让你的数据告别“脏乱差”,真正为分析而生
在数据科学项目中,有一个广为流传的说法:80%的时间花在数据准备上,20%的时间花在实际建模与分析上。如果你曾把Excel表格直接扔进回归模型,结果得到一堆错误或无法收敛的提示,你就知道这话一点不假。
从原始的Excel数据,到可以放心地输入机器学习算法,中间隔着一条名为 “数据清洗” 的鸿沟。今天,我们就以典型的Excel数据为例,聊聊如何系统性地完成这道“预处理工序”,让你的数据真正 建模就绪。
一、为什么Excel里的“干净数据”往往不干净?
很多研究者或业务人员习惯在Excel中手工录入、整理数据,并认为填满了单元格就是“完整”的。然而,建模视角下的数据质量,关注的是一致性、完整性、有效性和结构适配性。常见的“脏数据”包括:
· 合并单元格与多级表头:人看着直观,程序读取时却会生成大量空值或错行。
· 数值与文本混排:比如“1,234”、“>100”、“未测量”等,导致字段无法直接被识别为数字。
· 缺失值编码混乱:有的用空白,有的用“NA”、“-999”、“无”,甚至用0表示缺失。
· 日期格式五花八门:2025.05.26、2026/5/26、26-May-2026,Excel能显示,但Python或R不认。
· 数据非结构化:一个单元格里包含多个信息,如“北京-朝阳-30岁”。
这些“Excel式”的便利,恰恰是建模前必须清理的障碍。
二、数据清洗五步法:从Excel到建模就绪
下面这套流程,适用于绝大多数表格型数据(.xlsx, .csv)。你可以根据自己的项目按需调整顺序。
第1步:读取与初步体检
不要双击打开Excel后直接动手改。正确的做法是用脚本(Python+Pandas、R或SQL)读取原始数据,保留一个只读的原始副本。
```python
import pandas as pd
df = pd.read_excel('raw_data.xlsx', header=None) # 先不设表头,便于观察
print(df.head(10))
print(df.info())
```
关键动作:
· 检查有多少行、多少列。
· 识别真正的表头在哪一行(可能从第3行开始)。
· 找出合并单元格造成的缺失值(常常表现为左侧列大量NaN)。
第2步:处理表头与行列重构
将多级表头“拍平”成一列有意义的名称。例如:
Unnamed: 0 Unnamed: 1 2025 2026
姓名 销售额 毛利率 销售额
清洗后应为:['姓名', '销售额_2025', '毛利率_2025', '销售额_2026']。
操作要点:
· 使用 pd.DataFrame.iloc[] 选取正确的表头行。
· 对列名进行重命名、去重、补齐缺失。
· 删除无意义的合计行或说明行。
第3步:处理缺失值与异常值
缺失值没有“万能解法”,取决于业务含义:
· 连续变量:可用均值/中位数填充,或用模型预测填充;缺失过多(>30%)可考虑删除该变量。
· 分类变量:可用众数填充,或单独设为“未知”类。
· 时间序列:常用前向填充或插值。
异常值检测常用:
· 描述统计(min, max)发现明显错误,如年龄=200。
· 箱线图识别超出1.5倍IQR的值。
· 领域知识:比如血压值不可能为负数。
注意:不要随意删除含异常值的整行。应先判断是录入错误(可修正)还是真实极端值(应保留)。
第4步:标准化数据类型与编码
这一步是将“长得像数字的文本”变成真正的数字,把“乱七八糟的日期”统一成datetime类型。
```python
# 去除数字中的逗号
df['sales'] = df['sales'].str.replace(',', '').astype(float)
# 统一日期解析
df['date'] = pd.to_datetime(df['date'], errors='coerce')
```
对于分类变量,建模前通常要转换为数值编码(LabelEncoder或One-Hot)。但注意:有序分类(如小学、中学、大学)可保留顺序编码;无序分类(如红、绿、蓝)用哑变量。
第5步:重塑数据与构造特征
建模就绪的数据往往需要是整洁数据(Tidy Data):
· 每行是一个观测。
· 每列是一个变量。
· 每个单元格是一个值。
如果你遇到宽表(如每一列是一个年份),可能需要用 pd.melt() 转为长表。另外,特征工程也是清洗的一部分——从现有列派生新特征,例如从“年龄”构造“年龄段”,从“地址”提取“城市”。
三、那些Excel中“顺手做”但建模时后悔的操作
❌ 不要:
· 在原文件上直接删除行列(失去追溯可能)。
· 使用颜色或字体格式标记异常(计算机读不懂)。
· 对缺失值统一填0(除非0确实有含义)。
· 把不同来源的数据粘贴到同一个sheet的不同区域。
✅ 应该:
· 保留原始数据的只读副本。
· 用注释记录每一步清洗操作(例如写一个清洗日志文件)。
· 清洗完做一个简单的校验:总行数、关键变量的缺失率、统计量与业务预期是否接近。
四、推荐工具链
阶段 推荐工具 适合场景
快速探查 Excel(筛选、透视表) 小型数据集(<1万行),了解数据概貌
批量清洗 Python (Pandas) / R (tidyverse) 中型到大型数据,可复用的清洗脚本
缺失值插补 Python (sklearn.impute) / R (mice) 统计建模前
异常值检测 Python (PyOD) / 可视化工具 高维数据或需要自动化
数据质量校验 Great Expectations 团队协作,持续集成
五、结语:数据清洗是一份严谨的“学术手艺”
不要因为数据清洗枯燥就跳步。一个建模就绪的数据集,应该让任何一位合作者都能打开它,立刻理解每个字段的含义、类型和取值范围,并且能够复现你从原始Excel到最终表格的每一步转换。
下次当你打算对着Excel狂按删除键时,不妨停下来想一想:如果把这个数据交给一个月后的自己,他还能读懂吗? 如果答案是否定的,那就从现在开始,用工程化的清洗流程,为高质量建模铺平道路。
你的数据有多干净,你的模型就有多可靠。
作者:明溪,研究者,主要方向卫生政策评估、卫生经济等。
夜雨聆风