當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy stats.chisquare用法及代碼示例


本文簡要介紹 python 語言中 scipy.stats.chisquare 的用法。

用法:

scipy.stats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)#

計算 one-way 卡方檢驗。

卡方檢驗檢驗分類數據具有給定頻率的零假設。

參數

f_obs array_like

在每個類別中觀察到的頻率。

f_exp 數組,可選

每個類別中的預期頻率。默認情況下,假定類別具有相同的可能性。

ddof 整數,可選

“Delta 自由度”:對 p 值自由度的調整。 p 值是使用卡方分布計算的k - 1 - ddof自由度,其中k是觀察到的頻率數。默認值為ddof為 0。

axis int 或無,可選

f_obs 和 f_exp 的廣播結果軸,沿該軸應用測試。如果 axis 為 None,則 f_obs 中的所有值都被視為單個數據集。默認值為 0。

返回

資源:Power_divergenceResult

包含屬性的對象:

奇斯克 浮點數或 ndarray

卡方檢驗統計量。如果軸為無或 f_obs 和 f_exp 為一維,則該值為浮點數。

p值 浮點數或 ndarray

檢驗的 p 值。如果 ddof 和返回值 chisq 是標量,則該值為浮點數。

注意

當每個類別中觀察到的或預期的頻率太小時,此測試無效。一個典型的規則是所有觀察到的和預期的頻率至少應為 5。根據 [3],建議樣本總數大於 13,否則應使用精確檢驗(如 Barnard's Exact 檢驗)因為他們不會過度拒絕。

此外,觀察到的頻率和預期頻率的總和必須相同才能使測試有效;如果總和在 1e-8 的相對容差範圍內不一致,則 chisquare 會引發錯誤。

默認自由度 k-1 適用於沒有估計分布參數的情況。如果通過有效最大似然估計 p 個參數,則正確的自由度為 k-1-p。如果以不同的方式估計參數,則自由度可以在 k-1-p 和 k-1 之間。但是,漸近分布也可能不是卡方,在這種情況下,此檢驗不合適。

參考

[1]

洛瑞,理查德。 “推論統計的概念和應用”。第 8 章。https://web.archive.org/web/20171022032306/http://vassarstats.net:80/textbook/ch8pt1.html

[3]

皮爾遜,卡爾。 “在相關變量係統的情況下,給定係統與可能的偏差的標準是可以合理地假設它是從隨機抽樣中產生的”,哲學雜誌。係列 5. 50 (1900),第 157-175 頁。

[4]

曼南,R.威廉和E.查爾斯。梅斯洛。 “俄勒岡州東北部管理森林和 old-growth 森林中的鳥類種群和植被特征。”野生動物管理雜誌 48,1219-1238,DOI:10.2307/3801783,1984 年。

例子

在[4]中,對俄勒岡州old-growth森林中的鳥類覓食行為進行了調查。森林中,花旗鬆占樹冠體積的44%,黃鬆占24%,大冷杉占29%,西部落葉鬆占3%。作者觀察了幾種鳥類的行為,其中之一是red-breasted五子雀。他們對該物種的覓食進行了 189 次觀察,其中在花旗鬆中記錄了 43 次 (“23%”),在黃鬆中記錄了 52 次 (“28%”),在大冷杉中記錄了 54 次 (“29%”),在白鬆中記錄了 40 次 (“21%”)。西部落葉鬆。

使用卡方檢驗,我們可以檢驗覓食事件的比例等於冠層體積的比例的原假設。該論文的作者認為 p 值小於 1% 才具有顯著性。

使用上述冠層體積和觀察到的事件的比例,我們可以推斷出預期的頻率。

>>> import numpy as np
>>> f_exp = np.array([44, 24, 29, 3]) / 100 * 189

觀察到的覓食頻率為:

>>> f_obs = np.array([43, 52, 54, 40])

我們現在可以將觀察到的頻率與預期頻率進行比較。

>>> from scipy.stats import chisquare
>>> chisquare(f_obs=f_obs, f_exp=f_exp)
Power_divergenceResult(statistic=228.23515947653874, pvalue=3.3295585338846486e-49)

p 值遠低於所選的顯著性水平。因此,作者認為差異顯著,並得出結論,覓食事件的相對比例與樹冠體積的相對比例不同。

以下是其他通用示例,用於演示如何使用其他參數。

當隻給出 f_obs 時,假設預期頻率是均勻的,並由觀察到的頻率的平均值給出。

>>> chisquare([16, 18, 16, 14, 12, 12])
Power_divergenceResult(statistic=2.0, pvalue=0.84914503608460956)

使用 f_exp 可以給出預期頻率。

>>> chisquare([16, 18, 16, 14, 12, 12], f_exp=[16, 16, 16, 16, 16, 8])
Power_divergenceResult(statistic=3.5, pvalue=0.62338762774958223)

當 f_obs 是 2-D 時,默認情況下測試應用於每一列。

>>> obs = np.array([[16, 18, 16, 14, 12, 12], [32, 24, 16, 28, 20, 24]]).T
>>> obs.shape
(6, 2)
>>> chisquare(obs)
Power_divergenceResult(statistic=array([2.        , 6.66666667]), pvalue=array([0.84914504, 0.24663415]))

通過設置 axis=None ,將測試應用於數組中的所有數據,相當於將測試應用於展平數組。

>>> chisquare(obs, axis=None)
Power_divergenceResult(statistic=23.31034482758621, pvalue=0.015975692534127565)
>>> chisquare(obs.ravel())
Power_divergenceResult(statistic=23.310344827586206, pvalue=0.01597569253412758)

ddof 是對默認自由度所做的更改。

>>> chisquare([16, 18, 16, 14, 12, 12], ddof=1)
Power_divergenceResult(statistic=2.0, pvalue=0.7357588823428847)

p 值的計算是通過使用 ddof 廣播卡方統計量來完成的。

>>> chisquare([16, 18, 16, 14, 12, 12], ddof=[0,1,2])
Power_divergenceResult(statistic=2.0, pvalue=array([0.84914504, 0.73575888, 0.5724067 ]))

f_obsf_exp也在播出。在下麵的,f_obs具有形狀 (6,) 和f_exp有形狀 (2, 6),所以廣播的結果f_obsf_exp具有形狀 (2, 6)。為了計算所需的卡方統計量,我們使用axis=1

>>> chisquare([16, 18, 16, 14, 12, 12],
...           f_exp=[[16, 16, 16, 16, 16, 8], [8, 20, 20, 16, 12, 12]],
...           axis=1)
Power_divergenceResult(statistic=array([3.5 , 9.25]), pvalue=array([0.62338763, 0.09949846]))

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.chisquare。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。