数据清洗入门:脏数据比想象中更常见
做数据分析的人,大多有过这样的经历:拿到一份表格,兴冲冲跑模型,结果一半时间是花在改数据上。有机构做过粗略统计,数据从业者日常工作中,清洗和整理数据的时间占比常年在六成以上。这个数字听起来夸张,但做过项目的人心里有数——真正耗费精力的不是算法,而是那些看起来不起眼的脏数据。
先说缺失值。一份电商订单表,用户ID、下单时间、金额三列齐全,但收货地址栏有12%是空的。这12%不是随机分布的:偏远地区订单的缺失率明显更高,部分来自系统对接时字段没同步。如果直接删掉这些行,等于把偏远市场从分析里抹去了。缺失值本身携带信息,关键在于先判断它是随机缺失还是结构缺失,再决定填补、标记还是保留。
异常值更微妙。零售场景里,某门店单日销售额突然比过去30天均值高出4倍。是促销活动、系统重复记账,还是真有一笔大单?不查清楚就删掉,可能把一次有效的销售脉冲当噪音扔掉。常见的判断方法是看标准差倍数或箱线图,但阈值只是起点。更稳妥的做法是拉出原始流水,逐条核对时间戳和操作人,再决定去留。
还有一种脏数据不显眼:格式不统一。同一张客户表里,电话号码有带区号的、带横线的、前面加了86的,甚至还有把号码填进邮箱栏的。不统一格式就直接匹配,两个明明是同一客户的记录会被当成两个人。处理这类问题通常先做标准化,再用模糊匹配去重,但匹配阈值定在0.85还是0.9,需要拿样本人工验证,不能拍脑袋。
时间序列里的脏数据对走势判断影响最大。某制造企业的设备传感器数据,每5分钟一条,但偶尔出现连续多条时间戳完全相同的情况。如果按时间聚合,这些点会被挤到同一个桶里,短期走势看上去像被压平了。处理时除了去重,还要检查采集端是否发生了时钟漂移——问题出在源头,清洗只能补救,不能根治。
清洗过程中,记录比结果更值得保留。每删一行、补一个值,最好留下日志:改了什么、依据什么规则、影响多少条记录。有团队在做一个季度销售预测时,回看清洗日志才发现,上一版把某区域的退货订单误删了,导致预测偏高约7%。日志不是形式主义,它是让后来者能复现判断的凭据。
工具层面,pandas、SQL、OpenRefine各有适用场景,但工具不解决判断问题。同样一份缺失率8%的数据,有人直接均值填补,有人先做分组填补,结论可能差出一截。入门阶段与其追求工具熟练,不如先养成两个习惯:拿到数据先做描述性观察,看分布、看极值、看缺失模式;每次清洗动作都写清楚理由。
数据清洗没有一劳永逸的模板。业务在变,数据来源在变,今天干净的字段明天可能又出问题。把它当成一项需要持续维护的手艺,而不是一次性的任务,心态会踏实很多。