8.1 相关与因果¶
本节学习目标
- 分清 相关 (correlation) 与 因果 (causation)
- 识别 混杂变量、反向因果、巧合 三大陷阱
- 知道想证因果,得靠 实验(RCT、自然实验、因果图)
- 记住一条铁律:先画散点图,再下结论
8.1.1 冰淇淋与溺水的『高相关』¶
每年夏天,沿海城市的卫生局都会注意到一个诡异的统计结果:冰淇淋销量 和 溺水死亡人数 的月度相关系数高达 0.8。报纸标题写着:『甜食危机:冰淇淋让孩子无法游泳?』
冰淇淋只是『跟着出现』,并没有 导致 任何事。这样的例子不是孤例:『家里书多的孩子成绩好』『喝咖啡的人更长寿』『吃巧克力多的国家诺奖也多』——每一个都是漂亮的相关,但背后可能藏着第三个变量、藏着反过来的因果、或者纯属巧合。
本节就把『相关』和『因果』分清楚,让你不再被这类新闻骗。
金句:Correlation does not imply causation.(相关不蕴含因果。)
8.1.2 把幕后的气温画进去¶
先把冰淇淋和溺水画成散点:横轴是某月冰淇淋销量,纵轴是当月溺水人数,每个点是一个月份。你会看到一条向右上斜的点云——卖得多的月份,淹得也多。
但这条云的『斜』来自一个看不见的推手:气温。把气温也画进去(用颜色深浅表示),整张图一下就清楚了:高温的月份挤在右上角(冰淇淋卖得多、溺水也多),低温的月份挤在左下角。冰淇淋和溺水之间根本没有手伸过去,它们只是 同一个时钟下的两根指针。这种结构有个名字:虚假相关 (spurious correlation)。
下面这个动画让你亲手拖动相关程度,看『冰淇淋 vs 溺水』的点云怎么变形:
8.1.3 相关系数的脾气:怕离群点、只认直线¶
怎么把『一起涨一起跌』压成一个数?这正是 §4.8 手把手算过的——先算 协方差 定方向,再除以两个标准差洗掉单位,得到 相关系数,落在 −1 到 +1 之间。这里不再重算,直接拿来用,只补两条它的『脾气』,免得被它骗:
- 它只认直线。 相关系数为 0,只说明没有 直线 关系。数据完全可以是一条 U 形曲线(先升后降),明明紧紧绑在一起,却照样被它判成『无关』。所以看见 0,别急着说两者没关系。
- 它怕离群点。 一个离群的极端点,就能把相关系数从 0 一把拽到 0.8。这也是为什么我们反复强调——先画散点图,再报相关系数。
8.1.4 骗人的相关有三种花样¶
回到冰淇淋的故事,把骗人的『相关』归成三类:
(1)混杂变量 (Confounder)。 背后有个第三者同时影响两边。气温→冰淇淋、气温→溺水,就是最经典的混杂——这正是我们这一节的主角。
(2)反向因果 (Reverse causation)。 看到 X 和 Y 一起变,以为是 X 推动 Y,其实是 Y 在推动 X。比如『朋友多的人更幸福』——也可能是 先幸福、才更容易交到朋友,方向反了。
(3)纯属巧合。 样本不随机,或者运气太好两条线刚好一起漂。有人专门收集这种离谱例子:『某州离婚率 vs 人造黄油消费量,相关高达 0.99』——其实只是两条各自下降的曲线撞在了一起。
陷阱:r 一高就喊因果
任何想用观察数据声称『X 导致 Y』的说法,都得先过三个反问:有没有混杂变量?因果方向反了没?是不是纯巧合?
8.1.5 想证因果,得靠实验¶
要从『相关』升级到『因果』,统计学有三条主流路子:
| 方法 | 思路 | 例子 |
|---|---|---|
| 随机对照试验 (RCT) | 随机分组,强行打散一切混杂 | 临床新药试验 |
| 自然实验 | 借一个外部偶然事件做随机化 | 政策断点 |
| 因果图 (DAG) / 工具变量 | 用因果图理论把混杂识别出来 | 经济计量学 |
放回冰淇淋的故事:如果真要证因果,就得找一群条件差不多的人,随机 分配吃或不吃冰淇淋,再看溺水率——你会发现两组根本没差别。这类方法的细节见 §16.5 因果推断。
应用场景
医学新药、教育政策、广告效果、A/B 测试——所有真想说『我做了 X,导致了 Y』的场合,背后撑腰的都是 RCT 或类 RCT 设计。媒体里只靠观察数据得出的『研究发现』,先打七折再读。
8.1.6 用 scipy 算一行相关系数¶
import numpy as np
from scipy import stats
# 12 个月的数据(拟真合成):幕后真凶是气温
rng = np.random.default_rng(0)
temp = rng.uniform(10, 35, 12) # 气温
icecream = 50 + 4.0 * temp + rng.normal(0, 8, 12) # 冰淇淋销量
drown = 2 + 0.3 * temp + rng.normal(0, 1, 12) # 溺水人数
r, p = stats.pearsonr(icecream, drown)
print(f"冰淇淋 vs 溺水: r = {r:.2f}")
# r 算出来很高,但两者谁也没导致谁——真凶是没进模型的气温
冰淇淋和溺水的相关系数会很高,可它们之间没有任何因果。一行代码能算出 r,却算不出『谁导致谁』——那永远得靠前面说的实验来回答。
你知道吗
Pearson 在 1896 年提出相关系数,本意是想量化达尔文表弟 Galton 发现的现象:高个父亲的孩子,身高会 回归到平均。『回归』这个词(regression)就是从这儿来的——它原本描述的是一种『被拉回平均』的趋势,而不是『拟合一根线』。下一节我们就来认识这根线。
8.1.7 本节小结¶
- 相关 ≠ 因果:看到漂亮的相关,先警惕 混杂、反向、巧合 三大陷阱。
- 相关系数只认 直线、还怕离群点;等于 0 不代表两者独立(可能是曲线关系)。它怎么算,§4.8 已手把手讲过。
- 看相关系数之前 先画散点图——形态决定一切。
- 想要因果,就做 实验 或用因果推断方法(RCT、自然实验、因果图),细节见 §16.5。
- 下节 §8.2 进入 简单线性回归,把『相关』升级成『带方程的预测』。
