📑
コード書きの練習 二日目(四分位範囲と四分位偏差の実装)
二日目の題材は、四分位範囲と四分位偏差の実装です。
定義は https://mathlandscape.com/quartile/ を参考にしました。
やってみた
# frozen_string_literal: true
require 'rspec'
def median(a_n)
length = a_n.length
if length.even?
((a_n[length / 2 - 1] + a_n[length / 2]) / 2.0).round(2)
else
a_n[length / 2]
end
end
# 四分位範囲
def quartile_range(a_n)
q2 = median(a_n)
q1 = median(a_n.select { |n| n < q2 })
q3 = median(a_n.select { |n| n > q2 })
q3 - q1
end
# 四分位偏差
def quartile_deviation(a_n)
quartile_range(a_n) / 2.0
end
RSpec.describe 'コード書きの練習' do
describe '#median' do
subject { median(a_n) }
context do
let(:a_n) { [0, 10, 30, 30, 50, 60, 80, 90, 100] }
it { is_expected.to eq 50 }
end
context do
let(:a_n) { [0, 10, 30, 30] }
it { is_expected.to eq 20 }
end
context do
let(:a_n) { [60, 80, 90, 100] }
it { is_expected.to eq 85 }
end
end
describe '#quartile_range' do
subject { quartile_range(a_n) }
context do
let(:a_n) { [0, 10, 30, 30, 50, 60, 80, 90, 100] }
it { is_expected.to eq 65 }
end
context do
let(:a_n) { [0, 1, 1, 2, 3, 5, 8, 9, 9, 10] }
it { is_expected.to eq 8 }
end
end
describe '#quartile_deviation' do
subject { quartile_deviation(a_n) }
context do
let(:a_n) { [0, 10, 30, 30, 50, 60, 80, 90, 100] }
it { is_expected.to eq 32.5 }
end
context do
let(:a_n) { [0, 1, 1, 2, 3, 5, 8, 9, 9, 10] }
it { is_expected.to eq 4 }
end
end
end
雑記
定義の理解をすると実装は、簡単になりますね。次回予告、Base32の実装をしようと考えています。
Discussion