共计 2015 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
AB 实验是产品迭代中验证假设的黄金标准,但实践中常遇到三类典型问题:

- 统计偏差 :非随机分组导致实验组 / 对照组基线不一致。例如测试新推荐算法时,活跃用户更可能被分到实验组
- 样本量不足 :未提前计算统计功效,导致无法检测到真实的处理效应
- 混杂变量 :未控制季节性或外部事件影响。如促销期间测试价格敏感度会干扰结果
技术选型对比
1. 随机对照实验 (RCT)
- 原理 :通过完全随机化分配消除混杂因素
- 优势 :黄金标准,因果效应估计最干净
- 局限 :需大规模样本,某些场景无法随机化(如价格歧视)
2. 双重差分法 (DID)
- 公式 :效应 = (实验组后 - 实验组前) – (对照组后 - 对照组前)
- 适用 :存在自然实验场景(如部分用户灰度发布)
- 案例 :评估新客服系统效果时,用未升级地区作为对照
3. 倾向得分匹配 (PSM)
- 步骤 :
- 构建预测分组概率的模型
- 为实验组用户匹配最相似的对照组用户
- 优势 :适用于观测数据,无需随机实验
核心实现
实验分组随机化
import pandas as pd
import numpy as np
# 模拟用户数据
df = pd.DataFrame({'user_id': range(10000),
'age': np.random.randint(18, 65, 10000),
'gender': np.random.choice(['M','F'], 10000),
'history_purchase': np.random.exponential(100, 10000)
})
# 分层抽样:保证各层中实验组 / 对照组比例一致
strata = pd.cut(df['history_purchase'], bins=5)
df['group'] = df.groupby(strata)['user_id']\
.transform(lambda x: np.random.choice(['control','test'], len(x), p=[0.5,0.5]))
因果推断实现
from dowhy import CausalModel
# 电商案例:评估会员折扣对复购率的影响
model = CausalModel(
data=df,
treatment='is_member',
outcome='repurchase_rate',
common_causes=['age', 'gender', 'past_purchase']
)
# 识别因果效应
identified_estimand = model.identify_effect()
# 使用倾向得分加权估计
estimate = model.estimate_effect(
identified_estimand,
method_name='backdoor.propensity_score_weighting'
)
print(f"ATE: {estimate.value:.3f}")
避坑指南
- 新奇效应 :用户对新功能临时性好奇导致短期数据偏高
-
解法 :设置足够长的实验周期(通常 1 - 2 个完整自然周)
-
样本污染 :同一用户在不同设备被分到不同组
-
解法 :按用户 ID 而非设备 ID 分组,使用持久化分组
-
多重检验 :同时测试多个指标导致假阳性率上升
-
解法 :使用 Bonferroni 校正或控制 FDR
-
季节性波动 :工作日 / 周末行为差异影响结果
-
解法 :确保实验组 / 对照组时间窗口完全重叠
-
幸存者偏差 :仅分析完成流程的用户会高估效果
- 解法 :采用 ITT(意向处理)分析原则
性能考量
统计功效计算
- 工具 :statsmodels 库的
tt_ind_solve_power - 参数 :
- 效应量(如转化率从 5% 提升到 5.5%)
- 显著性水平(通常 α =0.05)
- 功效(通常 β =0.8)
from statsmodels.stats.power import tt_ind_solve_power
# 计算检测 5% 相对提升所需的样本量
required_n = tt_ind_solve_power(
effect_size=0.05/0.95, # Cohen's d
alpha=0.05,
power=0.8,
ratio=1 # 两组样本量相等
)
print(f"每组需要样本: {int(required_n)}")
多重检验校正
- Bonferroni 法 :将 α 阈值除以检验次数
- FDR 控制 :使用 statsmodels 的
multipletests
电商案例:优惠券发放策略
场景 :比较 ” 满 100 减 10″ 与 ” 直接 9 折 ” 哪种更能提升客单价
- 实验设计:
- 分层因素:用户历史客单价、活跃度
-
监测指标:订单金额、使用率、利润率
-
分析发现:
- 9 折券使用率更高(+15%)
-
但满减券拉动更高客单价(+22%)
-
决策建议:
- 对价格敏感用户推送 9 折券
- 对高价值用户使用满减策略
延伸思考
- 如何设计实验验证推荐算法「爆款过滤」功能的效果?
- 当用户存在网络效应(互相影响)时,传统 AB 测试有何局限?
- 对于 DAU 小于 1 万的产品,如何调整实验方法?
在实践中,AB 测试是科学决策的开始而非终点。建议建立完整的实验文档体系,记录每次实验的假设、设计和结论,长期积累形成数据资产。
正文完
