从缺失值到走势:数据清洗的四个实操步骤
第一次拿到一份销售记录时,很多人会直接画图。结果图上一根线突然掉到零,再跳回原位。查了半天发现,那天的日期被录成了“2024-13-01”。这类问题不处理,后面的走势、预测都建立在错误的地基上。数据清洗不是高深技术,更像是在做饭前把米里的石子挑出来。
先看缺失值。一份一万行的用户表中,年龄字段空了约12%。处理方式通常有三种:删掉、填一个固定值、或者用均值、中位数补上。如果缺失比例低于5%,直接删除影响不大。但若超过10%,就要想清楚为什么缺。比如收入字段缺失,往往不是随机丢失,而是高收入人群更不愿填。这时用均值填充,会把整体水平拉低。我的习惯是先标记缺失,再跑一次对比观察,看填充前后关键指标的波动幅度。
异常值比缺失值更隐蔽。某电商后台的日活跃用户数,平时在8万到10万之间。某天突然显示47万。查日志发现,当天有一批测试账号被误计入。如果直接算月度走势,这个点会把均值抬高近两成。识别异常值常用箱线图或3σ原则。但要注意,不是所有异常值都该删。促销日的订单量本来就会跳升,那是真实信号。判断标准是:这个点有没有合理的业务解释。没有解释的极端值,才考虑剔除或修正。
格式问题看起来琐碎,却最耗时间。手机号字段里混着“138-0000-1234”“13800001234”“+8613800001234”三种写法。不统一,就没法去重。日期字段里,有人写“2024/3/5”,有人写“2024-03-05”,还有Excel自动转成的“2024年3月5日”。统一成ISO格式后,再做时间序列分析,才不会在排序时出错。我一般会写一个简单的正则替换脚本,跑一遍全量数据,把常见变体归拢。
逻辑校验是最后一道关。比如订单表里,下单时间晚于发货时间,这显然不对。又比如用户表中,出生年份写成了1899年。这类错误不能靠统计方法发现,只能靠规则。我通常会列一份检查清单:金额不能为负、年龄不能超过120、结束日期不能早于开始日期。每一条规则对应一个查询语句,跑完把异常行导出,人工抽看几十条,判断是录入错误还是系统bug。
清洗做到什么程度算够?没有统一答案。我的经验是,当同一份数据在两次独立清洗后,核心指标的差异小于1%,就可以停了。比如日活跃用户数,两次清洗结果分别是94,200和93,800,差了0.4%,说明主要问题已经处理完。继续抠下去,边际收益很低。把时间花在建模或可视化上更划算。
清洗记录本身也值得保存。每次改了哪些字段、删了多少行、填充用了什么值,写进一个日志文件。下次再拿到类似数据,可以直接复用规则。更重要的是,当别人质疑你的分析结果时,你能说清楚数据经过了哪些处理。这份透明,比清洗本身更能建立信任。走势看得准,预测才有意义,而这一切都始于那几步不起眼的清理动作。