第4章:实验设计与随机化
说到A/B测试,很多人第一反应就是“切分流量,跑个实验”。但真正上手你就知道,分流量这件事没那么简单。我曾经在团队里见过一个惨痛的案例:测新推荐算法,结果实验组和对照组的数据在几个维度上天然不平衡,最后折腾两周才发现是随机化没做好。嗯,这一章我们就来把实验设计和随机化的门道聊透。
4.1 实验设计的三要素
不管你做的是界面改版、模型迭代还是运营策略,A/B测试的核心骨架都一样。说白了,就三样东西:
- 实验假设:你想验证什么?比如“新版注册流程能提高转化率5%”
- 实验变量:你改了什么?比如按钮颜色、推荐算法版本
- 指标:你怎么衡量效果?比如点击率、留存率、GMV
我个人的习惯是,在写第一行代码之前,先把这三样东西写进一个文档里。别觉得多余——很多实验做着做着就忘了当初要测什么,回过头来发现指标都没对齐。
4.2 随机化:不是随便分一分就行
随机化的目标只有一个——让实验组和对照组在除实验变量之外的所有维度上都可比。如果随机化没做好,实验结果就是假的。
4.2.1 简单随机化
最简单的方法,给每个用户一个随机数,模2分两组。但这么做有个坑:样本量小的时候,两组可能天然不平衡。
# 伪代码示例:简单随机分组
user_id = 10086
group = "treatment" if hash(user_id) % 2 == 0 else "control"
为什么会有问题?你想想看,如果活跃用户集中在奇数ID上,简单随机就可能把活跃度因素带进实验里。我在一个日活几百万的项目里遇到过,分组后对照组的新用户占比明显偏高,就是因为没有考虑分层。
4.2.2 分层随机化
分层随机化的思路很简单:先把用户按重要特征分层(比如新老用户、付费等级、地区),然后在每一层内独立做随机化。这样能保证层内两组分布一致。
| 分层维度 | 层内用户数 | 实验组 | 对照组 |
|---|---|---|---|
| 新用户 | 10,000 | 5,000 | 5,000 |
| 老用户-低付费 | 20,000 | 10,000 | 10,000 |
| 老用户-高付费 | 5,000 | 2,500 | 2,500 |
当然,分层也不是越多越好。我记得有一次分层维度加到十几个,结果有的层里只有几十个人,随机化成了笑话。你想想看,一个层里总共30个人,随机分配后两组各15人,稍微波动一下差异就很大。
4.2.3 区组随机化
区组随机化是另一种常用的技术,特别适合时间序列上的实验。比如你按天或按小时做实验,每个时间窗口内保证两组样本数尽量均衡。
具体做法:把用户按到达时间顺序,每n个人组成一个区组,在区组内做随机分配。比如每10人一个区组,区组内随机分配5人去实验组,5人去对照组。
# 区组随机化示例(块大小=10)
def assign_group(user, block_size=10):
block_id = user.seq_id // block_size
# 区组内打乱顺序
perm = np.random.permutation(block_size)
is_treatment = perm[user.seq_id % block_size] < block_size // 2
return "treatment" if is_treatment else "control"
这么做的好处是时刻保证两组样本量相近,不会出现“前面2小时全是实验组,后面2小时全是对照组”的尴尬局面。
4.3 样本量计算:别太小,也别太大
样本量太小,实验没统计学功效——明明有效果,检测不出来。样本量太大,小到没业务意义的效果也被判定显著,浪费资源。
常用的公式是(假设显著性水平α=0.05,统计功效1-β=0.8):
n = 2 * (Z_α/2 + Z_β)² * σ² / δ²
# 其中:
# σ²:指标方差(可从前序数据中估算)
# δ:最小可检测效应 (如转化率提升0.5%)
# Z_α/2 = 1.96,Z_β = 0.84
举个例子:老用户转化率是10%,你想检测到提升1个百分点的效果(δ=0.01)。假设转化率的方差≈0.09(伯努利分布方差 p*(1-p)=0.09)。
n = 2 * (1.96 + 0.84)² * 0.09 / (0.01)²
≈ 2 * 7.84 * 0.09 / 0.0001
≈ 14,112
也就是说,每组至少需要14,112个用户。如果日活跃用户只有1万,那这个实验可能需要跑3-4天才能累积够样本。
4.4 随机化的常见坑
- 网络效应干扰:有些功能有社交属性,比如你在好友圈里改了推荐算法,好友之间会互相影响。这时候简单按用户ID随机化会“污染”对照组。解决方案:按社交集群随机化(如按班级、按小区)。
- 用户重复进入实验:同一个用户如果多次进入同一实验,既会被记录多次,又会稀释效果。我之前做过一个活动页的A/B测试,忘了给每个用户打实验标签,结果用户每天进来都被当成新样本……数据完全乱了。
- 随机化后的数据漂移:有些特征在你随机化时是均衡的,但实验跑着跑着两边就偏了。比如实验组提升了用户体验,导致用户留存变好,那么后期两组用户画像就可能分化。这是正常的,但分析时要注意方法(如增量分析)。
4.5 本章核心流程全景图
这张图概括了本章的核心逻辑:从定义假设出发,选择随机化方法并计算样本量,然后执行并监控,最后做效果分析。每一步之间都有反馈——比如发现随机化不均,你可能需要回到方法选择重新设计。
小结
实验设计不是纸上谈兵。我建议你在实际项目中至少花20%的时间在实验设计阶段,把随机化方案、样本量估算、监控指标都写清楚。别急着上线跑实验,前期磨刀不误砍柴工。