统计学中有很多非常经典的样本检验方法,在具体的使用场景中我们要依据具体的情况来选择合适的样本检验方法以便于得到正确的实验结果。
最近正好的用到了T检验,这里简单贴一下百度百科中对于T检验的定义和介绍:
从上面的介绍中我们不难发现:T检验是用于比较两个样本平均数的差异性的,当然它有一个适用性的前提约束条件就是样本的分布为正态分布,这就要求我们在使用该方法的时候需要先对样本的分布等情况做一个检验,python的Scipy模块中已经封装好了相应地函数方法,已经能够满足我们的需求,在这里简单进行实践,具体内容如下:
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
'''
__Author__:沂水寒城
功能:python 实现独立样本检验
'''
import sys
import xlrd
import numpy as np
import scipy.stats as stats
import scipy.optimize as opt
reload(sys)
sys.setdefaultencoding("utf-8")
def readOneExcelData(datapath='before/BMI.xls'):
'''
读取单个 Excel 中的数据
获取整行和整列的值(返回数组)
table.row_values(i)
table.col_values(i)
'''
workbook=xlrd.open_workbook(datapath,'rb')
table=workbook.sheets()[0]
row_num,col_num=table.nrows,table.ncols
data_list=[]
for i in range(1,row_num): #去除第一行的标题
data_list.append(table.row_values(i)[0])
print 'data_list_length: ',len(data_list)
one,two=data_list[0:36],data_list[36:]
print 'one_length: ',len(one)
print 'two_length: ',len(two)
return one,two
def leveneTest(one,two):
'''
当不确定两总体方差是否相等时,应先利用levene检验,检验两总体是否具有方差齐性
p值远大于0.05,认为两总体具有方差齐性
如果两总体不具有方差齐性,需要将equal_val参数设定为“False”
需注意的情况:
如果两总体具有方差齐性,错将equal_var设为False,p值变大
两总体方差不等时,若没有将equal_var参数设定为False,则函数会默认equal_var为True,这样会低估p值
'''
res=stats.levene(one,two)
statistic,pvalue=res
print 'statistic: ',statistic
print 'pvalue: ',pvalue
return statistic,pvalue
def T_TestDouble(one,two):
'''
两独立样本t检验-ttest_ind
'''
statistic,pvalue=leveneTest(one,two)
if pvalue>0.05:
T_statistic,T_pvalue=stats.ttest_ind(one,two,equal_var=True)
else:
T_statistic,T_pvalue=stats.ttest_ind(one,two,equal_var=False)
print '=*-'*30
print 'T_statistic: ',T_statistic
print 'T_pvalue: ',T_pvalue
if __name__=='__main__':
one,two=readOneExcelData(datapath='before/50m.xls')
T_TestDouble(one,two)
one,two=readOneExcelData(datapath='before/yangwo.xls')
T_TestDouble(one,two)
结果如下:
data_list_length: 72
one_length: 36
two_length: 36
statistic: 0.6963738019852161
pvalue: 0.4068437373713307
=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-
T_statistic: -0.27800065992812495
T_pvalue: 0.781831335343451
data_list_length: 72
one_length: 36
two_length: 36
statistic: 2.233199944804748
pvalue: 0.13956829000621795
=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-
T_statistic: 0.08430397488762228
T_pvalue: 0.9330553926737493
这里的结果中我们只需要主要关注P值就可以了,P<0.05认为有显著性差异,P>0.05认为无显著性差异。