实验设计核心要素:实验组与对照组、随机化分配、样本量计算、实验周期确定
做AB测试这么多年,我踩过最大的坑是什么?
不是算法不够好,不是指标选错了。
而是实验设计本身出了问题。
你想想看,一个设计有漏洞的实验,跑再久也是白费功夫。数据出来,你根本分不清是策略有效,还是运气好。
所以今天咱们聊聊实验设计的四个核心要素。嗯,这四点你搞明白了,AB测试就稳了一半。
实验组与对照组:你的策略到底有没有用?
说白了,实验组就是用了新策略的用户,对照组就是没用的用户。
但这里有个坑——对照组必须是「当前线上版本」,不能是「空跑」或者「无推荐」。
我遇到过一个小团队,对照组直接给用户展示空列表。结果实验组点击率暴涨300%。他们高兴坏了,跑来问我是不是要上线。我说,你先看看对照组用户是不是都跑了?
嗯,果然,对照组用户流失率飙升。
另外,实验组和对照组的比例,我建议是50%:50%。
为什么?
统计功效最大。你切个1%的实验组,样本量太小,跑一个月都看不出显著差异。
随机化分配:别让用户自己选边站
随机化分配,听起来简单吧?
但实际做起来,很多人会犯一个错误——按用户ID奇偶分。
我曾经接手过一个项目,前任工程师按用户注册时间的奇偶来分实验组。结果呢?奇数用户大多是早期注册的老用户,行为模式跟新用户完全不一样。实验结论根本没法推广。
还有一点要注意:同一个用户,在整个实验周期内必须待在同一个组里。
你不能今天他在实验组,明天跑到对照组去了。这叫「组间污染」,会让你的实验效果被稀释。
样本量计算:跑多久才能出结果?
这个问题,我几乎每次做实验都会被问到。
样本量不够,实验跑不出显著差异。样本量太大,浪费流量和时间。
那怎么算?
公式其实不复杂:
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%。
为什么?因为周末用户更闲,愿意多点点看。工作日用户赶时间,新策略反而干扰了他们的效率。
另外,还有一个容易被忽略的点——新奇效应。
用户刚看到新推荐样式,可能会因为新鲜感而多点几下。但这种效果会随时间衰减。
所以,我一般会建议实验跑够2周。第一周看短期效果,第二周看效果是否稳定。
总结一下
实验设计这四个要素,说白了就是:
- 实验组与对照组:对照组必须是线上真实版本,比例尽量50%:50%
- 随机化分配:用哈希分桶,保证用户均匀分布且不跨组
- 样本量计算:用公式算,别拍脑袋。不确定方差就先跑小流量
- 实验周期:至少7天,建议14天,覆盖完整业务周期
嗯,这些就是我这些年做AB测试总结出来的核心经验。你下次设计实验的时候,不妨对照着检查一遍。少踩一个坑,就多一分靠谱。