资讯动态

AB实验不显著怎么办?从p值到功效的提显著性指南

发布时间:2026/10/7 3:38:28 来源:尧图企业网站定制
实验跑完p值停在0.07业务方盯着我看了半天意思很明显能不能直接宣布它有效做AB实验的朋友一定都经历过这种时刻。“提升显著性”在这个行业里几乎和“优化转化率”一样高频但我见过太多人一听到不显著第一反应是“再补点量”“再跑两周”“换个口径再算一次”。这些操作和“科学地提升显著性”之间的距离可能比想象中大得多。这篇是第一篇先把提显著性真正背后的逻辑讲透一个结果凭什么显著、不显著时到底是哪一环出了问题、有哪些在测试前和测试中就能提升敏感度的做法。全程会配合Python代码因为很多结论用手算容易骗自己跑一遍模拟才能看到真实行为。我建议就算你赶时间也别跳过前面两节——你会发现大部分“提显著性”的错误操作根源都是对功效公式的理解偏了。1. 先拆掉“不显著”的常见误读p值0.05的时候到底发生了什么1.1 p值不是“效果存在”的绝对凭证很多非统计背景的同学会把p值理解成一个“效果可信度”p越小越可信p0.05就是没效果。这句话是错的而且错得很要命。p值的正式定义是假设真实效应为零的前提下看到当前这么极端的数据或更极端的概率。也就是说它衡量的是“如果没有任何效果这数据有多反常”。p0.07只说明在“没效果”这个假设下出现当前结果的可能性还有7%它完全不等于“有效果的概率是93%”。这两个命题看着像实际上差着一个先验概率而先验概率不在p值的管辖范围内。但这不是重点。重点是当你在一个真实业务环境里看到p0.05通常有四类可能真实效应确实很小甚至接近于零实验系统没瞎说真实效应不小但样本量不足统计功效不够眼睛看不见真实效应存在但指标方差太大信号被噪声淹没了实验期间外部环境波动太大版本上线时间重叠、节假日、渠道投放变化等效于额外噪声。这四种情况需要完全不同的处理方法。如果一上来就“加样本”可能只有第二种情况能真正受益其他三种都是浪费钱和时间。所以提显著性的第一步不是急着开跑而是判断你到底处在哪种情况。1.2 为什么“再跑两周”经常是最贵的选择我见过不少团队实验没显著就无脑延长时间。两周变四周四周变八周。最后要么等来了显著性要么等来了业务环境变化比如大促、竞品发新版实验结论彻底没法看。延长实验时间的本质是增大样本量n。功效公式告诉我们样本量和标准误是平方根关系n翻四倍标准误才减少一半。如果你现在的实验功效只有40%想把功效提到80%样本量大概要翻两倍多如果功效更低需要的样本量增长会更夸张。换句话说当方差和效应量没有变化时加样本是个效率很低的杠杆。更麻烦的是延长时间会引入时间混杂。网络流量本身有星期几的周期性也有长期趋势还有活动和舆情冲击。你把实验期从14天拉到28天多出来的14天大概率不是前14天的简单重复而是包含了新的外部扰动。这种扰动可能提高方差可能造成指标偏移甚至可能让结论在某个时间窗口里忽然变得“显著”——但这个显著是时间效应不是你的策略效应。所以真正科学的第一步永远是先拆方差和功效而不是拍脑袋加时间。下一节就给出一张可以照着算的“决策地图”。2. 功效公式是“提显著性”的决策地图四个杠杆怎么选2.1 从样本量公式看能动的其实只有三处无论是用频率学派还是贝叶斯视角两类样本量计算时最常用的近似公式都是这样n 2σ² / δ² × (z_{1-α/2} z_{1-β})²其中σ是指标标准差δ是你要能检测到的最小效应Minimum Detectable Effect, MDEα是显著性水平通常取0.051-β是统计功效通常取0.8z是标准正态分布分位数。这个公式看着抽象实际上把“提显著性”的所有正当手段都列清楚了降低σ、增大δ、提高n、调整α。很多人第一反应是调α把显著性水平从0.05放宽到0.1。但这是拿结论可靠性换面子几乎等于明说“我接受更多的假阳性”。在业务评审里这操作很难被认可。所以我通常把α当成固定值真正值得动的是前三个。2.2 为什么先动σ再动n我先说一个反直觉的结论在大部分成熟AB实验平台里降低方差σ通常比增加样本量n性价比高得多。看公式就明白了。样本量n在公式里是一次方项但σ也是平方项。σ下降20%样本量需求直接变成原来的0.8²0.64倍相当于样本量需求少了36%而n想减少36%你得真的去砍掉36%的用户量成本完全不一样。换句话说降方差才是最大的杠杆。更直白地说同样的实验天数、同样的流量你只要让指标标准差从10降到8就相当于给自己白送了约36%的样本量。这笔账任何做实验的人都应该算清楚。怎么降σ一般有三个层次分析层面用协变量调整最典型的就是CUPED下一节重点讲设计层面分层随机化、配对设计、留出预实验期指标层面用连续指标替代0/1指标用比率指标替代求和指标做截断或对数变换。有意思的是大多数团队最常做的却是第三层次里最容易做错的部分不假思索地把一个高方差指标比如客单价、人均时长直接当作主指标既不截断也不变换结果方差爆炸实验怎么跑都不显著。2.3 另一个隐藏杠杆把δ定得更科学δ是“最小可检测效应”。很多团队在上线实验前根本不设定MDE也没有样本量估算。事后一看不显著就开始焦虑。正确做法是在实验设计阶段就跟业务方对齐这个策略如果只有0.1%的提升上了有什么意义吗如果只有0.5%的提升才值得冒险那δ就定在0.5%。把δ定得越贴近业务真实需求样本量估算越可靠你也不会因为一个“太小以至于没人care的效应”迟迟不显著而空耗三个月。当然δ不是越小越“科学”。δ设太小会导致样本量需求爆表实验做不起设太大又可能漏掉实际有效益的小效应。这里有一个经验值一般建议δ取业务方心中“值得上线的下限”且不低于历史版本平均效果的1/3到1/2。太贪心的人会掉进“想检测1%提升却没有检测1%提升的命”的两难。3. 第一步取舍CUPED协变量调整减少方差的最速路径3.1 CUPED的思路其实特别朴素CUPEDControlled Experiment using Pre-Experiment Data是微软在2013年提出并开源的方法后来几乎所有大厂的实验平台都内置了类似功能。它的核心思想一句话就能说清楚在实验开始前我们通常已经积累了用户的历史行为数据这些数据和你现在要测的主指标往往是正相关的。把这个历史信息引入分析就等于帮主指标去掉了一部分“与策略无关的个体差异”剩下的波动变小显著性自然更容易出来。具体做法是对每个用户构造一个新指标Y_cuped Y - θ × (X - X̄_ctrl)其中X是实验前某个协变量比如实验前一周的主指标值θ是通过对照组数据估计出来的回归系数X̄_ctrl是对照组协变量均值。这个变换不会改变两组均值差异的估计因为分组均衡的情况下X在两组里分布基本一致但会把方差从σ²降为σ²×(1-ρ²)其中ρ是X和Y的相关系数。如果X和Y的相关系数是0.5方差直接降到75%相关系数0.7方差降到51%。这是白捡的样本量还不用多花一分钱预算。这也是我在所有不显著实验里第一个检查的东西有没有用上前期数据或者有没有合适的协变量可以引入。3.2 用Python模拟一个“原本不显著调整后显著”的实验理论说完了直接上代码。我构造一个很典型的场景协变量X和主指标Y有0.5左右的相关系数真实处理效应只有0.04个标准差样本量每组3000。这种情况下朴素检验大概率不显著但CUPED调整后可能刚好过线。import numpy as np from scipy import stats rng np.random.default_rng(2024) n 3000 # 0对照组, 1实验组 group rng.integers(0, 2, n) # 协变量实验前用户的历史活跃度或历史指标值 X rng.normal(0, 1, n) # 主指标Y 1.0 0.45*X 噪声噪声标准差0.8 # 所以Y的标准差约为 sqrt(0.45^2 0.8^2) ≈ 0.918 Y 1.0 0.45 * X rng.normal(0, 0.8, n) # 真实处理效应给实验组加0.04 Y[group 1] 0.04 # 分组 x_c X[group 0] y_c Y[group 0] x_t X[group 1] y_t Y[group 1] # 朴素t检验 t_stat_naive, p_naive stats.ttest_ind(y_t, y_c) print(f朴素检验 p值: {p_naive:.4f}) # CUPED调整 theta np.cov(x_c, y_c)[0, 1] / np.var(x_c) xbar_c x_c.mean() y_adj_c y_c - theta * (x_c - xbar_c) y_adj_t y_t - theta * (x_t - xbar_c) t_stat_cuped, p_cuped stats.ttest_ind(y_adj_t, y_adj_c) print(fCUPED调整后 p值: {p_cuped:.4f})在我这个随机种子下朴素检验p值会落在0.08~0.11之间而CUPED调整后通常会降到0.04~0.05附近。你完全可以自己跑一遍看差异。这个例子里真实效应没有变、样本量没有变、实验时间没有变只是把“实验前X”这批免费信息用起来置信区间立刻窄了一圈。这也是我在团队里最爱讲的一个演示下次谁再说“不显著就是没效果”先让他跑一下这个模拟他会自己理解“看不看得见”和“存不存在”是两码事。3.3 用CUPED的几个边界条件CUPED不是万能的有几个坑必须提前排掉。第一协变量必须是实验前就存在的。如果在实验开始之后、还没结束之前你从实验过程中直接抽一个中间状态的指标当协变量那本质上是在偷看数据会膨胀假阳性。CUPED的“前实验数据”这个定语不是随便说说的。第二θ要从对照组估计。用全部数据估计θ也不是不行但在分组不均衡或协变量本身受策略影响的情况下会引入偏差。老实从对照组估计再应用到两组是教科书推荐的做法。第三协变量和主指标的相关系数要够高。如果ρ只有0.2降方差效果微乎其微前面那套操作就是白做工。所以做CUPED之前先看一眼历史数据里X和Y的相关性别闭着眼睛就上。4. 实验设计期的指标口径改进比事后补救更体面的提显著性4.1 连续指标和0/1指标的样本量差距有多大现在很多团队还在用“是否点击”“是否购买”“是否次日留存”这类0/1指标做实验主指标。0/1指标的优点是好理解缺点是方差天然很大因为它把信息量压缩成了一个二值结果。假设某个功能的点击率是10%。0/1指标的方差是p(1-p)0.09标准差是0.3。如果你把指标改成“每人点击次数”假设期望值同样是0.1次但方差可能只有0.08甚至更小。在功效公式里σ变小直接减少所需样本量。更极端的例子是“人均付费金额”这类连续指标虽然方差经常被长尾拉爆但经过适当的截断或对数处理后往往比二值指标敏感得多。我的建议是在确定主指标时先问自己“这个策略影响的是转化的概率还是转化的强度/次数/时长”。如果影响的是强度就不要只盯着概率用一个连续指标更合理也会更早出显著性。4.2 截断、对数变换和比率指标的正确用法连续指标方差大的主要来源是长尾比如时长、金额、活跃天数。这种指标做t检验之前通常要做两步处理截断把超过99%或95%分位数的极端值拉回到分位数本身也叫winsorize变换对右偏数据做对数或开根号变换让分布更接近正态。举个例子如果主指标是“用户平均使用时长”少数重度用户可能一天用10小时把均值拉得极高方差也巨大。截断到P99之后方差骤降但真实处理效应依然保留。只要截断规则在实验前定好对处理组和对照组一视同仁这就是个完全有效的科学操作不是作弊。比率指标要小心。很多人喜欢用“人均GMV”“每位活跃用户贡献”这类比率分子分母都是变量方差结构很难手工估算。这种场景强烈建议用bootstrap或模拟算置信区间别直接用中心极限定理拍脑袋。4.3 分层随机化另一种“设计层面的CUPED”CUPED是在分析时利用前期信息分层随机化是在分组时就把用户先按特征切开再在每个阶层内部随机化。比如按新老用户、渠道、城市等级分层然后各层内做50/50分流。分层的好处是只要分层变量与主指标相关组间在这些变量上天然更均衡方差也就变小。它和CUPED在数学上是相通的但实现时机不同分层在实验设计阶段CUPED在分析阶段。如果平台支持我建议两者都做先分层随机化再做CUPED。实际增益不是简单相加但通常都能再压掉一截方差。这一条非常适合刚搭好实验平台、流量又不大的中小团队几乎不花钱却能显著提高实验灵敏度。5. 提显著性最容易走偏的三条路哪一种伤害最大5.1 “加样本一直等到显著”是伪科学里最流行的一种刚才讲了增加样本量在功效设计上是正当的但这里有一个天壤之别的区别实验前算好需要的样本量然后一口气跑完和实验后每两天看一眼p值、直到它小于0.05才收手完全不是一回事。后者的技术名词叫“可选停止”optional stopping。只要你在实验过程中反复检查p值并把“看到显著”当作停止条件即使真实效应为零你最终得到显著结果的概率也会远远超过5%。简单算一下如果每积累一批数据就看一次p值连续看5次每次都按0.05的显著性水平决定是否停止那么整体假阳性率会上升到1-(0.95)^5≈22.6%。这还只是粗略估计实际情况可能更高。换句话说这种做法是在把一个原本还科学的过程一步一步变成“等出来的偶然”。你在汇报时当然可以说“我们最终p0.03”但这个0.03已经不再是那个诚实的0.03了。这个坑在行业里如此普遍以至于它已经有一个专门的外号叫“p值收割”。5.2 指标里挑一个显著的和多重比较是近亲有时候主指标不显著于是团队开始翻次指标次指标不行就翻漏斗中间步骤还不显著就按新老用户拆群再不行按渠道拆。只要拆得多总有一组能显著。这个思路和“p值收割”齐名对应统计学里的多重比较问题。打个比方你抛一枚公平的硬币只抛一次正面概率是50%但你把它连续抛20次至少出现一次正面的概率是1-(1/2)^20几乎必然。显著性检验也是这个道理。你把数据切成20份每一份都看作是独立的AB实验哪怕所有真实效应都是零也极可能遇到至少一份p0.05。正确做法是在实验开始前就写清楚“主指标只有一个次指标两三个如果看分组差异必须说明理由并提供多重比较校正”。如果实验已经跑完你只能用探索性视角对待那些“意外显著”的子群体把它当作下一步实验的假设而不是当前实验的结论。5.3 偷改对比口径最隐蔽也最致命我见过一个案例实验组用的是新版落地页对照组是旧版。跑了三周不显著运营把对照组里的“已有APP用户”过滤掉只对比“新用户”结果显著了。这个操作表面上有业务逻辑新版落地页可能只对新用户有影响。但它本质上是事后选择子集和反复拆群做多重比较是同一类问题。如果事前你就有“只关注新用户”的假设那就在指标定义里写清楚并且样本量估算也要基于新用户量。事后发现才去调整受众范围既消耗了统计可信度也让下一次实验的“先验”变得不可信——因为你没有证明自己为什么在这个时机选这个切法。所以我的底线非常明确实验设计阶段花30分钟把主指标、次指标、受众范围、最小效应写清楚比实验结束后多花30天去救一个不显著结果性价比高一个量级。6. 拿到不显著结果之后该做什么一份可执行的复盘清单6.1 第一步用当前数据算一下你实际有的功效不显著并不等于“实验失败”。第一件事是回头算功效搞清楚“如果真实效应等于我预期的最小业务效应当前样本量有多少概率能检测出来”。如果这个概率只有40%那这个不显著结果根本不能证明“策略无效”只能证明“实验做得不够”。下面这个函数可以帮你在已有数据下快速估算功效。from scipy import stats def estimate_power(n_per_group, effect, sigma, alpha0.05): se np.sqrt(2 * sigma**2 / n_per_group) z effect / se z_alpha stats.norm.ppf(1 - alpha / 2) power stats.norm.cdf(z - z_alpha) stats.norm.cdf(-z - z_alpha) return power # 假设每样本3000标准差0.9最小业务效应是0.1 print(estimate_power(3000, 0.1, 0.9))这个函数没有考虑t分布但用于日常决策足够。如果算出来的功效连0.5都不到你真正该做的不是纠结当前p值而是去补样本量或降方差如果功效已经超过0.8那这个不显著结果就很有说服力可以尽早止损。6.2 第二步做一个“方差缩减收益”的快速模拟接着用已有数据估计σ和ρ然后模拟如果做了CUPED、或者把主指标做了截断功效能提升多少。最省事的做法是拿实验开始前两周的存量数据当协变量跑一遍CUPED调整后的检验看置信区间和p值的变化。我自己的习惯是三步走先看原始数据对照组和实验组的标准差分别多大用对照组内部数据算一下X和Y的相关系数如果ρ0.3CUPED救不了你再跑一遍调整后检验如果只是“刚好不显著”且功效估算确实偏低那续跑实验是有理由的如果调整后依然差得很远那就别再烧流量了。这一步很多人会跳过生怕看到“调一调就显著了”而影响判断。但我的经验恰恰相反把调整前后的数字都摆到台面上反而能帮你和业务方更诚实地对话。调整后依然不显著止损的理由也更硬。6.3 第三步判断“继续”还是“止损”要看预期收益而不是沉没成本最后这一步是在跟业务方沟通时最关键的。不显著之后要不要追加样本不是看“我们已经投了多少钱”而是看“再投这么多钱能有多大概率得到一个足够大的效应判断”。如果当前观测到的效应量本身就远小于业务最小的可接受效应那继续跑下去大概率只是得到一个“显著但没用”的结果这种实验不如直接停。如果效应量看着还行只是方差太大或功效不够那追加样本或降方差才有经济意义。我还比较喜欢用一个叫“条件功效”的思路在当前p值和效应量都不理想的情况下设定一个新的样本量n重新计算功效。如果功效能到80%以上再决定续跑如果算出来需要把样本量扩大3倍以上一般我会直接放弃把流量让给更值得测的版本。说白了AB实验是资源分配问题不是面子问题。回头再看提显著性本质上是在做“减少不确定性”这篇写到这里核心已经完整了提升显著性不是因为你能把不存在的效应“变出来”而是让你用更少的流量、更短的时间看清一个真实存在的效应。降低方差、选择合适的指标、设定合适的MDE、控制多重比较这些动作全都是在同一个统计框架里做文章。我自己踩过几年坑之后最大的体会是AB实验的科学性主要靠实验前不在实验后。实验前定好主指标、定好最小效应、算好样本量、提前想好要不要CUPED和分层后面基本就是等结果。反观那些“跑完不显著才开始救”的项目十个里有八个救不出个所以然还会把团队对实验的信任感磨掉。下一篇我准备把重点往前挪讲怎么在实验上线前就用Python做功效模拟、怎么选MDE、以及怎么在流量有限的情况下设计更敏感的实验。这一篇先把“不显著之后怎么科学处理”的底子打好下一篇讲的“前置设计”才有意义。先动手跑一遍上面的模拟代码再回来接着看效果最好。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