哈喽各位小伙伴!我是你们的统计学+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】,免费领取今天的全套可直接运行的代码文件!