元数据卡
- 前置知识:第5章(统计推断)
- 预计时间:50 分钟
- 核心难度:进阶
- 阅读模式:高度专注
- 完成标志:能设计一个抽样方案,能区分相关关系和因果关系
你的进度
你构建了一组特征,训练了模型,预测精度还行。但一个更尖锐的问题浮出水面:
你发现训练数据里,前线的任务出勤率普遍高于后方。你能说'在前线提升出勤率'吗?不能。可能是因为前线本来就派了更多精英哨兵——数据里的差异不一定是因果关系。
你发现数据里的'相关性'和'因果性'之间,有一条你之前完全没意识到的鸿沟。
你的任务
在第 3 章里你发现"训练时间越长,任务成功率越高",在第 5 章你检验了这个差异有统计意义。但你能说"增加训练时间 导致 提高成功率"吗?不能。可能的原因是:本来就熟练的团队会花更多时间训练——因果关系反了。这一章教你区分相关和因果,并了解如何用数据做因果推断。
抽样:数据收集的第一道关口
你分析的数据不会包含总体的全部个体——只能抽样。抽样方式直接决定了分析结论能推广到多广。
import pandas as pd
import numpy as np
# 简单随机抽样
sample = df.sample(n=1000, random_state=42)
# 分层抽样 —— 每类任务按比例抽取
def stratified_sample(df, strata_col, frac=0.1):
return df.groupby(strata_col, group_keys=False).apply(
lambda x: x.sample(frac=frac, random_state=42)
)
stratified = stratified_sample(df, "mission_type", frac=0.1)
# 系统抽样 —— 每第 k 个取一个
k = len(df) // 1000
systematic = df.iloc[::k]这三种方式各有适用场景:
| 方法 | 何时用 | 风险 |
|---|---|---|
| 简单随机 | 总体均匀,无分层 | 少数群体可能完全被错过 |
| 分层抽样 | 各层占比悬殊,需保证每层都有样本 | 需要知道层的大小比例 |
| 系统抽样 | 数据有序排列,你无法随机访问 | 如果数据有周期模式会引入偏差 |
大多数偏差来自抽样不是随机的。如果你只分析最近一周的数据,而最近一周刚好有特殊事件,你的结论就不能推广到其他时间段。
相关 ≠ 因果
这是统计学的第一戒律。三个场景说明为什么:
- 反向因果:关系存在,但方向反了。"训练时间长 → 成功率高"可能是"高成功率的任务本身需要更多训练"。
- 混杂因素:隐藏的第三个变量影响了原因和结果。"穿越大片荒野的任务成功率高"——是因为穿越荒野本身有益,还是因为只有最有经验的团队才被派去做这类任务?
- 巧合:100 个独立测试中,期望有 5 个出现 p < 0.05。找到相关太容易了。
因果推断工具箱
当你需要从观测数据中推断因果关系时,用这些方法。
随机对照实验
最可靠的方法。把实验单位随机分配到处理组和对照组,随机化处理掉所有混杂因素。
# 随机分配模拟
np.random.seed(42)
n_missions = len(df)
# 随机分配到两组
df["treatment"] = np.random.choice([0, 1], size=n_missions, p=[0.5, 0.5])
# 比较两组的平均成功率
treatment_effect = (
df[df["treatment"] == 1]["success_rate"].mean()
- df[df["treatment"] == 0]["success_rate"].mean()
)
print(f"处理效应: {treatment_effect:.3f}")随机化的关键价值:在期望上,两组除了处理变量外,其他所有特征都是可比的。所以观测到的差异可以归因于处理。
但很多场景不能做随机化(无法随机分配"团队规模"或"任务难度")。这时你需要观察性研究的工具。
DAG(有向无环图)
画因果图之前,先问自己:哪些变量可能影响原因 和 结果?
team_experience ──→ training_time
↓ ↓
success_rate ←───────────┘这个 DAG 告诉你:team_experience 是混杂因素。如果只看 training_time 和 success_rate 的相关,你会误判。控制 team_experience 后你再分析,结果可能完全不同。
# 控制混杂因素 —— 分层分析
for exp_level in df["team_experience"].unique():
subset = df[df["team_experience"] == exp_level]
corr = subset["training_time"].corr(subset["success_rate"])
print(f"经验={exp_level}: 训练时间与成功率的相关 = {corr:.3f}")工具变量
当存在不可观测的混杂因素时,找一个"只通过原因影响结果的变量"作为工具。
这在数据科学中是从观测数据做因果推断的核心策略之一。工具变量必须满足两个条件:
- 相关性:工具变量与处理变量相关
- 排他性:工具变量只通过处理变量影响结果
如果你做 AB 测试的随机分组(分配变量),它天然是一个完美的工具变量——它随机决定了处理与否,且只通过处理影响结果。
常见陷阱
- 把观测到的相关直接当作因果。不控制混杂因素就下因果结论。
- 过度依赖统计显著性做决策。小样本下的显著关联可能在更大样本下消失。
- 忽略选择偏差。你只分析了完成了任务的数据——那些中途失败的任务没有记录,你的样本是有偏的。
- 在因果推断中混淆"控制变量"的含义。控制变量不当可能引入"对撞偏差"——受原因和结果共同影响的变量不应该被控制。
通关挑战
- 热身:从你身边找一个"相关但不因果"的例子,画出它的 DAG。
- 挑战:用一个包含混杂因素的数据集,展示"控制混杂前"和"控制混杂后"的效果差异。
- 排障:一份报告声称"参与额外培训的团队成功率高出 10%"。列出至少三种可能的替代解释。
验收标准
- 能解释为什么相关不等于因果
- 能画一个简单的 DAG 来识别混杂因素
- 理解随机对照实验为什么是因果推断的黄金标准
- 知道在什么场景下需要使用工具变量
旅人笔记
相关性描述了过去;因果推断指导未来行动。知道二者的区别,是数据科学家最重要的判断力。
下一站预告
你学会了从小样本推断总体、从相关判断因果。但数据量继续增长——当你的 DataFrame 大到内存放不下时,你需要分布式数据处理。