当前位置:首页>python>【Python】第十三天:多组数据比差异!单因素方差分析,从原理到代码手把手教

【Python】第十三天:多组数据比差异!单因素方差分析,从原理到代码手把手教

  • 2026-09-10 03:12:13
【Python】第十三天:多组数据比差异!单因素方差分析,从原理到代码手把手教

哈喽各位小伙伴!我是你们的统计学+Python零露老师~

上一期咱们搞定了两组数据的全维度差异检验,但日常论文、工作里,我们经常会遇到三组及以上数据的对比需求:比如三种治疗方案的疗效差异、四种营销活动的转化效果、五款产品的用户满意度……

这时候就不能用之前的t检验了,今天咱们就搞定多组数据差异分析的神器——单因素方差分析(ANOVA),全程大白话讲原理,全流程Python代码手把手带练,小白看完就会用!

一、先搞懂核心:为什么不能用多次t检验?

这是小白最容易踩的坑,我用一句话+一个数字讲透:

多次两两做t检验,会让「假阳性错误概率」疯狂飙升,结果完全不靠谱。

举个例子:

(1)对比3组数据,两两做t检验要做3次,行业通用的显著性水平是5%(每次检验有5%的概率把随机误差当成真差异),3次下来,犯错概率就从5%飙升到了14.3%;

(2)对比4组数据,要做6次t检验,犯错概率直接涨到26.5%,几乎1/4的概率得出错误结论。

而方差分析,是一次性对比所有组的差异,把犯错概率牢牢控制在5%以内,这就是它的核心价值,也是多组对比必须用它的原因。

二、大白话讲透方差分析的核心原理

方差分析,全称「变异数分析」,核心逻辑超级简单,一句话就能懂:

把数据的总差异,拆成「组间差异」和「组内差异」,对比两者的大小,判断各组的差异是不是真的存在。

我用一个超通俗的例子给你讲明白:

你要对比3个班级的数学成绩,看看老师的教学水平有没有差异:

(1)组内差异:同一个班级里,学生之间的分数差异。这是正常的个体差异、随机误差,和老师的教学水平无关;

(2)组间差异:3个班级平均分之间的差异。这部分差异,一部分是随机误差,另一部分就是老师教学水平不同导致的真实差异。

核心判断逻辑:

如果组间差异远大于组内差异,就说明「教学水平不同」带来的影响,远超过随机误差,3个班级的成绩确实有显著差异;

如果组间差异和组内差异差不多,就说明差异只是随机运气导致的,老师的教学水平没有本质区别。

这里刚好呼应咱们Day6学的F分布:方差分析的核心统计量F值,就是「组间差异÷组内差异」,F值越大,p值越小,越能证明各组有显著差异。

三、小白必记的核心规则&适用条件

1. 核心判断规则

和之前全程统一,零学习成本:

(1)p<0.05:各组之间至少有两组存在显著差异;

(2)p≥0.05:各组之间没有显著差异,差异只是随机误差。

⚠️ 重要补充:方差分析的p<0.05,只能说明「至少有两组不一样」,不能告诉你具体哪两组有差异。想要知道两两之间的差异,需要做事后两两检验(Tukey HSD检验),后面代码里会手把手教。

2. 小白版适用条件

满足这3条就能用,不用死记硬背:

(1)各组数据相互独立,互不干扰;

(2)各组数据基本符合正态分布;

(3)各组方差齐性(波动差不多,用之前学的Levene检验就能校验)。

四、Python全流程实战!双场景手把手教学

代码全程可直接复制运行,每一步都标清作用,小白零压力!

第一步:先导入工具库(必须先运行!)

Pythonimport numpy as npimport pandas as pdfrom scipy import statsfrom statsmodels.stats.multicomp import pairwise_tukeyhsd# 解决中文显示问题import matplotlib.pyplot as pltplt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei"]plt.rcParams["axes.unicode_minus"] = False

场景1:医学实战-三种治疗方案的降压效果对比

这是医学论文里最常用的场景:

我们招募了45名高血压患者,随机分成3组,每组15人,分别用A、B、C三种方案治疗,1个月后记录每个人的血压下降值。检验三种治疗方案的降压效果有没有显著差异。

步骤1:准备数据+方差齐性检验(前置校验)

Python# 1. 准备数据:三组患者的血压下降值(单位:mmHg)group_a = [12.5, 10.2, 14.3, 9.8, 11.6, 13.1, 10.9, 12.8, 11.3, 13.5, 10.5, 12.1, 14.0, 9.7, 11.9]group_b = [8.2, 7.8, 9.1, 8.5, 7.9, 8.8, 9.0, 7.7, 8.3, 8.6, 7.5, 8.9, 9.2, 8.0, 8.4]group_c = [15.3, 13.2, 16.1, 12.8, 14.5, 15.8, 13.6, 14.9, 13.9, 15.2, 12.5, 14.7, 16.0, 13.0, 14.3]# 2. 方差齐性检验(Levene检验)stat, p_levene = stats.levene(group_a, group_b, group_c)print(f"✅ 方差齐性检验p值:{p_levene:.6f}")if p_levene >= 0.05:print("�� 方差齐性校验通过:各组方差齐性,符合方差分析条件")else:print("�� 方差齐性校验不通过:各组方差不齐,建议使用非参数检验")

