St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

時系列解析:自己相関係数, 定常性, White Noise, AR, MA, ARMA, ARIMA, ARIMAX, SARIMAについて【調べたら随時追加】

こんにちは。

最近時系列解析をすることになり、AR, MA, ARMA, ARIMA, ARIMAX, SARIMAあたりについて勉強したので、それについてまとめておこうかと思います。

ぶっちゃけいろんなところにもうすでに解説は出ているので、これは調べている過程で参考になったリンクまとめ&個人的メモみたいな感じになってます。

時系列解析とは

そもそも時系列解析とはなんぞやっていうことなんですが、過去のデータから未来のデータを予測することを言います(そのまんまかよみたいな笑)。

他の情報とかを利用するケースもあると思うんですが(あんまり深く勉強していないので、こんなのもあるよとかあれば教えて欲しい笑)、基本的には過去の自分自身のデータを用いて、つまり1変量のデータのみを用いて未来の予測を行います。

こちらの参考資料にもありますが、時系列データにおいて回帰分析を行うのはあまり得策ではありません。

時間軸における影響、例えば先月の銀行の預金額は今月の預金額に影響を与えるといった、時間軸における特徴をしっかり考慮したモデルを考えよう、ということで時系列解析を行います。

時系列データの種類

何も加工のしていない時系列データそのものは、原系列と呼ばれます。

これに対して、あとで示す定常性を満たすために、原系列を変換する処理として一般的に使われるものがいくつかあります。

対数系列 原系列に対数変換をしたもの
階差系列/差分系列 原系列の各時点から何時点か前の時点を引いた系列
対数差分系列 原系列に対数変換を施して、その系列の差分系列をとったもの
季節調整済み系列 季節変動の影響を取り除いた系列

自己相関係数(ACF), 偏自己相関係数(PACF)

自己相関係数とは、過去の値とどれくらい似ているかを表したものです。以下の関数の定義式を用いて計算されます。

自己相関係数(ACF) = \frac{ \sum{ (y_t - \overline{y} )(y_{t-lag} - \overline{y} )} }{ \sum{(y_t - \overline{y})^2 }}

  • 分母は、分散
  • y_t : 時刻tにおける値
  • lag : ラグ
  • \overline{y} : 平均

相関係数の時系列バージョンという感じですね。値も-1から1までの値をとります。

こちらで自己相関係数を実際に Rでプロットしているものがあるんですが、こんな感じで、今現在の値が過去のどの時点に影響を受けているか、を見ることは大事です。

このプロットされているグラフはコレログラフといい、Rとかでめっちゃ簡単に表せます(Pythonでもできます)。

以下で定常性の話をしますが、定常性を満たしているかどうかを確認する上でも、この自己相関係数は重要です。以下の事実は、こちらにある通り、重要なのでここでも紹介させていただきます。

  • データが定常じゃないと直線になってしまう
  • データが定常だと「指数的に減衰」または「sinカーブを描きながら、減衰」となる

相関係数とは、注目している時点以外の要因を無視した自己相関係数のことです。例えば、昨日の関係はみたいけど、一昨日の要因は差排除して関係を見たいとかそういう時に使います。

以下の動画はACFとかPACFを理解するために参考になりました。
youtu.be

そこで紹介されていたのが、以下のテーブル。一応メモがてらこれだけ残しておきます笑。

AR(p) MA(q) ARMA(p,q)
ACF Tails off Cuts off after lag q Tails Off
PACF Cuts off after lag p Tails Off Tails Off

(弱)定常性

時間依存を調べることは、データの並び順に意味を見いだすことになります。なので、データの並び順を考慮しない「データが独立に抽出された標本」という前提条件に基づいた分析手法では、時間依存関係を調査することはできません。

そこで、「データが同一の分布に従う」という条件を元に、時間に依存した前提条件を考えることで、時系列データ解析が可能になります。その前提条件というのが、弱定常性というものです。

定常性には大まかに2種類定義があり、弱定常性と強定常性の二つがあるのですが、まずは弱定常性のみを示します。


【弱定常性の定義】
弱定常性を持つという定義は、任意のthに対して、以下を全て満たす時に言います。

  1. E(y_t)=a => 平均が一定
  2. Var(y_t)=\sigma_0 => 分散が一定
  3. Cov(y_t, y_{t-h}) = \sigma_h => 自己共分散がラグhにのみ依存


次に、強定常性の定義です。

【強定常性】
任意のthに対して、(y_t, y_{t+1},...,y_{t+h})^{T}の同時分布が同一になる場合、過程は強定常性という。

これらの定義から、弱定常性は「時点ではなく、lagにのみに線形の依存関係が存在する」ことを示していること、強定常性は「時点ではなく、lagにのみに線形の依存関係が存在するだけでなく、すべての形の依存構造がlagにのみにある」ことを示していることになります。

White Noise

