3. 数据采集与清洗

价格偏差预防的起点是高质量的数据。采购计划动态优化依赖历史采购数据的完整性与准确性。本节聚焦数据采集范围、价格标准化方法、异常值检测与处理策略,以及数据质量评估框架,确保后续建模与优化建立在可靠的数据基础之上。

3.1 采购历史数据源与采集范围

采购数据源通常分散在 ERP、SRM、WMS 及外部价格指数平台中。数据采集需覆盖以下核心维度:

数据类别 典型字段 来源系统 采集频率
采购订单 订单号、物料编码、供应商、下单日期、数量、含税单价、付款条件 ERP / SRM 每日增量
收货与质检 收货单号、实收数量、合格数量、不合格原因、入库日期 WMS / QMS 实时/每日
供应商报价 报价单号、物料编码、供应商、报价日期、有效期、报价单价 SRM / 邮件 按需/每周
市场价格指数 物料品类、价格指数、发布日期、来源(如 LME、ICIS) 外部 API / 爬虫 每日/每周
合同与框架协议 合同编号、物料清单、协议单价、价格调整公式、有效期 合同管理系统 变更时采集
实践建议:优先采集最近 24~36 个月的完整采购订单与收货数据。对于价格波动剧烈的品类(如有色金属、化工原料),建议同步接入外部价格指数 API,作为价格偏差的外部参照基准。

3.2 价格数据标准化

原始价格数据存在单位不统一、币种混杂、含税/不含税口径差异等问题。标准化是数据清洗的核心环节,需执行以下步骤:

  1. 单位统一:将所有价格转换为标准计量单位(如元/千克、元/个)。对于按“吨”计价但采购单位为“千克”的数据,需做换算。
  2. 币种转换:统一转换为人民币(CNY),使用订单日期的央行中间汇率进行换算。
  3. 含税/不含税归一:统一转换为不含税价格。若原始数据为含税价,按适用税率(如 13%)做价税分离。
  4. 价格类型对齐:区分“订单价”、“收货价”、“结算价”,优先使用结算价作为实际采购成本。
  5. 时间戳标准化:统一为 YYYY-MM-DD 格式,并标注价格对应的业务日期(订单日期 vs 收货日期)。
# 价格标准化示例(Python 伪代码)
def standardize_price(row):
    # 1. 单位换算:若采购单位是"吨",转换为"千克"
    if row['unit'] == '吨':
        row['price_per_kg'] = row['price'] / 1000
    else:
        row['price_per_kg'] = row['price']

    # 2. 币种转换:非 CNY 按当日汇率换算
    if row['currency'] != 'CNY':
        rate = get_exchange_rate(row['currency'], 'CNY', row['date'])
        row['price_cny'] = row['price_per_kg'] * rate
    else:
        row['price_cny'] = row['price_per_kg']

    # 3. 含税转不含税
    if row['tax_flag'] == '含税':
        row['price_ex_tax'] = row['price_cny'] / (1 + row['tax_rate'])
    else:
        row['price_ex_tax'] = row['price_cny']

    return row['price_ex_tax']
关键指标:标准化完成后,应检查“同一物料同一供应商同一日期”的价格标准差。若标准差超过 5%,说明标准化过程可能存在遗漏或数据源冲突,需回溯排查。

3.3 异常值检测与处理

异常值会严重扭曲价格基线,导致偏差预警失效。常用的检测方法包括统计法、四分位距法(IQR)和基于业务规则的检测。

3.3.1 异常值检测方法对比

检测方法 适用场景 阈值设定 优点 局限
Z-Score 法 数据近似正态分布 |Z| > 3 计算简单,可解释性强 对非正态分布敏感
IQR 法 偏态分布,含极端值 Q1 - 1.5×IQR 或 Q3 + 1.5×IQR 不受极端值影响 对样本量要求较高
MAD 法 含较多离群点 MAD > 3(稳健 Z-Score) 对异常值鲁棒 计算稍复杂
业务规则法 已知价格上限/下限 超出合同价 ±20% 贴合业务实际 规则需人工维护

3.3.2 异常值处理策略

  • 删除:对于明显录入错误(如价格多一位小数、数量为负),直接删除该记录。
  • 修正:若能通过关联单据(如合同价、历史均价)确认正确值,则进行修正。
  • 标记:对于无法确认但疑似异常的数据,保留并添加异常标记,供后续建模时加权或排除。
  • 插值:对于时间序列中的孤立异常点,可使用前后相邻值的均值或中位数替换。
注意:不要机械地删除所有异常值。某些异常值可能反映真实的市场波动(如原材料价格暴涨),删除后会掩盖价格偏差的真实信号。建议先标记,再结合业务判断处理。
异常值检测与处理流程 原始价格数据 统计检测 业务规则检测 异常标记 可确认? 修正/删除 保留并标记 清洗后价格数据集

3.4 数据质量评估

数据清洗完成后,需从四个维度评估数据质量,确保可用于价格偏差建模:

质量维度 评估指标 可接受阈值 评估方法
完整性 缺失率(关键字段) < 5% 逐字段统计空值占比
准确性 价格与合同价偏差率 ±10% 以内 抽样比对原始单据
一致性 同一物料多源价格差异 差异 < 3% 交叉验证 ERP 与 SRM 数据
时效性 数据延迟天数 < 2 个工作日 记录采集时间与业务时间差
质量评估报告示例:某制造企业完成数据清洗后,完整性从 82% 提升至 96%,准确性从 78% 提升至 93%,一致性从 65% 提升至 89%。其中,供应商报价数据缺失率最高(12%),通过补充历史邮件报价和合同扫描件后降至 4%。
数据质量评估雷达图(示例) 完整性 准确性 一致性 时效性 完整性 清洗前 清洗后 (数值越高表示质量越好)

3.5 数据清洗工作流总结

将上述步骤整合为可重复执行的清洗流水线,建议按以下顺序编排:

  1. 数据接入:从各源系统抽取原始数据,统一存储到数据湖或数据仓库。
  2. 字段映射:将不同系统的字段名映射到统一数据模型。
  3. 价格标准化:执行单位、币种、含税状态、时间戳的转换。
  4. 异常值检测:依次使用 IQR 法和业务规则法进行检测,生成异常标记。
  5. 异常处理:根据业务确认结果,执行删除、修正或保留标记。
  6. 质量评估:计算完整性、准确性、一致性、时效性指标,生成质量报告。
  7. 数据发布:将清洗后的数据集写入分析库,供价格基线计算和偏差预警使用。
自动化建议:将上述工作流封装为 Python 或 SQL 脚本,配置为每日定时任务。每次运行后自动输出数据质量看板,当完整性或准确性低于阈值时触发告警,通知数据管理员介入。