概要

大気中の二酸化炭素濃度データと状態空間モデルを用いて、1998年以降の二酸化炭素濃度の予測を実行

サンプルコード

import numpy as np import pandas as pd from statsmodels.tsa.statespace.structural import UnobservedComponents import matplotlib.pyplot as plt # 例として、statsmodelsの組み込みデータセットからCO2データをロードします from statsmodels.datasets import co2 data = co2.load_pandas().data data.index = pd.DatetimeIndex(data.index) # データセット内の欠損値を削除します data = data['co2'].resample('MS').mean() data = data.fillna(data.bfill()) # 1997年までのデータで訓練します train_data = data[:'1997-12-01'] # ローカルリニアトレンドモデルと季節性モデルを組み合わせます model = UnobservedComponents(train_data, 'local linear trend', seasonal=12) # 12ヶ月の季節性を仮定します # モデルをデータにフィットさせます result = model.fit() # フィット結果を表示します print(result.summary()) # 予測結果と信頼区間を取得します pred = result.get_forecast(data.index[-1], dynamic=False) pred_conf = pred.conf_int() # 結果をプロットします ax = data['1980':].plot(label='observed') pred.predicted_mean.plot(ax=ax, label='Forecast', alpha=.7) ax.fill_between(pred_conf.index, pred_conf.iloc[:, 0], pred_conf.iloc[:, 1], color='k', alpha=.2) ax.set_xlabel('Date') ax.set_ylabel('CO2 Levels') plt.legend() plt.show()

実行結果

Unobserved Components Results ===================================================================================== Dep. Variable: co2 No. Observations: 478 Model: local linear trend Log Likelihood -182.024 + stochastic seasonal(12) AIC 372.048 Date: Thu, 25 May 2023 BIC 388.616 Time: 20:37:10 HQIC 378.569 Sample: 03-01-1958 - 12-01-1997 Covariance Type: opg ==================================================================================== coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------------ sigma2.irregular 0.0279 0.005 5.256 0.000 0.017 0.038 sigma2.level 0.0663 0.008 8.722 0.000 0.051 0.081 sigma2.trend 2.966e-06 7.47e-06 0.397 0.691 -1.17e-05 1.76e-05 sigma2.seasonal 2.901e-05 7.45e-05 0.389 0.697 -0.000 0.000 =================================================================================== Ljung-Box (L1) (Q): 0.43 Jarque-Bera (JB): 59.71 Prob(Q): 0.51 Prob(JB): 0.00 Heteroskedasticity (H): 0.68 Skew: 0.16 Prob(H) (two-sided): 0.02 Kurtosis: 4.73 ===================================================================================

co2_forecast.png

実行結果解説

UnobservedComponents モデルのフィット結果表示について、それぞれのセクションについて説明します。

  1. Model Information: モデルの基本的な情報を示しています。モデルの名前、使用した観測データの数、ログ尤度(データに対するモデルの適合度)、情報量基準(AIC、BIC、HQIC:モデルの良さを評価するための統計量で、値が小さいほど良いモデルを示します)などが含まれます。

  2. Parameters: モデルパラメータの推定値を示しています。各パラメータには、その推定値(coef)、標準誤差(std err)、zスコア(z)、p値(P>|z|)、95%信頼区間([0.025 0.975])が表示されています。これらはモデルがデータから学習した結果で、モデルの挙動を理解する上で重要な情報です。

    • sigma2.irregular: 不規則成分(観測ノイズ)の分散
    • sigma2.level: レベル(トレンド)の分散
    • sigma2.trend: トレンド(勾配)の分散
    • sigma2.seasonal: 季節成分の分散
  3. Test Statistics: モデルの適合度を評価するための統計的テストの結果を示しています。ここではLjung-BoxテストとJarque-Beraテスト、Heteroskedasticityテストの結果が表示されています。
    Ljung-Box Test: モデルの残差に自己相関が存在するかを検定するためのテストです。p値(Prob(Q))が0.05より大きい場合、残差に自己相関が存在しないという帰無仮説を棄却できません。

    • Jarque-Bera Test: モデルの残差が正規分布に従うかを検定するためのテストです。p値(Prob(JB))が0.05より小さい場合、残差が正規分布に従うという帰無仮説を棄却します。
      -** Heteroskedasticity Test**: 残差の等分散性(均一性)を検定するためのテストです。p値(Prob(H))が0.05より小さい場合、残差が等分散であるという帰無仮説を棄却します。
    • Skewness: モデルの残差の歪度を示します。正規分布の場合、歪度は0になります。
    • Kurtosis: モデルの残差の尖度を示します。正規分布の場合、尖度は3になります。

これらの情報を元に、モデルの適合度や予測性能を評価することができます。

リンク