【统计检验】T检验

统计检验必学:T检验|三种类型+公式推导+Python代码+机器学习实战

T检验是统计学、数据分析、机器学习中最常用、最基础 的均值检验方法,专门用来判断两组数据的均值是否存在显著差异


一、T检验到底是什么?(一句话看懂)

T检验 = 小样本、总体标准差未知时,比较"均值是否有显著差异"的统计检验

它要回答的核心问题:

两组数据的均值不一样,是真的有差别,还是只是随机误差?

适用场景

  • 样本量 n < 30(小样本)
  • 总体标准差 未知
  • 数据近似服从 正态分布
  • 只比较 均值,不比较方差

二、T检验的三种核心类型(必考+必用)

T检验一共只有3种,对应3种不同业务场景,一定要分清:

1. 单样本 T 检验

用途:一组样本 和 已知总体均值 比较

  • 例子:某班平均分是否显著 不等于 全校平均分
  • 公式:
    t=X‾−μ0s/n t = \frac{\overline{X} - \mu_0}{s/\sqrt{n}} t=s/n X−μ0

2. 独立样本 T 检验

用途 :两组完全独立的样本比较

  • 例子:男生成绩 vs 女生成绩;新方法 vs 旧方法
  • 公式:
    t=X‾1−X‾2Sp1n1+1n2 t = \frac{\overline{X}_1 - \overline{X}_2}{S_p \sqrt{\frac{1}{n_1}+\frac{1}{n_2}}} t=Spn11+n21 X1−X2
    合并方差:
    Sp=(n1−1)s12+(n2−1)s22n1+n2−2 S_p=\sqrt{\frac{(n_1-1)s_1^2+(n_2-1)s_2^2}{n_1+n_2-2}} Sp=n1+n2−2(n1−1)s12+(n2−1)s22

3. 配对样本 T 检验

用途同一组对象前后两次测量比较

  • 例子:减肥前体重 vs 减肥后体重;训练前成绩 vs 训练后成绩
  • 思路:先算差值,再对差值做单样本T检验

三、T分布是什么?和正态分布有什么区别?

T分布是小样本下的正态分布 ,形状由自由度 df 决定:

T分布特点

  1. 对称、钟形,和正态分布很像
  2. 自由度越小,尾部越厚(更能容忍小样本波动)
  3. 自由度越大,越接近标准正态分布
  4. 自由度公式:
    • 单样本:df=n−1df = n-1df=n−1
    • 独立样本:df=n1+n2−2df = n_1+n_2-2df=n1+n2−2

四、Python 代码1:T分布与正态分布对比可视化

python 复制代码
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

# 生成x轴数据
x = np.linspace(-5, 5, 100)

# 计算不同分布的密度
t2 = stats.t.pdf(x, df=2)
t10 = stats.t.pdf(x, df=10)
norm = stats.norm.pdf(x)

# 绘图
plt.figure(figsize=(8, 5))
plt.plot(x, t2, label='t-distribution df=2', c='red')
plt.plot(x, t10, label='t-distribution df=10', c='blue')
plt.plot(x, norm, label='Normal', c='green', linestyle='--')
plt.title('T分布 vs 正态分布')
plt.xlabel('x')
plt.ylabel('Density')
plt.legend()
plt.grid(alpha=0.3)
plt.show()

五、Python 代码2:独立样本T检验(最常用)

模拟两组成绩,判断是否有显著差异

python 复制代码
import numpy as np
import scipy.stats as stats
import seaborn as sns
import matplotlib.pyplot as plt

# 生成数据
np.random.seed(0)
group1 = np.random.normal(60, 10, 30)  # 方法A
group2 = np.random.normal(65, 12, 30)  # 方法B

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

print(f"T 统计量: {t_stat:.4f}")
print(f"P 值: {p_value:.4f}")

# 分布对比图
plt.figure(figsize=(8, 5))
sns.histplot(group1, color='blue', kde=True, label='Group1', stat='density', bins=10)
sns.histplot(group2, color='red', kde=True, label='Group2', stat='density', bins=10)
plt.title('两组数据分布对比')
plt.legend()
plt.show()

结果怎么看?

  • p < 0.05:差异显著,拒绝原假设
  • p ≥ 0.05:差异不显著,不能拒绝原假设

六、Python 代码3:机器学习中的应用------特征选择

T检验(及其等价的F检验)是分类任务特征筛选 神器:

判断特征在不同类别间是否有显著差异

python 复制代码
from sklearn.datasets import load_iris
from sklearn.feature_selection import f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 数据集
data = load_iris()
X, y = data.data, data.target

# 方差分析F检验(等价于多分类T检验)
f_vals, p_vals = f_classif(X, y)

print("特征F值:", f_vals.round(2))
print("特征P值:", p_vals.round(4))

# 筛选显著特征(p<0.05)
X_selected = X[:, p_vals < 0.05]

# 建模
X_train, X_test, y_train, y_test = train_test_split(
    X_selected, y, test_size=0.3, random_state=42
)
model = LogisticRegression()
model.fit(X_train, y_train)
acc = accuracy_score(y_test, model.predict(X_test))

print(f"筛选后特征数:{X_selected.shape[1]}")
print(f"模型准确率:{acc:.4f}")

七、T检验使用步骤(万能流程)

  1. 明确问题:单样本/独立样本/配对样本
  2. 检验正态性(T检验要求数据近似正态)
  3. 计算 t 统计量
  4. 查看 p 值
  5. 下结论:
    • p < 0.05 → 差异显著
    • p ≥ 0.05 → 差异不显著

八、超清晰总结(背诵版)

  1. T检验 = 小样本、方差未知时的均值检验
  2. 三种类型:单样本、独立样本、配对样本
  3. T分布:自由度越小越扁尾,越大越接近正态
  4. 看 p 值判断显著性:p < 0.05 显著
  5. 机器学习用途:特征选择(筛选显著差异特征)
相关推荐
2501_945425152 小时前
C++编译期字符串处理
开发语言·c++·算法
m0_733612212 小时前
模板编译期哈希计算
开发语言·c++·算法
ab1515172 小时前
3.18二刷基础119、124,完成进阶52
算法
Jordannnnnnnn2 小时前
复试day27
数据结构·c++·算法
仰泳的熊猫2 小时前
题目2311:蓝桥杯2019年第十届省赛真题-Fibonacci 数列与黄金分割
数据结构·c++·算法·蓝桥杯
似水明俊德2 小时前
06-C#
开发语言·c++·算法·c#
ysa0510302 小时前
模拟【打牌游戏】
数据结构·c++·笔记·算法
weixin_649555672 小时前
C语言程序设计第四版(何钦铭、颜晖)第八章指针之循环后移
c语言·c++·算法
_饭团2 小时前
C语言数组全解析:从入门到精通
c语言·开发语言·数据结构·经验分享·笔记·学习·算法