データ分析ガチ勉強アドベントカレンダー 12日目。
今までは、時間に依存しないデータについて取り扱ってきました。 しかし、世の中のデータは時間に依存したデータも多いのが事実です。
時間に依存しないデータは、その分各データを独立に扱うことができますが、時系列データはそういうわけにはいきません。なので、なかなか難しいのです。
今日は時系列のさわりをまとめて、また、時系列予測のチュートリアルをしていきます。
参考にできるサイト
時系列を学ぶにあたって、参考にした&参考にしたいサイトを列挙しておきます。 どれも充実した内容なので、一度は目を通しておくといいかもしれません。
メタ的な記事
- 時系列分析(前編)~「使ってみたくなる統計」
- 定性的に書いている。時系列データの勉強のさわりによさそう
- 実務の現場に多い時系列データ分析の際に注意しておきたい点を列挙してみる
- 実務ではまる落とし穴などについて解説している。
- 時系列に関しては他記事も含め、非常に勉強になる
- A comprehensive beginner’s guide to create a Time Series Forecast (with Codes in Python)
- Time Series Analysis: A Primer
- 英語
- Analysisの種類や性質について述べている。包括的
- 時系列解析:自己相関係数, 定常性, White Noise, AR, MA, ARMA, ARIMA, ARIMAXについて【調べたら随時追加】
- 時系列で使う言葉について調べてまとめている
pythonの実装も含めて
- A Guide to Time Series Forecasting with Prophet in Python 3
- 時系列事始としてよさそう
- statsmodelsの使い方の練習にもなる
- Prophet Quick Start
- 時系列ライブラリprophetを使いながら、時系列の取り扱いについて学べる
- Statsmodel examples
- 時系列の大事な解析方法が実装ありきで載っている
ディープラーニング系
- RNNで来月の航空会社の乗客数を予測する:TFLearnでLSTMからGRUまで実装しよう
- RNNでの時系列予測について実装まである
- GRUまで説明されているの割と少なかったので。
- いまさら聞けないLSTMの基本
- LSTMを詳しく解説した日本語記事ってあんまりないので重宝
- CNN better than LSTM/GRU for time series
- 最近CNNも時系列に使われ始めているってやつ
本
読んでる本、読みたい本を列挙しておく
本 | 内容 |
---|---|
時系列解析入門 | クラシカルな時系列データ分析が載っている本。数式をベースにきちんとした説明なのでよい。状態空間モデルのあたりは結構難しいが、たどり着きたいところ |
経済・ファイナンスデータの計量時系列分析 (統計ライブラリー) | 未読。いいらしい。 |
岩波データサイエンス Vol.6 | 時系列に関する最新トピックを集めた本。かなり面白いが、それなりの素養が必要 |
詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~ | KerasとTensorflowを使ってRNNを実装する本。LSTMの説明などもされていて、ディープラーニングのモデルを実装しつつ勉強ができる。 |
読みたい論文(積読)
(見出しを押せば論文にとびます)
Toeplitz Inverse Covariance-Based Clustering of Multivariate Time Series Data
2017年KDDのBestPaperを受賞している。時系列を分析して状態をクラスタリングするという旨の論文。
スポンサーリンク
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)
データの用意
pandasを用いてデータを用意する 使うデータは International Airport Passengers
定常性のチェック
- 平均や分散がずっと一定ならstarionary(定常)といえる
- 多くの時系列モデルは定常性を仮定しているので、定常性のチェックは重要。
使用しているデータを見ると、増加傾向にあることがわかる(上図)。これだと平均や分散が一定とならないように見える。 ちゃんと調べるために、下記の処理を施してみる
- moving averageやmoving distanceをとってみる(sliding window)今回は、季節変動的なのも吸収したいから12か月分
- 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%以上の信頼を持って定常といえると結論付けることができる。ともかく、このままだとこいつはまったく持って定常ではないデータなのである。
時系列データを定常状態にしたい
変動要因にはいろいろある
- トレンド
- 季節変動
- ノイズ
- 小変動(周期性あり)
定常性に響くトレンドをうまく取り除き、定常状態にしてやりたい。 下記の要領で行っていく
positiveトレンドのときは、大きい値にペナルティを与えるような変換をかける。さまざまな変換がある。
- logをとる
- logit変換
- 差分
- ルート、三重根をとる
トレンド成分を取り出す
- Aggregation : 週/月ごとにまとめた平均を取る
- Rolling : windowをスライドさせながら平均を取る(移動平均)
- Polynomial Fitting : 回帰でフィッティングさせる
- Originalからトレンド成分を引く
- テストをしてみる。
の要領でやっていく。今回は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 FunctionとPACF(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について触れたい。
明日もお楽しみに!