2 什么是数据预处理
你辛辛苦苦在野外采集了三个月的土壤数据,兴冲冲地导入 R 准备分析,却发现:有些样点的 pH 值是 -2(显然不可能),有些行的有机碳含量是空白,日期格式有的写”2027-03-15”有的写”15/3/2027”……
这就是真实数据的常态。数据预处理(Data Preprocessing)就是将”原始的、混乱的”数据转化为”干净的、可分析的”数据的过程。
2.1 为什么需要数据预处理?
原始数据几乎不可能直接用于分析,原因包括:
- 缺失值:传感器故障、记录遗漏、问卷未填写
- 异常值:输入错误、仪器故障、极端事件
- 格式不一致:日期格式混乱、单位不统一、编码不同
- 重复记录:同一样本被录入多次
- 数据类型错误:数值被存为文本,分类变量编码不规范
如果不处理这些问题就直接建模,结果将不可靠——这就是”垃圾进,垃圾出”(Garbage In, Garbage Out)。
2.2 数据预处理的完整流程
数据预处理不是单一步骤,而是一个系统化的流程:
原始数据
│
▼
① 数据检查(Data Inspection)
│ 了解数据结构、类型、维度、缺失情况
▼
② 数据清洗(Data Cleaning)
│ 处理缺失值、异常值、重复值、格式问题
▼
③ 数据转换(Data Transformation)
│ 类型转换、编码转换、单位统一
▼
④ 特征工程(Feature Engineering)
│ 创建新变量、变量选择、降维
▼
⑤ 数据标准化/归一化(Scaling)
│ 消除量纲差异,使变量可比较
▼
⑥ 数据质量评估(Quality Assessment)
│ 验证处理后的数据是否满足分析要求
▼
可分析数据
2.2.1 ① 数据检查
拿到数据后的第一件事:先看,再动手。
- 数据有多少行、多少列?
- 每个变量是什么类型(数值、分类、日期)?
- 有多少缺失值?分布在哪里?
- 数值变量的范围是否合理?
在 R 中,常用的检查函数:
| 函数 | 用途 |
|---|---|
dim() |
查看行列数 |
str() / glimpse() |
查看数据结构 |
summary() |
数值摘要(均值、中位数、极值) |
is.na() |
检测缺失值 |
head() / tail() |
查看前/后几行 |
2.2.2 ② 数据清洗
数据清洗是预处理中最耗时的环节,通常占整个数据分析工作量的 60-80%。
缺失值处理的常见策略:
| 策略 | 适用场景 | R 实现 |
|---|---|---|
| 删除含缺失值的行 | 缺失比例很小(<5%) | drop_na() |
| 均值/中位数填充 | 数值变量,随机缺失 | replace_na() |
| 众数填充 | 分类变量 | 手动替换 |
| 插值法 | 时间序列数据 | zoo::na.approx() |
| 保留缺失 | 缺失本身有意义 | 标记为单独类别 |
异常值处理的常见方法:
- 箱线图法:超出 Q1 - 1.5×IQR 或 Q3 + 1.5×IQR 的值
- Z-score 法:|Z| > 3 的值视为异常
- 领域知识:pH 值不可能为负数,温度不可能超过 60°C
Warning异常值 ≠ 错误值
异常值不一定是错误。一个极端的降雨量可能是真实的极端天气事件。处理异常值前,务必结合领域知识判断:是数据错误,还是真实的极端情况?
2.2.3 ③ 数据转换
- 日期格式统一:全部转为
YYYY-MM-DD格式 - 分类变量编码:将文本标签转为因子(factor)
- 单位统一:确保同一变量使用相同单位(如全部用 g/kg,不要混用 mg/kg 和 %)
2.2.4 ④ 特征工程
特征工程是从现有变量中创造新的、更有信息量的变量:
- 数学变换:对偏态分布的变量取对数(如生物量、面积)
- 交互项:温度 × 湿度 可能比单独的温度或湿度更能预测物种分布
- 时间特征:从日期中提取月份、季节、年份
- 空间特征:从经纬度计算样点间距离
2.2.5 ⑤ 数据标准化与归一化
当不同变量的量纲差异很大时(如海拔 0-4000m vs. pH 4-9),需要进行标准化:
| 方法 | 公式 | 结果范围 | 适用场景 |
|---|---|---|---|
| Z-score 标准化 | (x - μ) / σ | 无固定范围 | 大多数统计分析 |
| Min-Max 归一化 | (x - min) / (max - min) | [0, 1] | 神经网络、距离计算 |
| 对数变换 | log(x) | 取决于数据 | 右偏分布 |
2.2.6 ⑥ 数据质量评估
处理完成后,需要验证数据质量:
- 缺失值是否已全部处理?
- 数值范围是否合理?
- 变量类型是否正确?
- 样本量是否满足分析需求?
2.3 一个完整的示例
假设我们有一份土壤调查的原始数据:
| 问题 | 原始数据示例 | 处理后 |
|---|---|---|
| 缺失值 | pH = NA | 用该深度层的中位数填充 |
| 异常值 | pH = -1.5 | 标记为 NA 后填充 |
| 格式不一致 | 日期 = “15/3/2027” | 转为 “2027-03-15” |
| 重复记录 | 同一样点出现两次 | 保留第一条,删除重复 |
| 单位不一致 | 有机碳:有的 g/kg,有的 % | 统一为 g/kg |
2.4 数据预处理与可重复性
数据预处理是可重复性研究中最容易出问题的环节。为什么?
- 预处理步骤往往是”手动”的,缺乏记录
- 不同研究者对”异常值”的判断标准不同
- 缺失值的处理方式会显著影响最终结果
因此,所有预处理步骤都应该用代码实现,而不是在 Excel 中手动操作。代码是可追溯、可重复的;手动操作不是。
Tip最佳实践
- 保留原始数据的完整副本,永远不要直接修改原始文件
- 用 R/Python 脚本记录每一步预处理操作
- 在脚本中添加注释,说明每步处理的理由
- 使用版本控制(Git)追踪预处理脚本的变更
2.5 本课程的预处理章节预览
本课程将在第四单元详细讲解数据预处理的实操技术:
- 第 0301 章 数据清洗:缺失值、异常值、重复值的检测与处理
- 第 0302 章 特征工程:变量创建、变换、选择
- 第 0303 章 数据质量评估:质量指标、验证方法
2.6 课后思考
- 回顾你最近使用的一份数据,其中存在哪些需要预处理的问题?
- 你的预处理步骤是用代码实现的,还是在 Excel 中手动完成的?
- 如果删除所有含缺失值的行,你的数据会损失多少?这种损失可以接受吗?