1. 程式人生 > >利用python進行T檢驗

利用python進行T檢驗

引入所需的包

from scipy import stats
import numpy as np

注:ttest_1samp, ttest_ind, ttest_rel均進行雙側檢驗
H0:μ=μ0
H1:μμ0

單樣本T檢驗-ttest_1samp

生成50行x2列的資料

np.random.seed(7654567)  # 保證每次執行都會得到相同結果
# 均值為5,方差為10
rvs = stats.norm.rvs(loc=5, scale=10, size=(50,2))

檢驗兩列數的均值與1和2的差異是否顯著

stats.ttest_1samp(rvs, [1, 2]
)

返回結果:

Ttest_1sampResult(statistic=array([ 2.0801775 , 2.44893711]), pvalue=array([ 0.04276084, 0.01795186]))

分別顯示兩列數的t統計量和p值。由p值分別為0.042和0.018,當p值小於0.05時,認為差異顯著,即第一列數的均值不等於1,第二列數的均值不等於2。

不拒絕原假設——均值等於5

stats.ttest_1samp(rvs, 5.0)

Ttest_1sampResult(statistic=array([-0.68014479, -0.04323899]), pvalue=array([ 0.49961383, 0.96568674]))

拒絕原假設——均值不等於5

stats.ttest_1samp(rvs, 0.0)

Ttest_1sampResult(statistic=array([ 2.77025808, 4.11038784]), pvalue=array([ 0.00789095, 0.00014999]))

第一列數均值等於5,第二列數均值不等於0

stats.ttest_1samp(rvs,[5.0,0.0])

Ttest_1sampResult(statistic=array([-0.68014479, 4.11038784]), pvalue=array([ 4.99613833e-01, 1.49986458e-04]))

第一行數均值等於5,第二行數均值不等於0

#axis=0按列運算,axis=1按行運算
stats.ttest_1samp(rvs.T,[5.0,0.0],axis=1) 

Ttest_1sampResult(statistic=array([-0.68014479, 4.11038784]), pvalue=array([ 4.99613833e-01, 1.49986458e-04]))

將兩列資料均值分別與5.0和0.0比較,得到4個t統計量和p值

stats.ttest_1samp(rvs,[[5.0],[0.0]])

Ttest_1sampResult(statistic=array([[-0.68014479, -0.04323899],
[ 2.77025808, 4.11038784]]), pvalue=array([[ 4.99613833e-01, 9.65686743e-01],
[ 7.89094663e-03, 1.49986458e-04]]))

兩獨立樣本t檢驗-ttest_ind

np.random.seed(12345678)
#loc:平均值  scale:方差
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)

Ttest_indResult(statistic=0.26833823296238857, pvalue=0.78849443369565098)

當不確定兩總體方差是否相等時,應先利用levene檢驗,檢驗兩總體是否具有方差齊性。

stats.levene(rvs1, rvs2)

LeveneResult(statistic=1.0117186648494396, pvalue=0.31473525853990908)

p值遠大於0.05,認為兩總體具有方差齊性。

如果兩總體不具有方差齊性,需要將equal_val引數設定為“False”。

需注意的情況:

如果兩總體具有方差齊性,錯將equal_var設為False,p值變大

stats.ttest_ind(rvs1,rvs2, equal_var = False)

Ttest_indResult(statistic=0.26833823296238857, pvalue=0.78849452749501059)

兩總體方差不等時,若沒有將equal_var引數設定為False,則函式會預設equal_var為True,這樣會低估p值

rvs3 = stats.norm.rvs(loc=5, scale=20, size=500)
stats.ttest_ind(rvs1, rvs3, equal_var = False)

正確的p值
Ttest_indResult(statistic=-0.46580283298287956, pvalue=0.64149646246568737)

stats.ttest_ind(rvs1, rvs3)

被低估的p值
Ttest_indResult(statistic=-0.46580283298287956, pvalue=0.64145827413435608)

當兩樣本數量不等時,equal_val的變化會導致t統計量變化
rvs1:來自總體——均值5,方差10,樣本數500
rvs2:來自總體——均值5,方差20,樣本數100
兩總體不具有方差齊性,應設定equal_var=False

rvs4 = stats.norm.rvs(loc=5, scale=20, size=100)
stats.ttest_ind(rvs1, rvs4)

錯誤的t統計量
Ttest_indResult(statistic=-0.99882539442782847, pvalue=0.31828327091038783)

stats.ttest_ind(rvs1, rvs4, equal_var = False)

正確的t統計量
Ttest_indResult(statistic=-0.69712570584654354, pvalue=0.48716927725401871)

不同均值,不同方差,不同樣本量的t檢驗
錯誤的檢驗:未將equal_var設定為False

rvs5 = stats.norm.rvs(loc=8, scale=20, size=100)
stats.ttest_ind(rvs1, rvs5)

Ttest_indResult(statistic=-1.4679669854490669, pvalue=0.14263895620529113)

正確的檢驗:

stats.ttest_ind(rvs1, rvs5, equal_var = False)

Ttest_indResult(statistic=-0.94365973617133081, pvalue=0.34744170334794089)

配對樣本t檢驗

np.random.seed(12345678)

不拒絕原假設,認為rvs1 與 rvs2 所代表的總體均值相等

rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)
rvs2 = (stats.norm.rvs(loc=5,scale=10,size=500) + stats.norm.rvs(scale=0.2,size=500))
stats.ttest_rel(rvs1,rvs2)

Ttest_relResult(statistic=0.24101764965300979, pvalue=0.80964043445811551)

拒絕原假設,認為rvs1 與 rvs3所代表的總體均值不相等

rvs3 = (stats.norm.rvs(loc=8,scale=10,size=500) + stats.norm.rvs(scale=0.2,size=500))
stats.ttest_rel(rvs1,rvs3)

Ttest_relResult(statistic=-3.9995108708727924, pvalue=7.3082402191661285e-05)