見出し画像

第3回 時系列分析~状態空間モデル編~

はじめに

前回の記事では、時系列分析で良く用いられる統計的手法として、”自己回帰モデル”と"移動平均モデル"について説明し、Pythonでの実装例について紹介しました。

今回は、時系列分析で良く用いられる"状態空間モデル"について説明します。

状態空間モデルとは

状態空間モデルとは、時系列データをモデル化する際に、直接見ることのできない「状態」とその状態から観測される「観測値」に分解してモデル化する手法です。前回の記事で紹介した自己回帰モデルや移動平均モデルなどは背後にある状態を考慮せずに、観測値を直接モデル化していました。

例えば明日の株価を予測したい場合に、自己回帰モデルでは今日までの株価を元に明日の株価を予測していました。昨日、今日と株価は上がっているので明日の株価も上がるはずだ、と言ったように予測することは確かに可能ですが、市場の状況は日々変化しており、株価に大きな影響を与えているはずです。市場の状況は直接観測することはできませんが、市場の状況の変化を推定し、その状態から観測値を予測するというのが状態空間モデルの考え方となります。

状態空間モデルを図で表すと以下のようになります。$${x}$$を各時点における状態、$${y}$$を各時点における観測値とすると、各時点の観測値は前の時点の観測値から予測しているのではなく、状態から予測していることが分かります。

画像1

先ほどの図を数式で表したのが以下となります。なお、状態を表した数式を「状態方程式」または「状態モデル」、観測値を表した数式を「観測方程式」または「観測モデル」と呼びます。式に出てくる$${\boldsymbol{F}}$$や$${\boldsymbol{G}}$$、$${\boldsymbol{H}}$$を変えることで様々なモデルの表現をできるようになります。

画像2

Pythonでの実装例

ここからPythonでの実装例をご紹介します。今回はstatsmodelsというライブラリを使用して状態空間モデルの実装をします。使用したPythonのバージョンや各種ライブラリの情報は以下の通りです。

python: 3.7.3
matplotlib: 3.4.3
pandas: 1.3.3
statsmodels: 0.13.0

今回も前回の記事と同様に、飛行機の乗客者数のデータセットを使いたいと思います。ライブラリの読み込みなどを確認したい場合には、「第2回 時系列分析~統計的手法編~」を参照ください。

それでは早速状態空間モデルを用いて乗客者数の予測をしてみましょう。statsmodelsのUnobservedComponentsを用いるため、ライブラリから読み込みます。

from statsmodels.tsa.statespace.structural import UnobservedComponents

次に乗客者数データを用いてモデルの当てはめを行います。状態空間モデルは方程式を変えることによって、様々な表現をできると説明しました。”UnobservedComponents”では、様々な構造のモデルがプリセットとして用意してあり、モデル名を指定することで簡単にそのモデルを使用して当てはめ、予測をすることができます。利用可能なモデルの一覧は以下となっております。

利用可能なモデル一覧(出典:公式ドキュメント

まずは基本的な構造を持ったローカルレベルモデルを用いてモデルの当てはめを行います。

# モデルの指定。ここでは'local level'とする
model_ll = UnobservedComponents(df.loc[:len(df)-13, '#Passengers'], 'local level')
# モデルの当てはめ
model_ll = model_ll.fit()
# 予測
forecast_ll = model_ll.forecast(12)

前回の記事で紹介した自己回帰モデルなどと同様に、たったの3行でモデルの構築から予測までを行うことができます。当てはめた結果および予測結果をプロットしてみると以下のようになりました。ローカルレベルモデルでは予測時には前時点の値をそのまま出力するため、予測区間では予測値が一定となってしまいます。

次にローカル線形トレンドモデルを試したいと思います。また、乗客数の推移は12ヶ月周期があるように見えるので、季節成分も追加してみたいと思います。

# モデルの指定。ここでは'local linear trend'とする
model_llt = UnobservedComponents(df.loc[:len(df)-13, '#Passengers'], 'local linear trend', seasonal=12)
# モデルの当てはめ
model_llt = model_llt.fit(method='nm')
# 予測
forecast_llt = model_llt.forecast(12)

モデルを'local level'から'local linear trend'に変更し、季節節分としてseasonal=12を追加しました。またパラメータ推定の方法をデフォルトのままにするとうまく学習ができていなかったため、Nelder-Mead法に変更しています。

結果を見てみるとローカルレベルモデルよりも精度良く予測できていることが分かります。

まとめ

・時系列分析で良く用いられる統計的手法のうち”状態空間モデル”について説明しました。
・状態空間モデルは、直接見ることのできない「状態」とその状態から観測される「観測値」に分解してモデル化する手法です。
・状態空間モデルをPythonで使ってみたい場合には、statsmodelsを使用すると簡単に実装することができます。

次回予告

次はディープラーニングを用いた時系列予測について記事を書きたいと思っています。最後まで読んでいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?