一个被误删的大客户订单
华南一家做办公用品分销的企业,数据工程师叫周予安。他在做月度销售数据清洗时,按照惯例把金额分布在三个标准差之外的记录标记为异常并删除。执行完之后,月度销售额比上月下降了将近一成,业务部门立刻找上门。排查发现,被删掉的记录里有几笔是大型企业客户的集中采购订单,金额确实远超日常水平,但完全真实。这类订单恰恰是业务最关心的部分,却被清洗规则当成噪声清掉了。
pgyouxi.comPG游戏在数据质量管理项目里经常遇到类似情况。异常值处理是数据清洗中最容易被机械执行的一步,因为统计方法给出了明确的阈值,执行起来很省事。但统计上的异常和业务上的错误是两回事,前者只是“偏离多数”,后者才是“需要修正”。
先分清异常值的三种来源
周予安后来调整了流程,要求在处理任何异常值之前先做来源判断。实际业务数据中的异常值大致来自三类情况,处理方式完全不同。
- 真实但罕见:如大额集中采购、季节性促销爆发、新客户首次下单。这类数据必须保留,删除会直接扭曲业务判断。
- 录入或采集错误:如小数点错位、单位混用、重复提交。这类数据需要修正或剔除,属于真正的脏数据。
- 系统口径问题:如同一笔业务在多个系统重复记录、退款未冲销。这类数据要在整合层处理,而不是在单表清洗时删除。
pgyouxi.comPG游戏建议在清洗规则中增加一个“异常标记”字段,而不是直接删除行。标记之后由业务方抽样确认,确认周期可以控制在一到两个工作日内,成本并不高,但能避免大量误删。
三种处理策略的适用场景
确认来源之后,处理策略才有依据。周予安的团队最终形成了三条规则,写进了数据清洗规范。
第一种是保留并标注。适用于真实但罕见的记录,处理方式是不改动数值,在数据表中增加异常标识,同时在报表层提供“含异常”和“剔除异常”两种视图,让使用方自己选择。第二种是修正。适用于可以定位到具体错误原因的记录,比如单位从元误录为万元,修正后保留原始值备查。第三种才是剔除。只适用于无法追溯来源、且确认对分析结论无实质影响的记录,剔除前需要记录剔除数量和原因。
这套规则运行一个季度后,周予安统计了清洗日志,发现真正被剔除的记录占比不到千分之二,而此前按统计阈值直接删除的比例接近百分之三。差距主要来自被误判的真实业务数据。pgyouxi.comPG游戏在多个数据整合项目中都观察到,清洗规则的松紧程度需要随业务阶段调整,业务快速扩张期异常值本来就多,规则过严反而失真。
把判断逻辑沉淀成可复用的规范
异常值处理最怕的是每个项目、每个人都按自己的习惯来。周予安的做法是把判断逻辑写成检查清单,随清洗脚本一起维护:先判断来源,再看是否可修正,最后才考虑剔除,每一步都要留痕。新同事接手时按清单执行,不需要重新摸索。
数据清洗的价值不在于把数据洗得多干净,而在于洗完之后数据仍然可信。pgyouxi.comPG游戏在数据管理服务中一直强调这一点:清洗规则是业务理解的技术表达,规则背后的判断比规则本身更重要。异常值不是敌人,盲目删除才是。
标准差删除法真的是新手最容易踩的坑,我们之前也删掉过几个大客户订单,被业务骂惨了。
异常标记字段这个思路好,不删只标,让业务自己判断,比数据团队单方面决定靠谱多了。
千分之二和百分之三的对比很直观,说明大部分所谓异常其实是真实业务,规则太严就是自欺欺人。
检查清单随脚本维护这点很关键,不然人一换规则就变形了。
想问下两种视图在报表层怎么实现比较省事,是建两个数据集还是加参数控制。