统计检验前置必做:方差齐性检验|原理+方法+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. 导入库 + 生成数据
importnumpyasnpimportpandasaspdimportseabornassnsimportmatplotlib.pyplotaspltfromscipyimportstats# 固定随机种子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)# 波动大# 构建DataFramedf=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===== 最终结论 =====")ifbartlett_p<0.05:print("Bartlett:方差不齐 ❌")else:print("Bartlett:方差齐 ✅")iflevene_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