数据清洗入门:那些年我们踩过的坑
拿到一份新数据,第一反应往往是先跑个汇总看看。但很多人在这一步就卡住了——明明有1000行记录,销售额字段却显示只有800个非空值。那200行去哪了?翻回去看原始表格,有些单元格是空白,有些填了“暂无”,还有几个是“-”。这就是数据清洗要面对的第一个现实:数据不会以你期望的格式出现。
缺失值是最常见的问题,但处理方式不能一刀切。比如一份用户年龄表,缺失比例只有2%,直接删掉这些行影响不大。但如果是一份设备运行日志,温度字段缺失了15%,而且集中在凌晨时段,那删除就可能掩盖夜间故障的规律。更稳妥的做法是先标记缺失类型:是随机丢失,还是系统性缺失。用均值填充看似省事,却会压缩方差,让后续的走势观察变得平滑而失真。
格式混乱是另一个高频痛点。日期字段里同时存在“2024-01-05”“2024/1/5”“05-Jan-24”三种写法,直接排序就会乱套。手机号有的带+86,有的带横线,有的中间加了空格。这些看似细小的不一致,在关联两张表时会导致匹配率骤降。我曾见过一份订单数据,因为收货地址里“北京市”和“北京”混用,按城市汇总时直接多出了12%的“其他”分类。清洗时统一格式,比事后解释差异要省力得多。
异常值需要区分“错误”和“真实极端”。比如某电商平台的日活数据,平时在50万左右,某天突然跳到500万。查下来发现是当天上线了一个拉新活动,这就是真实极端值,不能删。但如果是某个用户年龄填了200岁,或者订单金额出现负数,那基本可以判定为录入错误。判断标准可以结合业务规则:年龄超过120岁、单价超过历史最高值10倍,先标记出来人工复核,而不是让算法自动决定去留。
重复记录也常被低估。一份客户名单里,同一个人可能因为不同渠道注册而出现三次,姓名相同但手机号差一位。简单的去重按手机号执行,会漏掉那些号码写错的情况。更细的做法是组合多个字段做相似度匹配,比如姓名+地址的模糊比对。但要注意,过度清洗可能把真实存在的同名同姓用户合并掉。清洗的边界,始终是保留信息与去除噪声之间的权衡。
这些清洗步骤做完,数据量通常会减少10%到30%。有人觉得可惜,但保留脏数据带来的偏差更大。比如用未清洗的销售数据做预测,促销期的异常大单会拉高整体均值,导致对日常走势的判断偏乐观。清洗后的数据未必完美,但至少让每一次观察都有可追溯的依据。
一个实用的习惯是:每次清洗都记录操作日志。删了多少行、填充了什么值、替换了哪些格式,写成简短备注。下次别人接手,或者自己三个月后回头看,能快速理解这份数据经历过什么。数据清洗没有一劳永逸的标准答案,但透明的处理过程能让结论更经得起推敲。