t檢驗主要是針對正態總體均值的假設檢驗,即檢驗樣本的均值與某個值的差異,或者兩個樣本的均值是否有差異等。其不需要事先知道總體的方差,並且在少量樣本情況下也可以進行檢驗。python進行t檢驗使用scipy包的stats模塊
一、單樣本t檢驗
示例:已知某工廠生產的一種點火器平均壽命大於1200次爲合格產品,現在質檢部隨機抽取了20個點火器進行試驗,結果壽命分別爲(單位:次):
809, 1250, 689, 1541, 995, 1234, 1024, 920, 777, 2510, 2301, 540, 850, 895, 1024, 1000, 1025, 863, 875, 1105
單樣本t檢驗用stats.ttest_1samp函數,如下:
from scipy import stats
import numpy as np
#單樣本t檢驗
sample=[809, 1250, 689, 1541, 995, 1234, 1024, 920, 777, 2510,
2301, 540, 850, 895, 1024, 1000, 1025, 863, 875, 1105]
sample = np.asarray(sample)
m = np.mean(sample)
print("樣本均值:",m)
#單樣本檢驗用stats.ttest_1samp
r = stats.ttest_1samp(sample, 1200, axis=0)
print("statistic:", r.__getattribute__("statistic"))
print("pvalue:", r.__getattribute__("pvalue"))
結果:
樣本均值: 1111.35
statistic: -0.8043067483882222
pvalue: 0.4311691484589055
在這裏統計量statistic<0,說明樣本均值小於指定均值1200,實際上是1111.35。但我們並不能因爲1111.35<1200而去認定點火器平均壽命低於1200。我們應看pvalue: 0.4311691484589055,這裏說明在這個樣本下,我們有0.4311691484589055>0.05的概率認爲產品的壽命均值爲1200。同樣我們不能拒絕產品的壽命均值>1200。也就是我們接受產品是合格的。
二、兩個獨立樣本t檢驗
示例:現市場上有2種蓄電池,爲研究哪種蓄電池比較好,分別抽取兩種蓄電池若干件,測試其續航時間,結果如下(單位:h):
A型蓄電池 | 5.5 5.6 6.3 4.6 5.3 5.0 6.2 5.8 5.1 5.2 5.9 |
B型蓄電池 | 3.8 4.3 4.2 4.0 4.9 4.5 5.2 4.8 4.5 3.9 3.7 4.6 |
根據抽樣結果分析兩種蓄電池續航是否有顯著差異(alpha=0.1)。
獨立2個樣本t檢驗用stats.ttest_ind函數,如下:
from scipy import stats
import numpy as np
#獨立2個樣本t檢驗
sample1=[5.5, 5.6, 6.3, 4.6, 5.3, 5.0, 6.2, 5.8, 5.1, 5.2, 5.9]
sample2=[3.8, 4.3, 4.2, 4.0, 4.9, 4.5, 5.2, 4.8, 4.5, 3.9, 3.7, 4.6]
sample1 = np.asarray(sample1)
sample2 = np.asarray(sample2)
r = stats.ttest_ind(sample1, sample2)
print("statistic:", r.__getattribute__("statistic"))
print("pvalue:", r.__getattribute__("pvalue"))
結果:
statistic: 5.484377451921326
pvalue: 1.9279192737974777e-05
由statistic=5.484377451921326大於0可以知道在樣本統計上A型的均值比B型的大,事實上樣本A均值爲5.5,樣本B的均值爲4.37。另外pvalue=1.9279192737974777e-05遠小於0.1,由此我們拒絕A的均值與B的均值相等,也就是說A型蓄電池的續航均值明顯比B型蓄電池好,即A型蓄電池比B型蓄電池要好。
這裏我們假設兩個總體有方差齊性,當不確定兩總體方差是否相等時,可以先利用levene檢驗,檢驗兩總體是否具有方差齊性。
r = stats.levene(sample1,sample2)
print(r)
結果爲LeveneResult(statistic=0.09936227113762626, pvalue=0.7557072345826116),pvalue>0.05說明具有方差齊性,假如不具有方差齊性,進行t檢驗時需要加上參數equal_val
並設定爲False。如下:
stats.ttest_ind(sample1, sample2, equal_var=False)
三、成對樣本t檢驗
成對樣本t檢驗,是針對成對的數據做的檢驗,比如比較兩種測量方法的差異,每對數據是針對同一個對象的測量。
示例:現有2種血壓計,爲研究其測量性能是否有顯著差異,分別使用這兩種血壓計測量15個人的血壓值,結果如下:
受測人編號 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
血壓計A | 68 | 85 | 123 | 74 | 88 | 128 | 63 | 115 | 110 | 93 | 99 | 75 | 89 | 68 | 140 |
血壓計B | 60 | 88 | 132 | 70 | 95 | 115 | 74 | 115 | 121 | 86 | 96 | 71 | 96 | 70 | 143 |
這裏數據都是成對的,使用stats.ttest_rel進行成對數據的t檢驗。
from scipy import stats
import numpy as np
#成對樣本t檢驗
sample1=[68, 85, 123, 74, 88, 128, 63, 115, 110, 93, 99, 75, 89, 68, 140]
sample2=[60, 88, 132, 70, 95, 115, 74, 115, 121, 86, 96, 71, 96, 70, 143]
sample1 = np.asarray(sample1)
sample2 = np.asarray(sample2)
r = stats.ttest_rel(sample1,sample2)
print("statistic:", r.__getattribute__("statistic"))
print("pvalue:", r.__getattribute__("pvalue"))
結果:
statistic: -0.492910604649229
pvalue: 0.6297167086230713
從結果上看,statistic<0,說明在樣本均值上看血壓計A的測量結果比血壓計B略低。但pvalue=0.6297167086230713遠大於0.05,我們並不能拒絕兩種血壓計測量均值相等,即我們認爲2種血壓計的測量性能並沒有顯著差異。