# 两个指标一起动，就能说成因果吗：四种更像真的解释，和排除它们的顺序

A 和 B 一起变化至少有四种非因果解释：共同原因、反向因果、数据本身的毛病、巧合；分层比较能剥掉共同原因，随机分配才能连没测量的变量一起摆平

> 结论表达 · 数据分析流程 · 指标口径 · 抽样误差 · 约 6 分钟 · 10 月 10 日

## 本篇要点

1. “A 引起 B”指的是：把 A 改一改，B 会跟着变；不动 A，B 就不变。但同一个对象只能观察到一种状态，另一种（反事实）永远测不到，所以只能找“本来差不多”的替身来比较。
2. 一起变化至少有四种非因果解释：共同原因同时影响两边、反向因果、数据本身的样本与口径问题，以及纯巧合。
3. 排除共同原因最实用的做法是分层：按猜测的共同原因把数据切开，在每层内部再比一次。各层内部差距大幅缩小，说明总差距大多来自“两组人本来就不同”。
4. 数值例子里，总体差距 22 个百分点，按活跃度分层后每层只剩 2 个百分点；合计算下来正好还原成 70% 与 48%，说明绝大部分差距来自活跃度而不是引导本身。
5. 分层只能排除你想到并且测量过的共同原因；统计调整同样管不了没测量的变量，也处理不了反向因果。
6. 控制变量不是越多越好：用引导之后才产生的变量不能拿来控制，否则会把引导起作用的通道一起掐断。
7. 随机分配把新用户分成两组，使分组与任何变量都不相关，包括你没测量和没想到的，所以不需要事先列全所有共同原因。
8. 做不了实验时，可以找自然形成的对比，或者把结论写得更保守，明确说出哪些解释还没排除。
9. 写结论要分清目的：只做预测，关联就够；要花钱改动，才需要因果。措辞也分三档：只说关联、说明分层结果、报告实验结果。

---

## 先说清楚“因果”要多强

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

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

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

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

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

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

```mermaid
flowchart LR
  Q["A 和 B 一起变化"] --> E5["真因果：A 引起 B"]
  Q --> E1["共同原因：C 同时影响 A 和 B"]
  Q --> E2["反向因果：其实是 B 引起了 A"]
  Q --> E3["数据本身：样本、口径、测量出错"]
  Q --> E4["巧合：波动或反复试出来的"]
```

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

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

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

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

## 一步步排除：三个问题按顺序问

```mermaid
flowchart LR
  C["投入程度（真正的原因）"] --> A["是否用过新手引导"]
  C --> B["是否 30 天留存"]
  A -.-> B
```

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

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

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

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

对一下合计：用过引导的 1000 人里留存 $800\times0.80+200\times0.30=700$ 人，正好 70%；没用过的 3000 人里留存 $1200\times0.78+1800\times0.28=1440$ 人，也就是 48%，和开头那组数一致。

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

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

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

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

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

## 最强的一步：自己制造对比

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

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

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

## 结论该怎么写

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

对应地，措辞分三档：

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

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

## 术语表

- 反事实：同一个对象在“被改变了”和“没被改变”两种状态下的结果，你只能观察到其中一种。这是因果判断困难的根源。
- 共同原因：一个同时影响 A 和 B 的第三个变量，它让 A 和 B 显得有关联，而两者之间并没有因果关系。
- 反向因果：看起来是 A 引起 B，实际是 B 引起了 A。时间顺序是识破它的主要线索。
- 分层比较：按猜测的共同原因把数据切成几层，在每层内部重新比较 A 和 B。差距大幅缩小，说明总差距大多来自两组人本来就不同。
- 辛普森反转：总体上看 A 更好，把数据分层后每一层里却是 A 更差。
- 随机分配：把对象随机分到干预组和对照组，使分组与任何变量都不相关，包括没测量和没想到的。这是最强的排除手段。

## 来源

1. [Wikipedia: Correlation does not imply causation — 系统梳理共同原因、反向因果等使关联不等于因果的典型情形](https://en.wikipedia.org/wiki/Correlation_does_not_imply_causation)
2. [Rohrer (2018), Thinking Clearly About Correlations and Causation — 讲清楚为什么控制中介或对撞因子会让估计偏离真实的因果效应](https://journals.sagepub.com/doi/full/10.1177/2515245917745629)
3. [Inferential Reasoning in Data Analysis: Correlation, causation, and statistical control — 用辛普森悖论说明分层与控制的作用，并解释随机分配如何打断混杂](https://bookdown.org/csu_statistics/inferential_reasoning_in_data_analysis/Correlation-and-Causation.html)
4. [StatPearls: Principles of Causation — 给出反事实模型、混杂的判定标准，以及随机化同时消除已测量与未测量混杂](https://www.ncbi.nlm.nih.gov/sites/books/NBK606119/)

---

原文：https://pangzhengboyin.com/articles/correlation-vs-causation-eliminating-alternatives-9858c95a

> **庞征博引** · 想学的，慢慢都会
>
> 庞征博引是把想学的东西写成连载的 AI 学习工具。说出想学什么，它会先了解你的基础，再把主题写成一篇篇 5–10 分钟能读完的文章；边读边问，接下来学什么跟着你走。这篇就是这样写出来的。
>
> 开始你自己的连载 → https://pangzhengboyin.com
