こんにちは、ミナピピン(@python_mllover)です。今日はPythonで時系列モデルの一種であるARモデルを実装して時系列データ予測をしてみたいと思います。
ARモデルの特徴
・定常過程でしか使用できない
⇒ 【Python】「ADF検定」で時系列データの定常性・単位根を確認する
使用するデータ
お馴染みの航空データのあれです。アイスクリームの売上データと同じで周期性が明確なのでサンプルにはうってつけです。
# ライブラリをインストールする $ pip install pydse
# ライブラリの読み込み import numpy as np from pydse import data %matplotlib inline df = data.airline_passengers() df.plot()
ARモデルでの時系列分析をPythonで実装する
# 変化率を計算する df['change'] = df['Passengers'].pct_change() from statsmodels.tsa import ar_model for i in range(20): model = ar_model.AR(df['change'][1:]) maxlag = i+1 results = model.fit(maxlag=maxlag) print(f'lag = {i+1}, aic : {results.aic}')
<実行結果>
lag = 1, aic : -4.446973357475064 lag = 2, aic : -4.4631716863118545 lag = 3, aic : -4.447775449486837 lag = 4, aic : -4.547186384494698 lag = 5, aic : -4.535533168461425 lag = 6, aic : -4.52194132402394 lag = 7, aic : -4.544234892748647 lag = 8, aic : -4.838737433463194 lag = 9, aic : -4.862897005884629 lag = 10, aic : -5.369470828101987 lag = 11, aic : -5.667943927077143 lag = 12, aic : -6.097118563657251 lag = 13, aic : -6.15443976125231 lag = 14, aic : -6.146411714225788 lag = 15, aic : -6.149795460174459 lag = 16, aic : -6.143571088872173 lag = 17, aic : -6.145833721785127 lag = 18, aic : -6.144051613542763 lag = 19, aic : -6.122643951390369 lag = 20, aic : -6.125921513035268
時系列モデルのラグの次数はAIC(赤池情報量規準)を見て選択します。AICが最小になるモデルが最適なモデルという事になります。基準尺度にはAICの他にもBIC(ベイズ情報量規準)というものも存在しています。
ラグ13の時にAICが最小となっているので、今回はAR(13)とします。
次にモデルの当てはまりの良さを確認するために残差を算出してプロットします。
model = ar_model.AR(df['change'][1:]) result13 = model.fit(maxlag=13) # 残差 resid13 = result13.resid #残差プロット plt.bar(range(len(resid13)), resid13)
続いて自己相関係数も確認してみましょう。
from statsmodels.graphics import tsaplots tsaplots.plot_pacf(resid13, lags=40)
見て分かるようにほとんどが95%の有意水準に収まっていることがわかります。
ARモデルで時系列予測
train = df['change']['1949-02-01':'1953-12-01'] test = df['change']['1954-01-01':'1958-12-01'] from statsmodels.tsa.ar_model import AR ar = AR(train).fit(maxlag=20, ic='aic') # モデルに当てはめて予測する ar_predict = ar.predict('1954-01-01', '1958-12-01') plt.plot(test, label='observation') plt.plot(ar_predict, '--', label='forcast')
傾向は予測できていますが、スパイクについていけていない印象です。
⇒ 【Python】MAモデルによる時系列予測をやってみる
⇒ 【Python】VARモデルによる時系列予測をやってみる
⇒ 【Python】ARIMAモデルによる時系列予測をやってみる
⇒ 【Python】SARIMAモデルによる時系列予測をやってみる
コメント