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最佳实践
  1. 保留原始数据的完整副本,永远不要直接修改原始文件
  2. 用 R/Python 脚本记录每一步预处理操作
  3. 在脚本中添加注释,说明每步处理的理由
  4. 使用版本控制(Git)追踪预处理脚本的变更

2.5 本课程的预处理章节预览

本课程将在第四单元详细讲解数据预处理的实操技术:

  • 第 0301 章 数据清洗:缺失值、异常值、重复值的检测与处理
  • 第 0302 章 特征工程:变量创建、变换、选择
  • 第 0303 章 数据质量评估:质量指标、验证方法

2.6 课后思考

  1. 回顾你最近使用的一份数据,其中存在哪些需要预处理的问题?
  2. 你的预处理步骤是用代码实现的,还是在 Excel 中手动完成的?
  3. 如果删除所有含缺失值的行,你的数据会损失多少?这种损失可以接受吗?