メインコンテンツへスキップ
見出し画像

書記が数学やるだけ#637 基本的な時系列モデルの推測

    実際のデータから時系列モデルを推測してみる。


    問題

    データは前回と同じものを用いる。

    画像


    説明

    自己回帰と移動平均を合わせたARMAモデルは,時系列モデルの基本として用いられる。さらに,差分系列を用いるARIMAモデル,季節周期を加えたSARIMAモデルなどと応用を広げることができる。

    画像


    モデルの同定は,大まかには以下の手順を辿る。

    画像


    トレンドを含むデータでは,差分を取ることで定常となるものもある(単位根過程)。

    画像


    単位根の有無を判定するにはいくつかの検定があり,この結果を踏まえて差分を取るかどうかを決めていく。

    画像


    解答

    ARMAモデルの次数については,AICが最小になるものを選ぶことにする。モデルが複雑になりすぎないよう,ここでは各次数を3までとしている。

    #自動ARMAパラメータ推定関数
    res_selection = sm.tsa.arma_order_select_ic(ts, ic='aic', max_ar=3, max_ma=3, trend='nc')
    res_selection


    するとこの中ではARMA(3,3)が最適と判断できる。

    画像


    ARMA(3,3)の各係数を推定することでモデルを作ることができる。

    #ARMAモデル
    arma_model = sm.tsa.ARMA(ts, order=(3,3))
    arma_result = arma_model.fit()
    arma_result.summary()


    画像


    しかしこれはうまくいかない。元のデータに対する当てはまりはいいが,予測となるとかなり怪しい。

    #ARMAモデルの2年後の予想
    arma_pred = arma_result.predict('1951-01', '1962-12') 
    
    plt.figure(figsize=(8, 4))
    
    plt.plot(ts, label="original")
    plt.plot(arma_pred, c="r", label="arma_pred", alpha=0.7)
    plt.legend(loc='best')


    画像


    コレログラムを再掲,自己相関があり非定常であることが予想できる。

    fig = plt.figure(figsize=(8, 8))
    
    #自己相関(ACF)のグラフ
    ax1 = fig.add_subplot(211)
    sm.graphics.tsa.plot_acf(ts, lags=40, ax=ax1)
    
    #偏自己相関(PACF)のグラフ
    ax2 = fig.add_subplot(212)
    sm.graphics.tsa.plot_pacf(ts, lags=40, ax=ax2)
    
    plt.tight_layout()


    画像


    例えばADF検定を行ってみると,帰無仮説「単位根あり」が棄却できないことから,次に差分系列(ARIMAモデル)を試すことにする。

    #ADF検定(原系列)
    dftest = sm.tsa.adfuller(ts)
    print('ADF Statistic: %f' % dftest[0])
    print('p-value: %f' % dftest[1])

    ADF Statistic: 0.815369
    p-value: 0.991880


    ARIMAモデルを作るために,上と同様に次数を決める。

    #ARIMAの次数推定
    res_selection = sm.tsa.arma_order_select_ic(delts, ic='aic', max_ar=3, max_ma=3 ,trend='nc')
    res_selection


    #ARIMAモデル
    arima = sm.tsa.SARIMAX(passengers,
    order=(3, 1, 3),
    seasonal_order=(0, 0, 0, 0),
    enforce_stationarity = False,
    enforce_invertibility = False
    ).fit()
    
    arima.summary()


    画像


    しかしこれもうまくいかない。

    画像


    残差の自己相関を見ると1年ごとに周期が見られるので,これを除去したSARIMAモデルを次に考える(コードは上とほぼ同様のため省略)。

    画像


    #SARIMAモデル
    sarima = sm.tsa.SARIMAX(passengers,
    order=(3, 1, 3),
    seasonal_order=(1, 1, 1, 12),
    enforce_stationarity = False,
    enforce_invertibility = False
    ).fit()
    
    sarima.summary()


    画像


    予測の当てはまりが改善され,残差の自己相関が無くなっており、上手くいっていそうである。

    画像


    画像


    実際の分析ではさらに評価すべき点はあるのだが,とりあえず今回はこのモデルを採用することとした。


    本記事のもくじはこちら:


    あなたへのおすすめ