モモノキ&ナノネと一緒にRで時系列分析を試してみよう
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPsHNlhMjQ69CPed7G5LOh78UYrVlW8I7ub6n_1LotAMN7AH44sWaQQLI7svnvDY2N8MyOVmjYGQIgm8dBM9acTMehf1MO_MS7L_uU6G61tS453APVnBqLa9zaiyUSfAMYd1lV7pyGQXU/s1600/pens.jpg)
Rで時系列分析、AirPassengersデータとSARIMAモデルを使って予測をやってみよう
ナノネ、統計解析用フリーソフト『R』の使い方を練習するよ。今回は時系列分析をやってみよう。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
時系列分析だね!データはPythonでも使ったAirPassenger?
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
うん。Rだとデフォルトでデータが入ってるから読み込みもラクチンだね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
さっそくAirPassengersのデータをチェックしてみよう。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
AirPassengers
飛行機乗客数のデータで1949年から1960年までの月次データ。数値は人数で、たしか千人単位だったよね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
plot(AirPassengers)
Rにおまかせでグラフにプロットしてみた。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
class(AirPassengers)
時系列データは『ts』とうい形式になるみたいだよ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
str(AirPassengers)
tsはTime-Seriesの略みたいだね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
Rで時系列分析をやるのは今回が初めてだから、まだやりかたが良くわからないけど...。グーグル先生に質問しながら、とりあえず実践してみよう。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
ラジャー。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
まずはデータ準備。AirPassengersは144カ月、12年分のデータがあるね。モデルで予測もやりたいから、モデル作成用のデータは最後の1年分を除外しておこう。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
data <- AirPassengers[1:132] # 1:(144-12)
最後の1年分を除外して、こんな感じかな??
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
print(data)
class(data)
モモノキ、ダメみたい。ts形式だったのに、ただのベクトルデータになっちゃった。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
時系列データはts()を使ってデータを加工するといいみたい。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
data <- ts(AirPassengers[1:132])
data
OK、ts形式に戻った。でも年月の設定が消えちゃったけど?
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
ts()のオプションで設定できるよ。startとfrequencyに値を渡せばいいみたい。今回の場合はstartにベクトルで開始の年と月、frequencyは月次データだから12を設定すればOK。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
data <- ts(AirPassengers[1:132], start=c(1949, 1),frequency=12)
data
うまくいったかも。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
次はモデルの作成だけど、そのまえに準備。『forecast』というのを使うからlibrary()で読み込んでおいてね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
# install.packages("forecast") # 必要に応じてインストール
library(forecast)
forecast準備OK。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
参考までにstl()を使うと季節変動、トレンド、残差にデータを分離できるよ。グラフにも簡単にプロットできて、上から順に生データ、季節変動、トレンド、残差だよ。データチェックに活用できるね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
data.stl <- stl(data,s.window="periodic")
plot(data.stl)
Pythonで出力したグラフと一緒だ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
さっそくモデルをつくるよ。Rでも(S)ARIMAモデルを使ってみよう。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
今回もまたモデルの最適次数とか探すの?Pythonで試したときけっこう手間取ったよね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
auto.arima()を実行すれば推奨次数をRが全部を教えてくれるから簡単だよ。auto.arimaのパラメータはコメントを参考にしてね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
model.arima <- auto.arima(
data, # データ指定
ic = "aic", # 情報量基準の指定
trace = T, # トレース出力(結果一覧)
stepwise=T, # 計算時の次数パターン省略
approximation=F, # 近似計算の適用
seasonal=T # 季節調整
)
ARIMA(1,1,0)(0,1,0)[12]がベストだって言ってる。名前はARIMAだけど季節調整(SARIMA)にも対応してるんだ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
うん、季節調整の次数チェックもしてくれるから便利だね。もし手動でパレメータを設定したい場合は、下みたいなコードでモデルをつくれるよ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
arima(
data,
order=c(1,1,0),
seasonal=list(order=c(0,1,0))
)
tsdiag()で作成したモデルの残差などをグラフ化できるよ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
tsdiag(model.arima)
グラフが3個あるけど、見かたは?
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
一番上が残差プロット、2番目が残差の自己相関、3番目がリュング・ボックス検定だよ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
残差と残差の自己相関は小さいほどいいよ。検定はホワイトノイズか?のチェック的なもので、白点が青破線を下回らなければとりあえずOKだよ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
次は作成した(S)ARIMAモデルで予測をやってみよう。forecast()で予測を実行できるよ。引数はモデルとlevelに信頼区間、hに予測期数を指定すればOK。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
pred = forecast(model.arima, level=95, h=12)
pred
class(pred)
そのままグラフにプロットもできるよ。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
plot(pred)
Rだと信頼区間も簡単にプロットできて便利だね。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
後半期間をグラフで拡大、予測期間もあと1年増やして2年分でやってみよう。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
plot(
forecast(model.arima, level = c(95), h = 24),
flty = 2,
xlim = c(1958, 1962),
xaxp = c(1958, 1962, 4),
ylim = c(200, 800),
yaxp = c(200, 800, 3),
)
lines(AirPassengers, lwd=2)
legend("topleft",
legend = c("pred", "actual"),
lty = c(2, 1),
lwd = 2,
col = c(4, 1),
cex = 1.5,
bty = 'n',
inset = c(0.05, 0.03)
)
けっこういい感じ?に予測できたかも。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDSoP6vl_5WnLlwA0WQfOndPS60c3Mq-IWMPKGYFLtlARMmwlePN-DEFgisjtO8m-rR3UWX4fBRMhub86326dMSf7NWraSzDpKkjIU6R9jf7cunwXEj1I09jKXGcE1nD6lQuCppUX5cI/s1600/nanone_0002.png)
今回のRで時系列分析は以上で。
またね!
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbKSROKeuV3BXLIAOztOnRFfuhmKPVtu-ZjkheKcV1DNfxtegsG0xOznshi-tHHjqJ5iBlPSoQyu-cZ8qX2QufY5hGqJr9O8r90ps4WANvreSsz_HrqHFN462y-_j543eRgyGi6TlMp3M/s1600/momonoki_02.png)
0 件のコメント :
コメントを投稿