
去年冬天我旁边工位的产品经理突然拍桌子把咖啡杯震得咣当响。他指着屏幕上的A/B测试报告两眼放光“老哥你看实验组转化率涨了百分之五p值零点零三显著能上线了吧”我探过头去瞅了一眼实验跑了三天样本量两边加起来不到四千对照组转化率百分之八实验组百分之八点四。我问他“你这个实验最少要跑几天”他说“我拍了七天但现在三天就显著了啊提前结束不行吗”我当时叹了口气给他画了张图横轴是时间纵轴是p值第一天零点四第二天零点一五第三天零点零三一条非常漂亮的下降曲线。“再跑四天信不信这条线大概率弹回去”他不信。我说行那你继续跑别停。第四天p值零点零七第五天零点一二第七天结束p值稳在零点三五。产品经理盯着那条先跌后涨的曲线发了半天呆幽幽地说“原来显著性这玩意儿还能自己长腿跑回去。”这就是A/B测试最反直觉的地方你越早看到一个令人振奋的结果这个结果越可能只是在逗你玩。统计显著性不是一堵墙翻过去就万事大吉它是一个会呼吸的东西随着样本量波动今天显著明天就哑火。这篇我想跟你聊聊做A/B测试那些年被统计指标玩得团团转的日子。一、为什么要提前算样本量很多人做A/B测试上来就是“先跑着看看”。这四个字害死人。我见过最离谱的一个实验是一个内容推荐策略的改动。实验组和对照组各分配了百分之五的流量跑了整整两个月最后发现转化率提升了百分之二但p值零点六。跑来问我为什么跑了这么久还不显著我帮他算了算以他的基准转化率和最小可检测效应量每组需要大概十二万样本才能达到百分之八十的统计功效。他跑了两个月两边各攒了一万八。也就是说他即使再跑八个月如果效果真的只有百分之二也未必能检出显著。这就引出一个在实操中常常被跳过的步骤实验前的功效分析。你得先问自己三个问题第一我能接受的最低提升幅度是多少百分之一还是百分之五第二我的基准转化率大概是多少第三我愿意承担多大的第一类错误和第二类错误风险前两个是业务判断第三个通常按行规阿尔法定零点零五贝塔定零点二也就是百分之八十的功效。有了这四个数随便找个在线计算器或者用Python的statsmodels库跑一下就能算出每组最少需要多少样本。算出来的数字往往比你直觉以为的大得多。我从一个做支付的朋友那里拿过一组数据他们某个环节的转化率高达百分之九十五想检测零点五个百分点的提升功效分析显示每组需要大概四万样本。他们每天的流量只有两千光这个实验就得跑一个多月。不做功效分析很容易以为一周就能收工。偷看的代价远比你想象的高。统计学上叫“重复显著性检验”或“偷窥效应”。实验跑的过程中你每天都去看一眼p值看到小于零点零五就兴冲冲地结束实验这会极大提高第一类错误的概率。理论上如果每天看一眼连续看十天真实的第一类错误率可能膨胀到百分之二十甚至更高。你以为自己用着零点零五的阈值实际上是在跟一个篡改了概率的骰子赌博。为什么p值会漂移因为小样本下的估计非常不稳定。实验开始前几天随便哪个极端用户的行为波动都能把实验组和对照组的差异拉出一个大坑。我做过一个电商优惠券实验前三天实验组转化率飙升百分之十我差点就要报喜了。结果第四天来了一个批发用户在实验组一口气下了四十单把均值又拉上去一大截。第五天他在对照组的小号也下了二十单差异又缩回去了。用户的随机波动在小样本下可以被放大成任何你想要的故事。真正严谨的做法是事先定好样本量和跑的时间到了就停不管显著不显著。或者用序贯检验的方法在实验开始前就设计好多次中期分析的节点并且相应地调整每次判断的显著性阈值。可惜大部分公司的实验平台都不支持这个大家还是在用“跑着看看”的土办法。二、辛普森悖论在背后捅刀子有一个经典案例我反复在各种场合讲过因为它太典型了我自己差点栽在里面。某内容平台做了一次推荐算法升级想看升级后用户的人均阅读时长有没有提升。整体数据跑出来实验组人均时长竟然下降了百分之三p值还显著。算法工程师脸都绿了辛辛苦苦调了两个月效果反而负了。他百思不得其解把数据按照用户活跃度分了个层高活用户、中活用户、低活用户。分层之后的结果让他又惊又喜每一层用户的人均时长都在涨高活涨了百分之五中活涨了百分之八低活涨了百分之十二。每一层都在涨但整体却跌了。这就是教科书级的辛普森悖论。原因出在用户结构的变化上。新算法吸引了大量低活用户回流这些原本不怎么用的人虽然时长涨了百分之十二但绝对值还是远远低于中高活用户。低活用户占比从实验前的百分之二十暴涨到百分之三十五把整体平均值给拉低了。新算法非但没问题反而是太好了好到把沉默用户都唤醒了结果这些人的低基线成了拉低均值的罪人。从那以后我每次看A/B结果之前第一件事就是做分层检查。不光是按用户分层有时候得按时间分层按渠道分层按设备分层。为什么因为整体平均值的欺骗性是最大的。你以为你在看总体的效果实际上你只是在看一个被各子群样本权重扭曲过的幻象。分层不是灵丹妙药分得越细越容易碰上多重检验的问题。切十个维度每个维度做一次显著性检验用零点零五的阈值纯随机的假阳性概率就不是百分之五了是百分之四十。这个问题得用Bonferroni或者FDR来修正但大多数人根本不修切完看见一个维度显著就拎出来汇报其他九个不显著的装作没看见这本质上是在钓鱼。三、指标体系的虚荣与真实A/B测试最痛苦的环节不是跑数据而是定义什么算“赢”。我曾经负责过一个用户增长实验产品经理定的核心指标是“次日留存率”。实验跑了两周次日留存提升了四个百分点显著。大家弹冠相庆准备全量上线。运营总监多留了个心眼让我拉一下第七日留存和第十四日留存。结果第七日留存没有变化第十四日留存反而跌了两个百分点。什么情况原来实验策略是在新用户注册当天送一张限时三天的大额优惠券用户为了把券用掉第二天确实会回来所以次日留存上去了。但券用完之后用户发现商品原价太贵反而流失得更快了。这个实验本质上是在用短期虚假繁荣透支长期价值。指标是分层的你得把它们串成一条线来看。我现在的习惯是每次实验先摆出一套指标体系三到四层第一层是“护栏指标”用来确保实验没有产生灾难性副作用比如退款率、客诉率、卸载率这些指标只要有一个出现显著恶化不管核心指标多漂亮实验都得叫停。第二层是“核心指标”也就是实验要提升的那个目标通常一到两个多了容易相互打架。第三层是“解释性指标”用来解释核心指标为什么涨或跌比如点击率涨了是因为推荐内容更精准了还是因为标题更标题党了。第四层是“长期价值指标”上面那个故事里的七日留存和十四日留存就属于这一层如果业务场景允许观察足够长的周期这一层必须放进去。搭建这套体系最大的阻力往往来自业务方。没人愿意给自己的实验戴上这么多镣铐他们只想用一个指标证明自己做了件正确的事。我见过一个运营实验核心指标选了“活动页面分享率”。实验组分享率暴涨百分之两百看起来牛逼到不行。我看了眼护栏指标发现页面停留时长暴跌分享出去的回流点击率几乎为零。原来他们搞了一个“分享得积分”的弹窗用户点完分享、返回App、积分到账全程三秒压根没看活动内容。这实验的分享率提升有意义吗屁都没有。但活动运营的KPI里写的就是分享率他赢了公司输了。这就是做A/B测试最细思极恐的地方只要指标选得够巧妙你可以证明任何你想证明的结论。想证明新策略好就挑一个容易被短期操纵的指标想干掉你不喜欢的策略就给它配一堆严格的护栏指标。数据分析师在这里的角色不是跑数的而是守门员。当所有人都在为显著性欢呼的时候你得冷静地追问这个指标能代表真实的用户价值吗四、网络效应与干扰效应经典的A/B测试假设每个样本是独立的用户的体验不受其他用户影响。这个假设在很多场景下根本不成立。我做社交类产品的时候碰到过一个问题两个人互为好友一个被分到实验组看到了新功能另一个在对照组看不到。实验组用户用新功能发了一条消息给对照组好友对照组好友点开一看报错闪退或者显示不兼容。对照组用户体验直接爆炸客诉飙升。这种场景下两组用户不是独立的实验组的行为污染了对照组直接对比已经没有意义。解决办法要么在集群层面做随机化比如以城市为单位分流整个上海市都在实验组整个北京市都在对照组。但这要求你有足够的集群数量而且集群之间用户互动极少。要么用更复杂的网络效应模型来估计处理效应但这已经超出大部分公司的工程和统计能力了。更多时候面对网络效应我们只能退而求其次做一些有限范围的观察性判断然后凭经验和直觉拍板。另一种干扰来自资源竞争。做过广告算法的都知道你把一批用户分到实验组给了更高的出价他们把有限的广告库存抢走了对照组用户的广告展现自然就变少了转化也跟着掉。这看起来像是实验组效果好、对照组效果差实际上是同一个池子里的零和博弈。这种实验的正确做法是对比两个独立的时间段或者用开关实验的方式今天全量开实验策略明天全量关反复切换比长期均值。但这又带来了时间序列上的混杂因素周末和周一用户行为本来就不一样需要用差异中的差异或CausalImpact这类方法来做分析。折腾下来一个简单的A/B变成了半篇计量经济学论文。五、当统计显著碰上业务显著最后一个坑也是最常见的坑统计显著不等于业务显著。百分之零点一的提升样本量足够大的时候也能给你跑出p值小于零点零零一。但百分之零点一值得上线吗工程的复杂度、维护成本、潜在风险可能远远大于这点收益。反过来有些提升虽然在统计上不显著但业务逻辑极其清晰而且实现成本极低你上还是不上我在一家创业公司的时候有个后端工程师在接口层做了一行代码的优化理论上能让加载时间减少十毫秒。A/B跑了一周因为样本量不够p值零点二从统计上没法说有效。但他非常确定这十毫秒是实打实省下来的。最后我们决定全量上线把实验当成一个“灰度验证”看看有没有负面问题。上线后虽然没有完美的对照组但加载时间的监控曲线整体左移了十二毫秒客服那边也没有异常反馈。这件事情如果死磕统计显著永远不会上线但实际上它就是一个正确的优化。反过来讲那些p值完美小于零点零五、但效应量小到可怜、解释逻辑诡异、上线成本巨大的实验我投反对票从来不手软。数据是决策的辅助不是决策的替代品。如果你只用数据做决策那你其实是在用过去的数据做决策而过去的数据里没有未来的黑天鹅。做A/B测试这些年最大的收获不是学会了算p值而是学会了在数字和业务之间找到一种张力。你对数字得足够尊重不能瞎解读但你也得对数字足够警惕不能被它牵着鼻子走。那些看起来漂亮的显著性有时候只是替你老板的预设结论披了一件科学的外衣。真正有价值的实验往往数据没那么完美但你能从用户行为的每一个微小变化里嗅到正确的方向。