《用十年學(xué)編程》(Teach Yourself Programming in Ten Years by Peter Norvig 原文地址:http://norvig.com/21-days.html) 里說學(xué)習(xí)編程的最好方法就是實(shí)踐噪漾,以任務(wù)為導(dǎo)向的學(xué)習(xí)往往更為高效。本文就是這樣一個(gè)筆記,算不上教程刹帕,只不過是菜鳥在記錄自己的腳步蠢挡。如果你恰好不知道怎么做卡方分析凡辱,不妨來看一看拧簸。
什么是卡方分析
卡方分析有兩個(gè)常見的應(yīng)用——適合度分析和獨(dú)立性分析寺旺。這個(gè)筆記著重于適合度分析组去。從我目前的經(jīng)驗(yàn)來看鞍陨,這也是應(yīng)用十分廣泛的一種統(tǒng)計(jì)分析方式。那么什么是卡方適合度分析呢从隆?且聽我慢慢道來诚撵。
現(xiàn)象1 | 現(xiàn)象2 | 現(xiàn)象3 | |
---|---|---|---|
觀測(cè)值 | a | b | c |
預(yù)期值 | A | B | C |
常見的適合度分析的結(jié)構(gòu)如下,一般有兩組數(shù)據(jù)键闺,一組是你統(tǒng)計(jì)或者觀察到的值寿烟,另一組是理論上的預(yù)期值。如果這兩組值十分接近辛燥,證明觀測(cè)到的結(jié)果很“合適”筛武,如果差距較大,則證明觀測(cè)到的數(shù)據(jù)不夠“合適”挎塌,這就是“適合度分析”名字的含義徘六。
這種統(tǒng)計(jì)分析在科學(xué)研究中是十分常用的,因?yàn)榭茖W(xué)家經(jīng)常按照理論預(yù)期來推測(cè)試驗(yàn)結(jié)果勃蜘,而實(shí)際上由于各種誤差的存在硕噩,實(shí)驗(yàn)數(shù)據(jù)不可能和理論預(yù)期完全一致,這時(shí)卡方檢驗(yàn)就能很好地檢驗(yàn)理論的正確性缭贡。
舉個(gè)栗子
某科學(xué)家預(yù)言拋一個(gè)色子炉擅,各面向上的幾率都相同辉懒。為了驗(yàn)證自己理論的正確性,該科學(xué)家拋了600次硬幣谍失,結(jié)果為一點(diǎn)102次眶俩,二點(diǎn)102次,三點(diǎn)96次快鱼,四點(diǎn)105次颠印,五點(diǎn)95次,六點(diǎn)100次抹竹。顯然這個(gè)結(jié)果和理論預(yù)期并不完全一樣线罕,那么,科學(xué)家的理論有錯(cuò)嗎窃判?我們就用Python來驗(yàn)證一下钞楼。
from scipy import stats
obs = [102, 102, 96, 105, 95, 100]
exp = [100, 100, 100, 100, 100, 100]
stats.chisquare(obs, f_exp = exp)
輸出
(0.73999999999999999, 0.98070147251964801)
從結(jié)果來看,p 值為0.98袄琳,可以認(rèn)為觀測(cè)到的值和預(yù)期值是相近即“合適”的询件。科學(xué)家的理論沒有錯(cuò)唆樊,觀測(cè)值和理論值的不同是由偶然誤差造成的宛琅。(一般 p 值大于0.95即可)
解釋一下
Python中進(jìn)行卡方分析的函數(shù)chisquare()位于scipy的stats模塊中。注意:stats在Python2.7的環(huán)境下使用是十分正常的逗旁,但是在Python3中使用就會(huì)報(bào)錯(cuò)嘿辟。說來慚愧,筆者之前試著在Py3下運(yùn)行痢艺,結(jié)果折騰了大半天都沒成功仓洼,換到Py2.7下介陶,一點(diǎn)問題都沒了堤舒。如果用Python進(jìn)行數(shù)據(jù)分析,個(gè)人感覺還是Py2.7好使哺呜,很多模塊都沒有穩(wěn)定的Py3版啊舌缤。當(dāng)然之前的栗子也要求在Py2.7下運(yùn)行。
scipy.stats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)
參數(shù)解釋如下:
f_obs : 觀測(cè)值某残,為一個(gè)數(shù)列
f_exp : 理論值国撵,為一個(gè)數(shù)列。如果不賦值玻墅,默認(rèn)為所有情況出現(xiàn)的可能相等介牙。所以栗子中可以不賦值
>>> stats.chisquare(obs)
(0.73999999999999999, 0.98070147251964801)
ddof : 即自由度, df = C - 1澳厢,數(shù)值上等于所有可能的情況數(shù)-1环础∏羲疲可以不用賦值,只要obs和exp沒問題线得,程序可以自己算出來饶唤。
輸出的結(jié)果是:
chisq: 即k值
p : p 值,大于0.95即統(tǒng)計(jì)顯著贯钩。
看了這個(gè)簡(jiǎn)單的小筆記募狂,大家應(yīng)該知道如何用Python進(jìn)行適合度檢驗(yàn)了吧。當(dāng)然這只是個(gè)很簡(jiǎn)單的筆記角雷,如果有更多問題祸穷,還是要參考scipy的toturial。如果大家有什么問題或建議勺三,歡迎大家在留言中和我討論粱哼。祝大家在python數(shù)據(jù)分析之路上玩的愉快!