用 python 做 z 檢驗,t 檢驗


Python 中的假設檢驗一般用到 scipy 或 statsmodels 包,需要注意的是,這兩個包裏面各種檢驗的置信度都是 0.05。

1. z 檢驗

對於大樣本數據(樣本量 \geq 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,在置信度 α=0.05\alpha=0.05 時,由於 p 值大於 α\alpha,接受原假設,認爲該樣本的均值是 39。

若要檢測該樣本均值是否大於 39,即原假設 H0:μ>39\mu>39,備選假設爲:μ39\mu\leq 39,則我們需要在代碼中增加一個參數 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 原假設 H0H_0 中樣本的期望值
輸出參數:
tstats 統計量值
pvalue p 值

下面是一個樣本的數據:
99.398.7100.5101.298.399.799.5102.1100.5 99.3\quad 98.7\quad 100.5\quad 101.2\quad 98.3\quad 99.7\quad 99.5\quad 102.1\quad 100.5

檢測樣本均值是否等於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 值爲 0.957/2=0.47850.957/2=0.4785,若是右側檢驗,則 p 值爲 10.957/2=0.52151-0.957/2=0.5215

假設有另外一個樣本的數據:
91.193.793.696.194.392.294.095.797.1 91.1\quad 93.7\quad 93.6\quad 96.1\quad 94.3\quad 92.2\quad 94.0\quad 95.7\quad 97.1

若兩個樣本相互獨立,檢測兩個樣本的均值是否相等,使用 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,拒絕原假設,認爲這兩個匹配樣本的均值不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章