SciPy 卡方檢定(Chi-Square Test)

Photo by Tim Gouw on Unsplash
Photo by Tim Gouw on Unsplash
卡方檢定(Chi-Square Test)根據觀察次數(observed frequencies)測定在交叉表裡的變數是否有無關聯。SciPy 的 chi2_contingency() 可以幫我們快速計算 chi-square statistic 和 p-value。

卡方檢定(Chi-Square Test)根據觀察次數(observed frequencies)測定在交叉表裡的變數是否有無關聯。SciPy 的 chi2_contingency() 可以幫我們快速計算 chi-square statistic 和 p-value。

交叉表(Contingency Table or Crosstab)

交叉表顯示變數間次數的分佈。假如你不熟悉交叉表的話,可以先閱讀以下的文章。

下面的交叉表是從 Women Entrepreneurship and Labor Force 取得。

European Union Membership
Member
European Union Membership
Not Member
Level of development
Developed
207
Level of development
Developing
024

卡方檢定(Chi-Square Test)

卡方檢定測定實際觀察次數(observed frequencies)與理論期望次數(expected frequencies)是否吻合。我們定義以下的假設:

接下來,我們會計算 chi-square value 和 p-value。然後,用 chi-square value 或 p-value 測定 H0 是否為真。

用 chi-square value 測定時,假如 chi-square value 小於等於 chi-square 的 critical value ,則 H0 為真。

\text{H0 holds true } if \text{ chi-square value} \leq \text{critical value}

用 p-value 測定時,我們會定義一個 significance factor 來決定變數間是否有 significant 相關。一般來說,這個 significance factor 取為 0.05。所以,假如 p-value 大於等於 significance factor,則 H0 為真。

\text{H0 holds true } if \text{ p-value} \geq \text{significance factor}

理論期望次數表(Expected Value Table)

計算理論期望次數的公式為:

\text{expected value} = \frac{\text{total of row} \times \text{total of column}}{\text{total}}

在上面的交叉表中加入總數後,會如下方的表格。

MemberNot MemberTotal
Developed20727
Developing02424
Total203151

利用公式,我們可以計算出下面的理論期望次數表。

MemberNot MemberTotal
Developed20 * 27 / 51 =
10.5882
31 * 27 / 51 =
16.4117
27
Developing20 * 24 / 51 =
9.4117
31 * 24 / 51 =
14.5882
24
Total203151

Chi-Square Table

利用下面的公式來計算 chi-square 表。

\frac{(\text{observed value} - \text{expected value})^2}{\text{expected value}}

最後算出的 chi-square 表如下。

MemberNot Member
Developed(20 – 10.5882)^2 / 10.5882 =
8.3661
(7 – 16.4117)^2 / 16.4117 =
5.3973
Developing(0 – 9.4117)^2 / 9.4117 =
9.4117
(24 – 14.5882)^2 / 14.5882 =
6.0721

根據上面的 chi-square 表,我們將表中所有的值加總起來,得出 chi-square value(X^2)。

Developed, Member8.3661
Developing, Member9.4117
Developed, Not Member5.3973
Developing, Not Member6.0721
Chi-Square Value29.2472

自由度(Degree of Freedom)

為了要找出 chi-square 的 critical value,我們必須要先算出自由度。利用下面的公式可以計算出自由度。

\text{degree of freedom} = (\text{number of row} - 1) \times (\text{number of column} - 1)

所以,上面的交叉表的自由度為 (2 – 1) x (2 – 1) = 1。

之後,根據下表查詢自由度為 1 和 significance factor 為 0.05 的值為 3.841。

假如 chi-square value 小於等於 chi-square 的 critical value ,則 H0 為真。而,我們的 chi-square value 為 29.2472 且 critical value 為 3.841,所以 29.2472 大於 3.841。所以,H0 被拒絕,也就是說,這兩個變數有相關。

P-Value

除了用 chi-square value 來測定 H0 之外,還可以用 p-value 來測定。當 p-value 大於等於 significance factor,則 H0 為真。scipy.stats.chi2_contingency() 會回傳 p-value。一般來說,significance factor 取 0.05,所以,若 p-value 大於等於 0.05 時,H0 為真。

Python SciPy

利用 SciPy 的 chi2_contingency() 函式,我們可以輕易地得到以上所有的值。

chi2, p, dof, expected = scipy.stats.chi2_contingency(observed)
  • observed:實際觀察次數,型態為 array_like。
  • chi2:chi-square value,型態為 float。
  • p:p-value,型態為 float。
  • dof:自由度,型態為 int。
  • expected:理論期望次數,型態為 ndarray。與 observed 有相同的 shape。

範例

下面程式碼顯示如何用 SciPy 的 chi2_contingency() 來驗證 H0。其中,observed 也可以直接填入 pandas.crosstab() 的回傳值。

from scipy.stats import chi2_contingency
observed = [
    [20, 7],
    [0, 24],
]
chi2, p, dof, expected = chi2_contingency(observed)
print('chi-square:', chi2)
print('p-value:', p)
print('degree of freedom:', dof)
print('expected value table:', expected)
if p >= 0.05:
    print('H0 is accepted')
else:
    print('H0 is rejected')

其輸出如下。

chi-square: 29.247311827956988
p-value: 6.370454442050726e-08
degree of freedom: 1
expected value table: [[10.58823529 16.41176471]
 [ 9.41176471 14.58823529]]
H0 is rejected
發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like