カイ二乗検定(Χ二乗検定)

カイ二乗検定とは?

カイ二乗検定は「独立性の検定」とも言われます。

この書き方だと難しいですが、個人的には「確率が有意に異なるかを検証する検定」と認識しています。

なお、サンプルサイズが小さいときはフィッシャーの正確確率検定を使用してください。

以下、具体例を見てみます。

その前に、同様の検定を以下にまとめます。

検定名英語名対応コメント
カイ二乗検定Chi-squared test対応なしサンプルサイズが小さいときはフィッシャーの正確確率検定を使用する
フィッシャーの正確確率検定Fisher's exact test対応なし-
マクネマー検定McNemar test対応あり対応ありの際はこの検定を用いる

例題 - データ

RのTitanicデータを使用します。

本来はいくつかデータがありますが、今回は「男女で生存率に差があるのか?」を検証したいと思います。

#!/usr/bin/env Rscript
df = data.frame(Titanic)

head(df)
# Class    Sex   Age Survived Freq
# 1   1st   Male Child       No    0
# 2   2nd   Male Child       No    0
# 3   3rd   Male Child       No   35
# 4  Crew   Male Child       No    0
# 5   1st Female Child       No    0
# 6   2nd Female Child       No    0

例題 - 可視化

以下のコードによって可視化します。

#!/usr/bin/env Rscript
df = data.frame(Titanic)

male_yes = sum(df[df$Sex == "Male" & df$Survived == "Yes", "Freq"])
male_no = sum(df[df$Sex == "Male" & df$Survived == "No", "Freq"])

female_yes = sum(df[df$Sex == "Female" & df$Survived == "Yes", "Freq"])
female_no = sum(df[df$Sex == "Female" & df$Survived == "No", "Freq"])

print(c(male_yes, male_no, female_yes, female_no)) # => 367, 1364, 344, 126
data = matrix(c(male_yes, male_no, female_yes, female_no), ncol=2)

# 簡易可視化
barplot(
  data,
  beside=T,
  legend.text=c("Yes", "No"),
  names.arg=c("Male", "Female"),
  col=c("red", "blue")
)
カイ二乗検定・テストデータ

男性のNoの確率(死亡率)が高いことがパッとわかるかと思います。

帰無仮説を「男女と生存は独立である(関連がない)」としてカイ二乗検定を行います。

なお今回、フィッシャーの正確確率検定との比較のために、100分の1にしたデータで計算してみます。


ソースコード

# Pythonでカイ二乗検定

#!/usr/bin/env python
import scipy
import scipy.stats as st

data = [[4, 14], [3, 1]]
p_value_chisq = st.chi2_contingency(data)[1]

print(p_value_chisq) # => 0.1452510053118262

# Rでカイ二乗検定

#!/usr/bin/env Rscript
# 男性_生存、男性_死亡、女性_生存、女性_死亡
data = matrix(c(4, 14, 3, 1), ncol=2)

p_value_chisq = chisq.test(data)$p.value
print(p_value_chisq) # => 0.145251

RとPythonで結果も同じであることがわかるかと思います。


その他

特になし