独立性検定とは、クロス集計表を作成したとき、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 パッケージ内の関数とタイトルの表を作成する方法R パッケージ内の関数とタイトルの表を作成する方法 Rにおいて、指定したパッケージに含まれる関数とそのタイトルの一覧をデータフレームとして作成する方法をお伝えします。 環境 Rの動作環境は次になります。 $ R --version R version 4.1.3 (2022-03-10) -- "One Push-Up" Copyright (C) 2022 The R Foundation for […]
  • R言語 CRAN Task View:機械学習&統計学習R言語 CRAN Task View:機械学習&統計学習 CRAN Task View: Machine Learning & Statistical Learningの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Torsten Hothorn Contact: Torsten.Hothorn at […]
  • 中小企業の経営者なら知っておきたい財務データ活用法中小企業の経営者なら知っておきたい財務データ活用法 あなたは財務データを経営ツールとして有効に活用できているだろうか。目の前の仕事で忙しい、財務データの見方が分からない、顧問税理士に任せてあるなどの理由を付けて回避していないだろうか。 目の前の仕事で忙しいといって、ただがむしゃらに働いたところで利益を出し続けなければ生き残っていけない。どの方向を向いてがむしゃらに働くかを把握しておかなければならない。 財務データの […]
  • R 文字列ベクトルで文字列を指定して要素を削除する方法R 文字列ベクトルで文字列を指定して要素を削除する方法 Rの文字列ベクトルで、文字列を指定して要素を削除する方法をお伝えする。 通常、ベクトルの要素を削除する場合は、次のように添字にマイナスを付加して削除する。 > s # 1番目の要素を削除 > s[-1] [1] "猫である。" "名前は" "まだ無い。" > # 1番目から2番目の要素を削除 > s[-1:-2] [1] "名前は" […]
  • WindowsでHeidiSQLを使用してMariaDBをバックアップ・リストアするの方法WindowsでHeidiSQLを使用してMariaDBをバックアップ・リストアするの方法 WindowsでHeidiSQLを使用してMariaDBをバックアップおよびリストア(復元)する方法をお伝えいたします。 MariaDBのバックアップ方法はいくつかありますが、今回ご紹介する方法は、ダンプファイルの作成という方法になります。MariaDBのダンプファイルの作成は、通常、CUI(黒い文字だけの画面)でmysqldumpというコマンドラインツールを用いて行い […]
カイ二乗検定 – 独立性検定