4. 数据准备与清洗:数据源整合、缺失值处理、异常值检测、数据标准化

好,咱们进入正题。数据准备与清洗,说白了就是给分析工作「喂」干净的数据。我见过太多案子,明明模型跑得挺漂亮,结果一查,原始数据里全是坑。嗯,今天咱们就把这些坑一个个填上。

4.1 数据源整合:把散落的信息拼起来

做回扣交易分析,数据源通常不止一个。我习惯把它们分成三类:

  • 内部系统数据:ERP、CRM、采购系统、财务系统
  • 外部数据:工商信息、关联方数据库、黑名单库
  • 非结构化数据:邮件、聊天记录、扫描件(OCR后)

整合的时候,最头疼的是「同一实体在不同系统里名字不一样」。比如供应商A在采购系统叫「宏达科技」,在财务系统叫「宏达科技有限公司」,在邮件里叫「HD Tech」。你想想看,如果不做实体对齐,后面分析全是错的。

我的习惯做法:先建一个「实体映射表」,把同一实体的所有别名、曾用名、简称都列出来。然后用模糊匹配(比如Levenshtein距离)做自动对齐,最后人工复核一遍。

举个例子,我曾在某项目中遇到一个供应商,在三个系统里分别叫「鑫源贸易」、「鑫源商贸有限公司」、「Xinyuan Trading」。映射表建好后,才发现这家公司跟采购经理的亲属公司是同一家。嗯,这就是整合的价值。

4.2 缺失值处理:别让「空」骗了你

缺失值在反舞弊分析里特别有意思。有时候,缺失本身就是线索。

我遇到过一种情况:某笔交易的「审批人」字段是空的。一开始以为是系统bug,后来一查,发现是有人故意绕过审批流程,直接下单。你看,缺失值不一定是数据质量问题,也可能是舞弊行为留下的痕迹。

处理缺失值,我一般分三步走:

  1. 判断缺失类型:是随机缺失、系统缺失,还是人为缺失?
  2. 决定处理方式:删除、填充、还是标记为「可疑」?
  3. 记录缺失模式:把缺失情况作为一个新特征保留下来
关键提醒:对于回扣分析,我建议不要轻易删除缺失值。尤其是金额、审批人、供应商ID这些关键字段,缺失往往意味着「有人不想让你看到」。

填充方法上,数值型字段我常用中位数填充(抗异常值),分类型字段用「未知」或「缺失」作为单独类别。但记住,填充只是权宜之计,真正重要的是搞清楚为什么缺失。

4.3 异常值检测:找到那些「不对劲」的数字

异常值检测,是回扣分析的核心环节。说白了,回扣往往藏在「不正常」的交易里。

我常用的检测方法有这些:

方法 适用场景 我的经验
Z-score 正态分布的数据 适合单价、数量等字段,但注意回扣数据往往偏态分布
IQR(四分位距) 非正态分布 我最常用的方法,稳健性好
孤立森林 高维数据 适合同时检测多个维度的异常
聚类分析 发现「离群」的交易模式 比如同一供应商的订单金额突然跳变

举个例子,我曾经用IQR方法检测某公司的采购单价。发现有一批订单的单价是正常价格的3倍以上。顺着查下去,发现是采购经理跟供应商串通,虚报价格吃回扣。嗯,异常值检测就是这么直接。

注意:异常值不一定是舞弊,也可能是业务正常波动。比如年底促销、紧急采购等。所以检测出来后,一定要结合业务背景去验证,别一棍子打死。

4.4 数据标准化:让不同量纲的数据「对话」

数据标准化,说白了就是把不同尺度的数据拉到同一个量级上。比如交易金额是百万级,交易频次是个位数,如果不标准化,模型会天然偏向金额大的特征。

我常用的标准化方法:

  • Min-Max标准化:把数据缩放到[0,1]区间。适合有明确边界的数据。
  • Z-score标准化:减去均值,除以标准差。适合数据近似正态分布。
  • Robust标准化:用中位数和四分位距。抗异常值能力强,我比较喜欢用这个。

在回扣分析中,我建议优先用Robust标准化。为什么?因为回扣数据里异常值太多了,Min-Max会被极端值拉偏,Z-score也不够稳健。Robust标准化用中位数和IQR,对异常值不敏感,结果更可靠。

一个小技巧:标准化后,记得检查一下各特征的分布情况。如果某个特征标准化后仍然偏态严重,可以考虑做对数变换或Box-Cox变换。我在一个项目中,对「交易金额」做对数变换后,异常检测的准确率提升了15%。

4.5 整体流程:一张图说清楚

下面这张图,是我做数据准备与清洗的完整流程。你可以把它当成一个检查清单,每次做分析前过一遍。

数据准备与清洗流程 数据源整合 ERP / CRM / 外部数据 缺失值处理 删除 / 填充 / 标记 异常值检测 Z-score / IQR / 孤立森林 数据标准化 Min-Max / Z-score / Robust 特征工程 衍生特征 / 聚合特征 数据验证 一致性 / 完整性 / 准确性 清洗后的干净数据 → 进入分析模型 发现问题?返回重新清洗

这张图里,我特意加了一个「循环反馈」的箭头。为什么?因为数据清洗很少是一次性完成的。你做完异常值检测,可能发现新的缺失值;做完标准化,可能发现某个特征需要重新处理。所以,保持迭代的心态很重要。

4.6 避坑指南:我踩过的那些坑

最后,分享几个我亲身踩过的坑,希望能帮你少走弯路:

  • 坑一:我曾经直接删除了缺失值占比超过50%的字段,结果后来发现那个字段是「审批备注」,里面藏着关键线索。从那以后,我都是先分析缺失原因,再决定去留。
  • 坑二:做异常值检测时,我一开始只用了Z-score,结果把很多正常的批量采购订单标记为异常。后来改用IQR+业务规则组合,准确率才上来。
  • 坑三:标准化时,我忘了对训练集和测试集分别做fit和transform,导致模型上线后效果崩了。记住:先fit训练集,再用同样的参数transform测试集。

嗯,数据准备与清洗这部分,看起来琐碎,但真的决定了分析的上限。你想想看,数据都不干净,模型再漂亮也是白搭。所以,花时间把这一步做好,后面会省心很多。

专注资料整理