哈喽各位小伙伴!我是你们的统计学+ Python 零露老师~
上一期咱们搞定了单因素方差分析,解决了「一个因素对结果的影响」,比如不同治疗方案的降压效果差异。但真实场景里,结果往往受多个因素影响:比如降压效果不仅和治疗方案有关,还和患者性别有关;用户消费不仅和营销方案有关,还和用户层级有关。
今天咱们就进阶双因素方差分析,一次性解决3 个核心问题:
(1)因素A 对结果有没有显著影响?
(2)因素B 对结果有没有显著影响?
(3)两个因素会不会互相干扰,产生1+1≠2 的叠加效果?
全程大白话,无复杂公式,医学+ 业务双实战案例,代码直接复制就能跑,小白看完就会用!
一、大白话讲透核心概念
1. 什么是双因素方差分析?
一句话定义:同时分析两个分类因素,对同一个连续结果的影响,还能检验两个因素的交互效应。
和单因素的核心区别:
(1)单因素:只看「治疗方案」这1 个因素对降压效果的影响
(2)双因素:同时看「治疗方案」+「性别」这 2 个因素对降压效果的影响,还能看不同性别对不同治疗方案的接受度有没有差异
2. 小白必懂的 3 个核心效应
这是双因素分析的灵魂,用一个超通俗的例子讲透,永远不会忘:我们要分析「奶茶口味」+「杯型」对销量的影响:
(1)主效应:单个因素自己对结果的独立影响
① 口味主效应:不管什么杯型,原味奶茶永远比抹茶味卖得好
② 杯型主效应:不管什么口味,中杯永远比大杯卖得好
(2)交互效应:两个因素互相影响,一个因素的效果,会跟着另一个因素变
① 无交互:原味永远比抹茶好卖,中杯永远比大杯好卖,两个因素各管各的,互不干扰
② 有交互:原味中杯卖爆,原味大杯没人买;抹茶大杯卖得好,抹茶中杯没人要。这时候「口味的销量效果」,完全取决于「杯型」,这就是典型的交互效应。
3. 核心判断规则
和之前全程统一,零学习成本,小白只看这一条:p<0.05 → 效应显著;p≥0.05 → 效应不显著,差异只是随机误差
4. 小白版适用条件
和单因素方差分析基本一致,满足3 条就能用:
(1)各组数据相互独立,互不干扰;
(2)各组数据基本符合正态分布;
(3)各组方差齐性(波动差不多)。
二、Python 全流程实战!双场景手把手教学
双因素方差分析用statsmodels实现最方便,结果清晰易懂,代码全程可直接复制运行,小白零压力!
第一步:先导入工具库(必须先运行!)
pythonimport pandas as pdimport numpy as npfrom statsmodels.formula.api import olsfrom statsmodels.stats.anova import anova_lm# 解决中文显示问题import matplotlib.pyplot as pltimport seaborn as snsplt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei"]plt.rcParams["axes.unicode_minus"] = False |
场景1:医学实战 - 治疗方案 + 性别对降压效果的影响
这是医学论文里的高频场景:我们招募了60 名高血压患者,按「治疗方案(A/B/C 三种)」+「性别(男 / 女)」分成 6 组,每组 10 人,记录治疗后的血压下降值。我们想知道:
1.不同治疗方案的降压效果有没有差异?
2.不同性别的降压效果有没有差异?
3.治疗方案的效果,会不会受性别的影响?
步骤1:整理数据(小白直接套用,改数据就行)
双因素分析必须用长格式数据:每一行是1 个患者,3 列分别是结果、因素 1、因素 2,格式完全固定。
python# 构建数据集df = pd.DataFrame({"血压下降值": [# A方案-男性13.2,12.5,14.3,11.8,13.6,12.9,14.1,12.7,13.5,12.8,# A方案-女性10.5,9.8,11.2,9.5,10.8,10.1,11.5,9.7,10.6,10.2,# B方案-男性8.5,7.8,9.2,7.5,8.8,8.1,9.3,7.7,8.6,8.2,# B方案-女性9.2,8.5,9.8,8.2,9.5,8.8,9.9,8.4,9.3,8.7,# C方案-男性15.2,14.5,16.3,13.8,15.6,14.9,16.1,14.7,15.5,14.8,# C方案-女性12.5,11.8,13.2,11.5,12.8,12.1,13.5,11.7,12.6,12.2],"治疗方案": ["A方案"]*20 + ["B方案"]*20 + ["C方案"]*20,"性别": ["男"]*10 + ["女"]*10 + ["男"]*10 + ["女"]*10 + ["男"]*10 + ["女"]*10})# 查看前5行数据,确认格式正确print(df.head()) |
步骤2:拟合模型 + 双因素方差分析
python# 构建双因素方差分析模型,带交互效应# 公式格式:结果变量 ~ 因素1 + 因素2 + 因素1:因素2model = ols("血压下降值 ~ C(治疗方案) + C(性别) + C(治疗方案):C(性别)", data=df).fit()# 输出方差分析结果anova_result = anova_lm(model)print("✅ 双因素方差分析结果:")print(anova_result) |
步骤3:大白话解读结果
运行后会输出一个表格,小白只需要看最后一列PR(>F)(就是p 值),其他列不用管:
行名 | 对应效应 | p 值判断 |
C (治疗方案) | 治疗方案的主效应 | p<0.05 → 不同治疗方案的降压效果有显著差异 |
C (性别) | 性别的主效应 | p<0.05 → 不同性别的降压效果有显著差异 |
C (治疗方案):C (性别) | 治疗方案和性别的交互效应 | p<0.05 → 两个因素有显著交互作用,治疗方案的效果受性别影响 |
步骤4:交互效应可视化(一眼看懂)
python# 画交互效应图,直观看到两个因素的互相影响plt.figure(figsize=(8, 5))sns.pointplot(x="治疗方案", y="血压下降值", hue="性别", data=df, ci=95)plt.title("治疗方案与性别的交互效应图", fontsize=14)plt.xlabel("治疗方案", fontsize=12)plt.ylabel("血压下降值(mmHg)", fontsize=12)plt.legend(title="性别")plt.show() |
看图判断交互效应:两条线不平行,甚至交叉,就说明有交互效应。比如你会看到,A/C 方案男性降压效果远高于女性,B 方案男女差异很小,完美验证交互效应。
场景2:非医学实战 - 营销方案 + 用户层级对消费的影响
这是运营工作的高频场景:我们给80 名用户投放活动,按「营销方案(1/2/3/4 四种)」+「用户层级(新 / 老用户)」分成8组,每组10人,记录活动期间的消费金额。分析两个因素对消费的影响,以及有没有交互效应。
python# 1. 构建数据集df = pd.DataFrame({"消费金额": [# 方案1-新用户189,259,329,199,289,359,219,299,179,269,# 方案1-老用户389,459,529,399,489,559,419,499,379,469,# 方案2-新用户289,359,429,299,389,459,319,399,279,369,# 方案2-老用户329,399,469,339,429,499,349,439,319,409,# 方案3-新用户159,229,299,169,259,329,189,269,149,239,# 方案3-老用户259,329,399,269,359,429,289,369,249,339,# 方案4-新用户299,369,439,309,399,469,329,409,289,379,# 方案4-老用户599,669,739,609,699,769,629,709,589,679],"营销方案": ["方案1"]*20 + ["方案2"]*20 + ["方案3"]*20 + ["方案4"]*20,"用户层级": ["新用户"]*10 + ["老用户"]*10 + ["新用户"]*10 + ["老用户"]*10 + ["新用户"]*10 + ["老用户"]*10 + ["新用户"]*10 + ["老用户"]*10})# 2. 双因素方差分析model = ols("消费金额 ~ C(营销方案) + C(用户层级) + C(营销方案):C(用户层级)", data=df).fit()anova_result = anova_lm(model)print("✅ 双因素方差分析结果:")print(anova_result)# 3. 交互效应可视化plt.figure(figsize=(8, 5))sns.pointplot(x="营销方案", y="消费金额", hue="用户层级", data=df, ci=95)plt.title("营销方案与用户层级的交互效应图", fontsize=14)plt.xlabel("营销方案", fontsize=12)plt.ylabel("消费金额(元)", fontsize=12)plt.legend(title="用户层级")plt.show() |
一张表总结:方差分析怎么选?
小白直接收藏,用的时候看一眼就不会错!
分析场景 | 首选方法 | 核心解决问题 |
1 组数据 vs 固定标准值 | 单样本t 检验 | 单组数据和标准值的均值差异 |
2 组独立数据对比均值 | 独立样本t 检验 | 两组数据的均值差异 |
3 组及以上独立数据对比均值 | 单因素方差分析 | 单个因素对结果的影响 |
同时分析2 个因素对结果的影响 | 双因素方差分析 | 两个因素的主效应+ 交互效应 |
第十四天学习总结
恭喜你!今天彻底搞定了双因素方差分析,核心就3 点:
(1)双因素方差分析,能同时分析两个因素对结果的影响,还能检验两个因素的交互效应,这是分开做两次单因素分析做不到的;
(2)核心看3 个效应:因素 1 主效应、因素 2 主效应、两因素交互效应,判断标准全程统一:p<0.05 就是显著;
(3)标准流程:整理长格式数据→拟合模型→解读结果 + 可视化,代码直接复制就能套用。
下期预告
明天Day15,咱们补全假设检验的最后一块拼图 ——非参数检验!解决「数据不符合正态分布」的差异分析问题,比如秩和检验,不管数据分布是什么样都能用,依旧是大白话+ Python 保姆级代码,咱们不见不散!
✨ 粉丝福利
(1)关注公众号,Day15 更新第一时间推送!
(2)评论区扣【14】,免费领取今天的全套可直接运行的代码文件!
(3)有任何不懂的地方,评论区留言,我一一解答!清华大学数学科学系-东门