更新時間:2020-08-07 來源:黑馬程序員 瀏覽量:
學(xué)習(xí)目標(biāo)
掌握卡方檢驗(yàn)的原理和實(shí)現(xiàn)
卡方檢驗(yàn)用來分析兩個名義變量之間是否顯著相關(guān)。
學(xué)了這么多連續(xù)變量的統(tǒng)計分析,那么對于計數(shù)資料可咋整。小伙伴會問了:如果我想看不同患者人群的術(shù)后復(fù)發(fā)率有沒有差異,怎么辦?這時候就需要?dú)g迎我們的統(tǒng)計小助手——卡方檢驗(yàn)閃亮登場啦!
卡方檢驗(yàn)可是一位重量級選手,凡是涉及到計數(shù)資料分布的比較都需要他的幫忙。
用藥物A治療急性心肌梗死患者198例,24小時內(nèi)死亡11例,病死率為5.56%,另42例治療時采用藥物B,24小時內(nèi)死亡6例,病死率為14.29%,提問:兩組病死率有無差別?
表1. 兩種藥物急性心肌梗塞患者治療后24小時內(nèi)死亡情況。
卡方檢驗(yàn)的目的:確定樣本對象落入各類別的比例是否與隨機(jī)期望比例相等。
1.卡方值計算
兩個概念
·觀測頻數(shù)
·預(yù)期頻數(shù)
計算各行和各列的和:
計算每個格子在當(dāng)前行中的預(yù)期頻數(shù)
列出每個格子的觀測頻數(shù)和預(yù)期頻數(shù)
卡方值的計算公式:
計算每個格子的值:
最終 $$\chi^2$$=0.19+4.17+10.06+0.19+4.17+4.11=22.89
自由度$df=(R-1)(C-1)=(2-1)(3-1)=2$
結(jié)論
2.代碼實(shí)現(xiàn)
手動代碼實(shí)現(xiàn):
·導(dǎo)入數(shù)據(jù)
import pandas as pd data=pd.read_csv('data/chi2.csv') data.head()
·統(tǒng)計頻次(交叉表統(tǒng)計)
#統(tǒng)計頻次 table=pd.crosstab(data['sex'],data['major']) table
·計算預(yù)期頻次
#計算預(yù)期頻次 x=o.values col=np.sum(x,axis=1,keepdims=True)#行的和 row=np.sum(x,axis=0,keepdims=True)#列的和 total=np.sum(x)#總和 col,row,total
e=col*row/total#計算預(yù)期頻次 e
·計算卡方值
#計算卡方值 o_miuns_e=o.values-e #o-e chi2=np.sum(np.square(o_miuns_e)/e) chi2
·計算p值
#計算p值 df=(o.shape[0]-1)*(o.shape[1]-1)#自由度 p=1-ss.chi2.cdf(chi2,df) p#7.074778948346072e-06 拒絕原假設(shè) 專業(yè)選擇和性別之間相關(guān)
·scipy實(shí)現(xiàn):
Api:scipy.stats.chi2_contingency(observed):
·參數(shù):
observed:觀測的實(shí)際頻次 通常為$$R\times C$$的表格
·返回值:
chi2:卡方值
p:p值
dof:自由度
expected:預(yù)期頻次
代碼實(shí)現(xiàn)
·加載數(shù)據(jù)
import pandas as pd import scipy.stats as ss data=pd.read_csv('data/chi2.csv') data.head()
·統(tǒng)計觀測頻次
#統(tǒng)計頻次 o=pd.crosstab(data['sex'],data['major']) o
·卡方檢驗(yàn)
chi2,p,dof,e=ss.chi2_contingency(o) chi2,p,dof,e
(23.71794871794872, 7.0747789483371884e-06, 2, array([[32.5, 30. , 37.5],[32.5, 30. , 37.5]]))
3.小結(jié)
·卡方檢驗(yàn):用來分析兩個名義變量之間是否顯著相關(guān)
·卡方值計算:
觀測頻次O
預(yù)期頻次E
自由度:$$(R-1)\times(C-1)$$
api:scipy.stats.chi2_contingency(observed)
猜你喜歡: