慶應大学 長倉大輔 様「 時系列分析 1 」を参照させていただきました。
一定の時間間隔で観測されたデータ \(y_t\)を時系列データと言います。
データを確率変数と見れば、期待値、分散が考えられます。
期待値:\(E(y_t)=\mu_t\) 分散:\(V(y_t)=\sigma_t^2\)
データが統計的に分析可能であるために、これらが時間tに依存しないという前提を設けます。
期待値:\(E(y_t)=\mu\) 分散:\(V(y_t)=\sigma^2\)
時点 \(t=1,2,\cdots,T\)
までのデータの集合 \(\left(y_1,y_2,\cdots,y_T\right)\)
に対し、
(標本平均) \(\displaystyle
\overline{y}=\dfrac{1}{T}\sum ^{T}_{t=1}y_{t}\)
定常性という仮定のもとで、\(\bar{y}\)
は\(E(y_t)=\mu\)
の推定値となります。
時間tによって \(y_t\)の期待値が変わらないから、T個のデータから計算した平均が他の
tでも当てはまると考えるのです。
(分散) \(V(y)=\dfrac{1}{T}\displaystyle \sum
^{T}_{t=1}\left( y_{t}-\overline{y}\right)^2\) も \(V(y_t)=\sigma^2\)
の推定値となります。
さらに、
\(y_t\)からkだけ時間をずらした系列\(y_{t-k}\)も定常性の仮定を満たし、
期待値:\(E(y_{t-k})=\mu\) 分散:\(V(y_{t-k})=\sigma^2\)
\(y_t,~y_{t-k}\)の共分散と相関係数の推定値を次のように求めることができます。
(標本自己共分散) \(\widehat{\gamma }_{k}=\dfrac{1}{T}\sum ^{T}_{t=k+1}\left( y_{t}-\overline{y}\right) \times \left( y_{t-k}-\overline{y}\right)\)
(標本自己相関) \(\widehat{\rho}_{k}=\dfrac{\widehat{\gamma}_{k}}{\widehat{\gamma}_{0}}\)
実際の計算はRの時系列パッケージで行うことができます。
分析に必要なパッケージを読み込みます。
library(TSstudio)
library(MLmetrics)
##
## 次のパッケージを付け加えます: 'MLmetrics'
## 以下のオブジェクトは 'package:base' からマスクされています:
##
## Recall
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(TTR)
library(quantmod)
## 要求されたパッケージ xts をロード中です
## 要求されたパッケージ zoo をロード中です
##
## 次のパッケージを付け加えます: 'zoo'
## 以下のオブジェクトは 'package:base' からマスクされています:
##
## as.Date, as.Date.numeric
時系列データとはどのようなものでしょうか。
当サイト情報Ⅰ_試作問題_参考
に時系列データの例があります。
時系列データは次の成分に分解されます。(時系列分解)
トレンド (Trend) | データの長期的変化・傾向 | |
季節変動 (Seasonal) | 周期変動 | |
誤差変動 (Random) | 誤差による変化 | |
これらの基礎成分から時系列データを合成してみます。
0.2ずつの増加をトレンドとします。
trend <- seq(0, 8-0.2, 0.2)
str(trend)
## num [1:40] 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 ...
plot(trend,type='l')
簡単のため8ヶ月周期の変化 5サイクルを季節変動とします。
kisetu <- rep(c(0,2,4,2,0,-2,-4,-2), 5)
str(kisetu)
## num [1:40] 0 2 4 2 0 -2 -4 -2 0 2 ...
plot(kisetu,type='l')
誤差は、平均0、標準偏差1の正規分布に従うものとします。
誤差変動は標準偏差の2倍、即ち \(\pm1\)の範囲に収まります。
gosa <- rnorm(40,0,1)
str(gosa)
## num [1:40] 0.21 -1.122 1.235 0.626 0.608 ...
plot(gosa,type='l')
合成した時系列データ
トレンド+季節成分+誤差成分 を時系列データとして図示します。
x <- trend+kisetu+gosa
plot(x,type='l')
データ形式を時系列に変換
xを関数tsによって時系列データiceに変換し、パケージの関数ts_decompos
で時系列分解します。
ice<-ts(x,start=c(2016,1),frequency=8)
ts_decompose(ice)
自己相関とは、\(y_t\)と \(y_t\)からkだけ時間をずらした系列\(y_{t-k}\)との相関係数です。
ACF(autocorrelation
function)のグラフはラグkを横軸にとった自己相関係数のグラフです。
季節変動(12ヶ月周期)ならば、k=12で1回目のピーク、k=24で2回目のピークが観測されます。
iceの例は8ヶ月周期に作られているので、k=8ごとにピークを観測します。
str(ice)
## Time-Series [1:40] from 2016 to 2021: 0.21 1.08 5.64 3.23 1.41 ...
acf(x,plot=T)
パッケージTS の関数ts_corを用いると、季節変動の周期(Seasonal Lag)が分析により表示され、PACFは片自己相関係数(partial autocorrelation function)で、間の観測値の影響を除去した相関係数です。
ts_cor(ice, lag.max = 60)
季節変動の大きさを変えると時系列分解はどうなるでしょうか? 参考までに、少し変えたデータで時系列の合成と分解を行ってみます。
tre <- seq(0, 32-0.2, 0.2)
kisetu <- rep(c(0,4,8,4,0,-4,-8,-4), 20)
gosa <- rnorm(160,0,1)
x <- tre+kisetu+gosa
plot(x,type='l')
ice<-ts(x,start=c(2016,1),frequency=8)
ts_decompose(ice)
ts_cor(ice, lag.max = 60)