3. 数据基础准备:采购订单数据、发票数据、合同数据、供应商主数据的字段规范与清洗

采购支出分析的质量,80% 取决于底层数据的质量。在开始供应商整合排查之前,必须对四类核心数据源进行字段规范与清洗。本章将逐一拆解采购订单、发票、合同、供应商主数据的标准字段清单、常见脏数据模式及清洗规则。

3.1 四类数据源的核心字段规范

下表定义了每类数据在分析阶段必须保留或衍生的关键字段,缺失或格式不一致将直接导致后续分析失败。

数据类别 必选字段 可选/衍生字段 字段格式要求
采购订单 (PO) PO编号、创建日期、供应商编码、物料编码、订单数量、单价、币种、采购组织 交货日期、收货数量、付款条款、采购员 PO编号统一大写字母+数字;日期格式 YYYY-MM-DD;币种使用 ISO 三字母代码
发票数据 发票编号、PO编号、发票日期、发票金额、税额、供应商编码、付款状态 付款日期、折扣金额、冲销凭证号 发票编号去空格去特殊符号;金额保留两位小数;税额与发票金额逻辑校验
合同数据 合同编号、供应商编码、合同开始日期、合同结束日期、合同总金额、品类、签署人 续约条款、价格调整机制、附件链接 合同编号与PO编号关联规则需提前定义;日期区间不可交叉或重叠
供应商主数据 供应商编码、供应商名称、注册地址、税号、行业分类、合作状态、风险等级 联系人、付款银行、评级分数、认证资质 供应商编码全局唯一;名称去前后空格去全角字符;税号按国家规则校验
字段规范要点: 所有数据源中的“供应商编码”必须使用同一套编码体系。如果 ERP 中供应商编码长度不一致(如 A001 与 0001A001),必须在清洗阶段统一为固定长度(如 10 位左补零),否则后续关联会丢失记录。

3.2 数据清洗六步法

数据清洗不是一次性工作,而是按以下六个步骤循环迭代的过程。每一步都对应具体的脏数据场景和清洗动作。

  1. 格式标准化:统一日期格式(YYYY-MM-DD)、数字格式(千分位去逗号)、文本大小写(供应商名称首字母大写)。
  2. 缺失值处理:关键字段(如 PO 编号、供应商编码)缺失则整行标记为异常并隔离;非关键字段(如采购员)缺失可填充“未知”或按规则推算。
  3. 重复记录去重:基于 PO 编号+供应商编码+物料编码组合去重;保留创建日期最新的记录,其余标记为历史版本。
  4. 逻辑校验:发票金额不应超过 PO 订单金额的 120%(含税);合同结束日期必须晚于开始日期;订单数量与收货数量逻辑一致。
  5. 异常值识别:单价低于 0 或高于历史均价 5 倍的数据需人工复核;数量为负数的订单需确认是否为退货单。
  6. 关联一致性:发票中的 PO 编号必须在 PO 表中存在;合同中的供应商编码必须在供应商主数据中存在。
常见陷阱: 不要直接删除异常数据。建议建立“异常数据暂存表”,将清洗过程中识别出的所有问题记录保留,供后续审计和追溯使用。删除数据前必须获得业务部门书面确认。

3.3 数据清洗流程架构

下图展示了从原始数据输入到清洗后标准数据集的完整流程,包含四个清洗阶段和两个质量门禁。

采购数据清洗流程架构 原始 PO 数据 原始发票数据 原始合同数据 供应商主数据 阶段一:格式标准化(日期/数字/文本统一) 阶段二:缺失值填充 + 重复记录去重 门禁1 阶段三:逻辑校验(金额/日期/数量一致性) 阶段四:关联一致性校验 → 输出清洗后标准数据集

3.4 字段清洗实战:常见脏数据模式

以下列出四类数据中最常遇到的脏数据模式及对应的清洗 SQL 或 Python 逻辑示例。

数据类别 脏数据模式 示例 清洗规则
采购订单 PO编号含空格或特殊字符 "PO-001 "、"PO#001" 正则去除非字母数字字符,统一转为大写
采购订单 单价为负数 -150.00 取值并标记为“价格异常”,通知采购员确认
发票数据 发票金额与PO金额不匹配 PO金额1000,发票金额1500 超出±10%范围则挂起,进入人工审核流程
发票数据 发票日期早于PO创建日期 发票日期2024-01-01,PO日期2024-01-15 标记为“日期倒挂”,退回财务重新核对
合同数据 合同结束日期早于开始日期 开始2024-12-01,结束2024-06-01 交换日期值并记录异常日志
供应商主数据 同一供应商多个编码 "SUP001"与"SUP0001"指向同一公司 建立编码映射表,统一归并到主编码
供应商主数据 税号格式错误 15位或18位混用,含中文括号 按国家税务规则校验,不合规则标记为“待核实”
清洗代码示例(Python/Pandas): 以下代码演示如何对 PO 编号进行标准化清洗。
import pandas as pd
import re

def clean_po_number(po_raw):
    # 去空格、去特殊字符、转大写
    po_clean = re.sub(r'[^A-Za-z0-9]', '', str(po_raw)).upper()
    # 统一补零至10位(假设标准长度)
    po_clean = po_clean.zfill(10)
    return po_clean

# 应用清洗
df['po_number_clean'] = df['po_number_raw'].apply(clean_po_number)

3.5 数据清洗后的质量评估指标

清洗完成后,必须用量化指标评估数据质量。以下四个指标是供应商整合排查前的必检项。

  • 完整率:关键字段非空记录数 / 总记录数 × 100%。目标 ≥ 99.5%。
  • 唯一率:去重后记录数 / 去重前记录数 × 100%。用于衡量重复数据占比。
  • 一致率:通过逻辑校验的记录数 / 总记录数 × 100%。目标 ≥ 98%。
  • 关联率:成功关联到其他数据源的记录数 / 总记录数 × 100%。目标 ≥ 95%。

只有当四个指标全部达标时,清洗后的数据才能进入供应商整合排查环节。任何一项不达标,都需要返回清洗流程的对应阶段进行修复。