スポンサーリンク

【Python】独立性のカイ二乗検定

記事内に広告が含まれています。

アンケート結果、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が独立であるという帰無仮説の下での検定を考えます。

各セルについて、観測度数をOij、期待度数をEijとします。帰無仮説H0(AとBが独立)の下では期待度数Eijは、以下の式で表されます。

$$ E_{ij}=\frac{O_{i.}}{O_{..}}\times\frac{O_{.j}}{O_{..}} $$

AとBが独立であれば、各セルの発生確率が、A、B各カテゴリの発生確率の積となるためです。

度数が大きい場合、以下の検定統計量χ2は、近似的に自由度(m-1)(n-1)のカイ二乗分布に従うことが知られています。

$$ \chi^2=\sum_{i=1}^{m}\sum_{j=1}^{n}\frac{(O_{ij}-E_{ij})^{2}}{E_{ij}} $$

χ2値から帰無仮説が棄却できるかどうかを判定します。

スポンサーリンク

例題

327人に「週1回以上外食をしますか」という質問をして、以下の結果が得られたとします。

はいいいえ
男性10956165
女性9765162
206121327

「はい」と答えた割合は、男性約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

データフレームの中身は以下のとおりとなります。

YesNo
Men10956
Women9765

続けて、カイ二乗検定を実行します。

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を用いた他の統計的検定ついて、以下の記事で紹介しておりますので、よろしければご覧ください。

タイトルとURLをコピーしました