プロクラシスト

今日の寄り道 明日の近道

【Day-12】時系列分析の良リソースまとめ&基礎チュートリアル


スポンサーリンク

データ分析ガチ勉強アドベントカレンダー 12日目。

今までは、時間に依存しないデータについて取り扱ってきました。 しかし、世の中のデータは時間に依存したデータも多いのが事実です。

時間に依存しないデータは、その分各データを独立に扱うことができますが、時系列データはそういうわけにはいきません。なので、なかなか難しいのです。

今日は時系列のさわりをまとめて、また、時系列予測のチュートリアルをしていきます。

参考にできるサイト

時系列を学ぶにあたって、参考にした&参考にしたいサイトを列挙しておきます。 どれも充実した内容なので、一度は目を通しておくといいかもしれません。

メタ的な記事

pythonの実装も含めて

ディープラーニング

読んでる本、読みたい本を列挙しておく

内容
時系列解析入門 クラシカルな時系列データ分析が載っている本。数式をベースにきちんとした説明なのでよい。状態空間モデルのあたりは結構難しいが、たどり着きたいところ
経済・ファイナンスデータの計量時系列分析 (統計ライブラリー) 未読。いいらしい。
岩波データサイエンス Vol.6 時系列に関する最新トピックを集めた本。かなり面白いが、それなりの素養が必要
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~ KerasとTensorflowを使ってRNNを実装する本。LSTMの説明などもされていて、ディープラーニングのモデルを実装しつつ勉強ができる。

読みたい論文(積読)

(見出しを押せば論文にとびます)

Toeplitz Inverse Covariance-Based Clustering of Multivariate Time Series Data

2017年KDDのBestPaperを受賞している。時系列を分析して状態をクラスタリングするという旨の論文。

www.youtube.com

WAVENET: A GENERATIVE MODEL FOR RAW AUDIO

CNNで時系列データ分析を実現した論文。Google音声合成などにも使われていて、高い性能を実現している

日本語の輪読スライドも、ぜひとも参考にしたいところ。

www.slideshare.net

基礎チュートリアル

上記で紹介した記事A comprehensive beginner’s guide to create a Time Series Forecast (with Codes in Python) を参考にしながら、実際に時系列の予測をしてみる。

ところどころライブラリのバージョンが古かったりしたので、修正&大事そうなところは加筆した。内容は↓

  • データの用意
  • 定常性チェック
  • 定常状態のデータに変換
  • 時系列の予測

いつものようにgithubにあげている(day12)

github.com

データの用意

pandasを用いてデータを用意する 使うデータは International Airport Passengers

定常性のチェック

  • 平均や分散がずっと一定ならstarionary(定常)といえる
  • 多くの時系列モデルは定常性を仮定しているので、定常性のチェックは重要。

使用しているデータを見ると、増加傾向にあることがわかる(上図)。これだと平均や分散が一定とならないように見える。 ちゃんと調べるために、下記の処理を施してみる

  1. moving averageやmoving distanceをとってみる(sliding window)今回は、季節変動的なのも吸収したいから12か月分
  2. Dickkey Fuller Testを用いる。定常性の統計検定である。詳細

移動平均や移動標準偏差には、pandasの関数rollingを用いる。(pandas rolling) windowは窓幅で、window=12はこのデータでは一年分の平均となる。これで、簡単に移動平均をとることができる。

rolmean = timeseries.rolling(window=12).mean()

移動平均/標準偏差をとった結果は↓

DF検定には、statsmodelsという時系列用統計ライブラリを使う。statsmodelsは時系列を取り扱うときに何かと便利なので、扱えるようにしておきたい(statsmodels)

from statsmodels.tsa.stattools import adfuller

で、検定をしてくれる。検定結果は↓

Results of Dickey-Fuller Test:
Test Statistic                   0.815369
p-value                          0.991880
#Lags Used                      13.000000
Number of Observations Used    130.000000
Critical Value (1%)             -3.481682
Critical Value (5%)             -2.884042
Critical Value (10%)            -2.578770

この表の見方だが、Test StatisticとCritical Valueを見比べる Test Statisticの値が、Critical Valueを下回らないと定常とはいえない。

たとえば、Test Statisticが-3.0だったとすると、95%以上の信頼を持って定常といえると結論付けることができる。ともかく、このままだとこいつはまったく持って定常ではないデータなのである。

