先说清楚“因果”要多强

前几篇讲的都是怎么把一批数描述准。但描述得再准,也只说清了“这两个东西长什么样”。真正让人想追问的是另一句:改了它,另一个会不会跟着变?

要证明“A 引起 B”,严格的意思不是“A 和 B 一起出现”,而是:把 A 改一改,B 会跟着变;不动 A,B 就不变。

麻烦在于,同一个用户、同一家门店、同一段时间,你只能看到一种状态——要么用了新功能,要么没用。另一种状态永远不会发生,也永远测不到。这个“本该发生、但你没看到”的结果,叫 反事实(counterfactual)4。

既然自己身上观察不到,就只剩一条路:找一群“本来和干预组差不多”的对象当替身,比较两边的结果。所以后面所有方法,本质上都在回答同一件事——替身够不够像。

一起变化,至少有四种别的原因

某 SaaS 公司的数据:用过新手引导的用户,30 天留存 70%;没用过的 48%。看上去引导带来了 22 个百分点的留存,很值得推。但同样这组数,至少还有四条路能解释它:

绘制中

共同原因。 更主动、更投入的用户,本来就会自己去点新手引导,本来也更可能留下来。“投入程度”同时影响了“用没用引导”和“留没留下”,它既不是原因也不是结果,而是两件事背后那只手。数据里其实留着痕迹:高活跃用户中 40% 用过引导,低活跃用户只有 10%——两组人本来就不同。

反向因果。 也可能不是“用了引导所以留下来”,而是“还没走,所以才有机会用引导”。一个第 3 天就流失的用户,可能压根没来得及点。

数据本身。 早就流失的人已经从表里消失,你只统计到还活着的;埋点漏报,会把用过的人记成没用过;而“用过”到底是点开一次算,还是完成全部四步才算,也能把结论整个改掉。

巧合。 样本只有几百人时,22 个百分点里有多少纯属波动?同时测了 20 个功能时,光靠运气也总有一个看着特别强。这两件事正是前几篇里“基准和波动范围”要处理的 3。

一步步排除:三个问题按顺序问

绘制中

第一步:谁先谁后。 先确认“用引导”的日期早于“流失”的日期。做法很朴素:只看注册后第一周内用了引导的人,再看他们第二到第四周的留存,这样至少堵住了“因为留下所以用到引导”这条路径。但这一步能排除的有限——用户可能在第一周就已经动了要走的念头,只是顺手点了一下引导。

第二步:把候选的共同原因拿出来,分层比一比。 这是全篇最实用的一步:按一个猜测的共同原因把数据切成几层,在每层内部再比一次 3。

按“注册首周活跃度”分两层:

层用过引导:人数 / 留存没用过:人数 / 留存
高活跃800 人 / 80%1200 人 / 78%
低活跃200 人 / 30%1800 人 / 28%

对一下合计:用过引导的 1000 人里留存 800×0.80+200×0.30=700800\times0.80+200\times0.30=700 人,正好 70%;没用过的 3000 人里留存 1200×0.78+1800×0.28=14401200\times0.78+1800\times0.28=1440 人,也就是 48%,和开头那组数一致。

再看每层内部:80% 对 78%,30% 对 28%——差距都只剩 2 个百分点。

原来那 22 个百分点里,20 个来自“谁更可能去用引导”,只有 2 个跟引导本身有关。结论从“引导能提升 22 个百分点”变成“最多 2 个百分点,而且这点差距,一个不强的隐藏原因就足以抹平”。方向甚至可能反过来:如果总体是“用引导的人更好”、每一层里却是“用引导的人更差”,那就是辛普森反转。

分层的好处是不需要新技术,只要想得出一个像样的候选共同原因;坏处也在同一处:你只能排除自己想得到、并且测量过的那些。

这里有个容易走过头的地方:分层有效,不代表把所有能拿到的列都塞进去比较就更好。如果某个变量本身就是“有没有用引导”造成的(比如用户后来完成的关键动作),把它控制住,等于把引导起作用的通道掐断 2。判断标准很简单:这个变量是在用引导之前就存在的,还是用引导可能造成的?前者可以考虑控制,后者通常不能碰。

第三步:查样本和口径。 这和前面讲的“一行代表什么、哪些列能加”是同一种功夫,要确认三件事:统计的样本是不是只剩活着的用户;分组依据有没有被埋点错误影响;“用过”和“留存”在这张表里各自怎么定义。

最强的一步:自己制造对比

前面三步都是在现有数据里尽量排除。还有一种做法是直接把对比造出来:把新用户随机分成两组,一组推引导,一组不推,再比留存。

随机分配的关键不是“公平”,而是分组跟任何变量都不再相关——包括你没测量、甚至没想到的。你不需要事先列出全部共同原因,它们会平均分布在两组里 34。这正是随机实验比统计调整更硬的地方:分层和模型只能处理你测到的变量,测不到的它们一概管不了。

做不了实验,可以退一步找自然形成的对比:某个时间点系统只对一部分人生效,或者两个本来很相似的地区一个先上线、一个没动。再不行,就把结论写得更保守,说清楚“我没排除什么”。

结论该怎么写

写之前先问一句:我要的是 预测,还是 改了它有没有用。如果只是想知道“哪些用户容易流失,好提前盯住”,关联就够了;如果你准备花钱、改流程、推功能,你要的就是后者。

对应地,措辞分三档:

  • 只看到关联:“用过新手引导的用户,30 天留存高出 22 个百分点。” 说清是相关,不说是原因。
  • 排除了一层共同原因:“分层比较后,差距缩小到 2 个百分点,其余来自用户活跃度差异。”
  • 做过随机实验:“随机分配后,引导组的留存比对照组高 X 个百分点。” 这时才可以谈“效果”。

多写一句“哪些解释我没排除掉”不显得心虚,反而让结论更可信——因为读者知道这个数在什么条件下成立。