Juliaでデータのヒストグラム、箱ひげ図を描き、平均、中央値、分散を求める方法

どうも、木村(@kimu3_slime)です。

今回は、Juliaでデータ(iris)のヒストグラム、箱ひげ図を描き、平均、中央値、分散を求める方法を紹介します。

 

準備

RDatasets, StatsPlotsを使うので、持っていなければインストールしておきましょう。

準備として、以下のコードを実行しておきます。

 

データのヒストグラムを描く

RDatasets.jlには様々なデータセットがあります。今回は、アイリス(iris, アヤメ)のデータを使いましょう。

150 rows × 5 columns

SepalLengthSepalWidthPetalLengthPetalWidthSpecies
Float64Float64Float64Float64Cat…
15.13.51.40.2setosa
24.93.01.40.2setosa
34.73.21.30.2setosa
44.63.11.50.2setosa
55.03.61.40.2setosa

この表形式のデータは、DataFrame(データフレーム)と呼ばれる型で、2次元の配列(行列)のように操作できますが、特有の操作も持っています。

iris以外にも、たくさんのデータセットがあります:Available datasets – Rdatasets

 

第1列、SepalLength(がく片の長さ)をデータ(ベクトル)として取り出しましょう。

 

150成分のデータがあります。この全体像を知るには、データの階級ごとの頻度を図示した、ヒストグラム(histogram)を使うのが手っ取り早いです。

「histogram(データ)」でヒストグラムが描けます。binsによって、ビン(棒)の個数を指定できます。

 

花弁の長さ(PetalLength)を、同様にプロットしてみましょう。

ばらつきがあるのがわかりますね。

 

このばらつきは、アイリスの中でも品種による違いが大きく表れたものです。

データフレームの第5行にはSpecies(品種)の情報がありますが、さきほどの簡略表示では「setosa」しか見えませんでした。

カテゴリ分けされたデータの名前、値の種類を取り出すには、「levels(データ)」です。

 

「@df データフレーム histogram(:列名, group=:分類列)」で、分類列に応じてヒストグラムを描くことができます。

 

品種による違いが明確になりました。

 

データの箱ひげ図を描く

データをその大きさ順に並び替えたときのようすを説明する箱ひげ図(box plot)を描くには、「boxplot(データ)」です。

上下にある横線が、データの範囲(range)を示しています。上側が最大値、下側が最小値です。

箱(色塗られた長方形)に含まれる部分に、全体の50%個のデータがあります。箱の下側が全体の25%:第1四分位数\(Q_1\)、真ん中が50%(中央値 median)\(Q_2\)、上側が75%:第3四分位数\(Q_3\)です。

箱の範囲\(Q_3 -Q_1\)を、四分位範囲(IQR; interquartile range)と呼びます。

 

品種による違いを見るために、品種ごとに箱ひげ図を描いてみましょう。

「groupby(データフレーム, グループ分けに使う列)」で、データフレームをそのグループ毎に分けることができます。

 

例えば、その3番目は品種virginica(バージニカ)のみを集めたデータフレームです。

50 rows × 5 columns

SepalLengthSepalWidthPetalLengthPetalWidthSpecies
Float64Float64Float64Float64Cat…
16.33.36.02.5virginica
25.82.75.11.9virginica
37.13.05.92.1virginica
46.32.95.61.8virginica
56.53.05.82.2virginica

 

この情報を使って、各品種の花弁の長さのデータの箱ひげ図をプロットしましょう。

丸(ドット)で示されているのは、外れ値(outlier)です。デフォルトでは、箱から四分位範囲×1.5以上の外側が外れ値として扱われています。

したがって、上下のひげは、(外れ値を取り除いたあとでの)最大値、最小値を表しています。

 

平均、中央値、分散を求める方法

データを図示して全体像を見てきたので、続いては数値的にデータを分析しましょう。

 

データフレームの概要を知るには、「describe(データ)」が便利です。

5 rows × 7 columns

variablemeanminmedianmaxnmissingeltype
SymbolUnion…AnyUnion…AnyInt64DataType
1SepalLength5.843334.35.87.90Float64
2SepalWidth3.057332.03.04.40Float64
3PetalLength3.7581.04.356.90Float64
4PetalWidth1.199330.11.32.50Float64
5Speciessetosavirginica0CategoricalValue{String, UInt8}

meanが平均値、minが最小値、medianが中央値、maxが最大値を表しています。

 

品種ごとに平均値や中央値を見ると、その違いが数値的にわかりやすいです。

5 rows × 7 columns

variablemeanminmedianmaxnmissingeltype
SymbolUnion…AnyUnion…AnyInt64DataType
1SepalLength5.0064.35.05.80Float64
2SepalWidth3.4282.33.44.40Float64
3PetalLength1.4621.01.51.90Float64
4PetalWidth0.2460.10.20.60Float64
5Speciessetosasetosa0CategoricalValue{String, UInt8}

5 rows × 7 columns

variablemeanminmedianmaxnmissingeltype
SymbolUnion…AnyUnion…AnyInt64DataType
1SepalLength5.9364.95.97.00Float64
2SepalWidth2.772.02.83.40Float64
3PetalLength4.263.04.355.10Float64
4PetalWidth1.3261.01.31.80Float64
5Speciesversicolorversicolor0CategoricalValue{String, UInt8}

5 rows × 7 columns

variablemeanminmedianmaxnmissingeltype
SymbolUnion…AnyUnion…AnyInt64DataType
1SepalLength6.5884.96.57.90Float64
2SepalWidth2.9742.23.03.80Float64
3PetalLength5.5524.55.556.90Float64
4PetalWidth2.0261.42.02.50Float64
5Speciesvirginicavirginica0CategoricalValue{String, UInt8}

 

個別のデータに対し、平均値、最小値、中央値、最大値は次のような関数で計算できます。

\[\mathrm{mean}(x)  :=  \frac{1} {n} \sum_{i=1} ^n x_i\]

 

分散と標準偏差は、「var(データ)」「std(データ)」で計算できます。

ここで計算される分散は、分母が\(n-1\)の不偏分散(unbiased variance)です。

\[\mathrm{var}(x)  :=  \frac{1} {n-1} \sum_{i=1} ^n (x_i – \mathrm{mean}(x))^2\]

\[\mathrm{std}(x)  :=  \sqrt{\mathrm{var}(x) }\]

 

品種グループごとに、がく片の長さのデータの分散を求めてみましょう。

全体の分散(約0.69)と比べると、グループごとの方が分散が小さくなっていますね。その中でも、setosaは分散が比較的小さく、virginicaは分散が比較的大きいことがわかりました。

 

以上、Juliaでデータのヒストグラム、箱ひげ図を描き、平均、中央値、分散を求める方法を紹介してきました。

データを図と数値の両面から理解するのは大事です。今回の説明が、Juliaでデータ・統計分析するのに役立てば嬉しいです。

木村すらいむ(@kimu3_slime)でした。ではでは。

 

1から始める Juliaプログラミング
進藤 裕之(著), 佐藤 建太(著)
コロナ社 (2020-03-26T00:00:01Z)
5つ星のうち4.5
¥7,353 (コレクター商品)

 

こちらもおすすめ

確率・統計における用語「分布」について整理する

総和の記法(Σ記号)とは、平均と分散の計算例、性質

Pythonで統計量関数(平均、中央値、分散、相関係数)を作り、可視化しよう