用Python实现时间序列模型实战——Day 10: ARIMA 与 SARIMA 模型的综合练习

一、学习内容
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 模型,并通过比较两种模型的预测效果和统计指标,选择最适合的模型。未来的实际应用中,可以根据数据的特性选择最合适的时间序列模型。

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值