3.2 关系、分组与可视化诚实性:图中相关不等于机制
图中任务时长越长,成功率越高,这还不足以支持延长所有任务。时长和成功率可能同时随任务类型变化,各组甚至使用不同的成功口径。解释斜率前,先核对指标定义和群体构成。
本课目标
- 为变量类型选择关系图与统计量;
- 区分 Pearson、Spearman 和非线性关系;
- 识别混杂、聚合偏差与 Simpson 悖论;
- 使用分母、区间和视觉编码诚实表达不确定性。
1. 散点图先处理重叠
Python 代码使用 pandas 3.0、seaborn 0.13 和 Matplotlib,按顺序运行。小样本用于核对作图与计算行为,不能据此推断总体。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
frame = pd.DataFrame({
"duration_minutes": [5, 10, 20, 30, 40, 60],
"resource_cost": [8, 13, 19, 40, 44, 70],
"team_size": [1, 1, 2, 2, 3, None],
"mission_type": ["survey"] * 3 + ["repair"] * 3,
})
fig, ax = plt.subplots()
sns.scatterplot(
data=frame, x="duration_minutes", y="resource_cost",
hue="mission_type", alpha=0.5, s=30, ax=ax,
)
ax.set_xlabel("Duration (minutes)")
ax.set_ylabel("Resource cost (credits)")
plt.show()大量点重叠时,散点密度会被遮住。可使用:
- 透明度与小点;
- hexbin 或二维密度;
- 按分组分面;
- 对展示抽样,但统计量仍用完整数据;
- 在图注说明抽样规则。
趋势线会隐藏局部结构。线性拟合前查看残差和非线性;平滑曲线则应说明方法和带宽。
2. 相关系数回答的关系不同
Pearson 相关衡量线性关联,对极端值敏感。Spearman 相关衡量秩之间的关联:严格递增变换在不改变并列秩时保持其值,单独反转一列的顺序则会改变符号。两者都不能发现所有非线性关系。
columns = ["duration_minutes", "resource_cost", "team_size"]
pearson = frame[columns].corr(method="pearson", min_periods=3)
spearman = frame[columns].corr(method="spearman", min_periods=3)
observed = frame[columns].notna().astype(int)
pair_counts = observed.T @ observed
print(pair_counts)
u_shape = pd.DataFrame({"x": [-2, -1, 0, 1, 2], "y": [4, 1, 0, 1, 4]})
print(u_shape.corr(method="pearson").loc["x", "y"]) # 0.0
print(u_shape.corr(method="spearman").loc["x", "y"]) # 0.0检查:
- 相关使用了哪些完整案例,缺失是否让每一对样本不同;
- 重复测量是否被当作独立点;
- 范围受限是否压低相关;
- 极端值是否主导;
- 时间趋势是否让两列共同上升。
相关接近零仍可能存在 U 形、阈值或分组后相反的强关系。
U 形样本满足确定关系 min_periods=3 只是演示门槛,不表示三个点足够做推断。
3. 分组比较要展示分布和样本量
箱线图显示中位数、四分位数和按规则定义的须,不直接给出“异常真值”,也不能仅凭箱体不重叠判断统计显著。
fig, ax = plt.subplots()
sns.boxplot(data=frame, x="mission_type", y="duration_minutes", ax=ax)
sns.stripplot(data=frame, x="mission_type", y="duration_minutes", color="black", ax=ax)
ax.set_xlabel("Mission type")
ax.set_ylabel("Duration (minutes)")
plt.show()样本较小时可叠加原始点;样本巨大时很小的差异也可能统计显著,应同时报告效应大小和业务尺度。分布偏斜时考虑 violin/ECDF,但核密度形状依赖平滑参数。
seaborn 默认 whis=1.5,须延伸到 1.5-IQR 围栏内最远的实际观测,并不一定落在围栏数值上。小提琴图平滑估计密度,ECDF 则按实际观测逐步累计比例,不需要带宽。参见 seaborn 箱线图接口。
4. Simpson 悖论提醒你检查构成
两个组内,新方案都比旧方案成功率高;汇总后却可能更低,因为新方案承担了更多困难任务。
简单任务:new 90/100,old 80/100
困难任务:new 20/100,old 1/10组内比较与汇总比较权重不同。解决不是永远分组,而是根据因果问题确定该控制哪些变量、哪些变量是中介或碰撞点。EDA 可以揭示分层反转,因果选择留到第 8 章。
这里 new 在两组内分别以 90% 对 80%、20% 对 10% 胜出,汇总却是 110/200=55%,低于 old 的 81/110≈73.64%。困难任务在 new 中占 50%,在 old 中只占约 9.09%,正是这些不同权重造成反转。
5. 时间关系要防共同趋势
两个随时间增长的累计指标可能相关接近 1,即使它们没有直接联系。先画原序列,再考虑:
- 去趋势或看差分;
- 季节分解;
- 滞后关系;
- 结构突变;
- 自相关导致的有效样本量下降。
简单地把一列向后 shift 后找到最高相关,会进行大量隐式比较;若要做推断,需要预先限定窗口或校正选择偏差。
6. 图形编码会放大或缩小差异
坐标轴
柱状图长度编码通常应从零开始,否则微小差异会被放大。折线图展示变化时可使用非零范围,但必须清楚标轴,避免截断误导。
面积与三维
气泡面积应与数值成比例,而不是半径。3D 柱图会引入透视和遮挡,通常不利于准确比较。
颜色
顺序数据用连续色阶,正负偏差用以有意义中心为中点的发散色阶,类别用离散色。兼顾色觉差异,并避免只靠颜色传达关键状态。
双轴
双 Y 轴通过任意缩放可以制造同步感。优先分面、标准化指数或直接标注;若必须使用,明确尺度与理由。
7. 不确定性与分母要进入图表
分组成功率可同时画:
点估计 + 置信区间 + 样本量 n置信区间的解释取决于估计方法和抽样假设。对聚类、重复用户或时间相关数据,简单二项独立区间可能过窄。
误差条必须说明是标准差、标准误还是置信区间。三者不可互换;标准差描述观测离散,标准误描述估计量抽样波动。
8. 多重探索需要留痕
看几十张图后挑出最惊人的一张,会放大偶然模式。EDA 可以自由探索,但后续验证应:
- 在独立数据或新时间窗口复现;
- 记录探索过的变量和切片;
- 区分探索性与确认性结论;
- 对正式多重检验做校正或层级建模;
- 不把筛选后的 p 值当预注册检验结果。
9. 自动报告是索引,不是结论
自动 profiling 能快速列出分布、缺失和相关,但会:
- 在高维数据产生大量偶然告警;
- 不理解业务粒度与分母;
- 对时间、聚类和采样设计缺少上下文;
- 可能消耗大量内存与时间。
用它发现需要调查的列,再回到数据契约和生成过程。工具版本和依赖在实施时再选择,不把某个当前包名写成永久标准。
常见误区
- 箱体不重叠就代表显著差异:图形不是检验规则。
- Spearman 能发现所有非线性关系:它主要捕捉单调关系。
- 按更多变量分组总更接近真相:控制碰撞点可能引入偏差,控制中介可能改变要估计的效应。
- 误差条都表示数据波动:SD、SE 和 CI 回答不同问题。
练习
- 构造 Pearson 接近零但有清晰 U 形关系的数据并画图。
- 用一组数据展示汇总与分层趋势方向相反。
- 把一张截断 Y 轴的柱状图改成更诚实的表达。
- 为成功率图增加分母、区间方法和重复用户假设说明。
小结
关系图展示的是在特定采样、分组和视觉编码下的关联。相关系数、趋势线和箱线图都需要分母、结构与不确定性解释。EDA 找到的是待验证模式,不是因果机制。
下一章转到 SQL:在写窗口函数之前,先固定一行的粒度、连接基数和指标分母,否则查询会精确地重复计算错误事实。