统计检验必学: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分布特点
- 对称、钟形,和正态分布很像
- 自由度越小,尾部越厚(更能容忍小样本波动)
- 自由度越大,越接近标准正态分布
- 自由度公式:
- 单样本: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检验使用步骤(万能流程)
- 明确问题:单样本/独立样本/配对样本
- 检验正态性(T检验要求数据近似正态)
- 计算 t 统计量
- 查看 p 值
- 下结论:
- p < 0.05 → 差异显著
- p ≥ 0.05 → 差异不显著
八、超清晰总结(背诵版)
- T检验 = 小样本、方差未知时的均值检验
- 三种类型:单样本、独立样本、配对样本
- T分布:自由度越小越扁尾,越大越接近正态
- 看 p 值判断显著性:p < 0.05 显著
- 机器学习用途:特征选择(筛选显著差异特征)