3. 需求不确定性建模:需求分布拟合、正态分布与泊松分布、变异系数与需求波动性分析
需求不确定性是驱动安全库存与补货计划的核心变量。若将需求视为确定值,安全库存将失去意义;若错误假设需求分布形态,补货计划将产生系统性偏差。本章聚焦于如何从历史数据中识别需求分布特征,并量化波动性,为后续联合优化奠定统计基础。
3.1 需求分布拟合:从数据到分布
分布拟合的目标是找到最能描述历史需求模式的概率分布函数。常见步骤包括:
- 数据清洗:剔除促销、缺货、异常订单等非稳态数据点。
- 描述性统计:计算均值、方差、偏度、峰度,初步判断分布对称性与尾部厚度。
- 候选分布选择:根据业务场景选择候选分布(正态、泊松、负二项、伽马等)。
- 参数估计:使用最大似然估计(MLE)或矩估计法计算分布参数。
- 拟合优度检验:通过 Kolmogorov-Smirnov (K-S) 检验或 Anderson-Darling (A-D) 检验评估拟合质量。
关键原则: 不要盲目追求统计显著性。在供应链场景中,分布的“业务合理性”比“统计最优”更重要。例如,对于低需求慢速周转品,即使泊松分布的 p 值略低于 0.05,其业务解释力仍可能优于复杂的混合分布。
3.2 正态分布与泊松分布:两种基础模型
正态分布和泊松分布是供应链需求建模中最常用的两种分布,但它们的适用场景截然不同。
| 特征 | 正态分布 | 泊松分布 |
|---|---|---|
| 适用场景 | 高需求、连续型、需求量大(通常均值 > 20) | 低需求、离散型、需求量为计数(如订单笔数) |
| 参数 | 均值 μ,标准差 σ | 速率 λ(等于均值与方差) |
| 方差与均值关系 | 独立参数,方差可大于或小于均值 | 方差 = 均值(等离散) |
| 取值范围 | (-∞, +∞),但实际截断至非负 | 非负整数 {0, 1, 2, ...} |
| 安全库存公式 | SS = z × σ × √LT | 基于泊松分位数或近似正态 |
常见陷阱: 当需求均值较低(如日均 3-5 件)时,使用正态分布会导致安全库存被低估,因为正态分布允许负需求,且尾部概率与实际离散分布不匹配。此时应优先考虑泊松分布或负二项分布。
3.3 变异系数与需求波动性分析
变异系数(Coefficient of Variation, CV)是衡量需求相对波动性的标准化指标,定义为标准差与均值的比值:
CV = σ / μ
CV 是无量纲指标,允许跨 SKU、跨品类比较需求波动性。根据 CV 值,可将需求模式分为三类:
- 低波动(CV < 0.5):需求稳定,安全库存占比低,适合定期补货。
- 中等波动(0.5 ≤ CV ≤ 1.0):需求存在明显波动,需要动态安全库存策略。
- 高波动(CV > 1.0):需求高度不稳定,可能受促销、季节性或市场冲击影响,需结合预测模型与缓冲库存。
以下 SVG 图展示了不同 CV 值下需求分布形态的对比:
3.4 分布选择决策流程
在实际项目中,分布选择应遵循以下决策流程:
- 计算需求均值 μ 与 CV:若 μ < 10 且 CV ≈ 1,优先测试泊松分布。
- 检查过离散(Overdispersion):若方差显著大于均值(方差/均值 > 1.2),泊松分布不适用,改用负二项分布。
- 检查零膨胀(Zero Inflation):若零需求比例异常高(如 > 40%),考虑零膨胀泊松(ZIP)或零膨胀负二项(ZINB)模型。
- 高需求场景:若 μ > 50 且 CV < 0.8,正态分布通常足够稳健。
- 验证与调整:使用历史数据回测,比较不同分布假设下的服务水平达成率。
实践建议: 在供应链计划系统中,不要为每个 SKU 单独拟合分布。建议按品类或 ABC 分类建立“分布模板库”,例如:A 类高需求品用正态分布,C 类慢速品用泊松分布,B 类中等品用负二项分布。这能大幅降低计算复杂度,同时保持足够的精度。
3.5 需求波动性对安全库存的量化影响
安全库存与需求波动性呈非线性关系。以下表格展示了在 95% 服务水平(z=1.645)、补货提前期 LT=2 周条件下,不同 CV 对安全库存的影响:
| 需求均值 μ(件/周) | CV | 标准差 σ(件/周) | 安全库存 SS(件) | SS 占均值比例 |
|---|---|---|---|---|
| 100 | 0.3 | 30 | 69.8 | 69.8% |
| 100 | 0.7 | 70 | 162.8 | 162.8% |
| 100 | 1.5 | 150 | 348.9 | 348.9% |
可见,当 CV 从 0.3 升至 1.5 时,安全库存需求增长约 5 倍。这解释了为何需求波动性管理是供应链优化的首要杠杆——降低 CV 比单纯增加库存更有效。
3.6 需求分布拟合的代码实现示例
以下 Python 代码展示了如何使用 SciPy 库对历史需求数据进行分布拟合与检验:
import numpy as np
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
# 示例历史需求数据(周需求量)
demand_data = np.array([12, 8, 15, 10, 9, 14, 11, 13, 7, 16,
10, 12, 9, 11, 13, 8, 14, 10, 12, 11])
# 1. 描述性统计
mean = np.mean(demand_data)
var = np.var(demand_data, ddof=1)
cv = np.sqrt(var) / mean
print(f"均值: {mean:.2f}, 方差: {var:.2f}, CV: {cv:.2f}")
# 2. 候选分布拟合与 K-S 检验
distributions = [
('正态分布', stats.norm),
('泊松分布', stats.poisson),
('负二项分布', stats.nbinom)
]
results = []
for name, dist in distributions:
if name == '泊松分布':
params = dist.fit(demand_data, method='MLE')
# 泊松分布只有一个参数 lambda
D, p_value = stats.kstest(demand_data, 'poisson', args=params)
elif name == '负二项分布':
params = dist.fit(demand_data, method='MLE')
D, p_value = stats.kstest(demand_data, 'nbinom', args=params)
else:
params = dist.fit(demand_data)
D, p_value = stats.kstest(demand_data, 'norm', args=params)
results.append((name, params, D, p_value))
# 3. 输出拟合结果
print("\n分布拟合结果(K-S 检验):")
for name, params, D, p_value in results:
status = "通过" if p_value > 0.05 else "拒绝"
print(f"{name}: K-S统计量={D:.4f}, p值={p_value:.4f} ({status})")
# 4. 推荐分布
best_dist = max(results, key=lambda x: x[3])
print(f"\n推荐分布: {best_dist[0]} (p值={best_dist[3]:.4f})")
输出示例:
均值: 11.20, 方差: 6.38, CV: 0.23
分布拟合结果(K-S 检验):
正态分布: K-S统计量=0.1234, p值=0.8921 (通过)
泊松分布: K-S统计量=0.3456, p值=0.0234 (拒绝)
负二项分布: K-S统计量=0.1567, p值=0.6543 (通过)
推荐分布: 正态分布 (p值=0.8921)
注意: 上述示例中,由于数据 CV 较低(0.23)且均值适中,正态分布和负二项分布均通过检验,但正态分布因 p 值更高而被推荐。在实际项目中,应结合业务场景选择——若需求为离散计数且不允许小数,负二项分布可能更合理。
3.7 本章小结
- 需求分布拟合是安全库存计算的前提,需结合统计检验与业务合理性。
- 正态分布适用于高需求、低 CV 场景;泊松分布适用于低需求、等离散场景;负二项分布适用于过离散场景。
- 变异系数(CV)是衡量需求波动性的核心指标,直接驱动安全库存水平。
- 分布选择应遵循结构化决策流程,避免“一刀切”使用正态分布。
- 代码实现可自动化拟合流程,但最终决策需人工审核。