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)