Tim Wong
深思心思
Published in
6 min readDec 10, 2019

--

[Python + Statistic] Chi-Square Test 之一

日期: 2019-Oct-25, 作者: Tim Wong

Chi-Square Test 是用來驗證一個實驗出來的分佈是否與理論分佈是否「吻合」,我們先定一下我們的假設:

Null Hypothesis: 兩組分類之間沒有關係。

Alternative Hypothesis: 兩組分類之間有一定關係。

例子一:拋硬幣

我們拋一個硬幣50 次,有31次是公向上,有19次字向上。那我們可以用Chi-Square Test 查一下這個結果是不是跟理論有顯著性差異,如果有,就是說這個硬幣有些不正常。

----------------------------
| 公 | 字
----------------------------
實驗/觀察 | 31 | 19
理論/期望 | 25 | 25
----------------------------
Class 1: 公
Class 2: 字
Degress of Freedom = Number of Class - 1 = 2-1 = 1
X² = Class1: (Observed — Expected)²/Expected +
Class 2: (Observed — Expected)²/Expected +
...
Class N: (Observed — Expected)²/Expected
X² = (31–25)²/25 + (19–25)²/25 = 2.88

然後就要查表,看看是不是要接受alternative hypothesis 了。

df         0.10    0.05   0.02    0.01
-----------------------------------------
1 2.706 3.841 5.412 6.635
2 4.605 5.991 7.824 9.210
3 6.251 7.815 9.837 11.341
...
12 18.55 21.03 23.34 26.22

一看Chi-Square 的 equation,就知它是由零到無限大的,數字愈大表示兩組數差異愈大。假如我們定了 significant level 是 5%…. oh! 2.88< 3,841, 差異不大到足以reject null hypothesis, 就是說,這個硬幣是正常的。

註:這樣理解更好: 實測及期望的結果,跟公或字,是沒有關係的。

Python Code:

import numpy as np
from scipy import stats
chi2, p_value = stats.chisquare([31,19], f_exp=[25,25])print(chi2) --> 2.88
print(p_value) --> 0.0896

例子二: X,Y ,發生,不發生

----------------------------------------
| 發生 | 不發生 | 出現總數
----------------------------------------
X | 36 | 14 | 50
Y | 30 | 25 | 55
----------------------------------------
X + Y | 66 | 39 | 105
Class 1: X發生
Class 2: X不發生
Class 3: Y發生
Class 4: Y不發生
Degress of Freedom = Number of Class - 1 = 4-1 = 3
Expected(X發生)= p(發生)*(X出現總數)= (66/105) * 50 = 31.429
Expected(X不發生)= p(不發生)*(X出現總數)= (39/105) * 50 = 18.571
Expected(Y發生)= p(發生)*(Y出現總數)= (66/105) * 55 = 34.571
Expected(Y不發生)= p(不發生)*(Y出現總數)= (39/105) * 55 = 20.429
X²=(36-31.4)²/31.4+(14-18.6)²/18.6+(30-34.6)²/34.6+(25-20.4)²/20.4
= 3.4

同樣,3.4 < 3.841 , 差異不大到足以reject null hypothesis, 就是說,發不發生(x-axis labels) 跟 是X還是Y(y-axis)兩者沒有關係的。

Python code:

import numpy as np
from scipy import stats
T = np.array([
[36,14],
[30,25]
])
chi2, p, dof, ex = stats.chi2_contingency(T, correction=False)
print(chi2) --> 3.42
print(dof) --> 1
print(p) --> 0.0645

例子三: 學歷與婚姻狀況

----------------------------------------
|小學 |中學 |大學 |碩士 |博士
----------------------------------------
未婚 |18 |36 |21 |9 |6
已婚 |12 |36 |45 |36 |21
離婚 |6 |9 |9 |9 |3
孤寡 |3 |9 |9 |6 |3

Python Code:

import numpy as np
from scipy import stats
T = np.array([
[18,36,21,9,6],
[12,36,45,36,21],
[6,9,9,3,3],
[3,9,9,6,3]
])
chi2, p, dof, ex = stats.chi2_contingency(T, correction=False)
print(chi2) --> 23.57
print(dof) --> 12 = (4-1)*(5-1)
print(p) --> 0.023

查上表,df =12, X² = 23.57 > 21.03 的機率是 <0.05. 我們滿意喇。

就是說,以上數據指出,學歷與婚姻狀況有關係X²(12)=23.57, p<0.05

全力衝刺中的一團火

我是阿Tim | timwong.ai@gmail.com

--

--