所有文章 > AI驱动 > 统计检验——T检验分析样本间的显著性差异

统计检验——T检验分析样本间的显著性差异

什么是T检验

T检验是一种常用的假设检验方法,通过对比样本数据的均值来判断不同组别之间是否存在显著差异,包括单样本t检验、独立样本t检验和配对样本t检验

检验步骤

  • 建立假设:提出原假设(  )和备择假设(  ),通常原假设是两组样本均值相等,备择假设则是均值不相等
  • 计算T统计量:根据样本数据计算T统计量,它衡量了两组样本均值的差异性
  • 计算p值:根据T统计量和自由度(样本量减1)计算出的概率值,即  值,  值表示观察到的差异出现的可能性大小,如果  值低于显著性水平(通常设为0.05),则拒绝原假设,接受备择假设,认为两组样本均值存在显著差异
  • 做出结论:根据p值判断两组样本是否有显著差异,并进行合适的解释和推断

单样本t检验


公式

使用场景

当你有一组数据,并希望确定它们的均值是否与某个特定的值(如理论值或历史数据)是否有显著差异(案例:假设你有一个班级的考试成绩数据,你想知道这些成绩的平均分是否和历史平均分55分有显著性差异

注意事项

  • 正态性:样本数据应近似服从正态分布,对于小样本(n < 30),这个条件尤为重要
  • 独立性:样本中的观测值应是相互独立的

关于如何检验数据是否成正态分布参考文章数据分布与变化:从理论到实践指南

代码实现

import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
import warnings

# 忽略所有警告
warnings.filterwarnings('ignore')

# 生成示例数据
np.random.seed(42)
sample_data = np.random.normal(loc=50, scale=10, size=30)
test_value = 55 # 假设检验的已知值 总体均值

# 进行单样本T检验
t_stat, p_value = stats.ttest_1samp(sample_data, test_value)

# 打印结果
print(f"T统计量: {t_stat}")
print(f"p值: {p_value}")

# 将数据转换为DataFrame,便于Seaborn进行可视化
data = pd.DataFrame({
'Score': sample_data
})

# 使用Seaborn进行可视化
plt.figure(figsize=(10, 6))
sns.histplot(data['Score'], kde=True, bins=10)
plt.axvline(test_value, color='red', linestyle='--', label=f'Test Value: {test_value}')
plt.title(f'One-Sample T-Test\nT-Statistic: {t_stat:.2f}, p-value: {p_value:.4f}')
plt.xlabel('Score')
plt.ylabel('Frequency')
plt.legend()
plt.show()

生成一个样本数据集,包含30个来自正态分布的数据点,均值为50,标准差为10,假设检验的已知值设定为55,可视化一个直方图和核密度估计图的组合,展示样本数据的分布情况,图中红色虚线表示假设检验的已知值(总体均值),这里的  说明样本数据的均值与所设定的总体均值(假设值)存在显著性差异,如果加上上述案例背景就是认为当前班级的考试成绩平均分与历史平均分75分存在显著性差异

独立样本T检验

公式

使用场景

比较两个独立样本的均值是否有显著差异(案例:比较男性和女性的工资水平,看看是否存在显著差异)

注意事项

  • 正态性:两个独立样本应分别近似服从正态分布
  • 独立性:两个样本中的观测值应相互独立
  • 方差齐性:两个样本的方差应大致相等,可以使用Levene检验来检验方差齐性,如果不满足方差齐性,可以使用Welch’s T检验

代码实现

# 生成示例数据
np.random.seed(42)
group1 = np.random.normal(loc=50, scale=10, size=100)
group2 = np.random.normal(loc=55, scale=10, size=100)

# 进行独立样本T检验
t_stat, p_value = stats.ttest_ind(group1, group2)

# 打印结果
print(f"T统计量: {t_stat}")
print(f"p值: {p_value}")

# 将数据转换为DataFrame,便于Seaborn进行可视化
data = pd.DataFrame({
'Score': np.concatenate([group1, group2]),
'Group': ['Group 1'] * len(group1) + ['Group 2'] * len(group2)
})

# 使用Seaborn进行可视化
plt.figure(figsize=(10, 6))
sns.boxplot(x='Group', y='Score', data=data)
sns.stripplot(x='Group', y='Score', data=data, jitter=True, color='black', alpha=0.5)

# 添加T检验结果到图中
plt.title(f'Independent Samples T-Test\nT-Statistic: {t_stat:.2f}, p-value: {p_value:.4f}')
plt.xlabel('Group')
plt.ylabel('Score')
plt.show()

生成两个独立样本数据,分别从正态分布中抽取,每个样本有100个数据点,可视化一个箱线图和散点图的组合,清晰地展示了两个组的分布情况,并且在图的标题中显示了T统计量和p值,这里的  意味着有理由拒绝假设两组独立样本的均值相等,认为它们之间存在显著差异,如果加上上述案例背景就是男性和女性的工资水平存在显著性差异

配对样本T检验

公式

使用场景

用于比较同一个样本在两个不同条件下的均值差异(案例:同一批学生在学期初和学期末的考试成绩,比较他们的进步情况)
注意事项

  • 正态性:配对差值(每对观测值之间的差值)应近似服从正态分布,对于小样本(n < 30),这个条件尤为重要
  • 配对性:数据必须成对,且每对观测值之间存在依赖关系

代码实现

# 生成示例数据
np.random.seed(42)
before_treatment = np.random.normal(loc=50, scale=10, size=30)
after_treatment = before_treatment + np.random.normal(loc=5, scale=5, size=30)

# 进行配对样本T检验
t_stat, p_value = stats.ttest_rel(before_treatment, after_treatment)

# 打印结果
print(f"T统计量: {t_stat}")
print(f"p值: {p_value}")

# 将数据转换为DataFrame,便于Seaborn进行可视化
data = pd.DataFrame({
'Before Treatment': before_treatment,
'After Treatment': after_treatment
})

# 绘制配对数据的分布和变化
plt.figure(figsize=(12, 6))

# 绘制两个时间点的箱线图
plt.subplot(1, 2, 1)
sns.boxplot(data=data)
sns.stripplot(data=data, jitter=True, color='black', alpha=0.5)
plt.title('Boxplot of Before and After Treatment')
plt.xlabel('Condition')
plt.ylabel('Score')

# 绘制配对数据的变化
plt.subplot(1, 2, 2)
for i in range(len(before_treatment)):
plt.plot([0, 1], [before_treatment[i], after_treatment[i]], color='grey', marker='o')
plt.xticks([0, 1], ['Before Treatment', 'After Treatment'])
plt.title('Paired Sample Changes')
plt.xlabel('Condition')
plt.ylabel('Score')

# 添加T检验结果到图中
plt.suptitle(f'Paired Samples T-Test\nT-Statistic: {t_stat:.2f}, p-value: {p_value:.4f}')
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()

生成一个示例数据集,其中包含处理前和处理后的配对样本数据,处理后的数据是处理前数据加上一个随机扰动,可视化为箱线图和散点图:展示处理前和处理后的数据分布情况、变化线图:展示每个配对样本在处理前后的变化情况,每条灰线代表一个配对样本,这里的 P<0.05说明两样本的均值存在显著差异,如果加上上述案例背景就是认为学期初和学期末的考试成绩平均值存在显著差异,表明学生在学业上有进步或退步

文章转自微信公众号@Python机器学习AI