基于Python的T检验
本文讨论的T检验分为三类,分别是:
- 单样本t检验,适用于对一组数据的均值进行检验
- 配对的双样本T检验,适用于配对的两组数据之间的差异进行检验
- 独立双样本T检验,适用于两组两组独立数据的差异,又可以进一步分为等方差的独立样本t检验和异方差的独立样本T检验
本文介绍3种T检验的使用方法,最后介绍T检验的一般报告格式
单样本T检验
单样本t检验用于比较单列正态分布与给定均值是否具有显著差异,自由度为n-1
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
data = np.random.randn(25)+3 # 待检验数据
popmean = 2 # 确定data的均值是否与 popmean具有显著差异
print('mean: ', np.mean(data))
print('std: ', np.std(data, ddof=1))
print('单样本T检验')
t, p = stats.ttest_1samp(data, popmean) # 进行单样本t检验
print('p = ', p)
print('t =', t)
if(p<0.05):
print('具有显著差异')
else:
print('没有明确的证据说明二者没有差异')
# 单样本检验之后还要确定置信区间
ddof = len(data)-1
std = stats.sem(data)
alpha = 0.05
t_ci = stats.t.ppf(1-alpha/2, ddof)
mu = np.mean(data)
print('置信区间: ', [mu-t_ci*std, mu+t_ci*std])
# 评价效应
effect = abs(mu-popmean)/np.std(data, ddof=1)
print('效应: ', effect)
mean: 3.029261856625774
std: 1.1196413921970838
单样本T检验
p = 0.00011589656665491695
t = 4.596390700624433
具有显著差异
置信区间: [2.5670966048468227, 3.491427108404725]
效应: 0.9192781401248865
配对样本T检验
所谓配对样本的T检验,是指参与对比的两列数据都是满足正态分布,而且两列数据之间存在一一对应关系。要想判断这种数据序列之间的差异是否显著,就可以使用配对样本T检验
data1 = np.random.randn(25) # 数据1
data2 = data1 + np.random.randn(25)+2 # 数据2
# 配对样本t检验用于表示两组数据是否具有显著差异
t, p = stats.ttest_rel(data1, data2) # 配对样本的t检验
print('p=', p)
print('t=', t)
t2, p2 = stats.ttest_1samp(data1-data2, 0) # 配对样本的t检验与两个样本取差之后进行单样本检验的结果是一样的
print('p2=', p2)
print('t2=', t2)
# 后续的置信区间等都是一致的,不再赘述
p= 9.93902851019286e-14
t= -15.06093595974834
p2= 9.93902851019286e-14
t2= -15.06093595974834
独立样本t检验
独立样本t检验用于比较两个正态分布的均值是否具有显著差异:
- 方差相等的t检验,统计量如下图,自由度为
n
1
+
n
2
−
2
n1+n2-2
n1+n2−2
- 方差不等的t检验统计量如下图, 也称welch方法
自由度为
# 这里我们只举个同方差的例子
data1 = np.random.randn(25)*2
data2 = np.random.randn(25)*2 + 3
# 首先进行方差齐性的检验
n1 = len(data1)
n2 = len(data2)
var1 = np.var(data1)
var2 = np.var(data2)
df1 = n1-1
df2 = n2-1
if(var1>var2):
F = var2/var1
else:
F = var1/var2
if(var1>var2):
p = stats.f.cdf(F, df2, df1)
else:
p = stats.f.cdf(F, df1, df2)
alpha = 0.05
if(p<alpha):
print('拒绝空假设,方差不同')
else:
print('无法拒绝空假设,方差相同')
# 此外,我们还有其他更简便的方法处理方差齐性
stats.bartlett(data1, data2) # bartlett检验
stats.fligner(data1, data2) # 非参数检验
stats.levene(data1, data2) # levene检验
# 确定了两总体方差相同,则进行检验
t, p = stats.ttest_ind(data1, data2, equal_var=True)
if(p<alpha):
print('拒绝原假设,存在差异')
else:
print('没有足够的证据表明存在差异')
无法拒绝空假设,方差相同
拒绝原假设,存在差异
sem = np.sqrt(np.var(data1)/n1+np.var(data2)/n2)
t_ci = stats.t.ppf(1-alpha/2, n1+n2-2)
sample_mean = np.mean(data1)-np.mean(data2)
print('置信区间: ', sample_mean-t_ci*sem, sample_mean+t_ci*sem)
置信区间: -5.120814280507316 -2.914514107733439
# 计算效用
# 混合标准差
sp = np.sqrt((np.var(data1)*(n1-1)+np.var(data2)*(n2-1))/(n1+n2-2))
effect = sample_mean/sp
print(effect)
-2.0711769775017146
总结部分参考:https://zhuanlan.zhihu.com/p/37265478
本文介绍了统计学的重头戏:假设检验的实现方法,重点介绍t检验
- 推论统计分析报告:描述统计+推论统计
- 推论统计分析内容:假设检验+置信区间+效应量
- 假设检验步骤:①问题是什么;②证据是什么;③判断标准是什么;④得出结论
- 确定问题首先根据实际情况,定义互为相反的零假设和备择假设
- 根据数据情况,判定属于哪种检验类型,见下图
- 判断均值的抽样分布为哪种分布(大样本n>30正态分布;小样本n<30且总体正态,t分布)
- 确定检验方向:左尾?右尾?双尾?
- 计算零假设成立时,出现样本均值的概率:p值
- p值与显著性水平 α作比较,得出统计显著性结论
- 计算置信度95%的置信区间
- 通过效应量判断效果显著性(有实际意义)
- 来自两个独立总体的样本,在t检验之前,先进行方差齐性检验。
注意,t检验的前提数据近似正态分布