独立性検定とは、クロス集計表を作成したとき、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 ggpartyパッケージを用いた決定木の可視化R ggpartyパッケージを用いた決定木の可視化 決定木の可視化において、とても柔軟性が高いggpartyパッケージをご紹介します。 ggpartyパッケージは、ggplot2の機能をpartykitに拡張し、partyクラスのツリーオブジェクトのために明瞭に構造化され、高度にカスタマイズ可能なビジュアライゼーションを作成するために必要なツールを提供します。 ggpartyパッケージを用いると、ノードやエッジに対 […]
  • Python pyqueryを用いて簡単にウェブスクレイピングPython pyqueryを用いて簡単にウェブスクレイピング Pythonでpyqueryパッケージを用いて、ウェブスクレイピングを行う方法をご紹介する。ウェブ上には様々なデータがあるが、必要なデータがいつもファイルとしてダウンロードできるとは限らない。ここでご紹介する方法は、htmlファイルを直接解析して、必要な情報を取得するという方法である。 それでは、さっそく見ていこう。 Ubuntu […]
  • R dplyrパッケージで複数の列を文字列として指定し結合された列を追加する方法R dplyrパッケージで複数の列を文字列として指定し結合された列を追加する方法 Rのdplyrパッケージのmutate関数は新たに列を追加する関数です。 ここでは、mutate関数に文字列として与えた列に対して、paste関数で統合した結果を新たに追加する方法をお伝えします。 サンプルデータとして、統計的な学生の髪と目の色が収められているHairEyeColorを用います。 ただし、このサンプルデータはtableとなっておりますので、実際にはd […]
  • R言語 CRAN Task View:再現性のある研究R言語 CRAN Task View:再現性のある研究 CRAN Task View: Reproducible Researchの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: John Blischak, Alison Hill Contact: jdblischak at […]
  • MySQL データベース内のカラム数を確認する方法MySQL データベース内のカラム数を確認する方法 MySQLまたはMariaDBのデータベース内のカラム数を確認する方法をお伝えします。 サンプルデータベースを次のように準備します。 # データベース作成 CREATE DATABASE sample_database; # データベース指定 use sample_database; # テーブル作成 CREATE TABLE […]
カイ二乗検定 – 独立性検定