chisquare#
- scipy.stats.mstats.chisquare(f_obs, f_exp=None, ddof=0, axis=0, *, sum_check=True)[原始碼]#
執行皮爾森卡方檢定。
皮爾森卡方檢定 [1] 是一種針對具有給定機率的多項分佈的適合度檢定;也就是說,它評估虛無假設,即觀察到的頻率(計數)是通過從具有給定期望頻率的類別分佈中獨立抽樣 N 個觀察值而獲得的。
- 參數:
- f_obsarray_like
每個類別中觀察到的頻率。
- f_exparray_like,選用
每個類別中期望的頻率。預設情況下,假設類別均等可能。
- ddofint,選用
“自由度差值”:用於調整 p 值的自由度。p 值是使用自由度為
k - 1 - ddof
的卡方分佈計算得出的,其中k
是類別的數量。ddof 的預設值為 0。- axisint 或 None,選用
廣播 f_obs 和 f_exp 結果的軸,沿該軸應用檢定。如果 axis 為 None,則 f_obs 中的所有值都被視為單一資料集。預設值為 0。
- sum_checkbool,選用
是否執行檢查
sum(f_obs) - sum(f_exp) == 0
。如果為 True (預設值),當相對差異超過資料類型精度的平方根時,會引發錯誤。有關原理和可能的例外情況,請參閱「註解」。
- 返回:
- res: Power_divergenceResult
包含屬性的物件
- statisticfloat 或 ndarray
卡方檢定統計量。如果 axis 為 None 或 f_obs 和 f_exp 為 1-D,則該值為 float。
- pvaluefloat 或 ndarray
檢定的 p 值。如果 ddof 和結果屬性 statistic 是純量,則該值為 float。
另請參閱
scipy.stats.power_divergence
scipy.stats.fisher_exact
費雪精確檢定於 2x2 列聯表。
scipy.stats.barnard_exact
無條件精確檢定。小樣本量的卡方檢定的替代方案。
- 卡方檢定
擴展範例
註解
當每個類別中觀察到的或期望的頻率太小時,此檢定無效。一個典型的規則是,所有觀察到的和期望的頻率都應至少為 5。根據 [2],建議觀察總數大於 13,否則應使用精確檢定(例如巴納德精確檢定),因為它們不會過度拒絕。
預設自由度 k-1 適用於未估計分佈參數的情況。如果通過有效最大似然估計 p 個參數,則正確的自由度為 k-1-p。如果參數以不同的方式估計,則 dof 可能介於 k-1-p 和 k-1 之間。但是,也可能漸近分佈不是卡方分佈,在這種情況下,此檢定不適用。
對於皮爾森卡方檢定,總觀察計數和期望計數必須匹配,p 值才能準確反映在虛無假設下觀察到如此極端統計量值的機率。此函數可用於執行其他不需要總計數相等的統計檢定。例如,要檢定虛無假設,即
f_obs[i]
是期望值為f_exp[i]
的卜瓦松分佈,請設定ddof=-1
和sum_check=False
。此檢定源於以下事實:平均值和變異數為f_exp[i]
的卜瓦松隨機變數近似於具有相同平均值和變異數的常態分佈;卡方統計量標準化、平方和加總觀察值;以及n
個平方標準常態變數的總和遵循自由度為n
的卡方分佈。參考文獻
[1]“皮爾森卡方檢定”。 維基百科。 https://en.wikipedia.org/wiki/Pearson%27s_chi-squared_test
[2]Pearson, Karl. “論相關變數系統中給定偏差系統與機率的標準,使得可以合理地假設它是由隨機抽樣引起的”,Philosophical Magazine。Series 5. 50 (1900), pp. 157-175。
範例
當僅給出強制性的 f_obs 參數時,假設期望頻率是均勻的,並由觀察到的頻率的平均值給出
>>> import numpy as np >>> from scipy.stats import chisquare >>> 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_obs 和 f_exp 也會被廣播。在以下範例中,f_obs 的形狀為 (6,),f_exp 的形狀為 (2, 6),因此廣播 f_obs 和 f_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]))
有關更詳細的範例,請參閱 卡方檢定。