实验设计核心要素:实验组与对照组、随机化分配、样本量计算、实验周期确定

做AB测试这么多年,我踩过最大的坑是什么?

不是算法不够好,不是指标选错了。

而是实验设计本身出了问题。

你想想看,一个设计有漏洞的实验,跑再久也是白费功夫。数据出来,你根本分不清是策略有效,还是运气好。

所以今天咱们聊聊实验设计的四个核心要素。嗯,这四点你搞明白了,AB测试就稳了一半。

实验组与对照组:你的策略到底有没有用?

说白了,实验组就是用了新策略的用户,对照组就是没用的用户。

但这里有个坑——对照组必须是「当前线上版本」,不能是「空跑」或者「无推荐」。

我遇到过一个小团队,对照组直接给用户展示空列表。结果实验组点击率暴涨300%。他们高兴坏了,跑来问我是不是要上线。我说,你先看看对照组用户是不是都跑了?

嗯,果然,对照组用户流失率飙升。

注意:对照组必须代表当前生产环境的真实体验。任何人为降级都会导致实验结论失效。

另外,实验组和对照组的比例,我建议是50%:50%。

为什么?

统计功效最大。你切个1%的实验组,样本量太小,跑一个月都看不出显著差异。

随机化分配:别让用户自己选边站

随机化分配,听起来简单吧?

但实际做起来,很多人会犯一个错误——按用户ID奇偶分。

我曾经接手过一个项目,前任工程师按用户注册时间的奇偶来分实验组。结果呢?奇数用户大多是早期注册的老用户,行为模式跟新用户完全不一样。实验结论根本没法推广。

正确做法:使用哈希函数对用户ID进行均匀分桶。比如 hash(user_id) % 100,小于50的进实验组,大于等于50的进对照组。

还有一点要注意:同一个用户,在整个实验周期内必须待在同一个组里。

你不能今天他在实验组,明天跑到对照组去了。这叫「组间污染」,会让你的实验效果被稀释。

样本量计算:跑多久才能出结果?

这个问题,我几乎每次做实验都会被问到。

样本量不够,实验跑不出显著差异。样本量太大,浪费流量和时间。

那怎么算?

公式其实不复杂:

n = (Z_α/2 + Z_β)² * (σ₁² + σ₂²) / δ²

其中:

  • Z_α/2:显著性水平对应的Z值(一般取1.96,对应α=0.05)
  • Z_β:统计功效对应的Z值(一般取0.84,对应80%功效)
  • σ₁²、σ₂²:两组指标的方差
  • δ:你期望检测到的最小效果(比如CTR提升0.5%)

我习惯用Python写个函数来算:

import math

def sample_size(effect_size, std1, std2, alpha=0.05, power=0.8):
    z_alpha = 1.96
    z_beta = 0.84
    n = (z_alpha + z_beta)**2 * (std1**2 + std2**2) / effect_size**2
    return math.ceil(n)

# 假设CTR标准差0.02,期望检测0.005的提升
n = sample_size(0.005, 0.02, 0.02)
print(f"每组需要样本量: {n}")
小技巧:如果你不确定方差,可以先跑一周小流量实验,用这周的数据估算方差,再反推完整实验需要的样本量。

实验周期确定:别被「周末效应」骗了

样本量算出来了,是不是跑够样本量就能停?

不是的。

你想想看,用户行为有周期性。工作日和周末不一样,月初和月末不一样,甚至双十一前后都不一样。

我见过最惨的案例:一个推荐算法实验,只跑了3天,刚好赶上周末。实验组CTR比对照组高10%,团队直接上线。结果周一数据一出来,CTR反而跌了5%。

为什么?因为周末用户更闲,愿意多点点看。工作日用户赶时间,新策略反而干扰了他们的效率。

经验法则:实验周期至少覆盖一个完整的业务周期。对于推荐系统,我建议最少跑7天,包含一个完整的周一到周日。

另外,还有一个容易被忽略的点——新奇效应。

用户刚看到新推荐样式,可能会因为新鲜感而多点几下。但这种效果会随时间衰减。

所以,我一般会建议实验跑够2周。第一周看短期效果,第二周看效果是否稳定。

总结一下

实验设计这四个要素,说白了就是:

  • 实验组与对照组:对照组必须是线上真实版本,比例尽量50%:50%
  • 随机化分配:用哈希分桶,保证用户均匀分布且不跨组
  • 样本量计算:用公式算,别拍脑袋。不确定方差就先跑小流量
  • 实验周期:至少7天,建议14天,覆盖完整业务周期

嗯,这些就是我这些年做AB测试总结出来的核心经验。你下次设计实验的时候,不妨对照着检查一遍。少踩一个坑,就多一分靠谱。