ARモデル(Auto Regressive)モデルは、自己回帰モデルと呼ばれています。
現在の時刻$t$におけるデータが、$t$以前の$0~ t-1$のデータで回帰できるモデルのことを、ARモデルと表現します。
古典的な時系列解析における、最も基本的なモデルと言っても良いでしょう。近年ではディープラーニングを用いた手法などが多数登場しておりますが、それでもやはりARモデルを元にした手法は実際の製品や分析でもよく行われています。
今回はARモデルについてわかりやすく解説し、その後Pythonを用いてARモデルを実装します。
- AR(自己回帰)モデルの解説
- 実際のデータを用いてPythonでARモデルを実装
ARモデルの定義
まず最初に、ARモデルを定義します。ARモデルは下記のように表現されるモデルとなっています。
\begin{equation} \begin{split} y_t &= \phi_1 y_{t-1} + \phi_2 y_{t-2}+ \phi_3 y_{t-3} + \dots + \phi_p y_{t-p} + \epsilon_t + c \\ &= \sum_{i=1}^{p} \phi_i y_{t-i} + \epsilon_t + c \end{split} \end{equation}
ここで、$\phi_n$は、ARパラメータ、$c$は定数、$\epsilon_t$はノイズとして定義されます。
$\epsilon_t$のノイズは、平均0、分散が$\sigma^2$に従う白色雑音(ホワイトノイズ)だと仮定しています。式で表現すると下記のようになります。
\begin{equation} \epsilon_t \sim \mathcal{N}(0, \sigma^2) \end{equation}
また、$c$は定数ですが、$\phi$と用いて統一的に表現する場合は、$\phi_0$と表現されることもあります。
ちなみに、(1)の定義は、現在の時刻$t$の観測値$y_t$が、$p$期前のデータまでで回帰できることを過程しています。
このように、現在のデータが$p$期前までのデータで回帰できることを過程しているARモデルをAR(p)と表現します。
(1)は一般的に表現したARモデルですが、ここで最も簡単なARモデルはAR(1)モデルとなります。
AR(1)モデルは、現在の観測値は1つ前の観測値だけで表現できるとするモデルで、次のように表現できます。
\begin{equation} \begin{split} y_t = \phi_1 y_{t-1} + \epsilon_t + c \end{split} \end{equation}
PythonでARモデルを試す
それでは、Pythonを用いてARモデルの実験をしてみましょう。
時系列データとして、超有名なデータセットである、飛行機の乗車人数であるAirPassengersを利用します。詳しいデータセットの解説はこちらをご覧ください。

まず必要なライブラリをインポートします。ARモデルを試すために、今回はstatsmodelsライブラリを利用します。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AR
続いて、データセットをインポートします。
df = pd.read_csv("https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv", index_col='Month', parse_dates=True)
plt.figure(figsize=(10, 3), dpi=100)
plt.plot(df)

このようなデータセットで、自己回帰モデルで学習します。
# 訓練データとテストデータを準備
len_test = 12
df_train = df[:len(df) -len_test]
df_test = df[len(df)-len_test:]
# モデルを訓練しAICが最も少ないモデルを選択
for i in range(21):
ar_model = AutoReg(df_train, lags=i)
result = ar_model.fit()
print(f"lag: {i}, AIC:{result.aic}")
ラグごとに次のようなAICが出力されました。

fig, ax = plt.subplots(figsize=(10, 2), dpi=100)
min_lag = 20
ar_model = AutoReg(df_train, lags=min_lag)
result = ar_model.fit()
forecast = result.forecast(len_test)
ax.plot(df, ls="-")
ax.plot(forecast, ls="-", color="r", label="predicted")
フィッティングの結果はこのようになりました。

ARモデルでも十分予測できていることがわかります。
まとめ
自己回帰モデルでも基本的な時系列を表現することができました。古典的時系列予測では、ARIMAモデルなどが頻繁に利用されますが、その基本となるARモデルを紹介しました。
次はMAモデルについて解説していこうと思うので、他の記事もぜひご覧ください。