抽樣實驗會產生抽樣誤差,對實驗資料進行比較分析時,不能僅憑兩個結果(平均數或率)的不同就作出結論,而是要進行統計學分析,鑑別出兩者差異是抽樣誤差引起的,還是由特定的實驗處理引起的。
顯著性檢驗(significance test)就是事先對總體(隨機變量)的參數或總體分布形式做出一個假設,然後利用樣本信息來判斷這個假設(備擇假設)是否合理,即判斷總體的真實情況與原假設是否有顯著性差異。或者說,顯著性檢驗要判斷樣本與我們對總體所做的假設之間的差異是純屬機會變異,還是由我們所做的假設與總體真實情況之間不一致所引起的。 顯著性檢驗是針對我們對總體所做的假設做檢驗,其原理就是「小概率事件實際不可能性原理」來接受或否定假設。
下文簡述各種差異性檢驗思想(兩組樣本差異),同時結合scipy.stats文檔中的描述進行python實踐。
參數檢驗在下文中,我們給出了兩個樣本,它們可以來自相同或不同的分布,我們想檢驗這些樣本是否具有相同的統計特性:
比較均值t檢驗t檢驗適用於:正態分布、方差具有齊性的兩組間小樣本比較;對於大樣本不滿足正態分布的數據而言t-檢驗還是相當精確有效的手段。
檢驗:兩個平均數的差異是否顯著。
均值相同的兩組樣本測試:
from scipy import statsrvs1 = stats.norm.rvs(loc=5, scale=10, size=500)rvs2 = stats.norm.rvs(loc=5, scale=10, size=500)stats.ttest_ind(rvs1, rvs2)
均值不同的兩組樣本測試:
rvs3 = stats.norm.rvs(loc=8, scale=10, size=500)stats.ttest_ind(rvs1, rvs3)
note:如果我們觀察來自相同或不同人群的兩個獨立樣本,例如男孩和女孩或兩個種族的考試分數,我們可以使用該測試。該測試測量樣本之間的平均(預期)值是否顯著不同。如果我們觀察到大的p值,例如大於0.05或0.1,那麼我們不能拒絕相同平均分數的零假設。如果p值小於閾值,例如1%,5%或10%,那麼我們拒絕相等平均值的零假設。
import numpy as npfrom scipy import statsnp.random.seed(12345678)rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)rvs2 = stats.norm.rvs(loc=5,scale=10,size=500)stats.ttest_ind(rvs1,rvs2)stats.ttest_ind(rvs1,rvs2, equal_var = False)rvs3 = stats.norm.rvs(loc=5, scale=20, size=500)stats.ttest_ind(rvs1, rvs3)stats.ttest_ind(rvs1, rvs3, equal_var = False)rvs4 = stats.norm.rvs(loc=5, scale=20, size=100)stats.ttest_ind(rvs1, rvs4)stats.ttest_ind(rvs1, rvs4, equal_var = False)rvs5 = stats.norm.rvs(loc=8, scale=20, size=100)stats.ttest_ind(rvs1, rvs5)stats.ttest_ind(rvs1, rvs5, equal_var = False)
擬合優度檢驗Kolmogorov-Smirnov test (KS檢驗)適用:連續分布,擬合優度
思想:依據總體分布狀況,計算出分類變量中各類別的期望頻數,與分布的觀察頻數進行對比,判斷期望頻數與觀察頻數是否有顯著差異,從而達到從分類變量進行分析的目的。
對於兩個樣本都來自同一分布的例子,
stats.ks_2samp(rvs1, rvs2)
pvalue=0.9954119517306488,我們不能拒絕零假設,因為pvalue很高。
不同均值的兩個分布為例,
stats.ks_2samp(rvs1, rvs3)
pvalue低於1%,,拒絕零假設。
非參數檢驗以上的參數檢驗都基於共同的兩個假設:正態性假定和方差齊性假定 。但是,我們在實際工作中,不可能總是遇到滿足這兩個假定的統計數據,這時候,如果強行採用參數檢驗就會造成錯誤。此時,可以採用基於秩和的非參數檢驗,如Kruskal-Wallis檢驗。
Wilcoxon符號秩檢驗(t檢驗的非參數版本)點擊Wilcoxon符號秩檢驗詳細了解。
非參數原假設(零假設):檢驗了兩個相關配對樣本x,y來自同一分布的。
非參數檢驗具有無需對總體分布作假定的優點,而就成對觀察值作的參數方式的T檢驗,必須假定有關的差別總體服從正態分布。
思想:
使用條件:
由於正態近似用於計算,因此使用的樣本應該很大。一般是要求n> 20。成對檢驗,數據是配對的。(x,y長度一致)。scipy.stats函數:wilcoxon(x[, y, zero_method, correction])
from scipy import statsx = [1, 3, 5, 7, 9]y = [2, 4, 6, 8, 10]stats.wilcoxon(x,y)
規則是要求n> 20,樣本過少會告警。
Kruskal-Wallis H檢驗(它是ANOVA的非參數版本)點擊Kruskal-Wallis H檢驗詳細了解。
思想:假設兩個分布的樣本中位數相等,用於檢驗樣本是否來源於相同的分布。它用於比較兩個或多個相同或不同樣本大小的獨立樣本。它擴展了Mann-Whitney U檢驗,該檢驗僅用於比較兩組。Kruskal-Wallis檢驗的參數等價物是單因素方差分析 (ANOVA)。
使用條件:
具有卡方分布的假設,每組中的樣本數量不能太小。(n>5)比較沒有配對的兩個獨立樣本,樣本可具有不同的大小。(x,y長度可以不一致)scipy.stats函數:kruskal(*args, **kwargs)
from scipy import statsx = [1, 3, 5, 7, 9]y = [2, 4, 6, 8, 10]stats.kruskal(x, y)
Mann-Whitney秩檢驗點擊Mann-Whitney秩檢驗,U檢驗詳細了解。
它假設兩個樣本分別來自除了總體均值以外完全相同的兩個總體,目的是檢驗這兩個總體的均值是否有顯著的差別。
思想:
使用條件:
比較沒有配對的兩個獨立樣本,樣本可具有不同的大小。(x,y長度可以不一致)僅在每個樣本中的觀察次數> 20且您有2個獨立的等級樣本時使用。scipy函數:mannwhitneyu(x, y[, use_continuity, alternative])
from scipy import statsx = [1, 3, 5, 7, 9]y = [2, 4, 6, 8, 10]stats.mannwhitneyu(x, y)
P值的意義不得不提的P值
P 值(pvalue),就是當原假設為真時所得到的樣本觀察結果或更極端結果出現的概率。如果 P 值很小,說明這種情況的發生的概率很小,而如果出現了,根據小概率原理,我們就有理由拒絕原假設,P 值越小,我們拒絕原假設的理由越充分。
總之,P 值越小,表明結果越顯著。但是檢驗的結果究竟是 「顯著的」、「中度顯著的」 還是 「高度顯著的」 需要我們自己根據 P 值的大小和實際問題來解決。
API匯總
T檢驗: ttest_ind(a, b[, axis, equal_var, nan_policy])
Kolmogorov-Smirnov檢驗擬合優度: kstest(rvs, cdf[, args, N, alternative, mode])
Mann-Whitney秩檢驗,U檢驗: mannwhitneyu(x, y[, use_continuity, alternative])
Wilcoxon符號秩檢驗: wilcoxon(x[, y, zero_method, correction]) 執行
Kruskal-Wallis H檢驗: kruskal(*args, **kwargs)