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种血压计的测量性能并没有显著差异。
author:
蓝何忠
email:
lanhezhong@163.com