定常な時系列の中でももっとも簡単で重要な系列であるのが、このWhite Noise(ホワイトノイズ、白色雑音)です。White Noiseでとは、平均が0、分散がある一定の値をとり、全ての自己共分散が0になっているものをさします。

【定義】

  • E(y_t)=0 => 平均が0
  • Var(y_t)=\sigma^2 => 分散がある一定の値をとる
  • Cov(y_t, y_{t-h}) = 0 => 自己共分散が0

このWhite Noiseは、時系列モデルにおいて確率的変動を表現するところとして表現することができます。また、White Noiseが弱定常性を満たすことは明らかです。

■参考文献

White noise - Wikipedia

見せかけの回帰・単位根検定・共和分検定

ARIMAなどのモデルに入る前に、このテーマについて扱っておきます。

見せかけの回帰とは、こちらのブログで示されている説明を引用させていただくと、

デタラメな2つの数字同士であっても、それが「前の日の分に今日の分を足す」操作をするだけで、勝手にお互いに関連があるように見えてしまうのです。これが見せかけの回帰です。

ということらしいです。見せかけの回帰についてや単位根過程についてはこちらに詳しくかいてあり、それも参考になりました。

AR, MA, ARMA, ARIMA, ARIMAX, SARIMA

AR(Auto Regressive model)

まず、定義は以下の通り。

y_{t} = \sum_{i=1}^{p} \gamma_{i}  y_{t-i} + C + \epsilon_{t}

  • p : lagの数
  • C : Constant
  • \gamma_{i} : parameter
  • \epsilon_{t} : White Noise

\gamma_{i}の値が例えば正の値を取ると、過去のその時点と同じ方向に進もうとする傾向が強くなるので、時系列におけるデータの変化が同じ方向に行こうとします。

逆に、負の値を取ると、過去のその時点と逆の方向に進もうとする傾向が強くなるので、時系列における変化がブレブレになります。

MA(Moving average model)

定義は以下の通り。

y_{t} = C + \epsilon_{t} + \sum_{i=1}^{q} \theta_{i}\epsilon_{t-i}

  • q : lagの数
  • C : Constant
  • \theta_{i} : parameter
  • \epsilon_{t} : White Noise

これを見ると、パラメーター\theta_{i}の値が正だと、同じ方向に動く傾向があり、また負だと逆方向に進む傾向が強くなるので、時系列における変化がブレブレになります。これは、ARと同じような感じです。

ARMA

先ほど示したARモデルとMAモデルを組み合わせたものです。定義は以下の通り。

y_{t} = C + \sum_{i=1}^{q} \theta_{i}\epsilon_{t-i} +  \sum_{i=1}^{p} \gamma_{i}  y_{t-i}

ARIMA(Auto Regressive Integrated Moving Average)

沖本先生の本に実際の定義はあるらしいのですが、こちらの方から引用させていただくと、

d階差分をとった系列が定常かつ反転可能なARMA(p,q)過程に従う過程は次数(p,d,q)の自己回帰和分移動平均過程もしくはARIMA(p,d,q)と呼ばれる。

ということらしいです。d=0の時は、ARMAモデルということになりますね。

ARIMAX

これは、ARIMAモデルは基本的には上で適宜される1変量による自己回帰なんですが、例えば曜日とか天気とか気温とかそういう効果を取り入れたいときに、使用するモデルです。これについては、こちらの記事が参考になりました。

SARIMA

以下の資料がわかりやすかった。ARモデルやMAモデルなどとの関係についても触れられていて、とてもよくまとまっていた。

DeepLearningで時系列解析

以下の資料を最近見つけた。

http://qiita.com/HirofumiYashima/items/a09f939c2f4d382640d0qiita.com

状態空間モデル

[工事中]

そのほか

ARFIMAなど、他にもたくさんあるみたいです笑。またここは調べたら更新します。

実装

R

Pythonでもできるみたいですが、色々調べた感じでは、Rの方がパッケージの充実度や使い勝手としては高い感じの印象を受けました。Pythonの方が言語としては好きなので、色々頑張りましたが結局自分はこの前のプロジェクトではRで実装しました笑

時系列解析系で使えるRのパッケージの一覧は以下にあります。

CRAN Task View: Time Series Analysis

ありすぎてやばいっすね。笑

で、どうしよっかなーと思っていたら、以下の資料を見つけました。

www.slideshare.net

Python

Pythonで時系列解析をしようと思ったら、statsmodelsが一番最初に思いつきます。

Pandasを使っての時系列データの扱い方と、statsmodelsの使い方は、以下の記事が参考になりました。Pandasのコミッターの方の資料なので、普段みないようなTipsがあってめちゃ参考になります。

statsmodels自体は、普通に線形回帰とかにも使えるので、便利です。

Prophet

Facebook社が開発した、時系列データの予測を行うことができるライブラリです。

○参考にした本



経済・ファイナンスデータの計量時系列分析


また書き足したら更新します。