時系列データを定常状態にしたい

変動要因にはいろいろある

  • トレンド
  • 季節変動
  • ノイズ
  • 小変動(周期性あり)

定常性に響くトレンドをうまく取り除き、定常状態にしてやりたい。 下記の要領で行っていく

  1. positiveトレンドのときは、大きい値にペナルティを与えるような変換をかける。さまざまな変換がある。

    • logをとる
    • logit変換{$z_n = \log{\frac{y_n}{1-y_n}}$}
    • 差分
    • ルート、三重根をとる
  2. トレンド成分を取り出す

    • Aggregation : 週/月ごとにまとめた平均を取る
    • Rolling : windowをスライドさせながら平均を取る(移動平均)
    • Polynomial Fitting : 回帰でフィッティングさせる
  3. Originalからトレンド成分を引く
  4. テストをしてみる。

の要領でやっていく。今回はlogをとって、移動平均にかけて、Originalから引いてみた。 移動平均には、普通の平均をとるのと、最近の時間ほど重みを強くかけるexpweighted moving average**の二種類をとった。後者は時間幅を厳格に設定しなくてよいため、クリティカルな窓幅が想像できないときなどに、柔軟に扱える。

moving averageによってトレンドを求めた結果がこちら

このトレンド成分(weighted moving average)をOriginalから引いたのがこちら

この結果を検定にかけると、下記の結果になる

Results of Dickey-Fuller Test:
Test Statistic                  -3.601262
p-value                          0.005737
#Lags Used                      13.000000
Number of Observations Used    130.000000
Critical Value (1%)             -3.481682
Critical Value (5%)             -2.884042
Critical Value (10%)            -2.578770

99%以上定常状態といえる。このようにして定常性を消すと良い。

時系列の予測

最後に予測。 予測によく使われるARIMA(Auto-Regressive Integrated Moving Average)の説明をしながら、実際に使ってみる。 ARIMAは、ARモデルと、MAモデルを統合したモデルとなっている。

ARIMAには、下記のパラメータを用いる

  • p (number of AR terms) : 自己回帰の窓幅を何個前まで取るか
  • q (number of moving average) : 移動平均の窓幅を何個前まで取るか
  • d (number of differences) : 一次の差分か二次の差分か

p=0だとMA、q=0だとARモデルとできる。

pとqを決めるための大事な量がACF(Autoorrelation FunctionPACF(Partial ACF)

  • p : ACFのupper confidential intervalがクロスするラインを選ぶ
  • q : PACFupper confidential intervalがクロスするラインを選ぶ

と良いらしい。これもstatsmodelsで利用可能。

from statsmodels.tsa.stattools import acf, pacf

*1 よさげなpとqがわかったら、ARIMAにかけてみる。 これもstatsmodelsで利用ができる。

  • モデル初期化はARIMA(p,d,q)の順番
    • p=0でMAモデル
    • q=0でARモデル
  • sklearnのように、fitでモデル作成
ts #時系列データ
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(ts, order=(2, 1, 0))  
model.fit()

いろいろとわちゃわちゃしながら*2の結果がこちら

定量評価には、RMSE(Root Mean Square Error)を使ってみた。自分で簡単に実装できるが、復習もかねてsklearn.metricsを使ってみる。

from sklearn.metrics import mean_squared_error
print("ARIMA:", np.sqrt(mean_squared_error(df.Passengers, df.ARIMA)))
print("MA", np.sqrt(mean_squared_error(df.Passengers, df.MA)))
print("AR", np.sqrt(mean_squared_error(df.Passengers, df.AR)))

今回はARが最も良かった模様?

ARIMA: 50.2956404427
MA 43.9652476837
AR 20.4183022135

まとめ

時系列分析事始ということで、調べたいリソースを集約するのと、はじめのチュートリアルまでを行った。 statsmodelsをとりあえず知っておけば、ぱぱっとした分析には良いなという感じなので、習得しておきたいところ。

しかし最近、facebookが時系列ツールを出したので、そちらのキャッチアップもしておきたい。 なので、明日はfacebook謹製の時系列予測ツールprophetについて触れたい。

明日もお楽しみに!

*1:でも結局pとqは試行錯誤で選ぶ気もしている

*2:詳しくはgithbをご覧ください

PROCRASIST