PythonでAR過程による時系列予測をしてみた

はじめに

前回の記事ではAR過程の性質についてまとめたので、 今回は実際にAR過程を用いて時系列データの将来値予測を行っていく流れをまとめていきたいと思います。

目次

AR過程とは

ある時点における観測データの値をそれよりも過去の観測データの線形和で表現するモデルであり、
以下のように数式で表現されます。

 y_t = c + \sum\limits_{i=1}^p \phi_i y_{t-i} + \epsilon_t, \quad \epsilon_t \sim W.N(\sigma^2)
 
\{y_1, \ldots , y_t\}\, : \, 時系列データ \\
c \, : \, 定数項 \\
\phi_i \, : \, 自己回帰係数 \\
\epsilon_t \, : \, 時刻tにおける撹乱項 \\
W.N(\sigma^2) \, : \, 平均0,分散\sigma^2 のホワイト・ノイズ

また、 p時点前までの観測データが含まれるAR過程のことをラグ pのAR過程と呼び、AR(p)と記述されます。

データ探索

どの時系列モデルを適用するのか判断するために、分析対象データのデータ探索を行います。
具体的には、

を行っていきます。

トレンド、季節性の確認

まずはじめに分析対象となる時系列データをプロットし、 データ内にトレンドや季節性などが存在していないか確認します。
ちなみに今回使用するデータは静岡県三島市の2010年1月から2019年12月までの月平均気温データとなっており、 以下サイトから取得できます。

上記サイトに掲載されているデータをプロットした図は以下のようになります。

f:id:oneopeadoauo_mt:20220313193014p:plain

図を見る限りでは、データのトレンド(上昇傾向・下降傾向)は確認できませんが、一年周期で気温が一定のパターンで変動しているため、 この時系列データは季節性を備えていると見做せます。

また、上記グラフを生成するソースコードは以下の通りです。

偏自己相関係数の確認

次にコレログラムをプロットし、各ラグごとに偏自己相関係数の値の大きさを確認します。
Pythonでコレログラムをプロットするために、ここではstatsmodelsライブラリを使用します。
実際に、先程の月平均気温データを用いて作成したコレログラムは以下のようになります。

f:id:oneopeadoauo_mt:20220313193335p:plain

縦軸は偏自己相関係数の値、横軸はラグとなっております。 また、グラフ内の青色領域は95%信頼区間を表しており、この青色領域の外側にプロットされているラグについては 異時点データ間の相関関係があるとみなすことができます。
従って、各月の平均気温は1ヶ月前〜6ヶ月前の月平均気温の値に影響を受けることが分かります。
上記コレログラムを生成するソースコードは以下の通りです。

拡張Dickey-Fuller検定の実施

次に拡張Dickey-Fuller検定(ADF検定)を行い、観測された時系列データが定常AR過程となっているか確認します。
ADF検定では時系列データの真の過程がAR(p)過程であることを仮定した上で、帰無仮説・対立仮説を以下のように設定した検定となっています。

  • 帰無仮説:過程は単位根AR(p)過程である
  • 対立仮説:過程は定常AR(p)過程である

ADF検定についてもstatsmodelsライブラリに内包されているため、引き続きstatsmodelsを使っていきます。
実際に、月平均気温データに対してADF検定を実行するコードは以下の通りとなります。

また、上記コードの補足は以下の通りです。

  • 2010年1月から2016年12月までのデータをAR過程への学習用データとして扱い、残りのデータを検証用データとして使用
  • adfuller関数の引数regressionではAR過程に含める説明変数の種類を指定しており、指定できる引数としては「"c"(定数項)」、「"ct"(定数項と1次のトレンド項)」、「"ctt"(定数項、2次までのトレンド項)」、「"n"(定数項、トレンド項なし)」が存在する。今回の時系列データではトレンドは確認できず、さらに時系列データは一定の範囲内を変動しているように見受けられたため、"c"を選択している。
  • adfuller関数では、AR(1)過程〜AR(maxlag)過程の中で、autolag引数で指定した指標のスコアが最も良いものを選定した後にADF検定を行っている。

また、上記コードの実行結果は以下の通りです。

# 実行結果
検定統計量 : -1.1529372620051508、p値:0.6935064693325749、使用したラグ:11、データ数:72
有意水準1%点:-3.524624466842421、有意水準5%点:-2.9026070739026064、有意水準10%点:-2.5886785262345677
今回の例では、AICを基準としてAR過程の選定を行っており、上記実行結果を確認するとAR(11)過程を用いて拡張ADF検定を実施していることが分かります。また、p値を確認すると約0.69と比較的大きい数字になっています。そのため、帰無仮説を棄却することができず、観測された時系列データが定常AR過程であるという仮説を導くことができませんでした。

差分系列に対して拡張Dickey-Fuller検定を実施

観測された時系列データが定常AR過程とならない場合、代わりに元の時系列データの差分系列に対して拡張ADF検定を行い、差分系列データを定常AR過程で表現可能か確認を行います。
学習用の差分系列データ(2010年1月〜2016年12月までの時系列データの差分系列データ)に対して、拡張ADF検定を行うコードは以下のようになります。
そして、実行結果は次のようになります。
検定統計量 : -7.765060620044867、p値:9.235111192010311e-12、使用したラグ:11、データ数:71
有意水準1%点:-3.526004646825607、有意水準5%点:-2.9032002348069774、有意水準10%点:-2.5889948363419957
上記検定結果より、p値が限りなく0に近い値となっているため、差分系列は定常AR過程であるという仮説を採択することができます。

AR過程による時系列モデリング

AR過程の生成

ここまで来てようやくAR過程による時系列モデリングを行うことができます。
まずはじめに、これまでのデータ探索・拡張ADF検定の結果を加味して、学習用の差分系列データの変動パターンをAR(11)過程(トレンド項なし)で表現します。
実際に、学習用差分系列データを用いてAR(11)過程を生成するコードは以下の通りです。

AR過程の残差の確認

次に、生成したAR(11)過程の残差プロット、残差のコレログラムを出力し、AR(11)過程が差分系列データにどれだけフィットしているのかを確認します。
以下のコードはAR(11)過程の残差、残差のコレログラムを出力するコードとなっています。
上記コードを実行した結果、出力されるグラフは以下のようになります。
f:id:oneopeadoauo_mt:20220314192908p:plain
残差プロット
f:id:oneopeadoauo_mt:20220314193015p:plain
残差のコレログラム

残差は概ね±2の範囲に収まっており、コレログラムはほぼすべてのラグにおいて95%信頼区間に収まっていることが見て取れます。
従って、作成したAR(11)過程は差分系列を上手く表現できているとみなすことができます。

AR過程による予測

最後に、これまでに作成したAR(11)過程を用いて2017年1月から2019年12月までの月平均気温データの予測を行います。
将来値予測を行うコードは以下の通りです。

上記コードの出力は以下の通りです。

f:id:oneopeadoauo_mt:20220314213817p:plain
AR(11)過程による予測

青の実線が実際の時系列データ、黄色の破線がAR(11)過程による予測データ系列となります。上記グラフより、2017年1月から2019年12月までの月平均気温を上手く予測できていることが分かります。

参考