跳至主要内容
A/B 实验题里最常见的四种错

A/B 实验题里最常见的四种错

「新推荐策略跑了三天,实验组点击率比对照组高 5%,能发全量吗?」这道题我给过不少人,答案几乎都会落进同样的四个坑里。

有意思的是,四个坑里没有一个跟统计公式有关。它们全都是「在做判断之前,先确认判断依据成立」的习惯问题。数据产品经理在这个环节的价值,不是会算 p 值,是能在会议室里拦住一个看起来很漂亮的结论。

本系列第 4/10 篇 · 上一篇:数据跌了三成,先别急着归因业务 · 下一篇:这个需求要不要新建一张表

第一种错:还没验数据,就先看指标

我等的第一句话是:两组样本量对得上吗。

设计上 50/50 分流,实际收上来 52/48,或者某一天实验组突然少了两成事件,这叫样本比例失衡(SRM)。这时候点击率的 5% 毫无意义,因为它可能来自「一部分人根本没被记录」,而不是「策略更有效」。SRM 的常见来源是分流逻辑写错、某端没接实验 SDK、埋点在新版本里丢了、或者实验组的请求超时更多。

所以正确的动作是先暂停看指标,回去查分流和埋点:按端、版本、渠道拆开看两组人数比,检查曝光事件是否成对出现,确认实验分组字段是曝光那一刻的快照而不是事后关联(第 2 篇里强调过这一点)。SRM 没排除之前,任何显著性计算都是在给一个坏掉的尺子读刻度。

能主动说出「先看 SRM」的人,通常真被实验事故坑过。剩下的人往往直接跳到「5% 够不够显著」,这一步跳过去,后面全白算。

第二种错:分流单元和分流时刻含糊

第二个追问是:你按什么分流,从哪一刻开始分。

按用户、按设备还是按会话,取决于体验是否跨端连续。推荐策略改的是用户长期看到的内容,就该按用户 ID 分流;同一个人在手机上进实验组、在平板上进对照组,两边行为互相污染,还会在他的体验里出现「换个设备内容就变了」。反过来,如果用户没登录,就只能用设备级匿名 ID,并且得承认换机、清缓存会重新分流,把这个限制写进结论。

分流必须是确定性且持久的,通常用 hash(user_id + 实验盐值) 取模,盐值每个实验独立,避免多个实验总把同一批人分到同一侧。我见过用随机数临时分组的实现,用户刷新一次就换组,实验数据直接变成噪声。也见过按时间轮流切换的「伪实验」,早上的流量全是对照组、下午全是实验组,把时段差异当成了策略效果。

还有分流时刻:必须在用户可能接触到改动之前就分好组,并且只把真正曝光过的用户计入分析。把「被分流但未曝光」的人算进分母,会稀释效果;只统计「点击过的人」更是典型的选择偏差,因为点击本身就是策略影响的结果。

第三种错:把「涨了」当成「显著」,而且反复偷看

第三种错最常见,也最容易被一句话糊过去:跑三天,涨 5%,发。

先估数量级。常见近似下,双侧 5% 显著性、80% 功效,每臂需要的样本量大致是:

TEXT1 行
1
n ≈ 16 × p × (1 - p) / δ²

p 是对照组基线率,δ 是想检出的绝对提升。基线点击率 10%、想检出 1 个百分点,代入就是 16 × 0.1 × 0.9 / 0.0001,每臂约一万四千条样本;如果基线是 2%、同样检 1 个百分点,数量级又不一样。这个式子的意义不是让人背,而是让人意识到:能检出多小的提升,是由流量和基线率决定的,不是由决心决定的。三天够不够,得先拿日均曝光量算一遍,算不出来就是还没资格下结论。

然后是偷看。每天打开报表看一眼,一显著就停手,等于反复做多次检验,假阳性会被显著放大。正确做法是实验开始前固定三件事:主指标、最小可检提升、样本量或运行时长,到点再看。如果业务上必须每天盯,那就用序贯检验或明确的提前停止规则,而不是靠感觉。

还有两个附带的坑:看了二十个指标总有一个显著,这叫多重比较;实验结束后再按地域、机型、新老用户切出一百个切片,挑出涨得最好那个说「对这群人特别有效」,多半只是噪声。分层分析要预先声明,事后切出来的只能当假设,留给下一轮实验验证。

第四种错:只看主指标,不看护栏和污染

点击率涨 5%,完全可能是标题更耸动、重复曝光变多、把用户引向低质内容。我会要求同时报一组护栏:停留时长、返回率、内容多样性、举报与投诉、次日留存,供给侧还要看创作者曝光是否被挤压。点击率是一个特别容易被局部优化带偏的指标,它涨的时候你更要问「用户有没有得到更好的结果」。

时间维度上还有新奇效应和学习期:用户因为「不一样」多点几下,两周后回落;新策略需要冷启动积累数据,前几天表现反而偏差。所以短期实验结论要配长期观测,或者至少留一段稳态窗口。

污染则来自实验期间发生的其他事:发版、大促、投放起量、节假日、上游推荐服务故障。我习惯把实验期内的所有变更列成一张时间轴贴在结论旁边,并且检查实验组与对照组是否同比例受这些事件影响。必要时留一部分流量做长期 holdout,用来观察发全量后的真实长期收益。

「能不能发全量」这个问题,我期待的答复是一个决策流程而不是一个字:先验 SRM 与埋点,再看主指标是否达到预设门槛,再看护栏有没有恶化、分层是否一致,最后给灰度方案——先放多少流量、监控哪几个指标、什么条件下回滚。回滚条件要写成可执行的句子,比如「通知关闭率或投诉率相对对照组超过约定阈值并持续两天,立即回滚」,而不是「有异常就回滚」。

面试里如果只剩一分钟,我会让对方把这句话说完:这次实验,最可能让你误判的是什么。答得出来的人,通常不会拿三天的数据去发全量。

关于本文

由 Lu's Blog 撰写,采用 CC BY-NC 4.0 许可协议。

#A/B 实验 #数据产品 #面试

评论