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

本文通过一个实例介绍如何使用Python的scipy库进行Student t检验,比较两种作物产量是否存在显著差异。首先,通过scipy的ttest_ind_from_stats方法直接计算假设检验,然后手动推导t值和p-value,验证了scipy计算结果的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们使用下面的一个简单的例子来熟悉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)
<think>我们正在讨论统计学中的T检验(T-test)。T检验是一种假设检验方法,用于确定两组数据之间是否存在显著差异。它基于t分布(Student's t-distribution),通常用于样本量较小(例如n<30)且总体标准差未知的情况。 T检验主要有三种类型: 1. 独立样本T检验(Independent Samples T-test):比较两组独立样本的均值。 2. 配对样本T检验(Paired Samples T-test):比较同一组受试者在两个不同时间点或条件下的均值。 3. 单样本T检验(One Sample T-test):比较样本均值与已知总体均值。 下面我将使用Python代码示例来展示如何执行这三种T检验。我们将使用`scipy.stats`模中的`ttest_ind`(独立样本T检验)、`ttest_rel`(配对样本T检验)和`ttest_1samp`(单样本T检验)。 ### 1. 独立样本T检验 假设我们有两组独立的数据,我们想检验这两组数据的均值是否存在显著差异。 ```python import numpy as np from scipy import stats # 生成两组数据 np.random.seed(42) # 保证可重复性 group1 = np.random.normal(loc=5.0, scale=1.0, size=30) group2 = np.random.normal(loc=5.5, scale=1.0, size=30) # 执行独立样本T检验 t_stat, p_value = stats.ttest_ind(group1, group2) print(f"独立样本T检验结果:t统计量 = {t_stat:.4f}, p值 = {p_value:.4f}") ``` ### 2. 配对样本T检验 假设我们有一组受试者在两个不同条件下的数据,我们想检验这两个条件下的均值是否存在显著差异。 ```python # 生成配对数据(例如,同一个受试者在处理前和处理后) before = np.random.normal(loc=5.0, scale=1.0, size=30) after = np.random.normal(loc=5.5, scale=1.0, size=30) # 假设处理后有所提高 # 执行配对样本T检验 t_stat, p_value = stats.ttest_rel(before, after) print(f"配对样本T检验结果:t统计量 = {t_stat:.4f}, p值 = {p_value:.4f}") ``` ### 3. 单样本T检验 假设我们有一组数据,我们想检验这组数据的均值是否与某个已知的总体均值(例如,理论值或标准值)有显著差异。 ```python # 生成一组数据 data = np.random.normal(loc=5.0, scale=1.0, size=30) # 已知的总体均值 pop_mean = 5.5 # 执行单样本T检验 t_stat, p_value = stats.ttest_1samp(data, pop_mean) print(f"单样本T检验结果:t统计量 = {t_stat:.4f}, p值 = {p_value:.4f}") ``` ### 解释 - **t统计量(t-statistic)**:表示组间差异与组内差异的比率。绝对值越大,差异越显著。 - **p值(p-value)**:表示观察到的差异由随机误差引起的概率。通常,如果p值小于0.05,我们拒绝零假设(即认为两组均值存在显著差异)。 ### 注意事项 - 独立样本T检验要求两组数据独立且方差齐性(可以使用Levene检验或Bartlett检验来检查方差齐性)。 - 配对样本T检验要求数据是配对的(即同一受试者的两次测量),且差值近似正态分布- 单样本T检验要求数据近似正态分布。 如果数据不满足正态性假设,可以考虑使用非参数检验,如Mann-Whitney U检验(独立样本)、Wilcoxon符号秩检验(配对样本)等。 §§相关问题§§: 1. T检验和Z检验有什么区别? 2. 如何检验两组数据的方差齐性? 3. 如果数据不满足正态分布,应该使用什么检验方法? 4. 在Python中如何使用Mann-Whitney U检验?</think>T-test(T检验)是一种统计学方法,用于检验两组数据的均值是否存在显著差异。它基于**t分布**(一种类似正态分布但尾部更厚的概率分布),常用于样本量较小(n < 30)或总体标准差未知的情况。 ### T检验的核心类型 1. **独立样本T检验** - 比较**两组独立样本**的均值(如实验组 vs 对照组) - 假设:数据独立、近似正态分布方差齐性(可通过Levene检验验证) 2. **配对样本T检验** - 比较**同一组样本在不同条件**下的均值(如用药前 vs 用药后) - 假设:差值近似正态分布 3. **单样本T检验** - 检验**单个样本均值**是否等于目标值(如检验某班级平均分是否为75分) --- ### Python代码示例 使用`scipy.stats`进行T检验: #### 1. 独立样本T检验 ```python from scipy import stats import numpy as np # 生成两组独立数据(如A/B测试结果) group1 = np.array([28, 30, 27, 25, 32]) # 实验组 group2 = np.array([22, 24, 26, 20, 18]) # 对照组 # 执行独立样本T检验 t_stat, p_value = stats.ttest_ind(group1, group2) print(f"t统计量 = {t_stat:.4f}") print(f"p值 = {p_value:.4f}") # 判断显著性(α=0.05) if p_value < 0.05: print("两组均值存在显著差异 (p < 0.05)") else: print("两组均值无显著差异") ``` #### 2. 配对样本T检验 ```python # 同一组受试者在两种条件下的数据(如治疗前后) before = np.array([120, 125, 130, 115, 110]) # 治疗前 after = np.array([115, 120, 125, 110, 105]) # 治疗后 # 执行配对T检验 t_stat, p_value = stats.ttest_rel(before, after) print(f"配对t值 = {t_stat:.4f}, p值 = {p_value:.4f}") ``` #### 3. 单样本T检验 ```python sample = np.array([72, 75, 68, 70, 78]) # 样本数据 pop_mean = 75 # 目标总体均值 # 检验样本均值是否等于75 t_stat, p_value = stats.ttest_1samp(sample, pop_mean) print(f"t值 = {t_stat:.4f}, p值 = {p_value:.4f}") ``` --- ### 结果解读 - **t统计量**:衡量组间差异与组内变异的比率,绝对值越大差异越显著 - **p值**: - p < 0.05 → 拒绝原假设(H₀),认为存在显著差异 - p ≥ 0.05 → 无法拒绝原假设 - **置信区间**:通常报告95% CI(如`stats.t.interval(0.95, df, loc, scale)`) --- ### 关键假设验证 1. **正态性检验**(Shapiro-Wilk): ```python _, p_norm = stats.shapiro(group1) if p_norm > 0.05: print("数据符合正态分布") ``` 2. **方差齐性检验**(Levene): ```python _, p_var = stats.levene(group1, group2) if p_var > 0.05: print("方差齐性成立") ``` > 📌 若不满足假设: > - 非正态数据 → 使用**Mann-Whitney U检验**(非参数替代) > - 方差不齐 → 设置`stats.ttest_ind(..., equal_var=False)`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值