第三章 需求预测基础:定性预测法、定量预测法、预测误差评估
各位好,我是老张。在供应链这行摸爬滚打了十几年,今天咱们聊聊需求预测。
说实话,我刚入行那会儿,觉得预测就是拍脑袋。后来吃过几次大亏——库存积压到爆仓,或者断货被销售追着骂——才明白这玩意儿是门硬功夫。
需求预测,说白了就是猜未来要卖多少。但怎么猜得准?咱们得讲方法。
3.1 定性预测法:靠人脑和经验
定性预测,就是没有历史数据,或者数据不可靠的时候,靠人的判断来估。我见过很多初创公司,新产品刚上市,只能用这招。
3.1.1 德尔菲法
找一群专家,背对背填问卷。一轮一轮地反馈,直到意见收敛。我个人习惯用三轮,再多就疲劳了。
3.1.2 市场调研法
直接问客户、问销售、问渠道。听起来简单,但坑很多。
- 客户说的不一定准——他们往往高估需求。
- 销售容易报低——怕完不成指标。
- 渠道会囤货——造成虚假繁荣。
我曾经遇到一个案例:销售说下个月能卖5000台,结果只卖了800台。为什么?因为客户只是随口一说,根本没下单。
3.1.3 历史类比法
拿类似产品的历史数据来套。比如新款手机上市,可以参考上一代的销售曲线。
嗯,这里要注意:类比的前提是场景相似。市场环境变了,类比就失效了。
3.2 定量预测法:用数据说话
有历史数据,咱们就用数学模型。定量预测分两类:时间序列法和因果分析法。
3.2.1 时间序列法
只看历史数据的变化规律,不考虑外部因素。
简单移动平均法
取最近N期的平均值。比如过去3个月的销量分别是100、120、110,那下个月预测就是(100+120+110)/3=110。
# Python示例:简单移动平均
def simple_moving_average(data, window=3):
return sum(data[-window:]) / window
sales = [100, 120, 110]
prediction = simple_moving_average(sales, 3)
print(f"下月预测: {prediction}") # 输出: 110.0
加权移动平均法
给不同时期的数据分配权重。越近的数据权重越大。
# 加权移动平均
weights = [0.2, 0.3, 0.5] # 权重之和为1
weighted_avg = sum(s * w for s, w in zip(sales, weights))
print(f"加权预测: {weighted_avg}") # 输出: 111.0
指数平滑法
给历史数据一个衰减系数α(0<α<1)。α越大,越看重近期数据。
# 一次指数平滑
def exponential_smoothing(data, alpha=0.3):
result = [data[0]]
for i in range(1, len(data)):
result.append(alpha * data[i] + (1-alpha) * result[-1])
return result[-1]
prediction = exponential_smoothing(sales, alpha=0.3)
print(f"指数平滑预测: {prediction}")
3.2.2 因果分析法
考虑外部因素。比如销量和广告投入、季节、天气有关。
线性回归
假设销量Y和某个因素X呈线性关系:Y = aX + b
# 简单线性回归示例
import numpy as np
# 广告投入 vs 销量
ad_spend = [10, 20, 30, 40, 50]
sales = [100, 150, 200, 250, 300]
# 计算回归系数
slope, intercept = np.polyfit(ad_spend, sales, 1)
print(f"Y = {slope:.2f}X + {intercept:.2f}")
# 如果下月广告投入60万,预测销量:
prediction = slope * 60 + intercept
print(f"预测销量: {prediction:.0f}")
3.3 预测误差评估
预测完了,得知道准不准。误差评估是闭环管理的关键。
3.3.1 常用误差指标
| 指标 | 公式 | 说明 |
|---|---|---|
| MAE | 平均绝对误差 | 所有误差绝对值的平均值。直观,但受量纲影响。 |
| MSE | 均方误差 | 误差平方的平均值。放大较大误差,适合惩罚极端偏差。 |
| RMSE | 均方根误差 | MSE开方,与原始数据同量纲。我最常用的指标。 |
| MAPE | 平均绝对百分比误差 | 百分比形式,适合跨品类比较。注意:实际值为0时会失效。 |
# 误差计算示例
actual = [100, 120, 110, 130]
predicted = [105, 115, 108, 125]
# MAE
mae = sum(abs(a-p) for a,p in zip(actual, predicted)) / len(actual)
# RMSE
mse = sum((a-p)**2 for a,p in zip(actual, predicted)) / len(actual)
rmse = mse ** 0.5
# MAPE
mape = sum(abs((a-p)/a) for a,p in zip(actual, predicted)) / len(actual) * 100
print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAPE: {mape:.2f}%")
3.3.2 误差分析的意义
光算误差不够,得分析原因。我一般分三步:
- 看趋势——误差是系统性偏高还是偏低?如果是,说明模型有偏。
- 找异常——有没有个别点误差特别大?可能是促销、缺货等事件。
- 调参数——根据误差反馈调整模型参数(比如α、窗口大小)。
3.4 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你想想看,预测不是孤立的事,它是个闭环:从方法选择,到模型计算,再到误差反馈。
你看,从方法选择到误差评估,是个循环。我见过太多团队只做预测不评估,结果越偏越远。
好了,这一章就到这儿。记住:预测永远有误差,关键是把误差控制在可接受范围内。下回咱们聊库存策略,到时候见。