为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。
(以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。)
练习题
下表是某地区2018-2023年各月份的社会消费品零售总额(单位:亿元)。
(1)绘制观测值图和按年折叠图,观察数据的变化特征和变化模式。
(2)使用Winters指数平滑法预测2024年各月份的社会消费品零售总额,并绘制预测图和预测的残差图,分析预测的效果。
绘图与分析
本期我们完成(2)题。
(1)题中的零售总额的折线图显示,各月份零售总额的走势有明显的季节成分和线性趋势,适合用Winters指数平滑模型进行预测。
Holt指数平滑模型适用于含有趋势成分但不含季节成分的时间序列的预测。如果时间序列中既含有趋势成分又含有季节成分,则可以使用Winters指数平滑模型进行预测。
构建Winters指数平滑模型
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.tsa.holtwinters import SimpleExpSmoothing, ExponentialSmoothing, Holt
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = Falseexercise11_2 = pd.read_csv('exercise11_2.csv')df = pd.melt(exercise11_2, id_vars=['月份'], var_name='年份', value_name='零售总额') # 融合数据
df['日期'] = df['年份'].astype(str) + '-' + df['月份'].astype(str) # 添加带有年份和月份的日期列
df['日期'] = pd.to_datetime(df['日期'].map(lambda x: x.replace("年", "-").replace("月", "-01"))) # 创建时间序列# 拟合Winters模型(model_w),并确定模型参数α,β,γ以及模型系数a,b和s
model_w = ExponentialSmoothing(df['零售总额'], trend = 'add', seasonal = 'add', seasonal_periods = 12,initialization_method = 'estimated',).fit()
绘制Winters模型拟合图
# 绘制Winters模型拟合图
df['零售总额_hw'] = model_w.fittedvalues
plt.figure(figsize = (7, 4.5))
l1, = plt.plot(df['日期'], df['零售总额'], linestyle = '-', marker = 'o', linewidth = 1, markersize = 4)
l2, = plt.plot(df['日期'], df['零售总额_hw'], linestyle = '--', marker = '*', linewidth = 1, markersize = 4)
plt.legend(handles = [l1, l2], labels = ['零售总额', '拟合值'], loc = 'best', prop = {'size':10})
plt.xlabel('时间', size = 12)
plt.ylabel('零售总额', size = 12)
上图展示了Winters指数平滑拟合效果,从拟合值与实际值的接近程度来看,预测模型比较理想。
Winters模型2024年零售总额的预测
# Winters模型2024年零售总额的预测
model_w1 = model_w.forecast(12)
round(model_w1, 4)
以上数据为2024年12个月的零售总额的预测值。
绘制预测图和残差图
# 绘制预测图和残差图
import scipy# 图(a)预测图
plt.subplots(1, 2, figsize = (11, 4))
plt.subplot(121)ax = df['零售总额'].plot(marker = 'o', markersize = 4, linewidth = 1, color = 'black') # 绘制实际值
ax.set_ylabel('零售总额', size =12)
ax.set_xlabel('时间', size = 12)
# 绘制2024年12个月的预测值
model_w.forecast(12).plot(ax = ax, style = '--', marker = 'o', markersize = 4, color = 'red')
plt.xticks(range(0, 72, 12), df['年份'][::12])
plt.axvline(72, ls = '--', c = 'grey', linewidth = 1)
plt.title('(a)零售总额的Winters指数平滑预测', size = 13)# 图(b)残差图
plt.subplot(122)
res = model_w.resid
plt.scatter(range(len(res)), res, marker = '^')
plt.hlines(0, 0, 72, linestyle = '--', linewidth = 1, color = 'red')
plt.ylabel('时间', size = 12)
plt.xlabel('残差', size = 12)
plt.xticks(range(0, 72, 12), df['年份'][::12])
plt.title('(b)Winters指数平滑预测残差', size = 13)
左图中虚线右侧的圆点是2024年各月份的预测值。右图显示,残差基本上围绕0轴随机波动,表明说选择的Winters指数平滑预测模型基本上是合适的。但后期的残差明显大于前期的残差,存在异方差现象,因此可考虑选择其他模型。
都读到这里了,不妨关注、点赞一下吧!