【Python】正規分布に従っているかを調べる手法3種

t検定の適用の可否を調べたい時など、データが正規分布に従っているかどうかを調べたい時があります。

ヒストグラムを書いてみれば、見た目でなんとなく正規分布っぽいかどうかは分かりますが、それは正確ではありません。
データが正規分布に従っているのか、もう少し正確に調査する手法「Q-Qプロット」「シャピロ・ウィルク検定」「コルモゴロフ・スミルノフ検定」をご紹介します。

今回使用するデータ

今回は、Wikipediaから拝借した常用漢字2136字の画数の分布を使ってみます。

このデータフレームの「総画」列を使用していきます。
まずはヒストグラムを以下のように確認します。

果たして、漢字の画数は正規分布に従うのでしょうか。

Q-Qプロット

まずは、「実測値」「データが正規分布であった場合の期待値」をパッと見で分かりやすくする「Q-Qプロット」から。
scipyのstatsモジュールにあるprobplotsメソッドを使用します。


これでQ-Qプロットが完成しました。赤い線と、青の点々が描かれていると思います。
青い点々が、この赤い線に乗っているほど、データが正規分布に近いと解釈できます。

この結果を見ると、中央付近はほぼ正規分布の性質を持ちそうです。
しかし、左下の点々がやや上ぶれており、右上の1つ飛んでいる点が気になります。
ちなみに右上の点が飛んでいるのは、「鬱」という漢字が常用漢字の中でも群を抜いて多い29画という画数を持つためです。

シャピロ・ウィルク検定(S-W検定)

Q-Qプロットは図にして正規性を視覚的に確認する手法でしたが、きちんと仮説検定で調べる手法も存在します。
データ数が少ない時(例えば1,000データ以下)はシャピロ・ウィルク検定(Shapiro-Wilk test)を用いると良いでしょう。
こちらはshapiroメソッドを使用すれば一発です。

数字が2つ出てきますが、これは「W」と略される検定統計量と、p値が並んでいます。
基本的には2つ目のp値が0.05などの有意水準より小さいかどうかを見れば良いでしょう。

この場合はp値<0.05なので、「正規分布である」という仮説が棄却され、漢字の画数データは正規分布とは言えないと考えられます。

コルモゴロフ・スミルノフ検定(K-S検定)

もう1つ、仮説検定の手法を紹介します。
データ数が多い場合(たとえば、1000以上)は、シャピロ・ウィルク検定よりもコルモゴロフ・スミルノフ検定(Kolmogorov-Smirnov test)が優れる、とされます。

これには以下のようにkstestメソッドを用います。

こちらも、検定統計量とp値が並んで出力されます。
p値は(四捨五入して)0.0ということで、こちらの検定を用いても漢字の画数データは正規分布とは言えないと考えられます。

このように、データを正規分布と見なしてよいかどうかを統計学的に調べる事は簡単に実行できます。
ヒストグラムを目視で確認するだけで終わりにせず、こういった手法・実行方法も抑えておく事をお勧めします。