一、学习内容
1. ARIMA 与 SARIMA 模型的对比分析
ARIMA 模型:
- ARIMA 模型适用于没有明显季节性趋势的时间序列数据。它通过自回归 (AR)、差分 (I) 和移动平均 (MA) 成分来建模时间序列数据的趋势和噪声。
SARIMA 模型:
- SARIMA 模型是 ARIMA 模型的扩展版本,专门用于具有季节性成分的时间序列数据。除了 ARIMA 的成分外,SARIMA 还包含季节性自回归 (SAR)、季节性差分 (SD) 和季节性移动平均 (SMA) 成分。
2. 不同模型在不同类型数据集上的表现对比
非季节性数据:
- 对于没有明显季节性趋势的数据,ARIMA 模型通常更合适。它可以有效捕捉数据中的趋势和短期波动,而不需要考虑季节性成分。
季节性数据:
- 对于具有明显季节性周期的数据,SARIMA 模型更为适合。它能够处理数据中的季节性模式,并在建模过程中包含这些周期性的变化。
二、实战案例
在本案例中,我们将对比 ARIMA 和 SARIMA 模型在同一数据集(航空乘客数据)上的表现,分析两种模型的适用性和优劣。
1. 数据加载与原始数据可视化
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
# 加载时间序列数据集
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. ARIMA 模型拟合
# ARIMA 模型拟合 (p, d, q) = (2, 1, 2)
model_arima = ARIMA(data['Passengers'], order=(2, 1, 2))
results_arima = model_arima.fit()
# 输出 ARIMA 模型摘要
print("ARIMA(2, 1, 2) Model Summary:")
print(results_arima.summary())
程序解释:
- 使用
ARIMA
函数拟合 ARIMA(2, 1, 2) 模型,并输出模型的摘要信息。ARIMA 模型适用于处理无明显季节性特征的数据。
结果输出:
ARIMA(2, 1, 2) Model Summary:
SARIMAX Results
==============================================================================
Dep. Variable: Passengers No. Observations: 144
Model: ARIMA(2, 1, 2) Log Likelihood -671.673
Date: Mon, 02 Sep 2024 AIC 1353.347
Time: 20:51:05 BIC 1368.161
Sample: 01-01-1949 HQIC 1359.366
- 12-01-1960
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ar.L1 1.6850 0.020 83.060 0.000 1.645 1.725
ar.L2 -0.9548 0.017 -55.420 0.000 -0.989 -0.921
ma.L1 -1.8432 0.124 -14.809 0.000 -2.087 -1.599
ma.L2 0.9953 0.135 7.380 0.000 0.731 1.260
sigma2 665.9584 114.053 5.839 0.000 442.419 889.498
===================================================================================
Ljung-Box (L1) (Q): 0.30 Jarque-Bera (JB): 1.84
Prob(Q): 0.59 Prob(JB): 0.40
Heteroskedasticity (H): 7.38 Skew: 0.27
Prob(H) (two-sided): 0.00 Kurtosis: 3.14
===================================================================================
ARIMA 模型的摘要:ARIMA(2, 1, 2) 模型的摘要信息包括模型参数的估计值、标准误差、t 统计量等。AIC 和 BIC 值用于评估模型的优劣。
3. SARIMA 模型拟合
# SARIMA 模型拟合 (p, d, q) x (P, D, Q, m) = (1, 1, 1) x (1, 1, 1, 12)
model_sarima = SARIMAX(data['Passengers'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
results_sarima = model_sarima.fit()
# 输出 SARIMA 模型摘要
print("\nSARIMA(1, 1, 1)(1, 1, 1, 12) Model Summary:")
print(results_sarima.summary())
程序解释:
- 使用
SARIMAX
函数拟合 SARIMA(1, 1, 1)(1, 1, 1, 12) 模型,并输出模型的摘要信息。SARIMA 模型适用于具有季节性成分的数据。
结果输出:
SARIMA(1, 1, 1)(1, 1, 1, 12) Model Summary:
SARIMAX Results
==========================================================================================
Dep. Variable: Passengers No. Observations: 144
Model: SARIMAX(1, 1, 1)x(1, 1, 1, 12) Log Likelihood -506.149
Date: Mon, 02 Sep 2024 AIC 1022.299
Time: 20:51:09 BIC 1036.675
Sample: 01-01-1949 HQIC 1028.140
- 12-01-1960
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ar.L1 -0.1272 0.356 -0.357 0.721 -0.825 0.570
ma.L1 -0.2149 0.325 -0.660 0.509 -0.853 0.423
ar.S.L12 -0.9272 0.214 -4.341 0.000 -1.346 -0.509
ma.S.L12 0.8395 0.309 2.717 0.007 0.234 1.445
sigma2 130.7819 15.420 8.481 0.000 100.559 161.005
===================================================================================
Ljung-Box (L1) (Q): 0.00 Jarque-Bera (JB): 7.05
Prob(Q): 0.99 Prob(JB): 0.03
Heteroskedasticity (H): 2.65 Skew: 0.13
Prob(H) (two-sided): 0.00 Kurtosis: 4.11
===================================================================================
SARIMA 模型的摘要:SARIMA(1, 1, 1)(1, 1, 1, 12) 模型的摘要信息同样包括模型参数的估计值、AIC、BIC 等。SARIMA 模型能够处理数据中的季节性成分。
4. 模型预测与对比
# 对比两个模型的预测结果
pred_arima = results_arima.get_forecast(steps=24)
pred_arima_ci = pred_arima.conf_int()
pred_sarima = results_sarima.get_forecast(steps=24)
pred_sarima_ci = pred_sarima.conf_int()
# 绘制模型预测结果的对比图
plt.figure(figsize=(14, 8))
plt.plot(data.index, data['Passengers'], label='Observed', color='blue')
plt.plot(pred_arima.predicted_mean.index, pred_arima.predicted_mean, color='red', label='ARIMA Forecast')
plt.fill_between(pred_arima_ci.index, pred_arima_ci.iloc[:, 0], pred_arima_ci.iloc[:, 1], color='red', alpha=0.3)
plt.plot(pred_sarima.predicted_mean.index, pred_sarima.predicted_mean, color='green', label='SARIMA Forecast')
plt.fill_between(pred_sarima_ci.index, pred_sarima_ci.iloc[:, 0], pred_sarima_ci.iloc[:, 1], color='green', alpha=0.3)
plt.title('ARIMA vs SARIMA Model Forecast')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()
程序解释:
- 通过拟合的 ARIMA 和 SARIMA 模型分别对未来 24 个月的乘客数量进行预测,并绘制预测结果对比图。
- 观察两种模型的预测效果,并比较其预测区间的宽度。
结果输出:
预测结果对比:通过对比 ARIMA 和 SARIMA 模型的预测结果,可以观察到 SARIMA 模型在处理季节性数据时往往具有更好的表现,预测区间更窄,说明预测的可信度更高。
5. AIC 和 BIC 值的比较
# 比较两个模型的 AIC 和 BIC 值
print(f"ARIMA(2, 1, 2) AIC: {results_arima.aic}, BIC: {results_arima.bic}")
print(f"SARIMA(1, 1, 1)(1, 1, 1, 12) AIC: {results_sarima.aic}, BIC: {results_sarima.bic}")
程序解释:
- 输出两种模型的 AIC 和 BIC 值,用于评估模型的拟合效果。AIC 和 BIC 值越小,模型的拟合效果越好。
结果输出:
ARIMA(2, 1, 2) AIC: 1353.346641008392, BIC: 1368.1608641596915
SARIMA(1, 1, 1)(1, 1, 1, 12) AIC: 1022.298793640585, BIC: 1036.6747802565908
AIC 和 BIC 值的比较:SARIMA 模型的 AIC 和 BIC 值如果明显低于 ARIMA 模型,则说明 SARIMA 模型更适合于该数据集。否则,ARIMA 模型可能表现更好。
三、结果分析
1. 模型选择的依据
- 对于具有显著季节性模式的数据集,SARIMA 模型通常表现更佳,因为它能够捕捉季节性成分并进行相应调整。对于无明显季节性模式的数据集,ARIMA 模型可能已经足够有效。
2. 预测结果的对比
- 通过比较两个模型的预测结果,可以直观地看到 SARIMA 模型在季节性数据上的优势。SARIMA 模型的预测区间往往比 ARIMA 模型更窄,表明其预测的不确定性较小。
3. AIC 和 BIC 值的评估
- AIC 和 BIC 是选择最优模型的重要标准,值越低的模型通常具有更好的拟合效果。在本案例中,如果 SARIMA 模型的 AIC/BIC 值低于 ARIMA 模型,则表明 SARIMA 模型更适合该数据集。
通过本次练习,您学会了如何在相同数据集上应用 ARIMA 和 SARIMA 模型,并通过比较两种模型的预测效果和统计指标,选择最适合的模型。未来的实际应用中,可以根据数据的特性选择最合适的时间序列模型。