4. 数据治理与质量

供应链关系数据来自ERP、SRM、WMS、TMS、工商征信、物流轨迹等多个系统,天然存在命名不一致、编码冲突、字段缺失、重复记录和异常波动。若直接把这些数据喂给风险模型,模型学到的往往是“脏数据的规律”,而不是真实风险。数据治理与质量工程的目标,是把多源异构数据转化为可信、可追溯、可复用的供应链主数据资产。

一、核心原理:从“数据可用”到“数据可信”

数据治理不是一次性清洗,而是一条持续运行的质量流水线。其核心原理可概括为四个层次:标准化(统一格式与编码)、一致性(跨系统同一实体指向同一对象)、完整性(关键字段可获取、可推断)、可信性(异常可识别、来源可追溯)。在供应链场景中,最关键的治理对象是“供应商—物料—订单—物流—资金”五类主数据及其关系边。

治理原则:先定义主数据标准,再做清洗与对齐;先保证关键字段质量,再追求全字段覆盖;先建立可回溯的规则,再引入自动化模型。

二、方法流程:五步质量流水线

  1. 数据剖析(Profiling):统计各字段空值率、唯一值分布、长度分布、枚举值集合,识别脏数据集中区域。
  2. 数据清洗(Cleaning):统一大小写、去除空白与不可见字符、规范电话/地址/税号格式、拆分合并字段。
  3. 实体对齐(Entity Resolution):通过规则+相似度+图关系,把“华为技术有限公司”“华为技术”“HUAWEI TECH”归并为同一供应商实体。
  4. 缺失值处理(Imputation):按字段重要度选择删除、均值/中位数填充、分组填充、模型预测填充或保留缺失标记。
  5. 异常检测与主数据管理(MDM):用统计、距离、密度、时序方法识别异常,并将黄金记录写入主数据系统,建立版本与血缘。
供应链数据质量流水线:从多源脏数据到主数据黄金记录 多源接入 ERP / SRM / WMS 数据剖析 空值率 / 分布 清洗标准化 格式 / 编码统一 实体对齐 规则 + 相似度 缺失值 / 异常检测 填充 / 离群识别 主数据管理 MDM 黄金记录 · 版本管理 · 数据血缘 · 质量评分 质量规则库 非空 / 唯一 / 值域 / 关系 异常检测 Z-Score / IQR / 孤立森林 实体对齐 编辑距离 / 图连通 监控告警 质量分 / 波动

三、关键技术与参数示例

实体对齐常用“阻塞+相似度+聚类”三段式。先用税号、统一社会信用代码、电话等强键做阻塞,缩小比较范围;再计算名称、地址、法人等字段的相似度;最后按阈值合并。缺失值处理要区分“随机缺失”和“业务性缺失”,后者本身可能是风险信号,例如供应商未提供环保资质。

# 供应商名称标准化与相似度对齐示例
import re
from difflib import SequenceMatcher

def normalize(name: str) -> str:
    name = re.sub(r"[\s()()【】\[\]]", "", name)
    name = name.replace("有限公司", "").replace("股份", "")
    return name.upper()

def similarity(a: str, b: str) -> float:
    return SequenceMatcher(None, normalize(a), normalize(b)).ratio()

pairs = [("华为技术有限公司", "华为技术"),
         ("HUAWEI TECH", "华为技术有限公司"),
         ("深圳市腾讯计算机系统有限公司", "腾讯计算机")]

for a, b in pairs:
    print(a, b, round(similarity(a, b), 3))

# 输出示例
# 华为技术有限公司 华为技术 0.857
# HUAWEI TECH 华为技术有限公司 0.333
# 深圳市腾讯计算机系统有限公司 腾讯计算机 0.667

异常检测在供应链中常用于识别订单量突增、交期异常、价格偏离、物流轨迹跳跃。推荐组合使用:单变量用IQR或Z-Score,多变量用孤立森林或LOF,时序用STL分解或Prophet残差。

# 订单金额异常检测:IQR 与 Z-Score 双规则
import numpy as np

amounts = np.array([1200, 1350, 1280, 1400, 1320, 98000, 1250, 1300])

q1, q3 = np.percentile(amounts, [25, 75])
iqr = q3 - q1
lower, upper = q1 - 1.5 * iqr, q3 + 1.5 * iqr

z = (amounts - amounts.mean()) / amounts.std()

for i, v in enumerate(amounts):
    flag = "异常" if (v < lower or v > upper or abs(z[i]) > 3) else "正常"
    print(f"金额={v:>6}  Z={z[i]:>6.2f}  {flag}")

四、案例场景:供应商主数据对齐

某制造企业SRM中有供应商“宁波XX精密机械厂”,ERP中为“宁波XX精密机械有限公司”,征信系统中为“宁波XX精密机械”。三套系统编码不同,导致同一供应商的交付风险、财务风险、合规风险被拆散在三个视图里。治理团队先以统一社会信用代码为强键做阻塞,再对名称做相似度计算,最后通过图连通把三套记录合并为一个主数据实体,并保留各源系统ID作为别名。

治理环节输入关键动作输出质量指标
数据剖析多源供应商表统计空值率、重复率、枚举分布质量画像报告空值率、重复率
数据清洗原始字段去空格、统一大小写、规范税号标准字段格式合规率
实体对齐标准字段阻塞+相似度+图合并统一实体ID对齐准确率、召回率
缺失值处理统一实体分组填充、模型预测、缺失标记完整特征关键字段完整率
异常检测完整特征IQR、Z-Score、孤立森林异常标签异常命中率、误报率
主数据管理异常标签黄金记录、版本、血缘主数据服务质量分、可追溯率

五、误区与复盘

常见误区一:把“清洗”等同于“删除”。删除缺失记录会引入选择偏差,尤其当缺失与风险相关时,删除等于抹掉风险信号。
常见误区二:实体对齐只靠名称相似度。名称相似不等于同一实体,必须结合税号、地址、法人、银行账户等强键交叉验证。
常见误区三:异常检测阈值一刀切。不同品类、不同区域、不同季节的订单波动差异很大,应按分组建立基线。
常见误区四:主数据只建不治。没有版本、血缘和质量监控的主数据,半年后就会重新退化为脏数据。
复盘建议:每次治理后回看三类指标——质量指标(空值率、重复率、对齐准确率)、业务指标(风险预警命中率、供应商画像覆盖率)、运维指标(规则执行时长、告警数量)。只有三类指标同时改善,数据治理才真正服务于供应链风险管控。

数据治理与质量是供应链风险因子实战的地基。清洗让数据可用,对齐让数据可连,缺失值处理让数据可算,异常检测让数据可警,主数据管理让数据可复用。五者形成闭环,才能支撑后续的关系图谱、风险评分与预警决策。