—关注作者,送A/B实验实战工具包
很多刚入行的数据分析师或工程师,对 A/B 实验的理解往往停留在 T 检验(T-test)的层面:把流量分两半,算算均值,看看 P 值,结束。
但在复杂的业务场景下,T 检验往往显得“火力不足”。比如,当你想知道“这个策略是不是只对老用户有效?”或者“为什么整体不显著,但某些城市的数据却在暴涨?”时,T 检验就捉襟见肘了。
这时候,你需要祭出统计推断的重型武器:线性回归 (Linear Regression)。
别误会,我不是让你用它做预测,而是用它做因果推断。在 A/B 实验的高阶分析中,线性回归不仅能替代 T 检验,更是异质性分析 (Heterogeneity Analysis) 的核心工具。
一、打破认知:回归不只是预测
在机器学习语境下,我们习惯用回归去拟合一条线来预测未来。但在 A/B 实验语境下,回归模型的系数(Coefficient)才是主角。
当我们构建一个包含干预变量
T
T
T(Treatment,0或1)的回归模型时,
T
T
T 的系数
β
\\beta
β 其实就是实验组相对于对照组的平均处理效应 (ATE, Average Treatment Effect)。
简单来说:T 检验能做的事,回归都能做;T 检验做不了的(如引入协变量、分析交互效应),回归也能做。
二、线性回归的四大假设
在使用这把利器之前,必须先了解它的底线。线性回归模型(OLS)的有效性建立在四个核心假设之上,违背这些假设可能导致推断失效。
Y
Y
Y 与自变量
X
X
X 之间存在线性关系。这意味着自变量每变化一个单位,因变量的变化量是恒定的。
X
X
X 的变化而变化。
- 直观理解:模型预测的“稳定性”应该是一致的。不能出现“预测低收入人群很准,预测高收入人群误差巨大”的情况(即“喇叭口”形状的残差分布)。
ϵ
\\epsilon
ϵ 应服从正态分布。
- 注:在大样本下,根据中心极限定理 (CLT),即使误差项不严格服从正态分布,回归系数的估计通常也是渐近正态的,但这依然是理想状态下的要求。
三、异质性分析:为什么回归比“下钻”更强?
异质性分析旨在回答一个问题:实验效果在不同人群中是否存在显著差异?
最直观的做法是下钻分析 (Drill-down),也就是把数据切开,分别看男用户和女用户的 Lift 和 P 值。但这在统计严谨性上存在巨大漏洞。
1. 下钻分析的陷阱
- 假阴性风险:当你把数据切成两半,每一组的样本量
N
N
N 减半,方差变大,统计功效 (Power) 暴跌。本来显著的差异,切开后可能都不显著了。 - 无法检验“差异的差异”:如果男性组提升 5%(显著),女性组提升 2%(不显著),你能说“策略对男性显著优于女性”吗?不能。统计学上,“一个显著一个不显著”不代表“两者之间有显著差异”。
2. 回归的解法:交互项 (Interaction Term)
线性回归通过引入交互项,直接对“差异的显著性”进行检验。
公式:
Y
=
β
0
+
β
1
T
+
β
2
X
+
β
3
(
T
⋅
X
)
+
ϵ
Y = \\beta_0 + \\beta_1 T + \\beta_2 X + \\beta_3 (T \\cdot X) + \\epsilon
Y=β0+β1T+β2X+β3(T⋅X)+ϵ
符号含义:
-
Y
Y
Y:实验核心指标(如人均消费)。 -
T
T
T:干预变量(0 = 对照组,1 = 实验组)。 -
X
X
X:用户特征(如性别,0 = 女,1 = 男)。 -
T
⋅
X
T \\cdot X
T⋅X:交互项,即干预变量与特征的乘积。
交互逻辑与系数解读:
-
β
1
\\beta_1
β1 (主效应):当X
=
0
X=0
X=0(女性)时,实验组带来的提升量。 -
β
2
\\beta_2
β2 (特征效应):在对照组中,男性比女性天然高出的消费量。 -
β
3
\\beta_3
β3 (交互效应):这是关键。 它代表“男性做实验的提升量”比“女性做实验的提升量”多(或少)了多少。
为什么回归更好?
β
3
\\beta_3
β3 的 P 值显著(<0.05),你才有资格说“实验效果因人而异”。
X
X
X 是“活跃度分数”,下钻分析必须人为分桶(丢失信息),而回归可以直接计算“活跃度每增加1分,实验效果提升多少”。
3.实战演练:手把手教你做异质性检验
光说不练假把式。我们以一个具体的**“会员折扣实验”**为例,看看在 Python 中如何落地。
1. 场景设定与数据准备
假设我们进行了一场 A/B 实验:
- Y (指标):用户当周 GMV。
- T (干预):是否发放 8 折券(1=实验组,0=对照组)。
- X (特征):用户等级(1=高活用户,0=低活用户)。
我们想知道:这张 8 折券,是不是对高活用户的刺激效果更大?
2. 代码实现 (Python statsmodels)
做统计推断(Inference),不要用 sklearn,因为它不直接提供 P 值。工业界标准做法是使用 statsmodels。
import statsmodels.formula.api as smf
import pandas as pd
# 假设 df 是你的清洗后的数据 DataFrame
# df.columns = ['gmv', 'is_treatment', 'is_high_active']
# 核心步骤:定义公式
# 符号 '*' 在公式中代表:主效应 + 交互效应
# 等价于:gmv ~ is_treatment + is_high_active + is_treatment:is_high_active
formula = 'gmv ~ is_treatment * is_high_active'
# 训练 OLS (普通最小二乘法) 模型
model = smf.ols(formula=formula, data=df).fit()
# 输出详细统计报告
print(model.summary())
3. 结果解读(关键!)
运行上述代码后,你会得到一张复杂的表。别慌,你只需要关注 coef (系数) 和 P>|t| (P值) 这两列,重点看以下四行:
| Intercept (截距) | 100.0 | 0.000 | 基准线:低活用户在对照组(没券)平均买 100 块。 |
| is_treatment | 10.0 | 0.000 | 低活用户的 Lift:券让低活用户多买了 10 块。 |
| is_high_active | 200.0 | 0.000 | 天然差异:高活用户本来就比低活用户多买 200 块(跟发券无关)。 |
| is_treatment:is_high_active | 50.0 | 0.030 | 交互效应 (重点):高活用户拿券后的提升,比低活用户额外多 50 块。 |
4. 决策逻辑
看着最后一行(交互项)的 P 值,按以下逻辑下结论:
-
情形 A:交互项显著 (P < 0.05) 且系数 > 0
- 结论:实锤了!高活用户对券更敏感(Lift = 10 + 50 = 60块),低活用户不太敏感(Lift = 10块)。
- 动作:如果预算有限,优先给高活用户发券,ROI 最高。
-
情形 B:交互项显著 (P < 0.05) 且系数 < 0
- 结论:反转了!高活用户反而没那么受用(甚至可能产生反感)。
- 动作:检查策略是否对高活用户有干扰,或者只对低活用户上线。
-
情形 C:交互项不显著 (P > 0.05)
- 结论:众生平等。虽然肉眼看系数有差异(比如算出来是 5.0),但统计上这属于随机误差。
- 动作:不要搞区别对待,全量上线即可,维护一套策略成本最低。
通过这套流程,你就熟清楚了如何实打实执行线性回归。
四、进阶引申:从回归到 CUPED 与 Uplift
理解了回归在 A/B 实验中的本质,你就能串联起更多高阶概念。
1. CUPED 本质就是 ANCOVA
工业界常用的方差缩减大法 CUPED (Controlled-experiment Using Pre-Experiment Data),其数学本质与协方差分析 (ANCOVA) 是一致的。 如果你在回归方程中去掉交互项,只保留协变量:
Y
=
β
0
+
β
1
T
+
β
2
X
p
r
e
+
ϵ
Y = \\beta_0 + \\beta_1 T + \\beta_2 X_{pre} + \\epsilon
Y=β0+β1T+β2Xpre+ϵ 这里的
X
p
r
e
X_{pre}
Xpre 是实验前的数据。此时
β
1
\\beta_1
β1 的估计方差会大幅降低。所以,跑一个带实验前特征的线性回归,就是在做方差缩减。
2. Uplift Modeling 的“手动挡”
Uplift Modeling (增益模型) 旨在预测每个用户的个体因果效应 (CATE)。 我们在上面讲的“线性回归 + 交互项”,其实就是最基础的 Uplift 模型(学术上称为 S-Learner 的线性版本)。
- 线性回归:需要你手动指定交互项(比如手动乘上性别、城市),属于“手动挡”。
- 树模型 Uplift:利用随机森林或 XGBoost 自动寻找特征与干预的交互规则,属于“自动挡”。
五、总结
不要因为线性回归“简单”就轻视它。在 A/B 实验中:
下次当业务方问你“为什么这组涨了那组没涨”时,别急着拉 Excel 切片,试着跑一个带交互项的回归模型,用交互项的 P 值说话。
如果这篇文章帮你理清了思路,不妨点个关注,我会持续分享 AB 实验干货文章。 
网硕互联帮助中心





评论前必须登录!
注册