Python 中的假設檢驗一般用到 scipy 或 statsmodels 包,需要注意的是,這兩個包裏面各種檢驗的置信度都是 0.05。
1. z 檢驗
對於大樣本數據(樣本量 30),或者即使是小樣本,但是知道其服從正態分佈,並且知道總體分佈的方差時,需要用 z 檢驗。在 python 中,由於 scipy 包沒有 z 檢驗,我們只能用 statsmodels 包中的 ztest 函數。ztest 函數的一般用法如下:
ztest(x1, x2=None, value=0, alternative=`two-sided’) | |
---|---|
輸入參數: | |
x1 | 數組,第一個樣本的數據值 |
x2 | 數組,第二個樣本的數據值,默認沒有值 |
value | 浮點型數值,若是單樣本,則 value 是樣本假設的均值 |
若是雙樣本,則 value是兩個樣本均值的差值 | |
alternative | 若爲 `larger’,備選假設 H1 大於 value 值 |
若爲 `smaller’,備選假設 H1 小於 value 值 | |
輸出參數: | |
tstats | 統計量值 |
pvalue | p 值 |
假設有下面表格的數據:
23 | 36 | 42 | 34 | 39 | 34 | 35 | 42 | 53 | 28 | 49 | 39 |
---|---|---|---|---|---|---|---|---|---|---|---|
46 | 45 | 39 | 38 | 45 | 27 | 43 | 54 | 36 | 34 | 48 | 36 |
47 | 44 | 48 | 45 | 44 | 33 | 24 | 40 | 50 | 32 | 39 | 31 |
檢測其均值是否爲 39, 該問題顯然是一個雙側檢驗,由於樣本個數大於 30,則使用 z 檢驗,python 代碼如下:
>>> import statsmodels.stats.weightstats as sw
>>> arr=[23,36,42,34,39,34,35,42,53,28,49,39,
... 46,45,39,38,45,27,43,54,36,34,48,36,
... 47,44,48,45,44,33,24,40,50,32,39,31]
>>> sw.ztest(arr, value=39)
(0.3859224924939799, 0.6995540720244979)
從 ztest 的運行結果可以看出,統計量值爲 0.385,而 p 值是 0.699,在置信度 時,由於 p 值大於 ,接受原假設,認爲該樣本的均值是 39。
若要檢測該樣本均值是否大於 39,即原假設 H0:,備選假設爲:,則我們需要在代碼中增加一個參數 alternative=``smaller”:
>>> sw.ztest(arr, value=39, alternative="smaller")
(0.3859224924939799, 0.650222963987751)
檢測結果的 p 值爲 0.650,大於置信度 0.05,則接受原假設,認爲樣本均值大於39。假設另外一個樣本 2 的數據:
41 | 34 | 36 | 32 | 32 | 35 | 33 | 31 | 35 | 34 |
---|---|---|---|---|---|---|---|---|---|
37 | 34 | 31 | 36 | 37 | 34 | 33 | 37 | 33 | 38 |
38 | 37 | 34 | 36 | 36 | 31 | 33 | 36 | 37 | 35 |
33 | 34 | 33 | 35 | 34 | 34 | 34 | 35 | 35 | 34 |
檢測兩個樣本的均值是否相等,因爲兩個樣本都是大樣本,使用 z 檢驗, python 代碼如下:
>>> arr2 = [41, 34, 36, 32, 32, 35, 33, 31, 35, 34,
... 37, 34, 31, 36, 37, 34, 33, 37, 33, 38,
... 38, 37, 34, 36, 36, 31, 33, 36, 37, 35,
... 33, 34, 33, 35, 34, 34, 34, 35, 35, 34]
>>> sw.ztest(arr, arr2, value=0)
(3.775645601380307, 0.0001595937672736755)
從 ztest 的檢驗結果可以看出,p 值小於 0.05, 則拒絕原假設,認爲兩個樣本的均值不相等。
2. t 檢驗
小樣本(樣本量小於30個),一般用 t 檢驗。對於 t 檢驗,可以根據樣本特點,用 scipy 包中的 ttest_1sample(單樣本 t檢驗函數),ttest_ind(兩個獨立樣本的 t 檢驗),ttest_rel (兩個匹配樣本的 t 檢驗)。但這些函數得到都是雙側 t 檢驗的 p 值。如果是單側檢驗,我們還要進行一些換算,得到單側檢驗的 p 值。
ttest_1sample 函數的語法爲:
ttest_1samp(a, popmean) | |
---|---|
輸入參數: | |
a | 數組,樣本的數據值 |
popmean | 原假設 中樣本的期望值 |
輸出參數: | |
tstats | 統計量值 |
pvalue | p 值 |
下面是一個樣本的數據:
檢測樣本均值是否等於100,對其進行雙側 t 檢驗的語法爲:
>>> import scipy.stats as st
>>> a = [99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]
>>> st.ttest_1samp(a, 100)
Ttest_1sampResult(statistic=-0.054996133220328265, pvalue=0.9574902045208937)
從結果可以看出,雙側檢驗的 p 值爲 0.95, 大於置信度 0.05,因此接受原假設,認爲樣本的均值是100。若是單側檢驗中的左側檢驗,則 p 值爲 ,若是右側檢驗,則 p 值爲 。
假設有另外一個樣本的數據:
若兩個樣本相互獨立,檢測兩個樣本的均值是否相等,使用 ttest_ind 函數。
ttest_ind 函數的語法爲:
ttest_ind(a, b, axis=0, equal_var=True) | |
---|---|
輸入參數: | |
a | 數組,樣本的數據值 |
b | 數組,樣本2的數據值 |
axis | 一般爲 0 |
equal_var | 若爲 true,表示兩個樣本由相同的方差 |
若爲 false,表示兩個樣本的方差不同,使用合併方差 | |
輸出參數: | |
tstats | 統計量值 |
pvalue | p 值 |
假設兩個樣本的方差不同,則獨立雙樣本的 t 檢驗 python 代碼爲:
\begin{lstlisting}[Language=Python]
>>> a = [99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]
>>> b = [91.1, 93.7, 93.6, 96.1, 94.3, 92.2, 94.0, 95.7, 97.1]
>>> st.ttest_ind(a, b, equal_var = False)
Ttest_indResult(statistic=7.723221821038956, pvalue=2.4331092243754622e-06)
從上面結果可以看出,p 值小於置信度 0.05,拒絕原假設,認爲兩個兩個樣本的均值不同。
若兩個樣本是匹配樣本,使用函數 ttest_rel,它的語法更簡單,只需在函數裏輸入兩個樣本的數組即可。假設上面兩個樣本爲匹配樣本,python 代碼爲:
>>> import scipy.stats as st
>>> a = [99.3, 98.7, 100.5, 101.2, 98.3, 99.7, 99.5, 102.1, 100.5]
>>> b = [91.1, 93.7, 93.6, 96.1, 94.3, 92.2, 94.0, 95.7, 97.1]
>>> st.ttest_rel(a, b)
Ttest_relResult(statistic=10.845107419335658, pvalue=4.617509769582176e-06)
結果顯示,p 值小於置信度 0.05,拒絕原假設,認爲這兩個匹配樣本的均值不同。