機械学習(主にTensorFlow)

機械学習のメモ書き

カイ二乗検定

相関の有無について学習中。

データの間に関係があるかどうかを判断する方法のひとつに「カイ二乗検定」というものがあるらしい。

計算方法は参考させていただいたサイトに適合度の検定と独立性の検定について、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より引用。

データのサンプル数が少ない時に統計学的な重要性を過大に見積もりすぎることを防ぐことである。 不幸なことに、イェイツの修正は修正しすぎる傾向があり、このことは全体として控えめな結果となり帰無仮説を棄却すべき時に棄却し損なってしまうことになりえる。そのため、イェイツの修正はデータ数が非常に少ない時でさえも必要ないのではないかとも提案されている。

引用元: https://ja.wikipedia.org/wiki/%E3%82%A4%E3%82%A7%E3%82%A4%E3%83%84%E3%81%AE%E3%82%AB%E3%82%A4%E4%BA%8C%E4%B9%97%E6%A4%9C%E5%AE%9A

数式的にはカイ二乗検定の式の期待値との差分から、さらに0.5差し引くように補正するらしい。

chi2_contingencyのコードを見た感じだと、自由度が1の場合のみcorrectionは効いてくるようだ。

デフォルト値correction=Trueなので、2x2クロス表の場合は気をつけよう。

参考リンク

25-4. 適合度の検定 | 統計学の時間 | 統計WEB

25-5. 独立性の検定 | 統計学の時間 | 統計WEB