SCipy简介及安装
Scipy库的简介
Scipy高级科学计算库:和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算、统计分析,所以可以说是基于Numpy之上了。Scipy有很多子模块可以应对不同的应用,例如插值运算,优化算法等等。SciPy则是在NumPy的基础上构建的更为强大,应用领域也更为广泛的科学计算包。正是出于这个原因,SciPy需要依赖NumPy的支持进行安装和运行。
SciPy是世界上著名的Python开源科学计算库,建立在Numpy之上。它增加的功能包括数值积分、最优化、统计和一些专用函数。SciPy函数库在NumPy库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。
Scipy库的安装
pip install scipy
Student t-test
英国统计学家W. S. Gosset于1908年以笔名“Student”发表论文,证明t分布服从自由度v=n-1的t分布,即
t分布,又称Student t分布(Student‘s t distribution),记作t ~ t(v)。t分布十分有用,它是总体均数的区间估计和假设检验的理论基础.
t-test
推断一般建立在一定的假设的基础之上,t检验所需要的假设基础:1.样本必须随机选择2.样本相互独立3.获得样本的总体正态
推断单个总体的均值。检验统计量t 为
图5 检验统计量t
假设检验的过程:
1 作出假设,一般把想要reject的情况作为零假设。
2 想要接受的情况作为备择假设(单边和双边的备择假设不同)。
3 计算检验统计量t。
4 根据所要求的(已知的)置信系数α以及自由度查表确定tα等临界值。
5 如果检验统计量落入了临界值之外,则拒绝零假设,结论发生错误的概率为α。否则没有足够的理由拒绝零假设。
用scipy直接做假设检验
例子
在10块地上同时种植甲乙两种作物,其产量服从正态分布,并且方差相同。结果计算得x=30.97,y=21.79,Sx=26.7,Sy=12.1。试问这两种作物的产量有无明显差异?
这是一个典型的双样本,正态同方差的假设检验,判断两个正态分布的期望是否相同。H0:μ1=μ2,H1:μ1≠μ2 ;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库函数要求输入的样本标准差是总体标准差的无偏统计量,也就是我们常说的“修正样本方差”和“修正样本标准差”。
修正样本方差定义为:
所以修正样本标准差和原始样本的标准差的关系是:
Python程序如下:
# two sample student t testimport numpy as npfrom scipy import statsmean1 = 30.97mean2 = 21.79std1 = 26.7std2 = 12.1nobs1 = 10nobs2 = 10modified_std1 = np.sqrt(np.float32(nobs1)/np.float32(nobs1-1)) * std1modified_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)
结果如图:
假设我们显著性水平α=0.05α=0.05,pvalue显著的大于0.05,所以我们不能拒绝原假设,也就是认为两种作物的产量没有显著差异。
手工推导进行t分布假设检验
下面,为了进一步熟悉student t-test的统计量,我们手工来推导一下检验结果,不使用scipy提供的ttest_ind_from_stats的现成方法。
假设两个总体X, Y, X∼N(a1,σ2),Y∼N(a2,σ2)X∼N(a1,σ2),Y∼N(a2,σ2)。因为本例子中两种作物总体的方差是相同的,所以统一使用δ表示。m, n分别是X, Y的样本数。
通过抽样分布定理我们可以构造t分布统计量
注意这个统计量里的方差不是样本的修正方差,它是总体方差σ2的有偏估计量。这个公式的得来如果不清楚的同学,可以查看一下数理统计的教材,正态分布的导出分布一节都会有讲述,基本思路是用标准正态变量除去一个χ2分布变量来构造t分布统计量。
有了(5)式我们就可以自己计算t值了。这里m=n=10:
第二部分代码
#t值的计算t = 3*(mean1 - mean2) / np.sqrt(std1**2 + std2**2)print(t)
结果如图:
可以看到t值和scipy给出的是一样的。接下来计算p-value。
注意t-test是two-side的, 而这里,我们的mean1 是大于mean2的,所以这里的t值是右侧的,利用t分布函数算出的结果要被1减去后再乘以2才是p-value。
第三部分代码:
#P值的计算p_value=((1 - stats.t.cdf(t, 18))*2)print (p_value)
结果如图
这里我们又利用了scipy提供的t分布累积分布计算函数t.cdf。自由度10 + 10 - 2 = 18。
得出来的p-value也和scipy计算的一致。
参考文献
1.https://blog.csdn.net/qq_41185868/article/details/79682406
2.https://www.jianshu.com/p/a2f7265a9d7f
3.https://zhuanlan.zhihu.com/p/47916928
4.https://blog.csdn.net/myairforce1/article/details/78970203
本期作者:冯玉全
本期编辑:刘昊昂

