時系列解析-4

はじめに

今回は時系列解析シリーズの最終回として、実際のデータを解析する。ソースコードはこのファルダ内にあるsrc/main_for_blog.ipynbである。言語はPythonである。

使用データ

使用するデータはこれである。1949年1月から1960年12月までの飛行機の乗客数データである。グラフは以下の通り。

図1

単調増加しており一目で非定常過程であることが分かる。

解析手順

解析手順は以下の通り。

  1. 非定常過程から定常過程に変換する。
  2. 自己相関を描画し周期を同定する。
  3. 訓練データとテストデータに分割する。
  4. 訓練データでハイパーパラメータを最適化する。
  5. 訓練データで訓練する。
  6. テストデータで予測する。

まず最初に、定常過程への変換から始める。

定常過程へ

定常過程に変換するために必要な差分回数を見積もる。最初に原系列に対しKPSS検定を行う。

4行目でモジュールstatsmodels内の関数kpssを使っている。上のコードを実行するとp_valueとして0.01を得た。この値は0.05(5%)より小さいから単位根ありと判定できる。つまり差分を取れる。次に1階差分系列に対しKPSS検定を行う。

1行目のdiff関数で1階差分を取っている。上のコードを実行するとp_valueは0.1となった。この値は0.05より大きいから単位根なしと判定できる。つまりこれ以上差分を取る必要はないということである。ここまでの結果から、原系列は単位根過程であることが分かり、差分回数は1と結論される。ところで、差分回数は別の関数でも評価できる。

モジュールpmdarimaの関数ndiffsを使うことができる。dが差分回数である。上を実行するとd=1を得る。この関数内部でもKPSS検定が行われている。

周期の検出

差分系列の自己相関を描画する。

4行目の関数plot_acfで自己相関のグラフを描画している。出力は以下の通り。

図2

12ヵ月周期であることが分かる。

訓練データとテストデータへの分割

次のコードでデータを分割する。今回は全データの8割を訓練データとした。

出力は以下の通り。

ハイパーパラメータの最適化

今回使う時系列モデルはSARIMAである。このモデルのパラメータは、(p,d,q)(P,D,Q,m)であった。ここまでの解析で差分回数d=1と周期m=12は分かっている。ここでは残りのハイパーパラメータをグリッドサーチで最適化する。

上の関数を用いて以下を実行する。

結果は以下の通り。

AICは赤池情報量規準である。AICが最小になるように最適化される。

訓練

上のハイパーパラメータを用いてモデルを訓練する。

4行目で、モジュールstatsmodelsが持つクラスSARIMAXのインスタンスを作成し訓練を実行している。ここで、SARIMAXのXは外生変数を表す。気温や天気など元の時系列データには含まれない外部要因を考慮できるようにSARIMAを拡張したモデルがSARIMAXである。ここでは外生変数は考えない。上の関数を用いて下のコードで訓練を実行する。

予測

訓練済みモデルmodelを用いて予測を行う。

5行目の関数predictは訓練期間の予測である。6行目のforecastでテスト期間の予測をしている。1行目の関数predictを用いて以下のコードで予測する。

返り値であるtrain_predは訓練期間に対する予測値、test_predはテスト期間に対する予測値、test_pred_ciはテスト期間に対する信頼区間である。グラフは以下の通り。垂直な点線の左側が訓練期間、右側がテスト期間である。

図3

赤色が訓練期間の観測値、緑色がテスト期間の観測値、青色がSARIMAXによる予測値である。網掛け部分が予測時の信頼区間を表す。テスト期間を拡大したものを以下に示す。

図4

青色が予測値、緑色が観測値、網掛けが信頼区間である。

まとめ

今回使用したSARIMAモデルは、解析手順が確立しており大変扱いやすい手法である。ライブラリも充実しているので手軽に試すことができる。時系列解析において最初に試すことができる手法であろう。

参照サイト

 

 

 

 

Kumada Seiya

Kumada Seiya

仕事であろうとなかろうと勉強し続ける、その結果”中身”を知ったエンジニアになれる

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP