使用Python scipy做统计检验--Student t-test

我们使用下面的一个简单的例子来熟悉Student t检验的方法。

在10块地上同时种植甲乙两种作物,其产量服从正态分布,并且方差相同。结果计算得 x=30.97,y=21.79,Sx=26.7,Sy=12.1 。试问这两种作物的产量有无明显差异?

这是一个典型的双样本,正态同方差的假设检验,判断两个正态分布的期望是否相同。 H0:μ1=μ2,H1:μ1μ2

使用scipy直接做假设检验

Scipy提供了两个方法解决双样本同方差的Student t-test问题:
1. scipy.stats.ttest_ind
2. scipy.stats.ttest_ind_from_stats
第一个方法要求输入原始样本数据,第二个方法直接输入样本的描述统计量(均值,标准差,样本数)即可。那么这里我们直接使用第二方法。

需要注意的是,Scipy.stats库函数要求输入的样本标准差是总体标准差的无偏统计量,也就是我们常说的“修正样本方差”和“修正样本标准差”。

S2=1nΣni=1(xix)2(1)

修正样本方差定义为:
S2^=1n1Σni=1(xix)2(2)

所以修正样本标准差和原始样本的标准差的关系是:
S=n1nŝ (3)

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,所以我们不能拒绝原假设,也就是认为两种作物的产量没有显著差异。

手工推导进行t分布假设检验

下面,为了进一步熟悉student t-test的统计量,我们手工来推导一下检验结果,不使用scipy提供的ttest_ind_from_stats的现成方法。

假设两个总体X, Y, XN(a1,σ2),YN(a2,σ2) 。因为本例子中两种作物总体的方差是相同的,所以统一使用 σ 表示。m, n分别是X, Y的样本数。

x=1mΣm1xi,y=1nΣn1yi

S21=1mΣmi=1(xix)2,S22=1nΣni=1(yiy)2(4)

通过抽样分布定理我们可以构造t分布统计量
T=xy(a1a2)mS21+nS22mn(m+n2)m+nt(m+n2)(5)

注意这个统计量里的方差不是样本的修正方差,它是总体方差 σ2 的有偏估计量。这个公式的得来如果不清楚的同学,可以查看一下数理统计的教材,正态分布的导出分布一节都会有讲述,基本思路是用标准正态变量除去一个 χ2 分布变量来构造t分布统计量。

有了(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计算的一致。

你可能感兴趣的:(数据分析)