我们使用下面的一个简单的例子来熟悉Student t检验的方法。
在10块地上同时种植甲乙两种作物,其产量服从正态分布,并且方差相同。结果计算得 x⎯⎯=30.97,y⎯⎯=21.79,Sx=26.7,Sy=12.1 。试问这两种作物的产量有无明显差异?
这是一个典型的双样本,正态同方差的假设检验,判断两个正态分布的期望是否相同。 H0:μ1=μ2,H1:μ1≠μ2 。
Scipy提供了两个方法解决双样本同方差的Student t-test问题:
1. scipy.stats.ttest_ind
2. scipy.stats.ttest_ind_from_stats
第一个方法要求输入原始样本数据,第二个方法直接输入样本的描述统计量(均值,标准差,样本数)即可。那么这里我们直接使用第二方法。
需要注意的是,Scipy.stats库函数要求输入的样本标准差是总体标准差的无偏统计量,也就是我们常说的“修正样本方差”和“修正样本标准差”。
Python程序如下:
# two sample student t test
import numpy as np
from scipy import stats
mean1 = 30.97
mean2 = 21.79
std1 = 26.7
std2 = 12.1
nobs1 = 10
nobs2 = 10
modified_std1 = np.sqrt(np.float32(nobs1)/np.float32(nobs1-1)) * std1
modified_std2 = np.sqrt(np.float32(nobs2)/np.float32(nobs2-1)) * std2
(statistic, pvalue) = stats.ttest_ind_from_stats(mean1=mean1, std1=modified_std1, nobs1=10, mean2=mean2, std2=modified_std2, nobs2=10)
print "t statistic is: ", statistic
print "pvalue is: ", pvalue
得到结果:
t statistic is: 0.939488657335
pvalue is: 0.359917216785
假设我们显著性水平 α=0.05 ,pvalue显著的大于0.05,所以我们不能拒绝原假设,也就是认为两种作物的产量没有显著差异。
下面,为了进一步熟悉student t-test的统计量,我们手工来推导一下检验结果,不使用scipy提供的ttest_ind_from_stats的现成方法。
假设两个总体X, Y, X∼N(a1,σ2),Y∼N(a2,σ2) 。因为本例子中两种作物总体的方差是相同的,所以统一使用 σ 表示。m, n分别是X, Y的样本数。
有了(5)式我们就可以自己计算t值了。这里m=n=10:
t = 3*(mean1 - mean2) / np.sqrt(std1**2 + std2**2)
print "t is: ", t
t is: 0.939488633311
可以看到t值和scipy给出的是一样的。接下来计算p-value。
注意t-test是two-side的, 而这里,我们的mean1 是大于mean2的,所以这里的t值是右侧的,利用t分布函数算出的结果要被1减去后再乘以2才是p-value。
print (1 - stats.t.cdf(t, 18))*2
0.359917228781
这里我们又利用了scipy提供的t分布累积分布计算函数t.cdf。自由度10 + 10 - 2 = 18。
得出来的p-value也和scipy计算的一致。