アンケート結果、ABテスト結果などに有意な差があるかどうか、カイ二乗検定を利用して確認できます。Pythonを使用して簡単に実施してみます。
独立性の検定
以下のようなクロス集計表を考えます。
\(B_{1}\) | \(B_{2}\) | … | \(B_{n}\) | 計 | |
\(A_{1}\) | \(O_{11}\) | \(O_{12}\) | … | \(O_{1n}\) | \(O_{1.}\) |
\(A_{2}\) | \(O_{21}\) | \(O_{22}\) | … | \(O_{2n}\) | \(O_{2.}\) |
: | : | : | : | : | |
\(A_{m}\) | \(O_{m1}\) | \(O_{m2}\) | … | \(O_{mn}\) | \(O_{m.}\) |
計 | \(O_{.1}\) | \(O_{.2}\) | … | \(O_{.n}\) | \(O_{..}\) |
\(A\)、\(B\)は属性で、それぞれの属性には\(m\)個、\(n\)個のカテゴリがあります。
属性\(A\)、\(B\)が独立であるという帰無仮説\(H_{0}\)の下での検定を考えます。
各セルについて、観測度数を\(O_{ij}\)、期待度数を\(E_{ij}\)をとします。
帰無仮説\(H_{0}\)(\(A\)と\(B\)が独立)の下では期待度数\(E_{ij}\)は、以下の式で表されます。
$$ E_{ij}=\frac{O_{i.}}{O_{..}}\times\frac{O_{.j}}{O_{..}} $$
\(A\)と\(B\)が独立であれば、各セルの発生確率が、\(A\)、\(B\)各カテゴリの発生確率の積となるためです。
度数が大きい場合、以下の検定統計量\(\chi^2\)は、近似的に自由度\((m-1)(n-1)\)のカイ二乗分布に従うことが知られています。
$$ \chi^2=\sum_{i=1}^{m}\sum_{j=1}^{n}\frac{(O_{ij}-E_{ij})^{2}}{E_{ij}} $$
\(\chi^2\)値から帰無仮説が棄却できるかどうかを判定します。
例題
327人に「週1回以上外食をしますか」という質問をして、以下の結果が得られたとします。
はい | いいえ | 計 | |
男性 | 109 | 56 | 165 |
女性 | 97 | 65 | 162 |
計 | 206 | 121 | 327 |
「はい」と答えた割合は、男性約66%、女性約60%です。
一見、「男性の方が週1回以上外食する人が多い」と言えそうですが、誤差なのか、有意差があるのか、カイ二乗検定を利用して確認してみます。
Python実装
動作確認したpython、モジュールのバージョンは以下のとおりです。
python 3.6.0
pandas 0.22.0
scipy 1.2.0
Pythonで実装します。pandasとscipyをインストールしておきます。
scipyは科学技術計算のパッケージで、numpy配列を効率よく扱えるようです。
pip install pandas
pip install scipy
まずライブラリをインポートし、クロス集計表をデータフレームとして作成します。
import pandas as pd
from scipy import stats
df = pd.DataFrame([[109, 56], [97, 65]],
index=['Men', 'Women'], columns=['Yes', 'No'])
df
データフレームの中身は以下のとおりとなります。
Yes | No | |
---|---|---|
Men | 109 | 56 |
Women | 97 | 65 |
続けて、カイ二乗検定を実行します。
chi2, p, dof, exp = stats.chi2_contingency(df, correction=False)
print("期待度数", "\n", exp)
print("自由度", "\n", dof)
print("カイ二乗値", "\n", chi2)
print("p値", "\n", p)
chi2_contigencyの第二引数、correction=False はイエーツの補正を実施しないという指定です。
実行結果は以下のとおりです。
期待度数
[[103.94495413 61.05504587]
[102.05504587 59.94495413]]
自由度
1
カイ二乗値
1.3410405507372527
p値
0.24685054834632514
有意水準5%の場合、p値が約0.247のため、帰無仮説(週1回以上外食をする割合は性別によって変わらない)が棄却できず、男性と女性では有意差はないという結論になります。
「イエーツの補正」は、2×2の分割表に対するカイ二乗検定で使用される補正です。この補正は、小さいサンプルサイズに対して検定結果の歪みを減らすために考案されました。具体的には、カイ二乗統計量を計算する際に、期待度数と観測度数の差の絶対値から0.5を引くことで補正します。これにより、検定の保守性が高まり、第1種の過誤(誤検出)のリスクが減少します。
まとめ
Pythonでカイ二乗検定を行ってみました。外部データでも、データフレームとして読み込めば、今回と同様の方法で簡単に検定できます。
Pythonを用いた他の統計的検定ついて、以下の記事で紹介しておりますので、よろしければご覧ください。