ピープル・アナリティクスケーススタディ(補足①):Pythonで正規性を確認する
正規性を前提とした分析手法はいくつもある!
これまで、Pythonを使ってピープル・アナリティクスのケーススタディをいろいろな分析手法を使ってやってみました。
その方法としての前提で多いのが正規性に従う(=観測値の分布が正規分布である)というものです。
正規分布とは、平均値が一番値が高く、そこからなだらかに減少していく以下のような分布をしています。
平均から標準偏差の1倍まで離れた範囲に全体のデータの約68.3%、2倍までの範囲に95.4%、3倍までの範囲に99.7%までが含まれます。
ここでは深く立ち入りませんが、この正規分布に従うという前提で行われている分析や統計モデルはいくつもあります。
私がAIHRの中にある”Statistics in HR”という講座で習った分析手法や統計モデルで正規分布を前提しているものとしては以下のようなものがありました。
- ピアソンの相関係数
- T-テスト(2つのグループ間における平均の違い)
- ANOVA(分散分析)の説明変数
- 単回帰分析
- 重回帰分析の説明変数・被説明変数の誤差
以前のブログで「正規性の確認はヒストグラムと歪度でいい」ということを述べましたが、より厳密に正規性を確認する方法をGW中に学びましたのでこちらをご紹介したいと思います。
この記事の参考にさせていただいた本及びブログは以下のものです。
以下の本ではモデリングで気を付けるべきことや以前から疑問に思っていたことをわかりやすく解説されていました。正規性についてはT-テストで触れられてのみでしたが、その注釈で検定手法が書かれていたのが正規性の実装につながる一歩となりました。
相関係数の検定方法や、偏相関係数についても学ぶことができたので、こちらはまた別の機会に書きたいと思います。
以下のブログはPythonでの実装に参考(というよりそのままコピペ!)にさせていただきました。ありがとうございます!
ヒストグラム以外にも確認方法がある!
「データ解釈学入門」の注釈にあったのが、「シャピロウィルク検定」と「コルモゴロフ・スミルノフ検定(K-S検定)」です。
こちらは両方とも「帰無仮説が有意水準で正規分布に従う」ということを前提としているため、P値が設定した有意水準(例えば0.05)より大きければ帰無仮説を棄却できない=正規分布に従うということができるということだそうです。
また「シャピロウィルク検定」と「コルモゴロフ・スミルノフ検定(K-S検定)」の違いは、前者がデータ数が小さい(1000以下)に利用し、後者が大きいデータ数に利用するというような状況ということです。
以前のブログでヒストグラムと歪度で正規性を確認したイノベーションの評価についての正規性について出してみましょう。
Pythonでの出し方はとても簡単です。 シャピロウィルク検定についてはscipy.statsでshapiroメソッドを出せば簡単に出ます。
>|Python|
import scipy.stats as stats
stats.shapiro(df["MEANINNOVATION"])
||<
結果は以下の通り。前者が「W」と略される検定統計量と、後者がp値になります。
(0.9798566699028015, 0.20555362105369568)
P値は0.2 > 0.05ですので、有意水準を0.05とした場合正規性を棄却できない=正規分布であるといえるということになります。
続いて コルモゴロフ・スミルノフ検定もご紹介しておきます。今回データ数はそこまで多くないのでシャピロ検定でいいかと思いますが、出し方は同じくkstestメソッドを使ってとても簡単に出ます。
>|python|
stats.kstest(df["MEANINNOVATION"], "norm")
||
結果は以下のような感じです。6.668048395734443の10の‐98乗だからこちらは棄却されちゃいますね。。
KstestResult(statistic=0.9286802359624794, pvalue=6.668048395734443e-98)
もう一つ、ご紹介したブログにあったのがQ_Qプロットです。
こちらは前回のブログの残差診断の右上にあった方法と同じです。
すなわち赤い線に従うほど正規性が高いというものです。
前回は4つ一度に出す方法だったので、今回はQ_Qプロットだけ出す方法で見てみたいと思います。
>|Python|
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(font="Hiragino Maru Gothic Pro",context="talk")
fig = plt.subplots(figsize=(8,8))
stats.probplot(df["MEANINNOVATION"], dist="norm", plot=plt)
plt.show()
||<
結果はこんな感じです。ちょっと上の方が外れているのが気になりますがほぼ正規性に従うといっていいのかな??
終わりに
以前正規性の確認で出したのが以下のヒストグラムです。このヒストグラムをみて「正規性がある」と断定するのは迷いがありますが、特にシャピロウィルク検定での結果は「大丈夫!」と念押しをしてくれるいいツールだと思いました。
以前のブログでも書いた通り、データの分布が「正規分布でないことも多い!」ということも念頭に置いておくことが重要なのでこうした検定は、手間であったとしてもやったうえで分析することが必要だと思いました。統計手法はデータをできる限り正確に分析するための手段であり目的ではないですからね😁