SQL 中的提升幅度、显著性与护栏指标
计算转化提升幅度,并进行数据检查以发现实验是否失效。
SQL 中的提升幅度、显著性与护栏指标 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。
从指标走向决策
每个变体的转化率只是起点。面试题真正要问的是:处理组是否真正胜出?这意味着要计算提升幅度,判断差异究竟是真实效果还是噪声,并检查能够发现实验故障的护栏指标。
您不会在 SQL 中运行完整的统计软件包,但可以计算所需的输入,并给出面试官希望看到的粗略显著性信号。
每个变体的汇总 CTE
后续所有计算都建立在一个整洁的汇总之上:对于每个变体,包含用户数 n、转化用户数 c 和转化率 p。请在一个 CTE 中计算一次,然后重复使用。
WITH summary AS (
SELECT
variant,
COUNT(DISTINCT user_id) AS n,
COUNT(DISTINCT converted_user) AS c
FROM experiment_flat
GROUP BY variant
)
SELECT
variant, n, c,
1.0 * c / n AS p
FROM summary;绝对提升幅度与相对提升幅度
提升幅度有两种定义,面试官通常默认希望您使用相对提升幅度:
- 绝对提升幅度 = 处理组转化率 - 对照组转化率(百分点)。
- 相对提升幅度 = (处理组转化率 - 对照组转化率)/ 对照组转化率(百分比提升)。
“增加 2 个百分点”和“相对提升 20%”可能描述的是同一个结果。请明确您使用的是哪一种。
使用自转置计算提升幅度
如果要将两个变体放在同一行进行比较,可以使用条件聚合,将对照组和处理组并列取出,然后进行算术计算。
这样可以避免脆弱的自连接,并让提升幅度公式更易读。
WITH s AS (
SELECT variant,
COUNT(DISTINCT user_id) AS n,
COUNT(DISTINCT converted_user) AS c
FROM experiment_flat GROUP BY variant
),
rates AS (
SELECT
MAX(CASE WHEN variant='control' THEN 1.0*c/n END) AS p_ctrl,
MAX(CASE WHEN variant='treatment' THEN 1.0*c/n END) AS p_trt
FROM s
)
SELECT
p_ctrl, p_trt,
p_trt - p_ctrl AS abs_lift,
ROUND(100.0 * (p_trt - p_ctrl) / p_ctrl, 2) AS rel_lift_pct
FROM rates;为什么差异可能只是噪声
处理组转化率更高,可能只是随机抽样带来的巧合。显著性要回答的是:如果两个变体实际上完全相同,出现这么大差距的可能性有多大?
关键因素是每个转化率的标准误,它会随着样本量增加而减小。大样本会让较小的提升幅度更可信;小样本则会让即使很大的提升幅度也值得怀疑。
比例的标准误
对于 n 个用户上的转化率 p,标准误为 sqrt(p * (1 - p) / n)。您可以直接在 SQL 中按变体计算它。
在比较各个转化率之前,这一步可以量化每个转化率的波动程度。
WITH s AS (
SELECT variant,
COUNT(DISTINCT user_id) AS n,
COUNT(DISTINCT converted_user) AS c
FROM experiment_flat GROUP BY variant
)
SELECT
variant, n,
1.0 * c / n AS p,
SQRT( (1.0*c/n) * (1 - 1.0*c/n) / n ) AS std_err
FROM s;两个比例的 Z 分数
粗略的显著性信号是两个比例的 Z 分数:用转化率差值除以该差值的标准误。绝对值超过约 1.96,通常对应于常用的 95% 阈值。
请明确说明这只是近似值,不能替代正式检验,但它可以在 SQL 中回答“这个差异是否可能是真实的?”
WITH r AS (
SELECT
MAX(CASE WHEN variant='control' THEN 1.0*c/n END) AS p1,
MAX(CASE WHEN variant='control' THEN n END) AS n1,
MAX(CASE WHEN variant='treatment' THEN 1.0*c/n END) AS p2,
MAX(CASE WHEN variant='treatment' THEN n END) AS n2
FROM (
SELECT variant, COUNT(DISTINCT user_id) n,
COUNT(DISTINCT converted_user) c
FROM experiment_flat GROUP BY variant
) s
)
SELECT
p2 - p1 AS abs_lift,
(p2 - p1) / SQRT( p1*(1-p1)/n1 + p2*(1-p2)/n2 ) AS z_score
FROM r;解读 Z 分数
请将数值转化为结论,让面试官听到的是业务判断,而不只是数学:
|z| >= 1.96:差异在大约 95% 的置信水平下具有显著性。|z| < 1.96:证据不足,提升幅度可能只是噪声。
请将其放入 CASE 中输出易读的标签,并始终结合提升幅度的实际大小来解读显著性。
SELECT
z_score,
CASE WHEN ABS(z_score) >= 1.96
THEN 'significant at 95%'
ELSE 'not significant' END AS verdict
FROM (
SELECT 2.3 AS z_score
) t;样本比例不匹配(SRM)
面试官会追问的第一个护栏问题是:用户是否真的按照设计完成分流?一个拥有数百万用户、原本应为 50/50 的实验却变成 53/47,这是危险信号,说明随机分配或日志记录出现了问题。
请将实际用户数与预期分流比例进行比较。较大的偏差会使整个测试失效,甚至在查看指标之前就应当判定实验存在问题。
WITH cnt AS (
SELECT variant, COUNT(DISTINCT user_id) AS n
FROM experiment_flat GROUP BY variant
),
tot AS (SELECT SUM(n) AS total FROM cnt)
SELECT
c.variant, c.n,
ROUND(100.0 * c.n / t.total, 2) AS observed_pct,
50.0 AS expected_pct
FROM cnt c CROSS JOIN tot t;护栏指标
护栏指标是指即使主要指标有所提升,也不得恶化的指标。常见的护栏指标包括:页面延迟、退款率、退订率和错误率。
请在报告胜出指标的同时,按变体报告这些指标。一个让转化率提升却使退款翻倍的处理方案并不能算胜出。主动计算护栏指标,能够体现您的产品判断力。
SELECT
variant,
AVG(load_ms) AS avg_latency_ms,
ROUND(100.0 * SUM(refunded) / COUNT(*), 2) AS refund_rate_pct,
ROUND(100.0 * SUM(errored) / COUNT(*), 2) AS error_rate_pct
FROM experiment_flat
GROUP BY variant;完整实验结果汇报
面试官喜欢的完整实验结果汇报,会在一个结果中结合四项内容:每个变体的转化率、相对提升幅度、显著性结论以及 SRM 检查。请分层使用 CTE,并将结果呈现为一张可直接支持决策的表。
最后请明确说明:差异显著、提升幅度可接受、护栏指标健康、分流均衡,因此发布或暂缓。
WITH s AS (
SELECT variant, COUNT(DISTINCT user_id) n,
COUNT(DISTINCT converted_user) c
FROM experiment_flat GROUP BY variant
),
r AS (
SELECT
MAX(CASE WHEN variant='control' THEN 1.0*c/n END) p1,
MAX(CASE WHEN variant='control' THEN n END) n1,
MAX(CASE WHEN variant='treatment' THEN 1.0*c/n END) p2,
MAX(CASE WHEN variant='treatment' THEN n END) n2
FROM s
)
SELECT
ROUND(100.0*(p2-p1)/p1, 2) AS rel_lift_pct,
CASE WHEN ABS((p2-p1)/SQRT(p1*(1-p1)/n1 + p2*(1-p2)/n2)) >= 1.96
THEN 'significant' ELSE 'not significant' END AS verdict,
CASE WHEN ABS(1.0*n2/(n1+n2) - 0.5) > 0.02
THEN 'SRM warning' ELSE 'split ok' END AS srm_check
FROM r;快速检查
处理组的转化率相对提升了 25%,但每个变体只有 40 个用户。正确的结论是什么?
回顾:提升幅度、显著性与护栏指标
现在,您可以将原始的变体指标转化为决策依据:
- 区分绝对(百分点)提升幅度与相对(百分比)提升幅度。
- 计算每个转化率的标准误,以及两个比例的 Z 分数,将其作为粗略的显著性信号(|z| >= 1.96 约对应 95%)。
- 执行 SRM 检查,确认分流比例符合设计。
- 报告护栏指标,避免一次胜出掩盖另一个指标的回归。
- 呈现一份可直接支持决策的结果汇报,并始终结合显著性与提升幅度的实际大小。
至此,您已经完成了 SQL 中的漏斗和 A/B 测试分析。
常见问题解答
「SQL 中的提升幅度、显著性与护栏指标」课时是免费的吗?
是的 — 「SQL 中的提升幅度、显著性与护栏指标」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「SQL 中的提升幅度、显著性与护栏指标」这节课中我会学到什么?
计算转化提升幅度,并进行数据检查以发现实验是否失效。 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「SQL 中的提升幅度、显著性与护栏指标」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 构建多步骤转化漏斗
- 有序事件与时间窗口
- A/B 测试分组与指标
- SQL 中的提升幅度、显著性与护栏指标