卡方檢驗及其Python實現

2021-03-02 數據不吹牛


分類數據的擬合優度檢驗

卡方檢驗主要是測試樣本分類數據的分布是否符合預期分布。相信大家如果學過高中生物,都知道孟德爾——遺傳學之父,當時他根據顏色和形狀把豌豆分為四類:黃圓、綠圓、黃皺和綠皺.孟德爾根據遺傳學原理判斷這四類的比例應為9:3:3:1.為做驗證,孟德爾分別統計了這四類豌豆的個數,正是利用檢驗證明了這令人激動的結論

在處理分類數據時,這些類別值本身對統計檢驗沒有多大用處,比如像「男性」、「女性」和「其他」這樣的類別數據沒有任何數學意義。所以處理分類變量的檢驗是基於變量計數,而不是變量本身的實際值。

下面通過生成一些虛假的人口統計數據,並通過檢驗來檢驗它們是否不同:

import numpy as np
import pandas as pd
import scipy.stats as stats

national = pd.DataFrame(["white"]*100000 + ["hispanic"]*60000 +\
                        ["black"]*50000 + ["asian"]*15000 + ["other"]*35000)
           

minnesota = pd.DataFrame(["white"]*600 + ["hispanic"]*300 + \
                         ["black"]*250 +["asian"]*75 + ["other"]*150)

national_table = pd.crosstab(index=national[0], columns="count")
minnesota_table = pd.crosstab(index=minnesota[0], columns="count")

print( "National")
print(national_table)
print(" ")
print( "Minnesota")
print(minnesota_table)

National
col_0 count
0
asian 15000
black 50000
hispanic 60000
other 35000
white 100000

Minnesota
col_0 count
0
asian 75
black 250
hispanic 300
other 150
white 600

檢驗是基於檢驗統計量。使用以下公式計算檢驗統計量的值:

observed = minnesota_table

national_ratios = national_table/len(national)  # 實際值

expected = national_ratios * len(minnesota)   # 理論值

chi_squared_stat = (((observed-expected)**2)/expected).sum()

print(chi_squared_stat)

col_0
count 18.194805
dtype: float64

檢驗假設所有預期計數均不小於5,如果某一類別的個數小於5,就將相鄰的某些類別合成為一類。

拒絕域:W={},其實r為類別數,a為顯著性水平

crit = stats.chi2.ppf(q = 0.95, # 找到95%置信度的臨界值
                      df = 4)   # 自由度個數

print("Critical value")
print(crit)

p_value = 1 - stats.chi2.cdf(x=chi_squared_stat,  # P值
                             df=4)
print("P value")
print(p_value)

Critical value
9.487729036781154
P value
[0.00113047]

由於檢驗統計量大於P值,所以得出結論,有95%的把握認為上述兩個總體的分布不是相同的。

當然也可以使用scipy.stats.chisquare()函數,十分快捷!

stats.chisquare(f_obs= observed,   # 觀察值
                f_exp= expected)   # 理論值

Power_divergenceResult(statistic=array([18.19480519]), pvalue=array([0.00113047]))

獨立性檢驗

獨立性檢驗是統計學的另一種檢驗方式,它是根據次數判斷兩類變量彼此相關或相互獨立的假設檢驗。下面生成一些虛假的選民投票數據並進行獨立性測試,用於確定教育、政治觀點和其他偏好等變量是否因性別、種族和宗教等人口因素而有所不同:

np.random.seed(10)

voter_race = np.random.choice(a= ["asian","black","hispanic","other","white"],
                              p = [0.05, 0.15 ,0.25, 0.05, 0.5],
                              size=1000)

voter_party = np.random.choice(a= ["democrat","independent","republican"],
                              p = [0.4, 0.2, 0.4],
                              size=1000)

voters = pd.DataFrame({"race":voter_race, 
                       "party":voter_party})

voter_tab = pd.crosstab(voters.race, voters.party, margins = True)

voter_tab.columns = ["democrat","independent","republican","row_totals"]

voter_tab.index = ["asian","black","hispanic","other","white","col_totals"]

observed = voter_tab.iloc[0:5,0:3]   
print(voter_tab)

            democrat  independent  republican  row_totals
asian 21 7 32 60
black 65 25 64 154
hispanic 107 50 94 251
other 15 8 15 38
white 189 96 212 497
col_totals 397 186 417 1000

對於獨立性測試,使用與擬合優度檢驗相同的檢驗統計量。主要區別在於,獨立性檢驗必須在二維表格中計算每個單元格的預期計數,而不是一維表格。要獲得單元格的預期計數,需要將該單元格的行總計乘以該單元格的列總計,然後除以觀察的總數。可以通過np.outer()除以總的觀察數快速獲得表中所有單元格的理論值

expected =  np.outer(voter_tab["row_totals"][0:5],
                     voter_tab.loc["col_totals"][0:3]) / 1000

expected = pd.DataFrame(expected)

expected.columns = ["democrat","independent","republican"]
expected.index = ["asian","black","hispanic","other","white"]

