1. 数据清洗概述
数据清洗是特征工程中最基础、也最容易被低估的环节。在实际项目中,原始数据往往包含缺失值、异常值、重复记录、格式不一致等问题。如果这些“脏数据”未经处理直接进入模型训练,轻则降低模型精度,重则导致完全错误的业务结论。业界公认:数据清洗通常占据数据科学家 60%–80% 的工作时间,其质量直接决定后续特征工程与建模的上限。
核心观点: 没有干净的数据,再复杂的特征工程都是空中楼阁。清洗不是“可选的预处理步骤”,而是建模前的必要前提。
1.1 常见数据质量问题分类
根据数据产生与采集的环节,可将常见质量问题归纳为以下四类:
| 问题类别 | 典型表现 | 常见原因 |
|---|---|---|
| 缺失值 | NaN、NULL、空字符串、占位符(如 -9999) | 传感器故障、用户未填写、数据合并遗漏 |
| 异常值 | 远超正常范围的值(如年龄 200 岁)、分布尾部极端点 | 录入错误、测量误差、系统 bug |
| 重复数据 | 完全相同的行、关键字段重复但其他字段略有差异 | 多次采集、数据源合并未去重 |
| 格式与逻辑不一致 | 日期格式混用(2024-01-01 vs 01/01/2024)、性别字段出现“男/M/1” | 多源异构、缺乏统一录入规范 |
实战提示: 在 Python 中,
df.info() 和 df.describe() 是快速扫描缺失值与数值分布的首选工具。对于分类字段,df['col'].value_counts() 能帮你一眼发现格式不一致问题。
1.2 数据清洗流程概览
一个标准的数据清洗流程通常包含以下五个阶段,它们构成一个可迭代的闭环:
- 数据探查(Profiling) —— 使用统计摘要与可视化手段了解数据全貌,定位问题区域。
- 缺失值处理 —— 根据缺失比例与业务含义选择删除、填充或模型插补。
- 异常值检测与处理 —— 基于 IQR、Z-Score 或业务阈值识别异常点,并决定修正或剔除。
- 重复与冗余处理 —— 去重、合并同类记录、删除无信息列。
- 格式标准化 —— 统一日期、文本大小写、分类编码、数值单位等。
1.3 清洗流程中的关键决策点
在实际项目中,清洗并非机械地执行上述步骤,而是需要根据数据特征与业务场景做出判断。以下表格总结了各阶段的核心决策问题:
| 阶段 | 关键决策 | 常用 Python 工具 |
|---|---|---|
| 数据探查 | 哪些列需要清洗?缺失比例是否超过可接受阈值? | pandas + matplotlib / seaborn |
| 缺失值处理 | 删除行/列?均值/中位数/众数填充?还是用 KNN / MICE 插补? | pandas.fillna() / sklearn.impute |
| 异常值处理 | 直接删除?盖帽法(Winsorize)?还是保留并做对数变换? | scipy.stats.zscore / numpy.percentile |
| 重复处理 | 完全去重还是基于关键字段模糊匹配? | df.drop_duplicates() / pandas-dedupe |
| 格式标准化 | 统一为哪种格式?是否保留原始字段作为备份? | pandas.to_datetime() / str.lower() |
常见陷阱: 不要一次性对所有列执行相同的清洗策略。例如,对“年龄”列用均值填充可能合理,但对“收入”列用均值填充会严重扭曲分布。务必逐列分析业务含义后再做决策。
1.4 清洗前后的数据质量对比
为了直观展示清洗效果,下面用一个微型示例对比清洗前后的数据状态:
经验法则: 清洗后记录数减少 1%–5% 属于正常范围。如果减少超过 10%,需要重新审视清洗策略是否过于激进,或者数据源本身存在系统性质量问题。