LoginSignup
0
0

More than 1 year has passed since last update.

scipy.stats: 分割表の検定 chi2_contingency

Last updated at Posted at 2022-05-29

scipy.stats: 分割表の検定 chi2_contingency

2 つのカテゴリー変数のクロス集計表に基づいて2 変数が独立であるかどうかの検定(いわゆる $\chi^2$ 検定)を行う。

帰無仮説は $H_0$: 2 変数は独立である。

対立仮説は $H_1$: 2 変数は独立ではない。

chi2_contingency(observed, correction=True, lambda_=None)

from scipy.stats import chi2_contingency

1. 2 × 2 分割表の場合

連続性の補正はデフォルトである。 correction=True

戻り値は,検定統計量($\chi^2$ 値),$p$ 値,自由度,期待値行列である。

tbl22 = [[12, 4], [6, 15]]
chi2_contingency(tbl22)
(6.087538725285434,
 0.013613860284292038,
 1,
 array([[ 7.78378378,  8.21621622],
        [10.21621622, 10.78378378]]))

連続性の補正をしない場合には correction=False を指定する。

chi2_contingency(tbl22, correction=False)
(7.835839598997492,
 0.0051220356982058955,
 1,
 array([[ 7.78378378,  8.21621622],
        [10.21621622, 10.78378378]]))

2. 2 × 2 より大きい分割表の場合

import numpy as np
tbl = np.array([[7, 9, 15], [3, 8, 4], [19, 11, 9]])
chi2_contingency(tbl)
(10.401761012439543,
 0.03417745006801264,
 4,
 array([[10.57647059, 10.21176471, 10.21176471],
        [ 5.11764706,  4.94117647,  4.94117647],
        [13.30588235, 12.84705882, 12.84705882]]))

3. パワーダイバージェンス検定

デフォルトでは lambda_=None で,通常の $\chi^2$ 検定が行われる(lambda_=1 を指定するのと同じ)。

lambda_ として指定できるのは以下の通り(文字列あるいは数値で指定できる)。

  • "pearson" (value 1)
    ピアソンの $\chi^2$ 検定統計量を求める。
  • "log-likelihood" (value 0)
    対数尤度比を求める。別名で $G$ 検定 または $G^2$ 検定と呼ばれる_.
  • "freeman-tukey" (value -1/2)
    Freeman-Tukey 検定統計量を求める。
  • "mod-log-likelihood" (value -1)
    修正対数尤度比を求める。
  • "neyman" (value -2)
    ネイマンの検定統計量を求める。
  • "cressie-read" (value 2/3)
    Cressie らの提唱した統計量を求める。

3.1. ピアソンの χ² 検定

chi2_contingency(tbl, lambda_=1)
(10.401761012439543,
 0.03417745006801264,
 4,
 array([[10.57647059, 10.21176471, 10.21176471],
        [ 5.11764706,  4.94117647,  4.94117647],
        [13.30588235, 12.84705882, 12.84705882]]))

3.2. 対数尤度比検定 G² 検定

chi2_contingency(tbl, lambda_=0)
(10.013932616936309,
 0.04019364174846649,
 4,
 array([[10.57647059, 10.21176471, 10.21176471],
        [ 5.11764706,  4.94117647,  4.94117647],
        [13.30588235, 12.84705882, 12.84705882]]))

パワーダイバージェンス検定を行う power_divergence() 関数でも行えるが,呼び出しが面倒である。

power_divergence(f_obs, f_exp=None, ddof=0, axis=0, lambda_=None)

from scipy.stats import power_divergence
from scipy.stats.contingency import expected_freq
f_exp = expected_freq(tbl)
# ddof = (len(tbl)-1) * (len(tbl[0])-1) # tbl がリストの場合
ddof = np.prod(np.array(tbl.shape)-1)
power_divergence(tbl, f_exp=f_exp, ddof=ddof, axis=None, lambda_=0)
Power_divergenceResult(statistic=10.013932616936309, pvalue=0.04019364174846649)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0