TT Lab
开始
学习 学习路径 课程

处理客户数据

格式全对,数值却不对劲

在 TT Lab 中继续学习

一句话总结

要说通过了验证器的数据有问题,必须有依据,而这个依据不是某一个值,而是分布。并且分布给出的不是证据,而是线索。

为什么需要它

schema 对,列数对,缺失值也符合规则。验证器是绿灯。可是这个月的销售额总觉得哪里不对。被问到哪里不对,却回答不出来。

这时能做的,是做一张说明数据本身的表:每一列是什么类型,空值占百分之几,有多少种不同的值,值的长度通常是几个字符,最常见的值是什么,它占总数的百分之几。这张表叫作概要(profile)。

光靠一份概要,很难看出是否异常。因为异常不是绝对的值,而是通过与上一次的差异显现出来的。所以概要要在每次交付时都保存下来,并进行比较。

工作原理

从一列中要提取的内容大致如下。

项目 能发现什么
缺失比例 对方系统开始填不上某一列了
唯一值比例 本应是标识符的列,开始出现重复的值
值长度分布 电话号码里缺了区号,代码的位数变了
众数及其比例 某一个值突然占了总数的三分之一
最小值和最大值 单位变了,或者混入了异常值

值长度分布尤其便宜又管用。即使通过了格式检查的值,长度不同,也说明生成它的一方变了,而把偏离众数长度的几条直接取出来看,通常马上就能看出原因。

接下来是交付之间的比较。规则越简单越好:缺失比例变动是否超过 5 个百分点,唯一值比例变动是否超过 0.2,众数长度是否变了,众数的占比变动是否超过 10 个百分点。阈值要按数据分别确定,而把用了什么值写下来,比阈值本身更重要。

最后是首位数字的分布。自然聚集的数字,首位是 1 的约占 30%,是 2 的约占 18%,是 9 的约占 5%。这一观察叫作本福特定律。把观测到的分布与期望分布进行比较的标准方法是拟合优度检验,美国国家标准与技术研究院(NIST)统计手册中的卡方拟合优度检验写明了该流程。本实验的做法比它更简单,只用与期望比例的最大差值这一个数来判定:目的不是取代检验,而只是把它当作选出需要人来看的位置的尺子。人手工编造的数字很难符合这个形状:会集中在某些位数上,比如 4 万韩元档、5 万韩元档。

在现场相遇的样子

第一,把本福特定律当作证据。这是最危险的错误。首位分布偏离,意味着“需要人来看这一列”,而不是“有人做了手脚”。分布偏离,除了做手脚还有很多原因:价目表只有几种固定的价格,或者有舍入规则,或者有最低订单金额,仅仅这些就会造成偏离。

第二,把它用在不适用的数据上。要使本福特定律成立,值必须分布在多个数量级上。一个分数只在 100 到 130 之间的列,首位实际上只有 1,所以即使数据是诚实的,也会与期望分布大幅偏离。因此要先判定是否适用:条数是否足够,最大值与最小值的比值是否覆盖了多个数量级。不做这个判定就运行本福特定律,会不断对完好的数据发出告警,而这样一来就没有人再去读这些告警了。

第三,凭一个信号下判断。实际上有用的,是把信号叠加起来看。如果同一列中众数占比跳升、唯一值比例下降、首位分布也偏离,那么这三者很可能指向同一件事。只命中一项的列和命中三项的列,处理方式是不同的。

第四,抛出线索就结束了。报告的最后一行不应是“什么地方有问题”,而应是接下来要确认什么。看起来像手工填写的金额是否集中在某个负责人名下,位数变了的电话号码来自哪个系统:写明接下来该看的位置,才算完成这项工作。

实际工作中真正重要的事

下一项实验要做什么

生成三个月同样形态的凭证交付数据。两个月平平无奇,有一个月格式全都对,但值很奇怪。提取每列的概要,把偏离值长度分布的值直接取出来看,并用阈值判定交付之间的分布变化。然后测量首位数字的分布,怀疑动过手脚的痕迹,再放入一个值范围很窄的列作为反例,让代码自己说出本福特定律不适用的情形。最后把多个信号叠加起来,留下需要调查的对象清单和接下来要确认的内容。评分器会在每次生成不同的交付数据,真实运行你的工具并核对结果。