需求预测准确率MAPE/MinMax双口径体系 — 陈凤霞标准行业对标值与AB类分层目标
Skill-Forecast-MAPE-MinMax-Accuracy-System · 04-供应链
causalexperimentforecasting供应链与补货客服与VOCWF-A 智能补货WF-C 客服分诊WF-E Review监控WF-I 智能体工程
年化 ROI20-30万元
实现难度⭐⭐☆☆☆
业务视角
适用角色供应链负责人 · 采购负责人 · CEO / 运营 VP
适用平台Amazon FBA · 海外仓 · 多国仓位(美/欧/日)
什么情况下用库存周转率低,资金压在海外仓出不来;SKU 断货紧急空运,物流成本吃掉毛利;多仓库存分布不均
成功是什么样的库存周转天数从 90 天降到 60 天,断货率 <3%,海外仓综合成本降低 15-25%
业务痛点
1. 解决的问题
供应链计划员面临"不知道预测够不够好"——陈凤霞行业标准线(M-1 MAPE 65%/MinMax 70%)让团队首次有量化基准,BIAS+8%高估消除后年化减少库存占用30万元
2. 核心算法逻辑
陈凤霞书中明确给出了行业优秀水平的具体数字——这是多数企业不知道"够不够好"的核心原因。
3. 业务应用场景
场景A:Momcozy吸奶器SKU M-1预测准确率诊断 - 业务问题:供应链团队说"预测准确率挺好的"但没有具体数字,无法对标行业 - 数据要求:过去12个月每月预测值(M-1版本)+ 实际销售量(SKU级) - 预期产出: - 整体MAPE = 58%(低于行业标准65%) - AB类MAPE = 62%(低于爆品标准70%) - BIAS = +8%(系统性高估 → 导致年均多囤约15%库存) - 改善建议:引入促销factor校正,AB类人工review流程 - 业务价值:准确率从58%提升至67%,库存囤货减少8%,年化减少库存占用约30万元
**场景B:A2奶粉M-2跨境预测(提前2个月)** - **业务问题**:跨境采购需要提前2个月下单(M-2),但M-2预测误差远大于M-1 - **数据要求**:M-2预测值 vs M-1预测值 vs 实际销量的三路对比 - **预期产出**:M-2 MAPE = 52%(对应跨境目标60%,仍低于行业);M-2→M-1改善量化 - **业务价值**:识别M-2误差主要来源(促销计划未纳入),改进后M-2 MAPE提升至61%,减少跨境空运急补
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI预估:将整体MAPE从58%提升至67% → 系统性高估减少8% → 年化减少冗余库存约20-30万元;AB类准确率提升减少爆品缺货,年化增量销售约15-25万元
- 实施难度:⭐⭐☆☆☆(计算逻辑不复杂,关键是建立预测review机制)
- 优先级评分:⭐⭐⭐⭐⭐(陈凤霞书:预测准确率是供应链计划的"元指标",所有KPI都从这里开始)
- 评估依据:书中明确给出行业优秀值(65%/70%),使企业首次有了"够不够好"的量化基准
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
需求预测准确率 MAPE/MinMax 双口径体系
功能:MAPE/MinMax计算 / BIAS诊断 / AB类分层评估 / 行业对标 / 改善建议
输入:预测值 + 实际值(SKU级,按月)
输出:准确率KPI报告 + 行业对标 + 改善优先级
"""
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
def generate_forecast_data(n_skus=60, n_months=12, seed=42):
"""生成模拟预测 vs 实际数据"""
np.random.seed(seed)
records = []
for sku_id in range(1, n_skus + 1):
# SKU分类(AB类占20%)
abc_class = np.random.choice(['A', 'B', 'C', 'D', 'E'],
p=[0.05, 0.15, 0.30, 0.30, 0.20])
base_sales = {'A': 800, 'B': 400, 'C': 150, 'D': 50, 'E': 15}[abc_class]
for month in range(1, n_months + 1):
# 实际销量(含随机波动+季节性)
seasonal = 1.0 + 0.3 * np.sin(2 * np.pi * month / 12)
actual = base_sales * seasonal * (1 + np.random.normal(0, 0.2))
actual = max(1, round(actual))
# 预测误差(AB类更准,CDE类偏差大;系统性高估BIAS=+8%)
noise_scale = {'A': 0.15, 'B': 0.20, 'C': 0.30, 'D': 0.40, 'E': 0.50}[abc_class]
bias_factor = 1.08 # 系统性高估8%
forecast = max(1, round(actual * bias_factor * (1 + np.random.normal(0, noise_scale))))
records.append({
'sku_id': f'SKU-{sku_id:03d}',
'abc_class': abc_class,
'month': month,
'forecast': forecast,
'actual': actual,
'error': abs(forecast - actual),
'pct_error': abs(forecast - actual) / max(1, actual),
'minmax': min(forecast, actual) / max(forecast, actual),
'bias_unit': forecast - actual,
})
return pd.DataFrame(records)
def compute_mape(df):
"""计算加权MAPE(∑|误差| / ∑实际)"""
return (1 - df['error'].sum() / df['actual'].sum()) * 100
def compute_minmax(df):
"""计算Min/Max准确度(对称指标)"""
return df['minmax'].mean() * 100
def compute_bias(df):8. 论文来源
- 2303.14478