Pythonを使って多変量時系列データの予測における変数の関係性を分析 〜予測誤差分散分解〜

スポンサーリンク


 現在、データを取得しやすくなったことで、多変量の時系列データも増えてきました。多変量時系列データを扱う上で、1変数ずつ見ていくのでもよいのですが、せっかく多変量あるならば、多変量ならではの示唆を得たいですよね。そこで今回は、多変量時系列データの予測における変数の関係性を見れるようにします。多変量時系列データの予測モデルであるVARの構築に関してはこちらをご覧ください。


www.dskomei.com


 多変量時系列データにおいて、どの変数がどの変数に影響しているかがわかれば、未来に対してどの変数に注目すべきかよりわかるようになりますね。そのために、予測誤差分散分解(Forecast Error Variance Decomposition; FEVD)を行います。今回のコードはこちらに置いてあります。




予測誤差分散分解


 予測誤差分散分解は、多変量時系列データの予測において、各変数の影響度合いを見れるようにすることを目的としています。これは、VARモデルでの予測時の全体の誤差に対する対象の変数の誤差の割合によって、関係性を定量化しています。詳しいことは後に述べます。まずは実装をしてみましょう。


データの準備


 それでは、予測誤差分散分解をやってみます。そのために、データを準備し、VARモデルを構築し、予測分散分解を行うという手順で進めていきます。


データの準備


 前回のVARのモデルの構築と同じように、statsmodelsモジュールに組み込まれているアメリカの経済データを使います。

import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.api import VAR

macro_data = sm.datasets.macrodata.load_pandas().data


データの加工


 取得したデータのデータフレームのインデックスに、時期を表すクオーターを代入し、今回扱う変数である「realgdp」「realcons」「realinv」だけを取り出しています。

  • realgdb:実質国内総生産
  • realcons:実質個人消費支出
  • realinv:実質国内総投資
macro_data['year'] = macro_data['year'].astype(int)

macro_data.index = pd.date_range(
    str(macro_data['year'].min()), 
    periods=len(macro_data), 
    freq='Q'
)
target_data = macro_data[['realgdp', 'realcons', 'realinv']]

f:id:dskomei:20201016210429p:plain


 クオーター別な「実質国内総生産」「実質個人消費支出」「実質国内総投資」データを作成しました。


VARモデルの構築


 多変量時系列データのモデルであるVARモデルを構築します。とはいっても、数行でできるため、サクッとやってしまいましょう。前回見たとおり、今回扱っているデータは、非定常的なデータであり、1次の階差を取ることで定常的なデータになります。VARモデルは非定常的なデータでは使用できないので、今回も1次の階差をとったうえでVARモデルを構築します。

learning_data = target_data.diff().dropna()

model = VAR(learning_data)
model_result = model.fit(maxlags=15, ic='aic')
model_result.summary()

f:id:dskomei:20201017144649p:plain


 AIC基準でVARモデルのラグを選択しており、今回はラグ3のモデルが選択されました。VARモデルができたので、今回の本題である予測分散分解を行っていきます。


予測分散分解


 VARモデルが構築できたので、予測分散分解を行い、各変数の関係性を見ていきます。予測分散分解自体は、構築したVARモデルを使い、ワンライナーでできます。下記では、20期分の予測における予測分散分解をやっています。

fevd_result = model_result.fevd(20)
fevd_result.summary()

f:id:dskomei:20201017152055p:plain


 ポイントは、自身が予測に対してどれだけ影響力があるかと、他の変数がどれだけ影響するかです。例えば、変数「realgdp(実質国内総生産)」は、短期的な予測には自身の影響は強い(ラグ3までのrealgdpの値が強く影響している)ですが、長期的な予測には他の変数の影響も若干受けるようになっています。他の変数の中でも、「realcons(実質個人消費)」の影響力が強いです。


f:id:dskomei:20201017172502p:plain:w400


 更に、statsmodelsの便利なところは、この結果を簡単にグラフ化してくれるところです。

fevd_result.plot()

f:id:dskomei:20201017154835p:plain:w500


 グラフ化することで時系列データの変数の関係性がより分かるようになります。わかることをまとめると以下になります。

  • 実質国内総生産の予測は、短期的には直近の自身の値に影響され、長期的には実質個人消費の影響を若干受ける
  • 実質個人消費の予測は、短期か長期かに関わらず自身の影響を強く受け、若干実質国内総生産の影響を受ける
  • 実質国内総投資の予測は、短期か長期かに関わらず自身の影響が低く、実質国内総生産、実質個人消費の両方から影響を受ける


 予測分散分解を行うことで、時系列データならではの予測に対する他の変数の影響度合いがわかりました。面白いですね。


 これにて、実装パートは終わりです。次からは、数式を使いながら予測分散分解の中身を見ていきます。


予測誤差分散分解の中身を理解


 予測分散分解は名前の通り、予測時の誤差の分散を各変数の影響力で割合化することであり、それによりどの変数が予測に寄与しているかを見ています。なので、そんなに複雑な処理はしていないです。


 予測誤差分散の割合は、相対的分散寄与率(Relative Variance Cotribution; RVC)と呼ばれており、簡単に表すと次式になります。ここで、MSEとは二乗誤差のことです。


\[ RVC(i, j) = \frac {y_iのk時点先のMSEにおいてy_jが寄与する部分} {y_iのk時点先のMSE} \]


 これだけだと分かりづらいと思いますので、具体例を示します。2変量VAR(1)を構築して、以下の式になったとします。ここで、時間 \(t \) の予測誤差を \( u_t \) としています。


\( y_{1, t+1} = c_1 + a_{11} y_{1, t} + a_{12} y_{2, t} + u_{1, t+1} \)
\( y_{2, t+1} = c_2 + a_{21} y_{1, t} + a_{22} y_{2, t} + u_{1, t+1} + u_{2, t+1} \)


 変数 \(y_1 \) の1期先の予測の誤差は \( u_1\) だけであり、\( y_2 \) の項がありません。なので、1期先の \( RVC \) は以下の値になります。


\[ RVC(1, 1) = \frac {u_{1, t+1}} {u_{1, t+1}} = 1 \]
\[ RVC(1, 2) = 0 \]


 変数 \(y_2 \) の1期先の予測の誤差は \( u_1 + u_2 \) です。なので、1期先の \( RVC \) は以下の式になります。


\[ RVC(2, 1) = \frac {u_{1, t+1}} {u_{1, t+1} + u_{2, t+1}} \]
\[ RVC(2, 2) = \frac {u_{2, t+1}} {u_{1, t+1} + u_{2, t+1}} \]


 このように、VARモデルから予測分散分解は簡単に行えるます。ただし、これを行えるようにするためには、予測誤差が各変数の誤差として分解されていなければいけません。これをVMA表現と呼びます。VMA表現について書くと、だいぶ長くなってしまうので、こちらをご覧ください。ということで、逃げておきます。
ミャンマーの並行為替レートの要因分解:構造型VARによる名目・実質ショックの識別
https://ir.library.osaka-u.ac.jp/repo/ouka/all/23029/osipp_029_071.pdf


終わりに


 時系列データの分析においては、良い本がたくさんありますが、中でもこちらの本はMUSTで読まないといけないかなと思います。


参考Web