基于Python的t检验实践篇 (1)

基于Python的T检验

本文讨论的T检验分为三类,分别是:

  1. 单样本t检验,适用于对一组数据的均值进行检验
  2. 配对的双样本T检验,适用于配对的两组数据之间的差异进行检验
  3. 独立双样本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检验用于比较两个正态分布的均值是否具有显著差异:

  1. 方差相等的t检验,统计量如下图,自由度为 n 1 + n 2 − 2 n1+n2-2 n1+n22
    在这里插入图片描述
  2. 方差不等的t检验统计量如下图, 也称welch方法
    在这里插入图片描述
    自由度为
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wYagY009-1590511098056)(./df.png)]
# 这里我们只举个同方差的例子

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检验

  1. 推论统计分析报告:描述统计+推论统计
  2. 推论统计分析内容:假设检验+置信区间+效应量
  3. 假设检验步骤:①问题是什么;②证据是什么;③判断标准是什么;④得出结论
  4. 确定问题首先根据实际情况,定义互为相反的零假设和备择假设
  5. 根据数据情况,判定属于哪种检验类型,见下图
  6. 判断均值的抽样分布为哪种分布(大样本n>30正态分布;小样本n<30且总体正态,t分布)
  7. 确定检验方向:左尾?右尾?双尾?
  8. 计算零假设成立时,出现样本均值的概率:p值
  9. p值与显著性水平 α作比较,得出统计显著性结论
  10. 计算置信度95%的置信区间
  11. 通过效应量判断效果显著性(有实际意义)
  12. 来自两个独立总体的样本,在t检验之前,先进行方差齐性检验。

注意,t检验的前提数据近似正态分布

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对Python中的t检验,有多种方法可以进行实现。首先,可以使用Scipy库中的ttest_ind方法,该方法接收两个数据样本,并返回一个t统计量和相应的p值。以下是一个示例代码: ```python # 导入numpy和scipy import numpy as np from scipy import stats # 创建两个工厂的虚拟数据样本 factory_a = np.full(30, 355) + np.random.normal(0, 3, 30) factory_b = np.full(30, 353) + np.random.normal(0, 3, 30) # 运行双样本t检验来比较两个样本 tstat, pval = stats.ttest_ind(a=factory_a, b=factory_b, alternative="two-sided") # 显示结果 print("t-stat: {:.2f} pval: {:.4f}".format(tstat, pval)) ``` 输出结果类似于: ``` t-stat: 3.15 pval: 0.0026 ``` 另外,还可以使用Scipy库中的stats模块的ttest_1samp方法进行单样本t检验。以下是一个示例代码: ```python # 导入numpy和scipy import numpy as np from scipy import stats # 创建两个工厂的虚拟数据样本 factory_a = np.full(30, 355) + np.random.normal(0, 3, 30) factory_b = np.full(30, 353) + np.random.normal(0, 3, 30) # 运行每个样本的单样本t检验 a_stat, a_pval = stats.ttest_1samp(a=factory_a, popmean=355, alternative='two-sided') b_stat, b_pval = stats.ttest_1samp(a=factory_b, popmean=355, alternative='two-sided') # 显示结果 p<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [t 检验的 3 种常用方法及在 Python 中使用样例](https://blog.csdn.net/m0_46510245/article/details/122575617)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值