Python 時系列分析

【Python】ARモデルで時系列データ分析をやってみる

この記事は約5分で読めます。

 

 

こんにちは、ミナピピン(@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モデルによる時系列予測をやってみる

 

 

 

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

タイトルとURLをコピーしました