4. 数据收集与准备:需求预测所需的数据源与数据治理
需求预测的起点并非算法,而是数据。任何预测模型的精度上限,都受限于输入数据的质量与完整性。在实际项目中,我们常看到企业花费大量精力调优模型参数,却忽视了数据源头存在的系统性偏差——例如销售历史中混入退货记录、促销期间数据未做标记、或外部因素数据粒度与内部数据不一致。本章将系统梳理需求预测所需的数据源分类、数据清洗的核心流程、缺失值处理策略以及异常值检测方法,帮助学员建立一套可落地的数据准备框架。
4.1 需求预测的数据源体系
需求预测的数据源可划分为三大类:内部业务数据、市场运营数据和外部环境数据。每一类数据在预测模型中扮演不同角色,且需要不同的采集频率与治理策略。
4.1.1 销售历史数据(核心输入)
销售历史是需求预测的基石,但“销售”在不同企业中有不同口径。常见的数据来源包括:
- POS(销售点)数据:最接近真实消费者需求的记录,但可能受缺货、退货影响。
- 订单数据:包含客户下单时间、数量、金额,但可能包含未发货或取消订单。
- 发货/出库数据:反映实际物流出库量,适合供应链端预测,但滞后于真实需求。
- 发票数据:财务口径,通常按月度汇总,粒度较粗。
在数据准备阶段,必须明确“预测目标的口径”——是预测终端消费者购买量,还是预测经销商订货量?不同口径对应的数据源不同,模型结果的含义也不同。
4.1.2 市场运营数据(解释变量)
市场运营数据用于解释销售波动的原因,主要包括:
| 数据类别 | 典型字段 | 预测中的作用 | 常见粒度 |
|---|---|---|---|
| 促销活动 | 促销类型、折扣率、持续时间 | 识别促销带来的需求增量 | SKU×门店×日 |
| 价格信息 | 零售价、成交价、竞品价 | 价格弹性分析 | SKU×渠道×周 |
| 渠道数据 | 渠道类型、门店等级、陈列位置 | 渠道差异建模 | 渠道×区域 |
| 新品信息 | 上市日期、生命周期阶段 | 新品预测曲线调整 | SKU×月 |
4.1.3 外部环境数据(辅助变量)
外部数据能显著提升中长期预测的准确性,但需注意数据获取成本与时效性:
- 宏观经济指标:GDP增速、CPI、消费者信心指数(月度/季度)。
- 天气数据:温度、降水量、湿度(日粒度),对快消品、服装、能源行业影响显著。
- 节假日与事件:春节、双11、世界杯等,需提前构建事件日历。
- 竞品动态:竞品促销、新品发布(较难获取,可借助爬虫或第三方报告)。
4.2 数据清洗:从原始数据到可用数据
数据清洗的目标是解决脏数据问题,包括重复记录、格式不一致、逻辑冲突等。清洗过程应遵循“先结构、后内容、再业务校验”的顺序。
4.2.1 数据清洗的核心操作
- 去重:同一订单在多个系统中重复记录,需按订单号+SKU+时间戳去重。
- 格式统一:日期格式(YYYY-MM-DD)、数值单位(件/箱/吨)、货币单位(元/美元)统一。
- 逻辑校验:例如“发货日期早于订单日期”“销售数量为负数”等逻辑错误。
- 粒度对齐:将不同来源的数据统一到同一时间粒度(日/周/月)和产品粒度(SKU/品类/品牌)。
4.2.2 数据清洗的实操流程
# 伪代码示例:数据清洗流程
1. 加载原始数据(销售表、促销表、日历表)
2. 检查重复:group by 订单号+SKU+日期,count>1 则标记
3. 格式转换:日期字段统一为 datetime 类型
4. 逻辑校验:过滤 quantity <= 0 的记录(或单独标记)
5. 粒度聚合:按 SKU×日 汇总销售数量
6. 输出清洗后数据集 + 清洗日志(记录删除/修改的条数)
4.3 缺失值处理策略
缺失值是时间序列预测中最常见的问题。处理方式取决于缺失的模式(随机缺失/非随机缺失)和比例。
4.3.1 缺失值分类与影响
| 缺失类型 | 定义 | 示例 | 处理难度 |
|---|---|---|---|
| 完全随机缺失 | 缺失与任何变量无关 | 系统故障导致某天数据丢失 | 低 |
| 随机缺失 | 缺失与其他变量相关 | 高销量SKU更易缺货导致无销售记录 | 中 |
| 非随机缺失 | 缺失与缺失值本身相关 | 低价值产品被业务人员忽略录入 | 高 |
4.3.2 常用缺失值处理方法
- 删除法:当缺失比例<5%且为完全随机缺失时,可直接删除。
- 均值/中位数填充:适用于平稳序列,但会降低数据方差。
- 前向/后向填充:适用于时间序列,用前一个值填充,但会忽略趋势。
- 插值法:线性插值、样条插值,能保留趋势信息。
- 模型预测填充:用其他变量建立回归模型预测缺失值,适合缺失比例较高时。
4.4 异常值检测与处理
异常值(Outlier)是指显著偏离正常分布的数据点。在需求预测中,异常值可能来自真实的业务事件(如爆款、断货、退货潮),也可能是数据录入错误。处理异常值前,必须先判断其业务含义。
4.4.1 异常值检测方法
| 方法 | 原理 | 适用场景 | 局限性 |
|---|---|---|---|
| Z-Score法 | |x-μ|/σ > 3 视为异常 | 近似正态分布的数据 | 对非正态分布不适用 |
| IQR法 | Q1-1.5×IQR 或 Q3+1.5×IQR 之外 | 偏态分布、含极端值 | 对样本量敏感 |
| 业务规则法 | 超过历史最大值/低于最小值 | 有明确业务上限的场景 | 需要业务经验 |
| 时间序列分解 | 残差超过阈值 | 有趋势和季节性的数据 | 计算复杂度高 |
4.4.2 异常值的处理策略
- 保留:如果异常值对应真实的促销活动或突发事件,应保留并标记为“事件日”。
- 修正:如果是录入错误(如数量多了一个0),修正为合理值。
- 剔除:如果异常值无法解释且对模型影响过大,可剔除,但需记录剔除原因。
- Winsorize(缩尾):将极端值替换为分位数(如99%分位),保留信息但降低影响。
4.5 案例拆解:某快消品企业的数据准备实战
以下案例展示了一个完整的数据准备流程,涵盖从原始数据到建模数据集的全部步骤。
4.5.1 背景与初始数据
某饮料企业计划为华东区域500家门店做未来12周的SKU级需求预测。初始数据包括:
- 2023-2024年每日POS销售记录(约180万条)
- 促销日历(含促销类型、折扣率)
- 门店信息表(门店等级、所在城市)
- 天气数据(每日温度、降雨量)
4.5.2 数据问题诊断
初步探查发现以下问题:
| 问题类型 | 具体表现 | 影响程度 |
|---|---|---|
| 重复记录 | 约2.3%的订单在POS和ERP中重复 | 高 |
| 缺失值 | 天气数据缺失12%(传感器故障) | 中 |
| 异常值 | 某SKU单日销量达平时50倍(疑似团购) | 中 |
| 口径不一致 | 部分门店按“箱”上报,部分按“瓶” | 高 |
4.5.3 处理过程与决策
- 去重:以“订单号+SKU+门店+日期”为唯一键,保留POS系统记录,删除ERP重复记录。
- 单位统一:将“箱”转换为“瓶”(1箱=24瓶),并增加“单位换算”标记字段。
- 缺失值处理:天气数据采用“最近7天同城市均值”填充,并生成“是否缺失”标志列供模型参考。
- 异常值处理:将单日销量超过历史均值10倍且无促销标记的记录标记为“团购事件”,单独建模,不进入常规预测训练集。
- 促销数据对齐:将促销日历与销售数据按门店+SKU+日期关联,生成“促销强度”特征(折扣率×时长)。
4.5.4 结果与复盘
清洗后的数据集从180万条降至172万条(去除重复和无效记录),缺失率从12%降至0%,异常值占比从0.8%降至0.1%。后续模型预测准确率(MAPE)比未清洗数据提升约18%。
复盘经验:数据清洗不是一次性工作,而是需要建立持续监控机制。建议每次数据更新后自动运行质量检查脚本,输出数据质量报告,确保模型输入始终处于可控状态。
4.6 本章总结与行动清单
数据准备是需求预测项目中最耗时但最关键的环节。本章的核心要点可归纳为:
- 数据源分类:销售历史(核心)、市场运营(解释)、外部环境(辅助),三者缺一不可。
- 清洗优先级:先解决口径不一致和重复问题,再处理缺失和异常。
- 缺失值处理:区分“零值”与“缺失”,根据缺失模式和比例选择方法。
- 异常值处理:先判断业务含义,再决定保留、修正还是剔除。
- 文档化:所有清洗规则、缺失填充逻辑、异常值处理决策都应记录在数据字典中,确保可追溯。
| 阶段 | 关键输出 | 质量检查项 |
|---|---|---|
| 数据收集 | 原始数据清单 | 覆盖度、时效性、粒度 |
| 数据清洗 | 清洗后数据集 | 重复率<0.5%、格式统一 |
| 缺失处理 | 填充后数据集 | 缺失率<2%、填充方法记录 |
| 异常处理 | 标记后数据集 | 异常值占比<1%、处理原因记录 |
| 特征工程 | 建模数据集 | 特征相关性、数据分布 |
在下一阶段,我们将基于准备好的数据,探讨如何构建时间序列特征和外部变量特征,为预测模型提供高质量的输入。