R の fivenum 関数を Julia に移植する。
function fivenum!(x)
sort!(x)
n = length(x)
n4 = floor(Int, (n + 3) / 2) / 2
d = [1, n4, (n + 1) / 2, n + 1 - n4, n]
@. 0.5 * (x[floor(Int, d)] + x[ceil(Int, d)])
end
fivenum! は,最小値,下ヒンジ,中央値,上ヒンジ,最大値の 5 つの要約値を求める。
下ヒンジは,データ全体の中央値以下のデータの中央値,
上ヒンジは,データ全体の中央値以上のデータの中央値である。
データの個数 n = length(x) として,n % 4 つまり n を 4 で割った余りが 0, 1, 2, 3 の 4 パターンで,昇順に並べ替えたデータを配置するとわかりやすい。地色が黄色の数字が五数要約値。赤で示した数値は,中央値直近の二数の平均値である。
これを
n4 = floor(Int, (n + 3) / 2) / 2
d = [1, n4, (n + 1) / 2, n + 1 - n4, n]
@. 0.5 * (x[floor(Int, d)] + x[ceil(Int, d)])
で記述するとは素晴らしい。
なお,quantile!() で求められる 25パーセンタイル値 Q1 と 75 パーセンタイル値 Q3 は
n が奇数の場合は下ヒンジ,上ヒンジと同じになるが,
n が偶数の場合は,同じにはならない。
また,高校の数学では,「データを小さい方から大きい方まで並べてメジアンをとる。そのメジアンを落として,メジアンより小さいデータのまたメジアンをとってそれを第一四分位数とする。メジアンより大きいデータのまたメジアンをとってそれを第三四分位数とする。」というような定義なので,n が奇数の場合にはヒンジとは異なる。