因果链为什么要校验时序?相关为什么不等于因果?
简化版
相关只说明两件事一起变化,不说明谁导致谁。两个指标同时下降,可能是 A 导致 B、B 导致 A(反向因果)、有第三个因素同时影响两者(混杂因素),也可能纯属巧合。严格的因果需要实验或因果推断方法,数据分析 Agent 通常做不到;但有一条成本很低又很硬的必要条件可以用代码校验:原因必须发生在结果之前。时序不成立,一定不是原因;所以归因系统里,「原因」必须带时间锚点,且不晚于它解释的现象,否则降级为「现象」。时序校验排除不了所有错误归因,但能排除最明显的一类。
详细版
两个指标相关,可能的解释:
| 解释 | 例子 |
|---|---|
| A 导致 B | 排片减少 → 票房下降 |
| B 导致 A(反向因果) | 票房下降 → 影院减少排片 |
| 混杂因素 C 同时影响两者 | 档期结束 → 排片和票房同时下降 |
| 巧合 | 两条恰好同向的曲线,没有任何关系 |
数据分析 Agent 能做到的因果证据等级:
弱 相关:两个指标一起变化
↓
时序:原因的变化发生在结果之前(代码可校验)
↓
排除:排除了已知的混杂因素、横向对比没有同样变化的对照组
↓
强 实验:A/B 测试、随机对照(分析系统通常做不到)
时序校验的规则:
原因没有时间锚点 → 降级为现象
被解释的结论没有锚点 → 无法比较,不因此降级原因
两者都有锚点 → 统一到同一粒度比较;原因晚于结果 → 降级为现象
完整版教学
一、为什么模型特别容易把相关说成因果
大模型生成归因时,最自然的写法是「A 下降,导致 B 下降」。这种句式在训练数据里非常常见,读起来也很合理。但在数据层面,模型看到的往往只是两个指标在同一段时间里都变了,它并没有、也没有能力验证因果关系。常见的错误归因:
同期出现:「口碑下滑导致票房下降」——两者在同一周都下降,但口碑下滑晚了 5 天
方向颠倒:「排片下降导致票房下降」——实际上是影院看到票房差才减排片
遗漏共因:「上座率下降导致票房下降」——两者都是档期结束的结果
所以归因系统不能只让模型「讲一个合理的故事」,要有代码来排除明显站不住的故事。
二、相关不等于因果的四种情况
反向因果。 排片和票房通常同向变化,但因果方向往往是双向的:排片多带来票房,票房好也会带来更多排片。只看相关系数,看不出方向。
混杂因素。 档期结束时,排片、票房、上座率可能同时下降,它们之间并没有直接的因果关系,而是共同受「档期结束」影响。
选择偏差。 只分析「票房下滑的影片」,会发现它们普遍口碑一般,但口碑一般却票房很好的影片被排除在样本外了。
巧合。 两个指标都在长期下行,计算相关系数会很高,但彼此毫无关系。数据越多、比较的指标组合越多,出现伪相关的机会越大。
记忆钩子:相关回答「是不是一起变」,因果回答「改变 A 会不会改变 B」。前者看数据就能知道,后者需要排除其他解释。
三、时序为什么是最值得先做的校验
严格的因果推断(随机实验、双重差分、工具变量等)需要特定的数据条件和研究设计,数据分析 Agent 很难自动完成。但时序校验有三个优点:
代价低:只需要比较两个时间点
判据硬:原因晚于结果,就一定不是这个结果的原因
可自动:时间锚点可以结构化输出,由代码比较
它的边界也要清楚:时序成立是必要条件,不是充分条件。原因早于结果,不能证明因果;但原因晚于结果,一定能否定因果。所以时序校验的作用是「排除」,而不是「证明」。
四、时间锚点的设计
要做时序校验,模型输出的每条「原因」必须带时间锚点。锚点的格式要限定:
只接受有限几种写法,比如:到日(2025-07-19)、到月(2025-07)
其他写法(「上映后不久」「七月中旬」)一律当作没填
不同粒度的比较,要先统一到同一个时间点。一种可行的约定是月份取该月最后一天:原因锚点是「2025-07」、结果锚点是「2025-07-15」时,把原因当作 7 月 31 日,比结果晚,判为时序不成立。这是偏保守的约定——粒度粗的原因不能用来解释月中的变化。
五、各种缺失情况怎么判
| 情况 | 判定 | 理由 |
|---|---|---|
| 原因没有锚点 | 降级为现象 | 无法证明它发生在前面 |
| 被解释的结论没有锚点 | 不比较,保留原因 | 拿不到对方的时间点,不是这条原因的错 |
| 两者都有,原因不晚于结果 | 通过 | 满足必要条件 |
| 两者都有,原因晚于结果 | 降级为现象 | 违反时序 |
降级而不是删除:这条结论的数据可能是真的(比如口碑确实下滑了),只是不能作为那个结果的原因,作为现象依然值得写进报告。
六、时序之外,还能做什么
在时序校验的基础上,分析系统还可以逐步增加证据强度:
横向对照:同期其他对象没有这个变化 → 更可能是这个对象自身的原因
纵向对照:同一个对象历史上出现过同样的前因后果
统计检验:差异、趋势、变点是否显著,而不是肉眼看出来的
排除共因:检查大盘、档期等共同因素是否也在变化
例如板块房价跌得比别处多,先比同区其他板块(是不是整个区都在跌),再比全市,再比其他城市——逐层排除「大家都在跌」这个共同原因,剩下的才更可能是这个板块自己的原因。
七、报告里怎么写因果
即使通过了时序等校验,报告里的措辞也要克制:
不推荐:「口碑下滑导致票房下降 40%」
推荐: 「口碑下滑发生在票房下降之前,两者可能相关;同期排片占比也下降了……」
把「支持这个判断的证据」和「还不能排除的其他解释」一起写出来,比给一个确定的因果结论更负责,也更符合数据实际能支持的结论强度。
八、常见误区与追问
- 误区:两个指标相关系数很高,就可以写成因果。 可能是反向因果、混杂因素或巧合,相关只能说明一起变化。
- 误区:时序成立就证明了因果。 时序是必要条件,只能用来排除错误归因,不能证明因果。
- 误区:锚点写成「上映后不久」也可以比较。 模糊写法无法比较,只接受限定格式,其他一律当作没填。
- 误区:被解释的结论没有时间锚点,原因也要降级。 拿不到对方的时间点不是原因的错,应该不比较、保留原因。
- 误区:时序不成立的结论直接删掉。 它的证据可能是真的,降级为现象保留更合适。
- 追问:月份和日期怎么比较先后? 统一到同一个时间点,比如月份取该月最后一天,偏保守地判断。
- 追问:怎么排除混杂因素? 横向和纵向对照:同期其他对象、全市大盘、历史同期是否也有同样变化。
九、加强记忆
相关只说明一起变化,可能是正向因果、反向因果、混杂因素或巧合。模型天然爱把同期变化写成因果,所以要有代码排除站不住的归因。时序是代价低、判据硬、可自动化的必要条件:原因晚于结果一定不是原因,但时序成立不能证明因果。实现上原因必须带限定格式的时间锚点,模糊写法当作没填;不同粒度统一比较,比如月份取月末。原因无锚点或晚于结果就降级为现象;被解释的一方无锚点则不比较。时序之外再用对照、统计检验和逐层排除共因提高证据强度,报告措辞保持克制。