Step 2.3–2.4:探索,与那张数据质量清单
这一章的核心是一个态度转变:探索不是「画几张图让报告好看」,而是主动去找麻烦。你在 2.3 找到的每一个麻烦,都会变成 2.4 清单上的一行,再变成 Step 3 里的一个具体动作,最后在 Step 8 里变成一句「因为我们在 3.2 做了 X,所以这里的结果可信」。找不到麻烦的探索报告,说明探索得不够。
三种图,各回答一个问题
2.3 只需要三类图就够了,前提是每一类都真的在回答问题:
| 图 | 回答什么 | 要看的东西 |
|---|---|---|
| 单变量分布(直方图/箱线图) | 这一列自己长什么样? | 偏态、多峰、边界堆积(大量值卡在 0 或 100)、离群点 |
| 相关矩阵(热力图) | 列与列之间、列与目标之间有关系吗? | 与目标强相关的列(有用)、列之间强相关(共线性隐患)、与目标相关度异常高的列(泄漏嫌疑) |
| 散点图(自变量 vs 目标) | 这个关系是什么形状? | 直线/曲线/喇叭形(异方差)/分层(有隐藏分组) |
下面这台探索台在示例数据上真的算了这三类图——三个标签页各切一次:
第一个发现:Pearson 和 Spearman 差了 0.2
切到「相关矩阵」标签页,在 Pearson 和 Spearman 之间来回切一次,看 gdp_pc 与 u5mr 那一格:
| 相关系数 | 值 | 它衡量什么 |
|---|---|---|
| Pearson r | −0.674 | 直线关系的强度 |
| Spearman ρ | −0.872 | 单调关系的强度(只看排序) |
Spearman 明显更高,意味着关系很强、但不是直线。切到散点图看一眼就明白了:点云是弯的——人均 GDP 从 200 涨到 1 000 时死亡率暴跌,从 5 000 涨到 15 000 时几乎不动。这在发展指标里是常识(边际效应递减),在数据上就表现为这两个系数的差距。
这一个观察直接产生了 Step 3.3 的一个动作:构造 log_gdp = log₁₀(gdp_pc)。第 11 章会验证:取完对数后 Pearson 从 −0.674 变成 −0.864,几乎追上了 Spearman,同时偏度从 3.39 掉到 0.02。
把每张图的图注写成两句:第一句陈述看到了什么,第二句写「因此在 Step X 我们将……」。
图 2.3-4 人均 GDP 与 5 岁以下死亡率的散点图(n = 480) 观察:两者呈明显负相关,但关系非线性——点云在低收入端陡降、 在高收入端趋平。Pearson r = −0.674,而 Spearman ρ = −0.872, 两者相差 0.198,进一步支持「单调但非线性」的判断。 因此:在 Step 3.3 构造 log₁₀(人均 GDP) 作为附加特征,并在 Step 6 比较使用原始值与对数值的模型表现(见表 6.2-1)。
这样的图注写三四个,2.3 就满分了。它证明的不是你会画图,是你会读图。
第二个发现:那个和目标相关 0.9998 的列
相关矩阵最重要的用途之一,是当泄漏探测器。示例数据里有一列 rate_reported(卫生局上报的死亡率),它和目标 u5mr 的相关系数是 0.9998;另有一列 deaths_registered(登记死亡数),相关 0.953。
任何单列与目标的相关系数超过 0.95,先假设它是泄漏,再去查它的定义。这两列都是「同一件事的另一种记录」——你在预测的东西已经躺在特征里了。第 13 章会把它留在模型里跑一遍,看看会发生什么(准确率 98.6%,AUC 0.999,零误报,而模型什么都没学到)。
在 2.3 就抓住它,成本是零;在 Step 8 才发现,你要重跑整条链。
第三个发现:一列纯噪声
相关矩阵里 spend(卫生支出占 GDP 比)那一列全是接近 0 的数(与目标 −0.096)。这是我故意放进示例数据的无关列,作用是让你看清「无关列」在后面每一步留下的痕迹:
- 第 12 章 PCA:它会独占一个主成分(PC2,解释 14.2% 的方差,载荷 0.999 全压在它身上)——因为它和谁都不相关,所以只能自己成一个方向。「解释方差高」不等于「有用」。
- 第 15 章决策树:深度放到 3 以上时,树会拿它劈一刀,训练准确率因此从 0.878 涨到 0.905,测试准确率从 0.861 掉到 0.799。这就是过拟合的现场。
真实数据里也一定有这样的列。2.3 的相关矩阵是你第一次、也是最便宜的一次识别它们的机会。
2.4:六类质量问题,一张清单
作业说明对 2.4 的要求只有四个字「verify the data quality」,但它是 Step 3 的施工图。按问题类型分六类列表,每类写:发现了什么、多少、怎么处理、在哪一节做。
| 类型 | 示例数据里的情况 | 处置 | 去哪 |
|---|---|---|---|
| ① 缺失 | doctors 36 格(7.4%)、literacy 55 格(11.3%) | 分列决定填补策略;literacy 疑非随机,用分组填补 | 3.2 / 第 9 章 |
| ② 哨兵值 | vaccine 有 5 行 = 999(超出 0–100) | 先转成真缺失,再按 ① 处理 | 3.2 / 第 9 章 |
| ③ 量纲/录入错 | gdp_pc 4 行超中位数 100 倍 | 判为多打三个零,除以 1000(不是删) | 3.2 / 第 10 章 |
| ④ 重复 | 7 行除 id 外全字段一致 | 保留第一条,记录去掉几条 | 3.2 / 第 10 章 |
| ⑤ 不一致 | region 大小写/空格 128 处;record_date 两种格式 94 处 | 规范化为标准形式 | 3.2 / 3.5 / 第 10 章 |
| ⑥ 异常值(真实极值) | 清洗后 gdp_pc 仍有 18 个 IQR 异常(3.8%) | 保留,但在 Step 4 考虑对数变换;建模时报告对结果的影响 | 3.3 / 4.1 / 第 10–11 章 |
| ⑦ 泄漏嫌疑 | rate_reported(r=0.9998)、deaths_registered(r=0.953) | 从特征集中排除,并说明理由 | 3.1 / 第 13 章 |
注意第 ③ 类和第 ⑥ 类的处置方式相反:录入错要修,真实极值要留。区分它们靠的不是统计判据,是领域知识——「人均 GDP 八百万美元」不可能,「某个富裕沿海地区人均 16 000 美元」完全可能。这个判断过程写出来,就是 2.4 的分。
如果你的 2.4 写出了这句话,会发生两件事:一是评分员知道你没认真看(任何真实数据都有问题);二是你在 Step 3(15% 的分)里将无话可写——Step 3 的分是靠「你处理了什么」拿的,2.4 找不到问题,Step 3 就没有素材。
如果你的数据真的很干净(比如某些教学数据集),那就主动制造检查记录:列出你检查过的每一项(缺失率、取值域、重复、类别一致性、时间连续性、目标泄漏),逐项写「检查方法 + 结果:无异常」。「我检查了六项,都正常」和「数据质量良好」是完全不同的两句话。
| ISAS | OSAS | BDAS | |
|---|---|---|---|
| 分布图 | Histogram / Distribution 节点 | df.hist()、Tableau | 抽样后 toPandas() 再画 |
| 相关矩阵 | Statistics 节点(Correlations) | df.corr() + sns.heatmap | Correlation.corr(vecDF)(pyspark.ml.stat) |
| 散点 | Plot 节点 | matplotlib / Tableau | 抽样后画 |
| 质量检查 | Data Audit 节点一次全给 | isna()、value_counts()、duplicated() | agg + countDistinct + groupBy().count() |
BDAS 的一个实操要点:Spark 上画图要先 .sample() 再 .toPandas(),直接 toPandas() 会把整个数据集拉回 driver 内存——这是新手在 EC2 上把 driver 打爆的头号原因。报告里写一句「可视化基于 5% 分层抽样,n = X」,既避免了爆内存又是一个专业细节。
1. Step 2.3(一页半):3–5 张图,每张配「观察 + 因此」两句式图注。至少包含一张相关矩阵和一张目标 vs 关键特征的散点。
2. Step 2.4(一页):上面那张七类清单表(发现 / 数量 / 处置 / 去哪一节)。数量必须是具体数字。
3. 一句泄漏声明:「列 X、Y 与目标变量相关系数分别为 0.9998 与 0.953,经核对其定义与目标同源,已从特征集中排除(见 3.1)。」
逐条勾一遍,全过再交:
- 1.1 有 SDG 编号与原文指标;有决策者与决策动作;有现状基线;有业务侧成功判据。
- 1.2 五格齐全:资源盘点/要求+编号假设+约束/风险与应对成对/术语表(含泄漏列点名)/成本收益(编号假设+算式+量级结论)。
- 1.3 分析单元、目标变量与阈值来源、任务类型、输出形态、模型侧判据(含「必须优于基线」)。
- 1.4 甘特表+关键路径+缓冲+工具技术初评+迭代计划。
- 2.1 URL/下载日期/许可/行列数/粒度/选列理由/多源拼接与匹配率。
- 2.2 机器统计表 + 手写数据字典(含单位与合法范围);类别列与时间列各一段。
- 2.3 3–5 张图,每张有「观察 + 因此」。
- 2.4 七类清单,数量具体,每类指向 Step 3 的某一节。
- 格式:所有图表编号(图 2.3-1、表 2.2-1),正文里被引用过;APA 引用至少 3 条(Fayyad、CRISP-DM、数据来源)。
- 文件:原始数据副本已存、命名带日期;报告 PDF 命名含姓名与迭代号。
这一章的一句话
探索不是配图,是主动找麻烦:Pearson 与 Spearman 差 0.2 意味着关系是弯的(去构造对数列),单列与目标相关 0.9998 意味着泄漏(去排除它),一列与谁都不相关意味着它将来会骗过你的 PCA 和决策树——找到的每个麻烦都要变成 2.4 清单上的一行,并指向 Step 3 的某一节。
提案交完,进入卷 III:Step 3–4。20% 的分,60% 的工时,以及这门课最隐蔽的一个坑。下一章从缺失值开始——六种做法,各跑一遍给你看代价。