カイ二乗検定
相関の有無について学習中。
データの間に関係があるかどうかを判断する方法のひとつに「カイ二乗検定」というものがあるらしい。
計算方法は参考させていただいたサイトに適合度の検定と独立性の検定について、pythonのモジュールで具体的に判定することを試した。
適合度の検定
scipyパッケージのscipy.stats.chisquareで計算できる。
参考サイトの下記データで適用してみる。
血液型 | A | O | B | AB | 計 |
---|---|---|---|---|---|
実測値 | 55 | 22 | 16 | 7 | 100 |
理論値 | 40 | 30 | 20 | 10 | 100 |
from scipy.stats import chisquare chi2, p = chisquare([55, 22, 16, 7], f_exp=[40, 30, 20, 10]) print("カイ二乗値:", chi2) print("p値:", p)
出力結果
カイ二乗値: 9.458333333333334 p値: 0.02377878015426507
p < 0.05なので、実測値の血液型分布は、理論値の分布に適合していないということになる。
独立性の検定
こちらはscipyパッケージのchi2_contingencyで計算できる。
参考サイトの下記データで適用してみる。
血液型 | A | O | B | AB | 計 |
---|---|---|---|---|---|
男性 | 55 | 22 | 16 | 7 | 100 |
女性 | 40 | 32 | 24 | 4 | 100 |
import pandas as pd from scipy.stats import chi2_contingency df = pd.DataFrame([ [55,22,16,7], [40,32,24,4] ]) chi2, p, dof, expected = chi2_contingency(df, correction=False) print("カイ二乗値:", chi2) print("p値:", p) print("自由度:", dof) print("期待度数:", expected)
出力結果
カイ二乗値: 6.63845472266525 p値: 0.08435923449835014 自由度: 3 期待度数: [[47.5 27. 20. 5.5] [47.5 27. 20. 5.5]]
p > 0.05なので、性別と血液型は独立しているということになる。(クロス表の変数同士が独立していることを棄却しない)
correction=Falseはイェイツの補正しないということらしい。
イェイツの補正
Wikiより引用。
データのサンプル数が少ない時に統計学的な重要性を過大に見積もりすぎることを防ぐことである。 不幸なことに、イェイツの修正は修正しすぎる傾向があり、このことは全体として控えめな結果となり帰無仮説を棄却すべき時に棄却し損なってしまうことになりえる。そのため、イェイツの修正はデータ数が非常に少ない時でさえも必要ないのではないかとも提案されている。
数式的にはカイ二乗検定の式の期待値との差分から、さらに0.5差し引くように補正するらしい。
chi2_contingencyのコードを見た感じだと、自由度が1の場合のみcorrectionは効いてくるようだ。
デフォルト値correction=Trueなので、2x2クロス表の場合は気をつけよう。