独立性検定とは、クロス集計表を作成したとき、2つの属性が独立であるかどうかを統計的に判定する方法です。
独立性検定を行う手順は次の通りです。

  1. 仮説を立てる
    • 帰無仮説H0:属性Ai(i=1,…,m)とBj(j=1,…,n)は独立である
    • 対立仮説H1:属性Ai(i=1,…,m)とBj(j=1,…,n)は少なくとも一つ以上は独立でない
  2. B1 B2 ・・・ Bn 合計
    A1 x11 x12 ・・・ x1n a1
    A2 x21 x22 ・・・ x2n a2
    ・・・ ・・・ ・・・ ・・・ ・・・ ・・・
    Am xm1 xm2 ・・・ xmn am
    合計 b1 b2 ・・・ bn N
  3. AiとBjの期待度数yijを次の式により求めます
    chi-square-test-test-of-independence-expectation
  4. 検定統計量Tを次のように計算します
    chi-square-test-test-of-independence-test-statistic
  5. このとき、検定統計量Tは自由度(m-1)(n-1)のカイ二乗分布に従うので、有意水準のカイ二乗値kと比較します
  6. T>kであれば、帰無仮説を棄却して、対立仮説を採用します

男女200人に朝食・昼食・夕食について、どの時間帯の食事を最も重要視するかの調査を行った結果、次の表になりました。このとき、男女と朝食・昼食・夕食について独立であるかどうかを調べます。

朝食 昼食 夕食 合計
50 15 55 120
10 40 30 80
合計 60 55 85 200
  • 帰無仮説H0:男女と朝食・昼食・夕食は独立である

期待度数の計算式は次のようになります。

朝食 昼食 夕食 合計
200×(120/200)×(60/200) 200×(120/200)×(55/200) 200×(120/200)×(85/200) 120
200×(80/200)×(60/200) 200×(80/200)×(55/200) 200×(80/200)×(85/200) 80
合計 60 55 85 200

期待度数の値は次のようになります。

朝食 昼食 夕食 合計
36 33 51 120
24 22 34 80
合計 60 55 85 200

検定統計量は次のようになります。

朝食 昼食 夕食 合計
(50-36)2/36 (15-33)2/33 (55-51)2/51
(10-24)2/24 (40-22)2/22 (30-34)2/34
合計
朝食 昼食 夕食 合計
5.4444 9.8181 0.3137 15.5762
8.1666 14.7272 0.4705 23.3643
合計 13.611 24.5453 0.7842 38.9405

これから検定統計量はT=38.9405となります。
これは、自由度(2-1)(3-1)=2のカイ二乗分布に従うので、有意水準を0.05とすると、カイ二乗値は5.991465となります。
エクセルでこの値を求めるときは、CHIINV関数を使います。

CHIINV(確率,自由度)

今回の例では、セルに「=CHIINV(0.05,2)」を入力します。

chi-square-test-test-of-independence-excel-chiinv

T=38.9405>5.991465から棄却域に入るので、帰無仮説H0は棄却されます。よって、男女と朝食・昼食・夕食は少なくとも一つ以上は独立でないとされます。

Rで計算する

Rで独立性検定を行う場合は、次のようになります。


chisq.test(matrix(c(50, 15, 55, 10, 40, 30), ncol=3, byrow=T))

	Pearson's Chi-squared test

data:  matrix(c(50, 15, 55, 10, 40, 30), ncol = 3, byrow = T)
X-squared = 38.9409, df = 2, p-value = 3.5e-09

よって、有意水準を5%(=0.05)とすると、p-value=3.5e-09<0.05となるため、帰無仮説は棄却されます。

Pythonで計算する

Pythonで独立性検定を行う場合は、次のようになります。あらかじめ、numpyとscipyパッケージをインストールしておきます。


import numpy as np
from scipy import stats

print(stats.chi2_contingency(np.array([[50, 15, 55], [10, 40, 30]]))

これを実行すると、次のように表示される。


(38.940879382055854, 3.5002211279659769e-09, 2, array([[36., 33., 51.], [24., 22., 34.]]))

これは、次のような意味である。

  • 検定統計量:38.940879382055854
  • p値:3.5002211279659769e-09
  • 自由度:2
  • 期待度数:array([[36., 33., 51.], [24., 22., 34.]])
R検定 カイ二乗検定 – 独立性検定