统计检验前置必做:方差齐性检验|原理+方法+Python实战全攻略
方差齐性检验是进行 t 检验、方差分析(ANOVA)、线性回归 之前必须做的前提检验,用来判断“不同组数据的波动大小是否差不多”。
一、什么是方差齐性?(一句话看懂)
- 方差:数据的离散程度 / 波动大小
- 方差齐性:不同组的数据波动程度差不多
- 方差不齐:有的组很分散,有的组很集中
超简单例子
- 班级 A:成绩 50~100,波动巨大 → 方差大
- 班级 B:成绩 75~85,非常集中 → 方差小
这就叫 方差不齐。
二、为什么一定要做方差齐性检验?
因为:
t 检验、方差分析、线性回归 都有一个重要假设:
✅ 各组方差相等(方差齐)
如果方差不齐,你直接做检验:
👉 结果会不准、p 值会骗人、结论会错误!
所以:
方差齐性检验 = 统计分析前的“安全检查”
三、3 种最常用方差齐性检验方法
1. F 检验(两组方差比较)
只适用于 两组数据,且数据符合正态分布。
公式:
F=S12S22(大方差放分子)
F = \frac{S_1^2}{S_2^2} \quad(大方差放分子)
F=S22S12(大方差放分子)
- H0:方差相等
- H1:方差不等
特点:对正态性非常敏感。
2. Bartlett 检验(多组方差比较)
适用于 3 组及以上,但依然要求数据正态。
原理:基于对数方差和卡方分布。
特点:速度快,但偏离正态就容易误判。
3. Levene 检验(最推荐、最稳健)
✅ 最常用、最实用、最靠谱
✅ 不严格要求正态分布
✅ 两组、多组都能用
✅ 受极端值影响小
原理:计算每个数据到均值或中位数的距离,再做方差分析。
四、方法选择总结(直接照这个选)
| 情况 | 推荐方法 |
|---|---|
| 两组数据 + 正态 | F 检验 |
| 多组数据 + 正态 | Bartlett 检验 |
| 任意组数 + 不确定正态 | Levene 检验(首选) |
五、判断规则(一看就会)
给定显著性水平 α=0.05:
- p < 0.05 → 拒绝 H0 → 方差不齐
- p ≥ 0.05 → 不拒绝 H0 → 方差齐
六、Python 完整实战(可直接运行)
我们模拟 3 组成绩,方差明显不同,然后做检验。
1. 导入库 + 生成数据
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
# 固定随机种子
np.random.seed(42)
# 生成3组数据(方差明显不同)
group_A = np.random.normal(loc=75, scale=5, size=30) # 波动小
group_B = np.random.normal(loc=78, scale=8, size=30) # 波动中
group_C = np.random.normal(loc=80, scale=12, size=30) # 波动大
# 构建DataFrame
df = pd.DataFrame({
'Score': np.concatenate([group_A, group_B, group_C]),
'Group': ['A']*30 + ['B']*30 + ['C']*30
})
2. 可视化:箱线图 + 散点图
plt.figure(figsize=(10, 6))
sns.boxplot(x='Group', y='Score', data=df, palette='Set2')
sns.swarmplot(x='Group', y='Score', data=df, color='black', alpha=0.6)
plt.title('三组成绩分布对比', fontsize=14)
plt.grid(alpha=0.3)
plt.show()
能明显看到:C 组最分散,A 组最集中。
3. 方差齐性检验(核心代码)
# Bartlett 检验(适合正态)
bartlett_stat, bartlett_p = stats.bartlett(group_A, group_B, group_C)
# Levene 检验(最推荐,基于中位数)
levene_stat, levene_p = stats.levene(group_A, group_B, group_C, center='median')
print("===== 方差齐性检验结果 =====")
print(f"Bartlett 统计量: {bartlett_stat:.4f}, p值: {bartlett_p:.4f}")
print(f"Levene 统计量: {levene_stat:.4f}, p值: {levene_p:.4f}")
4. 查看各组方差
print("\n===== 各组描述统计 =====")
print(df.groupby('Group')['Score'].agg(['mean','std','var']))
5. 方差柱状图
plt.figure(figsize=(10, 5))
sns.barplot(x='Group', y='Score', data=df, estimator=np.var, palette='bright')
plt.title('各组成绩方差对比', fontsize=14)
plt.ylabel('Variance')
plt.grid(alpha=0.3, axis='y')
plt.show()
6. 自动结论输出
print("\n===== 最终结论 =====")
if bartlett_p < 0.05:
print("Bartlett:方差不齐 ❌")
else:
print("Bartlett:方差齐 ✅")
if levene_p < 0.05:
print("Levene:方差不齐 ❌")
else:
print("Levene:方差齐 ✅")
七、结果怎么解读?
你会看到类似输出:
Bartlett p值: 0.0002
Levene p值: 0.0015
都 < 0.05
→ 方差不齐
八、方差不齐怎么办?(解决方案)
如果检验显示方差不齐,你可以:
- ✅ 使用 Welch t 检验(不要求方差齐)
- ✅ 使用 Welch ANOVA
- ✅ 数据变换(log、根号等)
- ✅ 使用非参数检验(Kruskal-Wallis)
九、方差齐性检验总结(背诵版)
- 是 t 检验、ANOVA 必做前置检验
- 检验各组波动是否差不多
- Levene 检验最稳健,优先用
- p < 0.05 → 方差不齐
- 不齐就换稳健方法,不要硬做普通 t / ANOVA

1万+

被折叠的 条评论
为什么被折叠?



