3. 数据基础准备:采购订单数据、发票数据、合同数据、供应商主数据的字段规范与清洗
采购支出分析的质量,80% 取决于底层数据的质量。在开始供应商整合排查之前,必须对四类核心数据源进行字段规范与清洗。本章将逐一拆解采购订单、发票、合同、供应商主数据的标准字段清单、常见脏数据模式及清洗规则。
3.1 四类数据源的核心字段规范
下表定义了每类数据在分析阶段必须保留或衍生的关键字段,缺失或格式不一致将直接导致后续分析失败。
| 数据类别 | 必选字段 | 可选/衍生字段 | 字段格式要求 |
|---|---|---|---|
| 采购订单 (PO) | PO编号、创建日期、供应商编码、物料编码、订单数量、单价、币种、采购组织 | 交货日期、收货数量、付款条款、采购员 | PO编号统一大写字母+数字;日期格式 YYYY-MM-DD;币种使用 ISO 三字母代码 |
| 发票数据 | 发票编号、PO编号、发票日期、发票金额、税额、供应商编码、付款状态 | 付款日期、折扣金额、冲销凭证号 | 发票编号去空格去特殊符号;金额保留两位小数;税额与发票金额逻辑校验 |
| 合同数据 | 合同编号、供应商编码、合同开始日期、合同结束日期、合同总金额、品类、签署人 | 续约条款、价格调整机制、附件链接 | 合同编号与PO编号关联规则需提前定义;日期区间不可交叉或重叠 |
| 供应商主数据 | 供应商编码、供应商名称、注册地址、税号、行业分类、合作状态、风险等级 | 联系人、付款银行、评级分数、认证资质 | 供应商编码全局唯一;名称去前后空格去全角字符;税号按国家规则校验 |
字段规范要点: 所有数据源中的“供应商编码”必须使用同一套编码体系。如果 ERP 中供应商编码长度不一致(如 A001 与 0001A001),必须在清洗阶段统一为固定长度(如 10 位左补零),否则后续关联会丢失记录。
3.2 数据清洗六步法
数据清洗不是一次性工作,而是按以下六个步骤循环迭代的过程。每一步都对应具体的脏数据场景和清洗动作。
- 格式标准化:统一日期格式(YYYY-MM-DD)、数字格式(千分位去逗号)、文本大小写(供应商名称首字母大写)。
- 缺失值处理:关键字段(如 PO 编号、供应商编码)缺失则整行标记为异常并隔离;非关键字段(如采购员)缺失可填充“未知”或按规则推算。
- 重复记录去重:基于 PO 编号+供应商编码+物料编码组合去重;保留创建日期最新的记录,其余标记为历史版本。
- 逻辑校验:发票金额不应超过 PO 订单金额的 120%(含税);合同结束日期必须晚于开始日期;订单数量与收货数量逻辑一致。
- 异常值识别:单价低于 0 或高于历史均价 5 倍的数据需人工复核;数量为负数的订单需确认是否为退货单。
- 关联一致性:发票中的 PO 编号必须在 PO 表中存在;合同中的供应商编码必须在供应商主数据中存在。
常见陷阱: 不要直接删除异常数据。建议建立“异常数据暂存表”,将清洗过程中识别出的所有问题记录保留,供后续审计和追溯使用。删除数据前必须获得业务部门书面确认。
3.3 数据清洗流程架构
下图展示了从原始数据输入到清洗后标准数据集的完整流程,包含四个清洗阶段和两个质量门禁。
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%。
只有当四个指标全部达标时,清洗后的数据才能进入供应商整合排查环节。任何一项不达标,都需要返回清洗流程的对应阶段进行修复。