数据清洗全解析:从脏数据到高质量数据的实战指南
1. 引言
在数据分析和机器学习的工作流程中,数据清洗往往是最耗时、最容易被忽视,但也是最关键的一步。有人调侃说:“数据科学家 80% 的时间在清洗数据,20% 的时间在抱怨数据。”这句话虽然夸张,却点出了现实。
脏数据如果不经过清洗,模型就可能被误导,最终得到“垃圾进、垃圾出(Garbage in, Garbage out)”的结果。本文将全面介绍数据清洗的核心任务、常见方法、Python 实现、以及结合实际业务场景的案例,让你真正掌握从原始数据到高质量数据的转化过程。
2. 数据清洗的核心任务
数据清洗的目标是 识别并修复原始数据中的质量问题,主要包括以下几个方面:
- 缺失值:数据为空或不存在。
- 异常值:明显不符合常理的极端值。
- 重复数据:同一条信息被多次记录。
- 不一致数据:单位、编码、命名等不统一。
- 特殊符号:文本或数值中混入干扰符号。
接下来,我们逐个拆解,并结合 Python 示例和业务场景讲解。
3. 缺失值处理
3.1 产生原因
- 信息无法获取(如客户没有填写手机号)。
- 人为遗漏(录入错误)。
- 属性本身不存在(某些交易没有优惠券信息)。
3.2 常见处理方法
删除记录
- 适用场景:数据量充足,缺失比例较小。
data.dropna() # 删除所有含缺失值的行
数据插补
- 均值/中位数/众数填补
- 最近邻插补(KNN Imputation)
- 回归插补
- 插值法(适合时间序列)
data['age'].fillna(data['age'].median(), inplace=True)
保留不处理
- 部分算法(如 XGBoost、LightGBM)原生支持缺失值。
3.3 案例:电商评分缺失
在电商评论中,部分用户只写了文字评价,却没有打分。若直接删除这些记录,可能丢掉大量有效文本。通常做法是:
- 数值型评分用均值填充;
- 文本保留用于 NLP 分析。
这样既保证了模型完整性,又保留了用户反馈。
4. 异常值处理
4.1 检测方法
- 简单统计量:年龄小于 0 岁或大于 200 岁。
- 3σ 原则:适合正态分布数据。
- 箱线图(IQR):常用方法。
Q1 = data['salary'].quantile(0.25)
Q3 = data['salary'].quantile(0.75)
IQR = Q3 - Q1
data = data[~((data['salary'] < (Q1 - 1.5*IQR)) | (data['salary'] > (Q3 + 1.5*IQR)))]
4.2 处理方法
- 删除记录
- 当作缺失值处理
- 平均值修正
- 保留(当异常值本身有业务意义时)
4.3 案例:金融交易异常
在金融反欺诈中,某客户日常消费 500 元,突然出现一笔 50 万元的交易。
- 如果直接删除,可能错过欺诈信号;
- 如果标记为异常,并交由风险模型处理,则能有效防范风险。
所以,异常值是否保留,需要结合业务场景判断。
5. 重复数据处理
5.1 检测与处理
哈希比对或逐行比较
Pandas 实现:
data.drop_duplicates(inplace=True)
5.2 案例:用户注册重复
某电商平台发现用户表中有同一手机号对应多条记录,原因是用户多次注册。
- 可以保留最后一次注册信息;
- 或通过业务逻辑合并历史订单。
6. 不一致数据处理
6.1 常见问题
- 单位不统一(重量 KG vs 斤)。
- 编码不一致(地区代码差异)。
- 命名冲突(“北京大学” vs “北大”)。
6.2 解决方法
- 标准化转换(如统一换算为 KG)。
- 规则映射(如地区代码表)。
- 实体识别(如 NLP 实体消歧)。
6.3 案例:医疗数据不一致
在医院数据中,有的病人性别记录为“男/女”,有的为“1/0”。
统一映射规则:{'男':1, '女':0}
,避免模型混乱。
7. 特殊符号处理
7.1 常见问题
- 文本含有干扰符号:
¥100
,#好评#
,***
。 - 数值列被误读成字符串:
"1,000"
。
7.2 处理方法
正则表达式清洗
import re data['price'] = data['price'].apply(lambda x: re.sub(r'[^\d.]', '', str(x)))
7.3 案例:社交媒体评论
微博评论中,“好好好好好”并不算有效评价。通常做法是:
- 压缩重复字符 → “好”。
- 过滤掉无意义评论 → “顶”“沙发”。
8. 数据清洗流程
- 质量分析:用直方图、散点图检查分布。
- 规则制定:如年龄 > 199 岁视为异常。
- 分批处理:大数据集用 Pandas
chunksize
逐块清洗。 - 结果验证:对比清洗前后分布,避免引入偏差。
9. 高级清洗技术
9.1 文本数据清洗
- 去重
- 连续重复字符压缩
- 短句过滤
- 正则提取结构化信息
9.2 自动化清洗流水线
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import FunctionTransformer
def remove_outliers(x):
# 示例函数:去除极端值
return x[(x > x.quantile(0.05)) & (x < x.quantile(0.95))]
pipeline = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('outlier', FunctionTransformer(remove_outliers))
])
9.3 数据质量监控
- 设置规则:缺失率 < 5%,异常率 < 2%。
- 使用 Great Expectations 进行自动化检测和报警。
10. 业务应用案例
10.1 电商评论清洗
- 删除无意义评论:
"好好好好"
- 填补缺失评分
- 检测异常点赞模式(水军识别)
10.2 金融数据清洗
- 修复交易时间戳乱序
- 处理股票价格异常跳空
- 补全客户征信数据
10.3 医疗数据清洗
- 标准化诊断编码(ICD-10)
- 合并患者多院区就诊记录
- 去除误录入的药品剂量(如“10000mg”)
11. 注意事项
- 保留原始数据副本,避免不可逆损失。
- 重大清洗决策需业务确认(如删除 30% 异常值)。
- 记录清洗日志,便于回溯。
- 避免过度清洗,不要把异常信号当噪音全部抹掉。
12. 总结
数据清洗是数据分析与建模的地基工程。如果不打好地基,再精美的房子也会塌。本文从缺失值、异常值、重复、不一致、特殊符号等常见问题出发,结合 Python 代码和实际案例,系统性地阐述了数据清洗的思路与方法。
在实战中,你需要根据 业务逻辑 + 数据分布 来制定清洗规则,既保证数据质量,又避免信息损失。只有把脏数据清理干净,我们才能真正进入建模和分析的核心环节。