9.2 双因素方差分析¶
社团准备办一次公益义卖。小率负责比较两件事:海报是“简洁版”还是“彩色版”,推送时间是“中午”还是“晚上”。如果只看一个因素,就会漏掉另一个因素的影响。
| 海报风格 | 推送时间 | 报名人数 |
|---|---|---|
| 简洁 | 中午 | 31, 33, 32 |
| 简洁 | 晚上 | 48, 50, 47 |
| 彩色 | 中午 | 44, 46, 45 |
| 彩色 | 晚上 | 47, 49, 48 |
彩色海报看起来更吸引人,晚上推送也更好。那我分别做两个单因素 ANOVA 可以吗?
可以当作粗略探索,但会漏掉一个关键问题:彩色海报是不是只在中午特别有效?这就是交互作用。
9.2.1 两个因素会带来三个问题¶
双因素方差分析(Two-Way ANOVA)同时研究两个分类因素。它通常要回答三件事:
- 因素 A 主效应:海报风格整体上是否影响报名人数?
- 因素 B 主效应:推送时间整体上是否影响报名人数?
- A × B 交互作用:海报风格的效果是否取决于推送时间?
交互作用可以用一句话判断:两条线是否平行。如果简洁海报从中午到晚上增加很多,而彩色海报从中午到晚上几乎不变,说明“时间的效果”取决于“海报风格”。
9.2.2 模型里多了一个乘法项¶
双因素 ANOVA 可以写成:
\[
Y=\mu+\alpha_i+\beta_j+(\alpha\beta)_{ij}+\varepsilon
\]
这里:
- \(\mu\) 是总体平均水平。
- \(\alpha_i\) 是因素 A 的主效应。
- \(\beta_j\) 是因素 B 的主效应。
- \((\alpha\beta)_{ij}\) 是交互效应。
- \(\varepsilon\) 是误差。
先看交互
如果交互作用显著,主效应的解释要更谨慎。因为“海报风格好不好”可能要分中午和晚上分别说。
9.2.3 双因素 ANOVA 表怎么读¶
双因素 ANOVA 表通常多出一行交互项:
| 来源 | 问的问题 | 读法 |
|---|---|---|
| 海报风格 | 简洁和彩色整体是否不同 | 主效应 A |
| 推送时间 | 中午和晚上整体是否不同 | 主效应 B |
| 海报风格 × 推送时间 | 一个因素的效果是否随另一个因素变化 | 交互作用 |
| 残差 | 同一条件下仍然存在的随机波动 | 组内误差 |
报告结果时,通常按这个顺序:
- 先报告交互作用是否显著。
- 若交互显著,再做简单效应分析。
- 若交互不显著,再解释主效应。
9.2.4 用 Python 拟合双因素 ANOVA¶
配套脚本放在:
核心代码如下:
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
df = pd.DataFrame({
"style": ["简洁"] * 6 + ["彩色"] * 6,
"time": ["中午"] * 3 + ["晚上"] * 3 + ["中午"] * 3 + ["晚上"] * 3,
"count": [31, 33, 32, 48, 50, 47, 44, 46, 45, 47, 49, 48],
})
model = ols("count ~ C(style) * C(time)", data=df).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)
别把交互作用当作小装饰
交互作用不是“额外加一行”这么简单。它会改变主效应的含义:有交互时,平均意义上的主效应可能掩盖局部差异。
也就是说,双因素 ANOVA 不只是省了两次分析,它能发现“组合方式”的效果。
对。现实里很多效果都不是单独发生的,而是和另一个条件一起发生的。
小率的笔记本
双因素 ANOVA 同时检验两个主效应和一个交互效应。画交互图时,线越不平行,越要怀疑交互。解释结果时先看交互,再看主效应。