步骤2:单因素方差分析

Python# 单因素方差分析f_stat, p_anova = stats.f_oneway(group_a, group_b, group_c)# 计算各组均值mean_a, mean_b, mean_c = np.mean(group_a), np.mean(group_b), np.mean(group_c)# 结果解读print(f"\n✅ A方案平均降压值:{mean_a:.2f}mmHg")print(f"✅ B方案平均降压值:{mean_b:.2f}mmHg")print(f"✅ C方案平均降压值:{mean_c:.2f}mmHg")print(f"✅ 方差分析F值:{f_stat:.2f},p值:{p_anova:.6f}")if p_anova < 0.05:print("�� 方差分析结论:p<0.05,拒绝原假设,三种治疗方案的降压效果有显著差异")else:print("�� 方差分析结论:p≥0.05,不能拒绝原假设,没有足够证据证明三种方案有差异")

步骤3:事后Tukey检验,看具体哪两组有差异

Python# 把数据整理成Tukey检验需要的格式df = pd.DataFrame({"血压下降值": np.concatenate([group_a, group_b, group_c]),"治疗方案": ["A方案"]*15 + ["B方案"]*15 + ["C方案"]*15})# 执行Tukey HSD检验tukey_result = pairwise_tukeyhsd(endog=df["血压下降值"], groups=df["治疗方案"], alpha=0.05)# 打印检验结果print(tukey_result.summary())print("\n�� 结果解读:reject=True 代表两组有显著差异,reject=False 代表无显著差异")

运行后你会得到清晰的两两对比结果,直接就能写进论文里!

场景2:非医学实战-四种营销方案的用户消费对比

这是运营、市场工作里的高频场景:

我们给4组用户分别投放4种不同的营销方案,每组20人,记录了活动期间的用户消费金额。检验四种营销方案的效果有没有显著差异。

Python# 1. 准备数据:四组用户的消费金额plan_1 = [189, 259, 329, 199, 289, 359, 219, 299, 179, 269, 209, 279, 339, 199, 259, 229, 309, 189, 249, 219]plan_2 = [289, 359, 429, 299, 389, 459, 319, 399, 279, 369, 309, 379, 439, 299, 359, 329, 409, 289, 349, 319]plan_3 = [159, 229, 299, 169, 259, 329, 189, 269, 149, 239, 179, 249, 309, 169, 229, 199, 279, 159, 219, 189]plan_4 = [299, 369, 439, 309, 399, 469, 329, 409, 289, 379, 319, 389, 449, 309, 369, 339, 419, 299, 359, 329]# 2. 方差齐性检验stat, p_levene = stats.levene(plan_1, plan_2, plan_3, plan_4)print(f"✅ 方差齐性检验p值:{p_levene:.6f}")# 3. 单因素方差分析f_stat, p_anova = stats.f_oneway(plan_1, plan_2, plan_3, plan_4)print(f"✅ 方差分析p值:{p_anova:.6f}")if p_anova < 0.05:print("�� 结论:p<0.05,四种营销方案的效果有显著差异")else:print("�� 结论:p≥0.05,没有足够证据证明四种方案的效果有差异")# 4. 事后Tukey检验df = pd.DataFrame({"消费金额": np.concatenate([plan_1, plan_2, plan_3, plan_4]),"营销方案": ["方案1"]*20 + ["方案2"]*20 + ["方案3"]*20 + ["方案4"]*20})tukey_result = pairwise_tukeyhsd(endog=df["消费金额"], groups=df["营销方案"], alpha=0.05)print("\n✅ 两两对比结果:")print(tukey_result.summary())

一张表总结:多组/两组数据差异检验怎么选?

小白直接收藏,用的时候看一眼就不会错!

数据场景

首选检验方法

Python核心函数

1组数据 vs 固定标准值

单样本t检验

stats.ttest_1samp

2组独立数据对比均值

独立样本t检验

stats.ttest_ind

2组配对数据对比均值

配对样本t检验

stats.ttest_rel

3组及以上独立数据对比均值

单因素方差分析

stats.f_oneway

方差分析后两两对比差异

Tukey HSD事后检验

pairwise_tukeyhsd

第十三天学习总结

恭喜你!今天彻底搞定了多组数据差异分析的核心技能,核心就3点:

(1)3组及以上数据对比,必须用方差分析,不能多次做t检验,避免错误概率飙升;

(2)核心逻辑:对比组间差异和组内差异,F值越大,p值越小,越能证明各组有显著差异;

(3)全流程标准步骤:方差齐性校验→方差分析→事后两两检验,代码直接复制就能套用。

下期预告

明天Day14,咱们进阶双因素方差分析,教你同时分析两个因素对结果的影响,比如「治疗方案+性别」对降压效果的影响、「营销方案+用户层级」对消费的影响,依旧是大白话+Python保姆级代码,咱们不见不散!

✨ 粉丝福利

1.关注公众号,Day14更新第一时间推送!

2.评论区扣【13】,免费领取今天的全套可直接运行的代码文件!

有任何不懂的地方,评论区留言,我一一解答!清华大学数学科学系-东门

最新文章

随机文章