用Python实现时间序列模型实战——Day 4: 时间序列分解

一、学习内容
1. 加性与乘性时间序列分解模型

加性模型

  • 加性模型假设时间序列可以分解为三个部分:趋势 (Trend)、季节性 (Seasonality) 和残差 (Residual),即:

y_t = T_t + S_t + R_t

其中:

  • y_t 是时间 t 的观测值。
  • T_t 是趋势成分,反映长期的变化。
  • S_t​ 是季节性成分,反映周期性波动。
  • R_t​ 是残差成分,反映随机波动或噪声。

乘性模型

  • 乘性模型假设时间序列的各成分是相乘关系,即:

y_t = T_t \times S_t \times R_t

  • 乘性模型通常用于波动幅度随时间增大而增加的情况。例如,季节性波动随趋势的上升而增加。
2. 使用 STL (Seasonal and Trend decomposition using Loess) 方法进行时间序列分解

STL 分解

  • STL(Seasonal and Trend decomposition using Loess)是一种强大的时间序列分解方法,可以将时间序列分解为趋势、季节性和残差成分。
  • STL 方法的优点是可以处理复杂的季节性和趋势变化,并且对季节性成分的长度没有严格限制。

STL 方法使用 LOESS(局部加权回归)来估计趋势和季节性成分,从而提供更灵活的分解方式。

二、实战案例
1. 数据加载与原始数据可视化
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose, STL

# 加载时间序列数据集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')

# 绘制原始数据的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data['Passengers'], label='Original')
plt.title('Original Time Series')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

程序解释:

  • 载入航空乘客数据集,并绘制原始时间序列图,显示乘客数量随时间的变化。

 结果输出: 

 原始数据的时间序列图

  • 图表显示了航空乘客数量的时间序列,存在明显的上升趋势和季节性波动。
2. 加性分解
# 加性分解
result_add = seasonal_decompose(data['Passengers'], model='additive', period=12)
result_add.plot()
plt.suptitle('Additive Decomposition', fontsize=16)
plt.show()

程序解释: 

  • 使用 seasonal_decompose 方法进行加性分解,将时间序列分解为趋势、季节性和残差成分。
  • 参数 model='additive' 指定使用加性模型,period=12 指定季节性周期为 12 个月。

 结果输出:

 

加性分解结果

  • 加性分解将时间序列分解为趋势、季节性和残差三个部分。趋势部分显示数据的长期上升趋势;季节性部分显示每年乘客数量的周期性波动;残差部分显示了去除趋势和季节性后的随机波动。
3. 性分解
# 乘性分解
result_mul = seasonal_decompose(data['Passengers'], model='multiplicative', period=12)
result_mul.plot()
plt.suptitle('Multiplicative Decomposition', fontsize=16)
plt.show()

程序解释:

  • 同样使用 seasonal_decompose 方法进行乘性分解。
  • 参数 model='multiplicative' 指定使用乘性模型,period=12 指定季节性周期为 12 个月。

  结果输出:

乘性分解结果

  • 乘性分解也将时间序列分解为趋势、季节性和残差部分。与加性分解不同,乘性分解更适合那些季节性波动幅度随趋势增加而增大的时间序列。结果图表中可以看到,季节性成分的波动幅度随着趋势的上升而增加。
4. STL 分解
# 使用 STL 方法进行分解
stl = STL(data['Passengers'], seasonal=13)
result_stl = stl.fit()
result_stl.plot()
plt.suptitle('STL Decomposition', fontsize=16)
plt.show()

程序解释: 

  • 使用 STL 方法对时间序列进行分解。seasonal=13 指定季节性成分的窗口大小。
  • STL 分解结果包含趋势、季节性和残差部分,并提供灵活的分解方式。 

  结果输出:

STL 分解结果

  • STL 分解提供了更灵活的时间序列分解方式。与传统的加性和乘性分解不同,STL 分解可以处理复杂的趋势和季节性变化,并且能够根据数据特点自适应地分解序列。
  • STL 分解结果中,趋势部分平滑地反映了长期变化,季节性部分精确地捕捉了周期性波动,残差部分则展示了去除趋势和季节性后的随机波动。
三、行结果分析
1. 加性分解
  • 加性模型适用于季节性波动幅度不随时间变化的时间序列。通过加性分解,我们能够独立地观察时间序列的趋势和季节性成分。这对于理解数据的结构非常有帮助,尤其是在构建预测模型之前。
2. 乘性分解
  • 乘性模型适用于季节性波动幅度随时间变化的时间序列。乘性分解的结果显示了季节性波动的动态变化,特别适用于那些季节性波动随趋势上升而放大的数据。
3. STL 分解
  • STL 分解提供了更灵活的分解方式,能够处理复杂的季节性和趋势变化。STL 方法的一个显著优点是其对季节性周期长度不敏感,且能够自适应地调整季节性成分,适合处理具有非线性趋势和复杂季节性的时间序列数据。

通过这些分解方法,我们能够深入理解时间序列的组成部分,为后续的建模和预测奠定基础。根据时间序列的特点,可以选择适合的分解方法来进行分析。对于波动幅度较为稳定的时间序列,加性模型可能更为适合;而对于波动幅度随趋势变化的数据,乘性模型或 STL 分解可能更合适。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值