一、学习内容
1. 加性与乘性时间序列分解模型
加性模型:
- 加性模型假设时间序列可以分解为三个部分:趋势 (Trend)、季节性 (Seasonality) 和残差 (Residual),即:
其中:
是时间
的观测值。
是趋势成分,反映长期的变化。
是季节性成分,反映周期性波动。
是残差成分,反映随机波动或噪声。
乘性模型:
- 乘性模型假设时间序列的各成分是相乘关系,即:
- 乘性模型通常用于波动幅度随时间增大而增加的情况。例如,季节性波动随趋势的上升而增加。
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 分解可能更合适。