print(expected)

          democrat  independent  republican
asian 23.820 11.160 25.020
black 61.138 28.644 64.218
hispanic 99.647 46.686 104.667
other 15.086 7.068 15.846
white 197.309 92.442 207.249

現在可以按照之前相同的步驟來計算檢驗統計量,臨界值和p值:

chi_squared_stat = (((observed-expected)**2)/expected).sum().sum()

print(chi_squared_stat)

7.169321280162059

注意:調用此處使用sum()方法兩次:第一次是獲取列和,第二次是將列和相加,返回整個二維表的總和。

crit = stats.chi2.ppf(q = 0.95, #找到95%置信度的臨界值
                      df = 8)   

print("Critical value")
print(crit)

p_value = 1 - stats.chi2.cdf(x=chi_squared_stat,  # P值
                             df=8)
print("P value")
print(p_value)

Critical value
15.50731305586545
P value
0.518479392948842

獨立性測試的自由度等於每個變量中類別數減去1的乘積。在本例中,有一個5x3表,因此df=4x2=8。

同樣可以使用scipy快速進行獨立性測試

stats.chi2_contingency(observed= observed)

(7.169321280162059, 0.518479392948842, 8, array([[ 23.82 ,  11.16 ,  25.02 ],
[ 61.138, 28.644, 64.218],
[ 99.647, 46.686, 104.667],
[ 15.086, 7.068, 15.846],
[197.309, 92.442, 207.249]]))

輸出檢驗統計量的值、p值和自由度以及理論值矩陣。

7.169321280162059<15.50731305586545,落入接受域,故認為上述兩變量之間無顯著關係。

