経済統計の使い方
統計初心者向けに、データや分析手法の解説をしています。「まとめページ」をご覧くだされば、全体的な内容がわかると思います。
python

【python】自己回帰モデルによる予測(statsmodels)

pythonで自己回帰モデルの予測をしてみます。statsmodels.tsa.ar_modelモジュールの中のAutoRegというクラスを使い、以下の式で計算できます。

AutoReg(データ,lag=ラグ数)

このモデルの計算結果はfitメソッドでモデルを訓練できます。この結果を使って、結果の確認、係数の出力や予測などができます。

経済統計の使い方では、経済統計の入手法から分析法まで解説しています。

【python】pythonのまとめ 経済統計の使い方では、統計データの入手法から分析法まで解説しています。 https://officekaisuiyoku.com...

データは、以下のデータを使います。景気動向指数のデータです。

import pandas as pd
df=pd.read_csv("CI.csv")

df.head()

景気動向指数のデータです。灰色の線が実績値、青がサンプル内の推定値、緑が予測値となっています。

自己回帰モデル

自己回帰モデルは、自分自身に回帰するもので、基本的な予測を作成する方法の一つです。ラグ数が1で、定数項をa,CIの係数をbとして以下の式を推計することになります。

$ CI_t=a+b CI_{t-1} $

自己回帰モデルの核となる式は以下です。

AutoReg(データ,lag=ラグ数)

このモデルを使って係数を推定する場合は、fitメソッドを使います。

model=AutoReg(データ,lag=ラグ数).fit()

fitメソッドの結果をmodelという名前にして保存しています(resultsなどの名前でもいいです)。modelはAutoRegResultsというクラスのインスタンスとして保存されるので、AutoRegResultsのメソッドを使うことができます。さまざまな推定結果が保存されています。

summary()結果
fittedvalues推定
predict(予測初期、予測終期)予測
params係数

以下は結果の表示です。

サンプル数の調整

自己回帰モデルは、自分自身の過去の値を使うので、たとえばラグが2期の場合、推定できるのは3番目からのデータになります。3つのサンプルがあったとしても、使えるのは3-2=1サンプルです。サンプル数(sample_size)はデータの個数-ラグ数となります。

学習データをサンプル数の90%とすると、サンプル数×0.9で学習データ数(train_size)が求められます。これをもとのデータから切り出す場合、データ初期はゼロです(サンプルサイズはラグ数分減ります)。学習データの終期は以下の表から、train_size-1+ラグ数となり、スライス記法では1期先を指定するので、train_size+ラグ数となります終

予測期間は、学習期間の終わりから1期後なので、train_size-1となります。終期は最後のデータのインデックス(ゼロから始まる)を指すので、データ数(len()で取得できます)-1となります。

  • 学習期間:(スライス記法)配列名[:train_size+ラグ数]
  • 検証期間:予測初期はtrain_size+ラグ数,終了期はデータ数-1
インデックスサンプル数(ラグが2の場合)インデックスが2の時の変数
0$X_{t-2}$
1$X_{t-1}$
21$X_t$
32$X_{t+1}$
train_size-1+ラグ数train_size学習期間の終期
train_size+ラグ数検証期間の初期
sample_size-1+ラグ数
len(データ)-1
sample_size検証期間の終期

プログラム

プログラムではグーグルドライブに上げたファイルから読み込むことにしています。

AutoRegの設定の中に、old_names=Faslseがあります。old_namesは係数名の表示の古い形式を表しますが、非推奨となっています。デフォルトではold_namesを使うことになっていますが、それを新形式にするようにしています。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AutoReg
from google.colab import drive

# ① Google Driveから読み込み
drive.mount('/content/drive', force_remount=True)
ci_df = pd.read_csv('/content/drive/MyDrive/MGDP/CI.csv')
ci = ci_df['ci'].values.astype(np.float32)

# ② パラメータ設定
n_lags = 2
sample_size = len(ci) - n_lags
train_size = int(sample_size * 0.9)

# ③ 学習データの作成(ラグを含める)
train_data = ci[:train_size + n_lags]

# ④ モデル学習
model = AutoReg(train_data, lags=n_lags, old_names=False).fit()

# ⑤ 推定値(実績期間):fittedvalues は n_lags 分遅れて始まる
ci_estimated = model.fittedvalues  # 長さは len(train_data) - n_lags

# ⑥ 予測値(検証期間):train_size 以降を予測
ci_forecast = model.predict(start=train_size + n_lags, end=len(ci)-1)

# ⑦ 結果表示
print(model.summary())
print("推定された係数:", model.params)

# ⑧ グラフ表示
plt.figure(figsize=(14, 6))
plt.plot(ci, label="True", color='gray')

# 実績期間の推定値をプロット(x軸の対応に注意)
plt.plot(range(n_lags, train_size + n_lags), ci_estimated, label="Fitted (Estimation)", linestyle='--', color='blue')

# 検証期間の予測値をプロット
plt.plot(range(train_size + n_lags, len(ci)), ci_forecast, label="Forecast", linestyle='--', color='green')

plt.axvline(x=train_size + n_lags - 1, color='gray', linestyle=':')  # 実績と予測の境界線
plt.legend()
plt.grid(True)
plt.title("AR Model: Estimation vs Forecast")
plt.show()

統計学・計量経済学のまとめ 統計学に関するまとめのサイトです。 教科書 「回帰分析から学ぶ計量経済学-Excelで読み解く経済の仕組み」 回帰分...

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA