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 数据清洗流程概览

一个标准的数据清洗流程通常包含以下五个阶段,它们构成一个可迭代的闭环:

  1. 数据探查(Profiling) —— 使用统计摘要与可视化手段了解数据全貌,定位问题区域。
  2. 缺失值处理 —— 根据缺失比例与业务含义选择删除、填充或模型插补。
  3. 异常值检测与处理 —— 基于 IQR、Z-Score 或业务阈值识别异常点,并决定修正或剔除。
  4. 重复与冗余处理 —— 去重、合并同类记录、删除无信息列。
  5. 格式标准化 —— 统一日期、文本大小写、分类编码、数值单位等。
数据清洗标准流程闭环 数据探查 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 清洗前后的数据质量对比

为了直观展示清洗效果,下面用一个微型示例对比清洗前后的数据状态:

清洗前后数据质量对比(示例) 清洗前(脏数据) • 缺失值:3 列存在 NaN • 异常值:年龄列出现 200 • 重复行:2 条完全重复 • 日期格式:3 种混用 • 性别字段:男 / M / 1 并存 • 可用记录数:1000 行 清洗后(干净数据) • 缺失值:全部填充或删除 • 异常值:盖帽法处理 • 重复行:已去重 • 日期格式:统一为 YYYY-MM-DD • 性别字段:统一为 男/女 • 可用记录数:985 行(减少 1.5%)
经验法则: 清洗后记录数减少 1%–5% 属于正常范围。如果减少超过 10%,需要重新审视清洗策略是否过于激进,或者数据源本身存在系统性质量问题。

1.5 本章小结