t检验(Student's t test),用于通过小样本(样本容量n < 30)对总体均值水平进行无差异推断。
t检验要求样本不能超过两组,且每组样本总体服从正态分布(对于三组以上样本的,要用方差分析,其他文章详述)。因此使用t检验前需要对所有样本分别进行正态分布检验。如果有不服从正态分布的情况,可以考虑使用MannWhitney检验和Wilcoxon检验。
需要说明的是t检验还分为单样本t检验、独立双样本t检验和配对双样本t检验,适用条件也各有不同,以下分别举例介绍。
1.单样本t检验
用于判断总体是否与既定均值无差异,可以通俗理解为总体均值是否与既定值相等。如下例
某产品合格率经10轮检测,保持在如下水平,试问可否认为其合格率为96.5%?
合格率(%):97.6 93.5 98.7 95.4 95.2 97.7 96.1 94.6 96.8 95.7
首先,使用scipy.stats.normaltest对样本进行正态分布检验.
from scipy import stats
import numpy as np
X=np.array([97.6,93.5, 98.7 ,95.4 ,95.2 ,97.7, 96.1 ,94.6 ,96.8 ,95.7])
stats.normaltest(X)
结果:NormaltestResult(statistic=0.07878377023988445, pvalue=0.9613738871946388)。p>0.05,样本通过正态分布检验。
然后,使用sstats.ttest_1samp进行单样本t检验。
stats.ttest_1samp(X,96.5)
结果:Ttest_1sampResult(statistic=-0.7396549082121191, pvalue=0.47835758603283807)。p>0.05,接受总体均值为96.5%的假设。
2.独立双样本t检验
用于判断两组独立样本在总体上是否均值无差异,可以通俗理解为两组独立采样的样本所代表的总体均值是否相等。
所谓独立样本指的是:对不同受试对象进行采样,如对男性和女性的身高进行采样。采样方法可以相同,也可以不同。
独立双样本t检验还要求两组样本的总体方差齐性(也就是无差异),如果方差不齐,要使用Welch t检验(Welch's t-test)。
首先我们先来看满足独立双样本t检验的例子。
某产品两条生产线的合格率经10轮检测,保持在如下水平,试问可否认为其合格率相同?
生产线1合格率(%):97.6 93.5 98.7 95.4 95.2 97.7 96.1 94.6 96.8 95.7
生产线2合格率(%):97.2 94.2 97.8 94.9 96.3 98.7 96.5 95.6 97.1 96.2
以下为示例代码
X1=np.array([97.6,93.5, 98.7 ,95.4 ,95.2 ,97.7, 96.1 ,94.6 ,96.8 ,95.7])
X2=np.array([97.2,94.2,97.8,94.9,96.3,98.7,96.5,95.6,97.1,96.2])
#正态分布检验
stats.normaltest(X1),stats.normaltest(X2)
#方差齐性检验
stats.levene(X1,X2)
#独立双样本t检验
stats.ttest_ind(X1,X2)
上述各项检验p值均大于0.05,因此可以接受两条生产线产品质量无差异的假设。
如果X2=[87.2,92.2,97.8,97.9,96.3,98.7,86.5,95.6,97.1,86.2],则两组样本无法通过方差齐性检验(p=0.03878,小于显著性水平a=0.05)。于是,我们采用Welch t检验。
#equal_var参数值为False时,ttest_ind执行Welch t检验检验
stats.ttest_ind(X1,X2,equal_var=False)
检验结果为:Ttest_indResult(statistic=1.5289576830456144, pvalue=0.15523450660981364)。可以接受两个生产线产品质量相同的假设。
3.配对双样本t检验
用于判断两组配对样本在总体上是否均值无差异。所谓配对样本指的是:对同一受试对象进行采样,如一个人在两个不同时间点的血压值。
配对双样本t检验也要求两组样本的总体方差齐性,同时要求样本容量相同且两个样本各数值的顺序与采样顺序一致。
配对双样本t检验的函数是stats.ttest_rel(X1,X2),使用方法与独立双样本t检验相同,不再赘述。
以上介绍的是均值无差异推断。这种推断是双侧的(two-sided),在实际应用中,我们还会遇到单侧检验(one-sided)的情况,即判断不同总体的均值大小。例如判断第一条生产线的产品质量是否优于第二条生产线。
无论是独立双样本t检验还是配对双样本t检验均支持单侧检验,只需要在检验函数中加入alternative参数即可。该参数的取值为“less”或"greater"。如下例
#X1与X2服从正态分布但方差不齐,使用Welch t检验(单侧)
X1=np.array([97.6,93.5, 98.7 ,95.4 ,95.2 ,97.7, 96.1 ,94.6 ,96.8 ,95.7])
X2=np.array([87.2,92.2,97.8,97.9,96.3,98.7,86.5,95.6,93.1,86.2])
stats.ttest_ind(X1,X2,alternative="less",equal_var=False)
结果:Ttest_indResult(statistic=1.81631548017011, pvalue=0.9514575126271494)。
该结果如何解读呢?是,还是
?这是很多初学者比较困惑的地方。这里作出重要解释:
假设检验的基本思想是“小概率事件”原理,其统计推断方法是带有某种概率性质的反证法。换句话说,我想得到A这个结果,我需要做得事是证明
不成立。也就是说
零假设(null hypothesis,无效假设)
备择假设(alternative hypothesis,想要的结果)
上述检验的备择检验H1是"less",所以零假设H0就是"greater"。由于p>0.05,所以接受零假设,即。
补充一点,如果样本超过30时,使用t检验就不合适了,我们应该使用z检验,获得更加可靠的结果,该函数是statsmodels.stats.weightstats的 ztest函数,其参数包括:
- x1,x2(可选):样本集合
- value:待检验均值(如果只有x1)或均值差(
,如果x1,x2都提供)
- alternative:检验方向,默认two-sided,还有larger和smaller(大多数函数用greater和less)
如上例如果我们使用z检验,则可以写成sw.ztest(X1,X2,alternative='smaller')