首页 / 资讯中心 / 文章详情

AB实验中的一类错误与二类错误:统计决策实战解结

AB实验中的一类错误与二类错误:统计决策实战解结 ★ FEATURED ARTICLE
做AB实验的人迟早会撞上同一堵墙跑了一个月的实验终于p值小于0.05高高兴兴全量上线结果业务指标纹丝不动反过来某个改动内部判断“肯定有效”实验跑了两周却不显著于是项目被砍三个月后竞品靠这个功能翻了身。这两种剧本我在不同团队里见过几十次根子大多不是产品问题而是统计决策里的一类错误和二类错误。这篇就来拆开这个贯穿AB实验始终的“生死结”讲清楚它们怎么产生、为什么互相牵扯、以及到底怎么在实战中把它们解开。1. 这场的两位主角一类错误和二类错误1.1 一类错误把“没效果”验成“有效果”一类错误在教科书里的定义是当原假设为真时我们错误地拒绝了原假设。翻译成人话新版本本来没有提升但抽样误差让实验组指标比对照组高出一截统计检验给出“显著”于是你上线了一个其实没用的改动。这里的关键词是“原假设”。AB实验的原假设通常是“新版本与旧版本没有差异”。这个假设极不性感也不代表我们真的相信它而是把它当作默认判决除非数据有足够强的证据否则不轻易翻案。α通常设为0.05就是翻案的门槛它表示“在原假设成立的前提下我愿意承受最多5%的误判概率”。用大白话说α是“冤枉好人”的概率。假设你重复做100个实际上完全无效的AB实验只靠随机波动平均也会有5个左右跑出“显著差异”。这5个就是假阳性。做实验的人最容易犯的错觉是p0.05就代表“这件事大概率有效”。不对p0.05只是说在新版本无效的假设下看到你手上这种数据或更极端数据的概率小于5%。它没有告诉你“有效”的概率是多少。我在实际项目里见过最典型的例子某个按钮颜色从蓝色换成了绿色对照组转化率10.2%实验组10.8%p0.04团队兴奋地全量。结果全量两周后整体转化率回落到10.3%。这类事情不是偶然而是在样本量不足、观察窗口过短的时候反复出现。把随机波动当成真效果就是一类错误的代价。1.2 二类错误把“有效果”验成“没效果”二类错误是另一个方向新版本确实有效果但实验没能把它检测出来于是我们错误地没有拒绝原假设得出“没有显著差异”的结论最终错过了一个真实的机会。二类错误的概率用β表示而1-β就是统计功效也就是“当效果真实存在时实验能把它找出来的概率”。行业里常规要求是0.8意思是如果真实有效果80%的情况下实验应该能给出显著结果剩下20%就漏了。这20%的漏报为什么可怕因为它是隐蔽的。一类错误导致的失败很容易被归因于“实验不靠谱”而二类错误导致的失败往往悄无声息。我印象很深的一个案例某团队优化推荐策略内部预期人均点击能提升1.5%实验只跑了三天就停了p0.09结论写成“策略无明显提升”项目就地解散。后来复盘发现他们用了一个错得离谱的样本量预算检验功效还不到35%。也就是说即使策略真能提升1.5%也有65%的概率会得到“不显著”。真实机会就这样被统计学裹挟着埋掉了。所以要记住p值大于0.05不代表“没有效果”它只是说“以当前的数据量证据还不够强”。不够强和不存在是两回事。1.3 这两个错误怎么就成了“生死结”说它们是“生死结”是因为在样本量固定的前提下降低一类错误的概率往往会导致二类错误的概率上升反过来也一样。你越想避免冤枉无效的改动就越容易漏掉真实有效的改动。用个生活化类比你在机场安检若把阈值调得特别严几乎不会放过危险品β低但普通旅客被误拦的概率大增α高。若把阈值放松误报少了可疑人员溜进去的概率又高了。两者就像天平两端想同时摁住一边另一边必然翘起来。这个结最磨人的地方在于AB实验里我们只能抽一份样本所有结论都建立在样本对总体的近似上。样本量越小两个分布的尾巴重叠越多两类错误就纠缠得越紧。要想真正解开不是靠某个统计技巧而是要靠增加信息量也就是更多的样本、更长的观察周期、更稳定的指标度量。后面我会展开讲为什么这些才是解开绳结的剪刀。2. 绳结是怎么系上的从抽样分布聊起2.1 两个分布的重叠区就是错误的藏身处理解这个结最直观的方式是看抽样分布。假设原假设H0为“新旧版本无差异”对应的检验统计量会落在以0为中心的一个分布里。备择假设H1为“新版本真实有提升”对应的统计量落在另一个偏右的分布里。我们设定一个临界值统计量超过它就算显著。真实世界里没有上帝视角你只能看到一次抽样落到了哪里。如果这个样本落在两个分布的重叠区麻烦就来了它可能来自H0的极端尾巴也可能来自H1的普通中心。你把它判成“显著”有可能是一类错误你把它判成“不显著”有可能是二类错误。临界值往右移α变小了但H1分布里靠左的那一大片区域都判不出显著β变大了。临界值往左移β变小了但H0分布里靠右的那一大片区域会被误判α变大了。这就是为什么“生死结”在图上看着一目了然落到决策上却让人抓狂。我建议每个做AB实验的人都亲手画一次这条两个分布重叠的曲线。画完就明白所谓统计推断本质上是在误差不可避免的前提下做权衡而不是在追求“绝对正确”。2.2 样本量是唯一能同时勒紧两端的解药既然固定样本量下α和β此消彼长那有没有能同时降低两者的方法有就是增加样本量。样本量n变大时样本均值的标准误变小整个分布会变得更瘦更尖H0和H1两个分布的重叠区域也随之缩小。临界值可以保持不变α和β却一起往下压。这就是为什么所有靠谱的AB实验流程第一条都是“先算样本量”。很多人觉得这是形式主义觉得反正流量多跑几天就够了。但流量多不等于样本量大尤其当真实效果只有1%到2%的提升时需要巨大样本量才能把信号从噪声里捞出来。基线转化率20%、真实提升2个百分点的场景如果每组只放1000个用户检验功效可能连30%都不到而每组放到6500个用户功效才能达到80%。这个差异不是修修补补能解决的它直接决定实验结论的生死。所以在实际工作里遇到“实验不显著”的第一反应不该是怀疑方案而是先看样本量够不够、功效够不够。很多时候不是产品不行是统计功效压根没给机会。2.3 p值、α、β别再混为一谈围绕这个结还有一个常见的理解误区把p值当成α又把α当成“效果不存在的概率”。α是你在实验开始前设定的阈值是长期重复实验时的一类错误率。p值是某一次实验拿到当前结果后在H0为真的假设下计算的概率。p值和α的对比方式很简单p小于α拒绝H0p不小于α不拒绝H0。但p值不是“新版本有效的概率”更不是“这个效果有多大概率能复现”。贝叶斯意义上的后验概率需要引入先验和备择假设的分布不是一张p值表就能回答的。β同样是对长期频率的描述如果真实效果存在且等于你假定的MDE那么重复做实验平均有β的比例会漏报。它不回答“这一次实验到底有没有漏”。但理解β的价值在于实验开始前你就能判断方案到底值不值得花时间去跑。如果功效只有40%那跑出来的结果无论显著还是不显著参考价值都很低。把α、β、p值放在一起看你就会明白AB实验的结论从来不是非黑即白而是一道在信息不足时的选择题。选错了不是因为你笨而是绳结本身的属性。3. 解结第一步算清楚样本量3.1 先定“值得发现的提升”否则一切白算每次聊样本量我都会先问一个问题你觉得这个改动带来多少提升才值得上线这个数值就是最小可检测效应简称MDE。它的定义是实验想要有足够把握检出的最小真实效果。MDE不是拍脑袋出来的它必须接近业务上的“最低盈利线”。比如某个改动上线成本高、风险大那它至少要带来10%的转化率提升才值得做但如果只是换个文案可能3%就值得。先把MDE定下来后面所有公式才有意义。经验不足的人最容易犯的错是把MDE设得特别小恨不得发现0.1%的提升。这不是严谨这是烧钱。样本量和MDE的平方成反比MDE从2%降到1%其他条件不变样本量会膨胀到原来的4倍左右。想象一下一个原本每组6500人的实验瞬间变成每组26000人周期可能从两周变成两个月。实验拖着不上线机会成本比那一点“可能存在的提升”大多了。我常用的实践标准是MDE至少取基线指标相对提升的10%到20%或者取财务模型算出来的最小可行改善。如果连这个量级的提升都看不到那这个改动本身不值得赌。3.2 一个完整算例从公式到代码给个具体场景某产品注册转化率目前是20%你要验证新版注册页能不能把它提升到22%。也就是说p10.20p20.22绝对提升2个百分点相对提升10%。设定α0.05双侧检验功效1-β0.80。问每组至少需要多少用户比例类指标的双样本近似公式是n ( (z_{1-α/2}×SE0 z_{1-β}×SE1) / (p1-p2) )²其中SE0是在原假设下用合并比例算的标准误SE1是在备择假设下用两个组各自比例算出的标准误。用标准正态分位数值z_{0.975}约1.96z_{0.80}约0.84。把p10.20、p20.22代入算出来每组大约需要6500个用户。这个数字的直观含义是如果新版注册页真能把转化率从20%提高到22%那么每组6500人的实验有80%的概率能给出“p0.05”的显著结果同时如果新版其实没用也有95%的概率会得到“不显著”。直接用代码算更方便from scipy.stats import norm def calc_sample_size(p1, p2, alpha0.05, power0.8): # p1/p2两组预期转化率alpha显著性水平power目标功效 z_alpha norm.ppf(1 - alpha / 2) z_beta norm.ppf(power) p_pool (p1 p2) / 2 se0 (2 * p_pool * (1 - p_pool)) ** 0.5 se1 (p1 * (1 - p1) p2 * (1 - p2)) ** 0.5 delta abs(p2 - p1) n ((z_alpha * se0 z_beta * se1) / delta) ** 2 return n print(calc_sample_size(0.20, 0.22))代码输出大约6505和我手算的估值一样。这意味着实验总共需要约13000个达标用户。如果日均新增注册用户5万那么顺利的话一天半就能攒够但实际还要考虑流量分割比例、用户留存周期、是否要覆盖完整周末效应等所以一般会把运行周期放宽到一到两周。这个场景如果只看“一天半就能跑完”然后第二天就下结论风险会很大。3.3 算完样本量后的三个实操提醒第一个提醒上面的公式是单指标、一次性检验的算法。如果你的实验有多个主指标或者中途会多次看显著性样本量就不够用了。多个指标意味着多重比较中途查看则意味着α在悄悄膨胀。后面第4部分会专门讲这两个坑。第二个提醒流量分割比不一定是1:1。有些场景为了照顾体验会用70%到30%甚至90%到10%的分流。这会导致总样本量要求上升。因为两样本比例固定时功效不是由总样本量单独决定的还要看较小那一组的样本量。如果需要对照组占30%那么总样本量可能会比1:1时高出不少别把“总流量”误当成“每组样本量”。第三个提醒样本量算出来是针对“有效分析用户”的不是曝光用户数。如果用户没看到新版页面或者看到了但没有产生可记录的转化就不算有效样本。实验设计阶段就要把“可分析用户”的定义写清楚否则样本量表很容易变成空气指标。4. 实际工作中把结越拉越紧的三个操作4.1 中途看p值一显著就停实验这是我在多个团队里纠正过无数次的操作。很多人跑实验每天打开后台看p值第三天看到p0.04就觉得“到位了”直接全量上线。然后翻车的概率远比你想象的高。原因在于你每多看一次数据就相当于额外做了一次统计检验。实验进行到第3天看一次第5天再看一次第7天再看一次每次都有约5%的一类错误风险。这些额外检验叠加起来整体一类错误率会远高于5%。只要保持“等数据攒够了再看”的纪律这个问题就能避免。如果业务上确实需要尽早知道结果那就不要用标准的固定样本检验而是用序贯检验或者α消耗函数。这类方法会提前把“中途多次查看”消耗的显著性预算算进去要求更严苛的p值阈值才能保持总体α不失控。不要觉得这很麻烦比起上线一个假显著的效果这点设计成本低得多。4.2 一堆指标里挑一个显著的当胜利一个实验只有三个核心指标还好有的团队一口气埋了几十个事件指标然后谁显著就宣称谁成功。这个操作同样会让一类错误失控。假设你看了10个独立指标每个指标显著性水平都是0.05全部无效时至少有一个指标显著的累积概率是1-(1-0.05)¹⁰约40%。也就是说哪怕新版本根本没有任何真实效果光是运气也有四成概率会“找到一个显著指标”。解法不是把所有阈值都乘个10倍做个保守校正而是回到业务逻辑本身。每个实验只能有一个主指标它是你在实验开始前根据业务目标选定的。其他指标只作为护栏指标和辅助诊断使用。如果要保护整体α可以用Bonferroni校正但那会牺牲功效让β变大所以更推荐的做法是少设主指标而不是多设指标后靠校正硬撑。4.3 不显著就直接宣告“没效果”这个操作其实是二类错误在决策层的溢出。p值不显著只能说明当前样本里没有足够证据支持“存在效果”的结论但它没有证明“效果不存在”。比如实验跑完观察到的提升是1.2%p0.0995%置信区间是[-0.3%, 2.7%]。这种情况下区间还覆盖了“提升1.5%”这种有业务意义的数值我们不能说这个改动没用只能说现有数据量不足以把结论钉死。正确的做法是把置信区间和效应量一起报告再判断是否有必要继续加量验证。我见过太多团队因为“跑了两周不显著”就砍掉一个有价值的优化属于自我实现式的平庸。反过来也有团队因为“拐角处卡了3个显著性”而盲目乐观。两种极端都源于把统计结论过于简化。4.4 常见问题速查表常见情况容易犯的错正确的解结姿势实验跑了两天p值降到0.03立刻全量上线先确认是否中途多次看p值按预定样本量和时间表执行7个指标里有1个显著宣称实验成功只看预先指定的主指标其他当作诊断信息p0.08且观察效应为正写结论“无明显提升”报告置信区间和效应量评估功效与继续增加样本的成本算样本量时发现需要跑60天直接把MDE调小凑样本量重新评估这个改动是否值得长期测试或降低测试目标对照组只有总流量10%直接套1:1样本量公式用非均衡分流的公式重新计算总样本量这张表是我在实际项目里踩坑后整理出来的自检清单。它不能替代完整的统计学原理但能在日常忙碌时把你从常见的认知偏差里拉回来。5. 真正解结的思路把两类错误变成业务决策5.1 给两类错误“定价”而不是套默认值大多数团队做实验α默认0.05功效默认0.8不问为什么。这两个值其实应该根据业务代价来定。如果上线坏版本的代价很高比如会伤害用户信任、导致流失那一类错误就更可怕α可以设成0.01。如果错过好版本的代价很高比如竞品在快速迭代、你晚一个月上线就会掉队那么β更可怕应该把功效提高到0.9以上。注意这些调整不是简单改阈值就能完成的。α调低、功效调高都需要更多样本来支撑否则就会回到“生死结”的原地。我自己的习惯是在实验前拉一个小型决策会明确这个改动属于“保守型”还是“激进型”并当场定下α和1-β。比如确认按钮文案优化这种低风险改动可以接受α0.05power0.8但涉及价格、隐私、强制迁移等高风险改动α会压到0.01power提到0.9。这样统计参数就不是抽象的数学符号而是跟业务风险绑定的可执行约定。5.2 把α、β和MDE写进实验设计文档解开“生死结”最有效的流程性手段是在实验开始前就把所有统计决策写下来。我的实验设计文档固定包含以下几项主指标唯一的成功标准预先是哪一个数据指标。原假设H0和备择假设H1明确写出你准备检验的差异方向。MDE这个改动最少提升多少才值得上线。α预设的一类错误上限。功效1-β预设的二类错误容忍度。每组样本量基于上述参数算出来的数字。运行周期数据采集需要覆盖的最短自然周期如7天或14天。停止规则能接受中途停止吗如果可以用什么序贯方法。这份文档写完了实验才开始跑。等结果出来后所有“p值是不是显著”“要不要继续”“换哪个指标看”的问题都有了标准答案不需要临时拍脑袋。这套流程看似简单却能在根源上避免第一类和第二类错误被“事后解释”带偏。5.3 我的复盘习惯每次实验结束后看四件事最后分享一个我坚持了很久的复盘习惯。每次AB实验出结果我不管p值多漂亮或多难看都会带着团队过四件事第一看p值是否低于实验前设定的α而不是“看起来小不小”。如果跑之前没写α这次结果我甚至不太想讨论显著性。第二看观测效应是否超过了MDE。如果p显著但提升才0.1%MDE是2%那这个“显著”也只是统计上显著业务上不值得全量。第三看置信区间下界。用“下界是否大于MDE”来判断复现空间这比单独看p值更靠谱。第四看实际样本量是否达到预估。如果中途偷偷用了更小的样本量所有结论都不可信。这套复盘方式帮我挡掉过好几次“假显著”和“假阴性”。它不神本质上是重新把α、β、MDE这些统计符号拉回业务现实里给每次决策建立一堵防错墙。你可以直接拿来用只要在实验设计阶段就把那几个数值定好实验结束后的四连问会变得又快又准。
阅读完成 · 觉得有帮助?
咨询建站