一、数据清洗概述:脏数据、流程与工具
大家好,我是老蓝。做数据这行十几年了,我见过太多人一上来就急着建模、跑算法,结果模型效果差得离谱。为什么?说白了,数据太脏了。今天咱们就聊聊数据清洗这件事——它不是什么高大上的技术,但绝对是数据工作的地基。
1.1 什么是脏数据?
脏数据,就是那些有问题、不干净的数据。我个人的定义很简单:不能直接用于分析或建模的数据,就是脏数据。
举个例子。我之前接手过一个电商项目,订单表里有条记录:用户年龄填的是「-5岁」。你想想看,这明显是录入错误。还有一次,我看到一个「性别」字段,里面居然填了「奥特曼」——嗯,这种数据你敢直接用吗?
常见的脏数据类型,我整理了一下:
| 类型 | 说明 | 我遇到的真实案例 |
|---|---|---|
| 缺失值 | 字段为空或Null | 用户手机号字段30%为空 |
| 重复数据 | 完全相同的记录出现多次 | 同一个订单被导入了3次 |
| 异常值 | 超出合理范围的数据 | 年龄字段出现200岁 |
| 格式不一致 | 同一字段格式混乱 | 日期有2024/01/01和2024-01-01两种 |
| 逻辑错误 | 数据之间互相矛盾 | 下单时间晚于发货时间 |
⚠️ 注意: 脏数据不是「偶尔出现」,而是「必然存在」。我做过统计,一个中等规模的数据集,脏数据比例通常在5%-30%之间。别指望数据是干净的——这是数据人的第一课。
1.2 数据清洗的流程
数据清洗不是瞎搞,得有章法。我个人习惯把流程分成五步,每一步都有明确的目标:
- 数据探查——先看看数据长什么样,心里有个底
- 数据评估——找出哪些地方有问题,严重程度如何
- 清洗方案——针对不同问题,制定处理策略
- 执行清洗——动手处理,记录每一步操作
- 验证反馈——检查清洗效果,确保没引入新问题
这里我画了一张流程图,把整个逻辑串起来:
💡 我的经验: 很多人跳过第一步「数据探查」,直接上手清洗。结果呢?洗到一半发现数据结构和预想的不一样,白费功夫。我建议你花20%的时间做探查,能省80%的返工时间。
1.3 数据清洗的常用工具
工具这东西,没有最好的,只有最顺手的。我这些年用过不少,挑几个常用的说说:
- Python(Pandas)——我最常用的工具。处理几百万行数据,几行代码搞定。适合有一定编程基础的人。
- Excel——别小看它。小数据集(几千行以内),Excel的筛选、排序、条件格式非常直观。我早期做数据清洗,全靠Excel。
- OpenRefine——专门做数据清洗的开源工具。界面友好,适合非技术人员。处理几十万行数据没问题。
- SQL——数据在数据库里的时候,SQL是最高效的。一个UPDATE语句就能批量修复格式问题。
- R(dplyr/tidyr)——统计学家爱用。如果你做统计分析多,R的数据清洗包很强大。
这里给个简单的Python示例,看看清洗有多快:
import pandas as pd
# 读取数据
df = pd.read_csv('订单数据.csv')
# 探查数据
print(df.info())
print(df.describe())
# 处理缺失值——我习惯先看看缺失比例
print(df.isnull().sum())
# 删除完全重复的行
df = df.drop_duplicates()
# 处理异常值——比如年龄超过120岁的
df = df[df['年龄'] <= 120]
# 统一日期格式
df['下单日期'] = pd.to_datetime(df['下单日期'], errors='coerce')
print('清洗完成!数据量:', len(df))
🔑 核心要点: 数据清洗不是一次性工作,而是贯穿整个数据生命周期的持续过程。我见过太多人「洗一次就完事」,结果模型上线后数据源变了,又出问题。记住:清洗要可重复、可追溯。
嗯,说到这,我想起一个教训。曾经有个项目,我清洗完数据后没做验证,直接拿去建模。结果模型效果奇差,排查了两天才发现——清洗时把某个字段的类型搞错了,所有数值都变成了字符串。从那以后,我每次清洗完都会做一次「数据完整性检查」,确保字段类型、取值范围都没问题。
工具选哪个?我的建议是:先看数据量,再看团队技能。小团队用Excel+Python就够了,大项目得上自动化管道。但不管用什么工具,清洗的逻辑是一样的——发现问题、分析问题、解决问题、验证结果。