時系列解析_理論編
最終更新:2017年6月1日
時系列分析という名前はご存知でしょうか? 残念ながらExcelで実行するのがやや困難であるためこの名前もあまり浸透していないのではないかと思います。
時系列解析は、回帰分析とは違ってあまり知らない人も多いと思うので、ざっと解説を載せておきます。これだけ読めば、時系列分析の雰囲気はつかめるのではないでしょうか。
時系列分析の基礎の基礎からSARIMAモデルまでを一気に解説します。
それと、便利なパッケージ forecast の紹介も。
Rを使えば簡単に計算できますよ。
Pythonを使いたい方は「Pythonによる時系列分析の基礎」の実装例も併せて参照してください。
スポンサードリンク
目次
1.時系列解析って何?
2.時系列データの扱い方
3.知ると便利な用語集
3-1.自己相関係数・偏自己相関係数
3-2.ARモデル(自己相関モデル)
3-3.MAモデル(移動平均モデル)
3-4.ARMAモデル(自己回帰移動平均モデル)
3-5.ARIMAモデル(自己回帰和分移動平均モデル)
3-6.SARIMAモデル(季節的自己回帰和分移動平均モデル)
4.便利なパッケージforecastの紹介
1.時系列解析って何?
時系列解析は、過去のデータから未来を予測するという手法です。
たとえば、一年前に魚が豊漁だったら、今年も豊漁になりやすいとか、そういう関係性があるのかというところを調べて予測に活用します。もちろん、回帰分析 のように別の要因の影響を取りこんで予測モデルを作ることも可能です。
とりあえずここでは一変量のデータのみを扱います。ようするに、過去の自分のデータしか使わないということです。
2.時系列データの扱い方
まず、時系列データにおいて、回帰分析は余りお勧めできません。
なぜか。
例をあげます。たとえば、北海道に牛の赤ん坊が生まれて、また沖縄にも同時刻に人間の子供が生まれたと。このとき、牛の子供と人間の赤ん坊の体重を回帰させてやると、おそらくきれいな回帰直線がひけます。両方とも成長しているからですね。
でも。そんな回帰分析には何の価値もないでしょう。北海道の牛がダイエットしたから沖縄の少年の体重が軽くなるなんてことはあり得ないわけです。でも、 回帰直線は引っ張れてします。ようするに、誤った予測をしやすくなってしまう訳。
このようなデータなら、「北海道の牛がダイエット翌日にちゃんと沖縄の少年の体重が軽くなっているか」を調べる手法が必要になりますね。そんな手法も時系列分析が提供してくれます。
また、ちょっとコアな話ですが、誤差が累積していくデータ(たとえばランダムウォークしているデータ)に対して、回帰分析は無力だと言うことが知られています。
具体的に言うと、誤差が一日ごとに累積していくと考えられるデータに対して回帰分析をしたときの検定結果は全く信用できないものとなります。これも時系列分析なら解決できます。
そこで「なんでも回帰分析」ってのはやめ、時系列データの特徴を丁寧にみてやって、時系列モデルを組み立てて行くことになります。
参考:時系列データへの回帰分析
→時系列データに対して回帰分析をしたい方はこちらを参照してください。
3.知ると便利な用語集
ここではいちいち時系列解析の細かい解説はしません。が、知っとかないとプログラムもできないし予測もできないというくらい大事な 「用語」にかんしては、すこしだけ書いておきます。雰囲気をつかむ程度ならこれで十分でしょう。
3-1.自己相関係数 ・ 偏自己相関係数
自己相 関係数は、過去の値とどれくらい似ているか(あるいは似ていないか)を表したものです。
たとえば、一日前と大きな正の自己相関があれば、「一日前に多ければ、今日も多い」ということになり、2日前と負の自己相関があれば「二日前に多ければ、 今日は少ない」ということになります。
R では acf( データ ) で図示してくれます。
偏自己相関係数は、注目している時以外の要因を無視して計算された自己相関係数です。一日前と今日の関係が知りたくて、一昨日の要因何か見たくないよってときにはこちらを使います。
Rでは pacf( データ ) で図示してくれます
3-2.ARモデル(自己回帰モデル)
自己回帰とは、その名の通り自分のデータと回帰する手法です。ようするに、一日前の値を横軸に、一日後のデータを縦軸にしてプロットし、線を引っ張ると言うイメージです。
一番簡単な時系列モデルです。
Rでは ar( データ , aic=TRUE ) でモデリングしてくれます。 aic=TRUE がデフォルトなので、AICで勝手にモデル選択(モデル選択を知らない方はこちらをどうぞ)をしてくれます。便利。
ただし、step()関数と同じく、全部のモデルを総当たりにAIC計算をしてくれているわけではどうやらなさそう(?)。ようするに、計算量をちょっとケチってるんですね。なので、モデル選択してくれた後でも、一応手作業で気になるモデルのAICを計算した方がいいかもしれません。
1期前のデータだけから回帰したARモデルを AR(1) と表します。同様に p期前までの全てのデータを使って今日のデータを予測するモデルはAR(p)モデルと書きます。
3-3.MAモデル(移動平均モデル)
こちらは、ちょっと込み入ったモデルです。というのも、「移動平均」という名前が悪い。これって歴史的な経緯(?)があってこんな名 前になったんですね。
まず、普通の移動平均の説明をします。
4 2 6 10 14 18
こんなデータがあったとします。 これを3区間移動平均をしてみます。すると……
(4+2+6)/3、 (2+6+10)/3、 (6+10+14)/3、 (10+14+18)/3
= 4 6 10 14
となりますこれが移動平均。 ようするに3地点の平均をずらしながらやっていったら3点移動平均になるわけです。
ここで、緑の部分に注目。移動平均する際のたんなる計算過程なのですが・・・・・
4番目の移動平均結果 14 = 10+14+18 ÷3
3番目の移動平均結果 10 = 6+10+14 ÷3
2番目の移動平均結果 6 = 2+6+10 ÷3
1番目の移動平均結果 4 = 4+2+6 ÷3
青い部分を見てください。4番目の結果に使用されているデータが3番目2番目の移動平均結果にも用いられていることが分かります。
同じ数字が使われている⇒似ている⇒相関があるということになります。
要するに、「移動平均みたいに、一部同じ数字を使って表されたデータは自己相関を持つ」 ということになるわけです。これを利用したのが移動平均モデル。
ちなみに、ここには書きませんが、式の形は全く移動平均の式に似ていません。「一部同じ数字を使って表されたデータは自己相関を持つ」というところだけが一緒です。
MAモデルだと、一日前と大きな自己相関があるとかいう現象や周期性うまくモデリングすることができます。
また、さきほど説明したARモデルとは密接な関係があるのですが、ここでは紹介しません。
3期移動平均モデル(要するに上の例と同じ)はMA(3)と表します。同様にq期移動平均モデルは
MA(q)と表記します。MA(q)はq個同じ数字を使っているわけなので、q期前までとは自己相関があり、q+1期前のデータとは自己相関がありません。
3-4.ARMAモデル(自己回帰移動平均モデル)
名前の通り、さっき解説したモデル(ARモデル、MAモデル)を両方突っ込んだモデルです。
3-5.ARIMAモデル(自己回帰和分移動平均モデル)
データの差分を取ってからARMAを適用したモデルです。
差分を取るのに、なぜ和分? って自分はむかし気になったんですが、要するに視点の問題ですね。もともとの値が累積していって生じた モデルだから和分過程。和分過程を元々のARMA過程に直すためには、差分を取ることになるわけです。
Rでは
arima.sim(n=乱数の数, model=list(order=c(p,d,q),ar=c(ARの係数),ma=c(MAの係数)),sd=sqrt(1))
で d 回の和分過程のAR(p)、MA(q) から生じるデータ(以下はARIMA(p、d,q)と記します)を作り出すことができます。シミュレーションに便 利。
実際のモデル推定は
arima(データ , order=c(p,d,q) )
で計算できます orderのあとのp、d、qには、それぞれAR(p)、d 回和分、MA(q)モデルの寄せ集めだということの指定をします。この時のモデルをARIMA(p、d、q)と記します。
3-6.SARIMAモデル(季節自己回帰和分移動平均モデル)
ARIMAモデルに、さらに周期的な変動(季節変動とか)を取り入れさせたモデルです。
Rでは arima( データ , order=c(p,d,q),seasonal=list(order=c(pp,dd,qq) )
で 推定可能です。この場合、パラメータの数は p+d+q+pp+dd+qq 個分推定することになります。この数字の組み合わせのパターンだけでも、嫌になるくらい多くなりますね。AR(1)にするか、AR(2)にするかそれとも2回差分をとるか1回でいいのかも考えないと……って延々数値を突っ込みモデ ルを作り続けるのは大変に面倒です。
そこで、以下の章では便利なパッケージ その名も forecast を紹介します。
4.便利なパッケージ forecast
forecast パッケージはCRANに登録されているので、
Rを管理者として実行⇒メニューバーのパッケージ⇒パッケージのインストール⇒CRANmirrorから適当にミラーサイトを選ぶ(例えばJAPAN (Tsukuba)など)⇒forecastを探し出してダブルクリック
でインストールできます。
簡単なモデル作成関数として
auto.arima(データ , ic=”aic” , trace=T , stepwise=T)
があります名前(auto.arima)の通り、全自動でモデル選択をしてくれます。季節成分があるかも勝手に判断してくれるので、大変に便利です。
ic=”aic” は、AICを情報量基準として使用してモデル選択をしてねという指定。AIC以外にも、AICc(aiccと入力)とか、BIC(bicと入力)なんかも使えます。
trace=T はデフォルトではFなのですが、あった方が良いと思います。これをTにしておくと、「こう言うモデルを作ってみてAICを計算してみましたよ」という計算履歴の一覧をずらずらと表示させることができます。
なぜこれが大事かというと、AICの計算もれがあるからですね。履歴を見て気になるところは手作業でAICを計算しましょう。
stepwice=Tは、計算をケチって素早く終わらせなさいよという指示です(デフォルトはT)。これをFにすると、時間がかかってしまいますが、その代り丁寧に計算をしてくれます。私はFにして計算させることが多いですが、Fにしたところで「すべての」組み合わせでやってくれるわけではないようです。一部抜けがあるんですね。
やっぱり、自動化されているとはいえ、人間が多少は汗を流した方がよいのかもしれません。
forecastな予測
パッケージforecastは、自動SARIMA推定だけでなく、色々な便利な関数が付いています。その中でも、forecast関数(forecastパッ ケージの中にこんな名前の関数があるのです。ややこしいですね)は大変便利です。将来予測+任意の予測区間の推定が一発で出来上がります。
具体的には
plot(forecast(model, level = c(95), h = 50))
で、推定されたモデルの予測値と95%予測区間を50期先まで求めてプロットまでしてくれます。
数字そのものが知りたいならばplotを抜いて。
forecast(model, level = c(95), h = 50)
ってすれば数字がずらずらと出て来ます。
この関数はlevel=c(95) の95を変えれば色々な予測幅を計算することができます。たとえば50%予測区間とか。また、level=c(50,95) とすれば、50%予測区間も95%予測区間も両方同時に求めることができます。
とても便利なパッケージですので、是非使ってみてください。
参考文献
時系列分析と状態空間モデルの基礎: RとStanで学ぶ理論と実装 管理人の書いた時系列分析の入門書です。 時系列分析のイロハのイから解説しました。ARIMAモデルも載ってます。 サポートページはこちらです。目次なども公開されています。 |
経済・ファイナンスデータの計量時系列分析 (統計ライブラリー) このサイトで時系列解析関連の記事を書く際は必ず参照している本です。 時系列解析の基本となる考え方から始めて、モデルの詳しい説明まで載っています。 今、時系列解析を学びたいと思った方はこの本から入ると良いでしょう。 |
Rによる時系列分析入門 Rを使ってARIMAモデルを推定する方法がとても丁寧に乗っています。 forecastパッケージは使っていないのでコードをそのまま使うのは無理かもしれませんが、時系列解析の基礎を学ぶには良いと思います。 |
現場ですぐ使える時系列データ分析 ~データサイエンティストのための基礎知識~ 大変読みやすい、Rによる時系列解析の入門書です。 ARIMAモデルが載っていないのは残念ですが、ARモデルの説明はあります。 GARCHモデルなどより進んだモデルのことも載っています。 |
書籍以外の参考文献
Package ‘forecast’ 説明書(PDF)
http://cran.r-project.org/web/packages/forecast/forecast.pdf
前のページ ⇒ 平滑化スプラインと加法モデル へ
次のページ ⇒ 時系列解析 実践編 へ
スポンサードリンク
>>「MAモデルだと、一日前と大きな自己相関があるとかいう現象や周期性うまくモデリングすることができます。」
MAモデルで周期性をうまくモデリングできるとはどういうことでしょうか?
capriceさま
管理人です。コメントありがとうございます。
コメントがあることに気付かず、お返事が遅くなってしまい、申し訳ありません。
まず、ご返答を率直に申し上げると、MAモデルで周期性を表すことは可能です。
ただし、周期性を「うまく」モデリングできるか、というと、難しい。ここはやや語弊がありました。
周期性をモデリングするならば、SARIMAモデルを使った方がずっと良いと思います。
このサイトでもVARモデルの解説を載せた際に参考にさせていただいた「時系列分析とその経済分析への応用:計量経済の新しい動向」という文献(http://warp.da.ndl.go.jp/info:ndljp/pid/8379094/www.mof.go.jp/pri/publication/financial_review/fr_list2/r23/r_23_048_072.pdf)
があるのですが、ここに以下のように記されています。
(以下引用)
『図2 . 1c は,MA(2)の例としてy2 t=ut+0.8ut -1+0.6 ut - 2の場合を示している。これらの例は,移動平均によって,相関が生じ,(厳密ではないが)ゆっくりとした周期的な変動が生じるつつあることを示している。』
と記されています。
MAモデルだと周期性を全く表せない、なんてことはないでしょう。
ただ、この文献にも「厳密ではない」と書かれていますし、この文献は規則性と周期性をいっしょくたにして使っているふしも見受けられますね。
また、私のサイトの本文にも記されているように、MA(q)はq個同じ数字を使っているわけなので、q期前までとは自己相関があり、q+1期前のデータとは自己相関がありません。
そのため、長期的な周期性については、普通MAモデルでは表しません。長期的な変動を表すためには、とても多くのパラメタを推定しなければならないからです。
というわけで、MAモデルでもパラメタ数をすごく増やせばある程度の周期性は表すことが可能です。
でも、普通、そんなことはしません。
周期的な変動を表すならば、本文中にも示されたSARIMAモデルを使うのが良いでしょう。
貴重なご意見ありがとうございました。
船の動揺に関して、ARMAモデルで運動方程式を表しそれを状態空間モデルに変形させ、各係数(パラメーター)を求めたいのですが、ARMAモデルを状態空間モデルに変形させ推定することは可能でしょうか?
くろまる様
管理人の馬場です。
コメントありがとうございます。
「ARMAモデルで運動方程式を表し」という部分が何を目指しているのか
ちゃんと理解できているわけではありませんが、
とりあえず、状態空間モデルを使ってARMAと同様のモデルを構築することは可能です。