3. 需求不确定性建模

需求不确定性是驱动安全库存与补货计划的核心变量。若将需求视为确定值,安全库存将失去意义;若错误假设需求分布形态,补货计划将产生系统性偏差。本章聚焦于如何从历史数据中识别需求分布特征,并量化波动性,为后续联合优化奠定统计基础。

3.1 需求分布拟合:从数据到分布

分布拟合的目标是找到最能描述历史需求模式的概率分布函数。常见步骤包括:

  1. 数据清洗:剔除促销、缺货、异常订单等非稳态数据点。
  2. 描述性统计:计算均值、方差、偏度、峰度,初步判断分布对称性与尾部厚度。
  3. 候选分布选择:根据业务场景选择候选分布(正态、泊松、负二项、伽马等)。
  4. 参数估计:使用最大似然估计(MLE)或矩估计法计算分布参数。
  5. 拟合优度检验:通过 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 值下需求分布形态的对比:

不同变异系数(CV)下的需求分布形态对比 低波动 CV=0.3 均值 μ=100 标准差 σ=30 分布集中 安全库存需求低 中等波动 CV=0.7 均值 μ=100 标准差 σ=70 分布较分散 需动态策略 高波动 CV=1.5 均值 μ=100 标准差 σ=150 分布极度分散 需高安全库存 CV 的业务解读 CV < 0.5:需求稳定,可降低安全库存,采用固定补货周期 CV > 1.0:需求高度不确定,需结合预测模型与动态安全库存

3.4 分布选择决策流程

在实际项目中,分布选择应遵循以下决策流程:

  1. 计算需求均值 μ 与 CV:若 μ < 10 且 CV ≈ 1,优先测试泊松分布。
  2. 检查过离散(Overdispersion):若方差显著大于均值(方差/均值 > 1.2),泊松分布不适用,改用负二项分布。
  3. 检查零膨胀(Zero Inflation):若零需求比例异常高(如 > 40%),考虑零膨胀泊松(ZIP)或零膨胀负二项(ZINB)模型。
  4. 高需求场景:若 μ > 50 且 CV < 0.8,正态分布通常足够稳健。
  5. 验证与调整:使用历史数据回测,比较不同分布假设下的服务水平达成率。
实践建议: 在供应链计划系统中,不要为每个 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)是衡量需求波动性的核心指标,直接驱动安全库存水平。
  • 分布选择应遵循结构化决策流程,避免“一刀切”使用正态分布。
  • 代码实现可自动化拟合流程,但最终决策需人工审核。