アンケート結果、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\)値から帰無仮説が棄却できるかどうかを判定します。
カイ二乗検定の帰無仮説
カイ二乗検定では、まず「帰無仮説」を立てることが重要です。
帰無仮説とは、統計学で「比較する集団や変数間に差がない」または「特定の関係が存在しない」ことを前提とした仮説です。
仮説が正しいと仮定した上で、観測されたデータがどの程度その仮説に反しているかを評価します。
観測データが帰無仮説から大きく外れる結果であれば、「比較する集団や変数間に差がない」という結論になります。
独立性の検定における帰無仮説は、通常、以下のように表されます。
2つの変数は独立しており、関係がない。
仮説を検定する際には、設定した「有意水準」と比較して、カイ二乗統計量がどの程度かを評価します。
検定の結果、帰無仮説が棄却される場合、変数間に「関係がある」または「差がある」と判断されます。
例題
327人に「週1回以上外食をしますか」という質問をして、以下の結果が得られたとします。
はい | いいえ | 計 | |
男性 | 109 | 56 | 165 |
女性 | 97 | 65 | 162 |
計 | 206 | 121 | 327 |
「はい」と答えた割合は、男性約66%、女性約60%です。
一見、「男性の方が週1回以上外食する人が多い」と言えそうですが、誤差なのか、有意差があるのか、独立性のカイ二乗検定を利用して確認してみます。
帰無仮説は「週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を用いた他の統計的検定ついて、以下の記事で紹介しておりますので、よろしければご覧ください。