相關焦點

  • python 卡方檢驗專題及常見問題 - CSDN
    卡方檢驗可以用於判斷兩個類別變量的相關性是否顯著。在分類的應用場景中可以用卡方檢驗選擇特徵,特徵與目標變量的相關性越顯著說明特徵越重要,預測力越強。      一、先簡單介紹一下卡方檢驗的步驟。假設y為目標變量,取值為好和壞,x為特徵變量取值為高、中、低。
  • R與Python之基本統計分析(四) ---- 卡方檢驗
    這一章我們就要正式開始介紹卡方檢驗了。在 R 中我們同樣參照了 Arthritis 資料庫。我們首先進行療效和治療方案的卡方檢驗。我們使用函數 chisq.test(),結果見圖 1,我們可以看到,X-squared = 13.055, p-value = 0.001463。
  • 常用統計檢驗的Python實現
    和我一起,成為更好的自己前言今天給大家整理了一些使用python進行常用統計檢驗的命令與說明,請注意,本文僅介紹如何使用python進行不同的統計檢驗,對於文中涉及的假設檢驗、統計量、正態性檢驗是檢驗數據是否符合正態分布,也是很多統計建模的必要步驟,在Python中實現正態性檢驗可以使用W檢驗(SHAPIRO-WILK TEST)檢驗原假設:樣本服從正態分布Python
  • 常用統計檢驗的Python實現和結果解釋
    前言今天給大家整理了一些使用python進行常用統計檢驗的命令與說明,請注意,本文僅介紹如何使用python進行不同的統計檢驗,對於文中涉及的假設檢驗、統計量、p值、正態性檢驗是檢驗數據是否符合正態分布,也是很多統計建模的必要步驟,在Python中實現正態性檢驗可以使用W檢驗(SHAPIRO-WILK TEST)檢驗原假設:樣本服從正態分布Python命令 stat,
  • 卡方合併檢驗 vs 卡方分割檢驗
    我們用兩個問到的例子來分別介紹卡方合併檢驗和卡方分割檢驗的SPSS操作。
  • 卡方檢驗的事後兩兩比較
    卡方檢驗檢出組間差異後,得到的結果只能顯示行變量與列變量間是否相互獨立,但各變量的不同組別間具體存在何種差異呢?
  • 卡方檢驗、t檢驗和方差分析的區別
    獨立樣本T檢驗和單因素方差分析功能上基本一致,但是獨立樣本T檢驗只能比較兩組選項的差異,比如男性和女性。相對來講,獨立樣本T檢驗在實驗比較時使用頻率更高,尤其是生物、醫學相關領域。針對問卷研究,如果比較的類別為兩組,獨立樣本T檢驗和單因素方差分析均可實現,研究者自行選擇使用即可。3)卡方分析卡方檢驗用於分析定類數據與定類數據之間的關係情況。
  • 卡方檢驗的理解
    卡方檢驗的理論知識卡方檢驗定義:卡方檢驗是假設檢驗的一種方法
  • 卡方檢驗、Kappa檢驗和McNemar檢驗的異同
    在文中提到過"該案例也可以嘗試使用Kappa一致性檢驗方法",但是並沒有講為什麼可以用Kappa一致性,以及它與McNemar檢驗的區別。在SPSS中進行交叉分析的過程中,很多人分不清Pearson卡方檢驗、Kappa檢驗和McNemar檢驗。因此,本文接下來將對它們分別進行解釋和區分。本文將用一個具體的案例來區分卡方檢驗、Kappa檢驗和麥克尼馬爾檢驗之間的異同。
  • 卡方檢驗,T檢驗和F檢驗
    卡方檢驗、T-test、F檢驗區別卡方檢驗卡方檢驗是一種用途很廣的計數資料的假設檢驗方法。
  • 卡方檢驗的多組比較
    SAS在ANOVA中可以直接指定post hoc分析,但對於卡方檢驗,SAS沒有自帶程序可以直接處理,這期講一下有哪些比較實用的方法與代碼~方法1:挨個做每兩組的卡方檢驗        存在的問題是多重比較,會增大Type I Error,需要校正p值
  • 基於SPSS軟體實現多組比較的卡方檢驗及兩兩比較
    如果不服從正態分布,採用中位數(四分位數間距)進行統計描述,組間比較採用非參數檢驗(Kruskal-Wallis秩和檢驗),當組間總的有統計學差異,進一步採用Dunn法(也可以是其它方法)進行多重比較。
  • 別錯過,卡方檢驗實用總結
    除此之外,卡方檢驗(準確說是卡方擬合優度檢驗)還可以檢驗定類數據的分布特徵是否與預期保持一致。比如本來預計男性和女性的比例各佔一半(50%),但收集回來的數據卻是45%和55%,那麼收集回來的數據是否就明顯的偏差預期(50%)呢?此時也可以使用卡方檢驗。
  • 別錯過,卡方檢驗實用總結!
    通常情況下,卡方檢驗是研究分類數據與分類數據之間關係的分析方法,如性別和是否戴隱形眼鏡之間的關係。卡方檢驗通常會涉及卡方值和P值兩個名詞術語。卡方值與P值有對應關係,P值小於0.05則說明有差異存在,即性別與是否戴隱形眼鏡之間有聯繫。
  • 卡方檢驗多種用途總結
    概念卡方檢驗是一種用途廣泛的分析定類數據差異性的方法,主要用於比較定類與定類數據的關係情況,以及分析實際數據的比例與預期比例是否一致。02.卡方優度檢驗卡方優度檢驗,是對一列數據進行統計檢驗,分析單個分類變量實際觀測的比例與期望比例是否一致。案例:當前收集了100份數據用於研究,其中有48名男性,52位女性。
  • 卡方檢驗(2x2表格)
    摘自:醫學統計園(微信公眾號)臨床上會遇到評價兩種藥物,對治療同一種疾病的不同患者,哪一種療效會更好,如下表,這時就需要用到卡方檢驗。卡方檢驗是針對計數資料的一種檢驗方法。如果卡方值越大,超出了設定檢驗水準(α=0.05)下的卡方值(χdf,0.05),則認為實際值與理論值之間偏差屬於隨機誤差的概率較小,故而拒絕H0假設;若卡方值為0,則表示觀察值與理論值完全一致。下面介紹如何使用SPSS對2x2表格,進行卡方檢驗;如前所述,對數據的預處理,是數據分析過程中花費時間最多也是最麻煩的,因此我們先講述如何將計量資料輸入SPSS。
  • Python實現常用的假設檢驗 !
    這篇文章,教大家用Python實現常用的假設檢驗!服從什麼分布,就用什麼區間估計方式,也就就用什麼檢驗!
  • 卡方檢驗的多種應用場景總結
    這類分析方法就被稱為卡方檢驗。本文將從概念、方法分類、每個方法的使用場景及案例分析對卡方檢驗進行介紹。 方法分類與T檢驗一樣,卡方檢驗也可細分為:分析卡方優度檢驗、交叉表卡方、配對卡方。 卡方優度檢驗卡方優度檢驗,是對一列數據進行統計檢驗,分析單個分類變量實際觀測的比例與期望比例是否一致。案例:當前收集了100份數據用於研究,其中有48名男性,52位女性。
  • 卡方檢驗在實際工作中的應用
    答案是:卡方檢驗。為什麼用卡方檢驗?定義是什麼?既然是對兩個分類變量(設計因素、高低CTR)做相關分析,卡方檢驗很適用於此案例。卡方檢驗怎麼做?思路是什麼?結論不符合預期時,卡方檢驗結論如何解讀?至此完成了卡方檢驗的基本操作,但檢驗結果僅代表數據的顯著性,該顯著性是否有意義仍需要結合實際情況來看。當數據顯著性出現與假設、預期不相符時,多是以下幾種情況。1. 描述統計差異較大但卡方檢驗不顯著e.g.
  • 如何快速搞定 SPSS 卡方檢驗?
    ,這些情況下,參數檢驗技術就未必適用了,因此我們還需要掌握一些非參數檢驗技術,其中最為常用的就是卡方檢驗,它最適合於次數分布檢驗。例如,樣本來自的總體數據不符合正態分布,此時可採用卡方檢驗完成。另外研究定類變量和定序變量之間的關係時,由於定類或者定序變量都不具有完備的運算性能,因此無法對總體某種參賽的計算,可採用非參數檢驗如卡方檢驗來完成。