3. 数据采集与清洗
价格偏差预防的起点是高质量的数据。采购计划动态优化依赖历史采购数据的完整性与准确性。本节聚焦数据采集范围、价格标准化方法、异常值检测与处理策略,以及数据质量评估框架,确保后续建模与优化建立在可靠的数据基础之上。
3.1 采购历史数据源与采集范围
采购数据源通常分散在 ERP、SRM、WMS 及外部价格指数平台中。数据采集需覆盖以下核心维度:
| 数据类别 | 典型字段 | 来源系统 | 采集频率 |
|---|---|---|---|
| 采购订单 | 订单号、物料编码、供应商、下单日期、数量、含税单价、付款条件 | ERP / SRM | 每日增量 |
| 收货与质检 | 收货单号、实收数量、合格数量、不合格原因、入库日期 | WMS / QMS | 实时/每日 |
| 供应商报价 | 报价单号、物料编码、供应商、报价日期、有效期、报价单价 | SRM / 邮件 | 按需/每周 |
| 市场价格指数 | 物料品类、价格指数、发布日期、来源(如 LME、ICIS) | 外部 API / 爬虫 | 每日/每周 |
| 合同与框架协议 | 合同编号、物料清单、协议单价、价格调整公式、有效期 | 合同管理系统 | 变更时采集 |
实践建议:优先采集最近 24~36 个月的完整采购订单与收货数据。对于价格波动剧烈的品类(如有色金属、化工原料),建议同步接入外部价格指数 API,作为价格偏差的外部参照基准。
3.2 价格数据标准化
原始价格数据存在单位不统一、币种混杂、含税/不含税口径差异等问题。标准化是数据清洗的核心环节,需执行以下步骤:
- 单位统一:将所有价格转换为标准计量单位(如元/千克、元/个)。对于按“吨”计价但采购单位为“千克”的数据,需做换算。
- 币种转换:统一转换为人民币(CNY),使用订单日期的央行中间汇率进行换算。
- 含税/不含税归一:统一转换为不含税价格。若原始数据为含税价,按适用税率(如 13%)做价税分离。
- 价格类型对齐:区分“订单价”、“收货价”、“结算价”,优先使用结算价作为实际采购成本。
- 时间戳标准化:统一为 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 数据清洗工作流总结
将上述步骤整合为可重复执行的清洗流水线,建议按以下顺序编排:
- 数据接入:从各源系统抽取原始数据,统一存储到数据湖或数据仓库。
- 字段映射:将不同系统的字段名映射到统一数据模型。
- 价格标准化:执行单位、币种、含税状态、时间戳的转换。
- 异常值检测:依次使用 IQR 法和业务规则法进行检测,生成异常标记。
- 异常处理:根据业务确认结果,执行删除、修正或保留标记。
- 质量评估:计算完整性、准确性、一致性、时效性指标,生成质量报告。
- 数据发布:将清洗后的数据集写入分析库,供价格基线计算和偏差预警使用。
自动化建议:将上述工作流封装为 Python 或 SQL 脚本,配置为每日定时任务。每次运行后自动输出数据质量看板,当完整性或准确性低于阈值时触发告警,通知数据管理员介入。