3、数据准备阶段:历史需求数据采集规范与清洗规则
安全库存参数配置的准确性,高度依赖历史需求数据的质量。本阶段的核心任务是将分散在ERP、WMS、POS等异构系统中的原始业务数据,按照统一规范进行采集、清洗与标准化,形成可供统计模型直接使用的“干净需求序列”。
3.1 数据采集范围与字段规范
历史需求数据并非简单的“出库数量”,而是指在特定时间粒度下,客户或下游环节对物料的实际消耗或独立需求。采集时需明确以下核心字段与约束:
| 字段名称 | 数据类型 | 采集规范说明 | 示例值 |
|---|---|---|---|
| 物料编码 | VARCHAR(50) | 必须与ERP主数据一致,区分SKU变体(包装、版本) | SKU-10086-A |
| 需求日期 | DATE | 精确到自然日,禁止使用财务期间或周别替代 | 2025-03-15 |
| 需求数量 | DECIMAL(18,3) | 以标准库存单位(EA/KG/L)记录,不含负值 | 1250.000 |
| 需求类型 | VARCHAR(20) | 区分“客户订单”、“预测消耗”、“调拨出库” | 客户订单 |
| 渠道/客户编码 | VARCHAR(30) | 用于后续按渠道分层计算安全库存 | CHN-华东-01 |
| 数据来源系统 | VARCHAR(10) | 标记ERP、WMS、POS等,用于溯源与对账 | ERP-SAP |
采集周期建议: 对于常规快消品,至少采集过去24个月的日级需求数据;对于长周期或项目型物料,建议覆盖36个月或覆盖至少3个完整生命周期。
3.2 数据清洗规则与异常处理
原始数据中普遍存在缺失、重复、异常峰值、负值等问题。以下清洗规则按优先级顺序执行,确保进入模型的数据序列平稳且可解释。
- 去重与合并: 按“物料编码+需求日期+需求类型”去重,保留最新系统时间戳的记录;若同一日存在多个同类型需求,合并为单条记录。
- 负值过滤: 剔除需求数量小于0的记录(退货、冲销等业务应单独归入“退货流”,不参与安全库存计算)。
- 缺失值填充: 对于无需求的自然日,填充为0;对于连续缺失超过7天的物料,标记为“间歇性需求”,单独建模。
- 异常峰值识别: 使用3σ原则或IQR(四分位距)法识别离群点。超出均值±3σ的需求点,需人工核实是否为促销、新品上市或数据录入错误。
- 时间序列对齐: 将日级数据按业务日历聚合为周级或月级序列,确保所有物料的时间跨度一致。
关键原则: 清洗过程必须保留原始数据快照与清洗日志。任何对异常值的剔除或修正,都应在数据集中增加“清洗标记”字段,便于后续审计与模型调优时追溯。
3.3 数据清洗流程架构
下图展示了从原始数据采集到标准化需求序列的完整清洗链路,各节点之间通过ETL调度任务串联,确保数据处理的自动化与可重复性。
3.4 数据质量校验清单
清洗完成后,必须通过以下校验项方可进入安全库存计算阶段。建议将校验规则固化到自动化脚本中,每次数据刷新后自动输出校验报告。
| 校验项 | 通过标准 | 校验方法 |
|---|---|---|
| 完整性 | 每个物料在时间跨度内无连续7天以上缺失 | SQL窗口函数统计缺失天数 |
| 一致性 | 物料编码与主数据表100%匹配 | LEFT JOIN 主数据表检查空值 |
| 准确性 | 异常峰值占比不超过总记录数的1% | 3σ或IQR方法统计离群点比例 |
| 时效性 | 最新数据日期与系统日期相差不超过2个工作日 | MAX(需求日期) 与当前日期对比 |
| 可追溯性 | 每条记录均保留原始系统来源与清洗标记 | 检查清洗标记字段是否为空 |
常见陷阱: 不要直接使用ERP中的“发货单”数据作为需求序列。发货数据可能包含补发、换货等非独立需求,且时间戳为发货操作时间而非客户实际需求时间。优先使用“客户订单创建日期”或“预测消耗日期”作为需求时间基准。
3.5 数据标准化输出格式
清洗后的数据应输出为以下标准格式,供后续安全库存模型直接读取。建议以CSV或Parquet格式存储,并建立数据版本管理机制。
-- 标准化需求序列表结构示例(DDL)
CREATE TABLE clean_demand_series (
material_code VARCHAR(50) NOT NULL,
demand_date DATE NOT NULL,
demand_qty DECIMAL(18,3) NOT NULL,
demand_type VARCHAR(20) NOT NULL,
channel_code VARCHAR(30),
source_system VARCHAR(10),
clean_flag VARCHAR(10) DEFAULT 'CLEAN',
original_qty DECIMAL(18,3),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (material_code, demand_date, demand_type)
);
-- 数据示例(前5行)
-- material_code | demand_date | demand_qty | demand_type | channel_code | clean_flag
-- SKU-10086-A | 2025-01-01 | 1250.000 | 客户订单 | CHN-华东-01 | CLEAN
-- SKU-10086-A | 2025-01-02 | 980.000 | 客户订单 | CHN-华东-01 | CLEAN
-- SKU-10086-A | 2025-01-03 | 0.000 | 客户订单 | CHN-华东-01 | CLEAN
-- SKU-10086-A | 2025-01-04 | 2100.000 | 客户订单 | CHN-华东-01 | PEAK_CHECK
-- SKU-10086-A | 2025-01-05 | 1100.000 | 客户订单 | CHN-华东-01 | CLEAN
完成上述数据准备后,即可进入下一阶段:需求模式识别与统计分布拟合,为安全库存参数计算提供数学基础。