LoginSignup
1
1

【実践時系列解析】電力需要をSARIMAモデルで予測する

Posted at

前回の記事「電力需要をARIMAモデルで予測する」に引き続き、電力需要だったら季節性があるだろうということで、季節性を考慮できるSARIMAモデルを利用して電力需要を予測する

前回記事:

当記事の内容は
・SARIMAモデルを適用し予測結果を可視化
・SARIMAモデルの季節性のパラメータをどのように調整したか
の2点をメインに記述していく

import

from statsmodels.tsa.statespace.sarimax import SARIMAX
import warnings
warnings.filterwarnings("ignore")
import statsmodels.api as sm
import pmdarima as pm
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

パラメータの調整

季節性を発見するための方法ですが、1年単位や半年単位、1ヶ月単位、1週間単位など人間の生活リズムなどと関係があるという想定でその辺りの数字を探索します。自己相関や偏自己相関のグラフで可視化して、季節性の数字が妥当かどうか確認します。

for i in [1,2]:
    for j in [3,7,14,30]:
        sns.lineplot(group_train.POWER.diff(i).diff(j))
        plt.show()

for i in [1,2]:
    for j in [3,7,14,30]:
        #自己相関係数のプロット
        sm.graphics.tsa.plot_acf(group_train.POWER.diff(i).diff(j).dropna(), lags=150)
        plt.xlabel(f'lags,i:{i},j:{j}')
        plt.ylabel('acf')
        

        #偏自己相関係数のプロット
        sm.graphics.tsa.plot_pacf(group_train.POWER.diff(i).diff(j).dropna(), lags=150)
        plt.xlabel('lags')
        plt.ylabel('pacf')

季節性を除いたからといって、定常性は発見できなかった。
原因として、電力需要は毎夏や毎冬などの年単位の季節性が存在すると考えられるが、データが1年分しかなく季節性を除外できなかったのかもしれない。

予測モデルの構築

手動でモデルを構築

sarima_model_log = SARIMAX(np.log(df_train), order=(2,1,2), seasonal_order=(0,1,0,30))
sarima_fit_log = sarima_model_log.fit()

fig, ax = plt.subplots(figsize=(20, 6))

min_lag = get_key_with_min_value(results_list)[0] + 1

forecast = np.exp(sarima_fit_log.forecast(len_test))
forecast.index = df_test.index

ax.plot(forecast, ls="-", color="r", label="predicted")
ax.plot(group_train.POWER, ls="-")

前半の方はうまくいっているが、後半の予測はうまくいっていない。ただし、ARIMAモデルやARモデルよりも予測はうまくいっているように思える。

スクリーンショット 2023-06-28 16.01.22.png

Auto_ARIMAを利用してモデル構築

Auto_arimaはおそらく、AICの最小化を基準にパラメータを選択しているように思われる。

pm.auto_arima(np.log(df_train),
             seasonal=True,
             m=30,
             n_jobs=1,
             maxiter=100)

結論は下写真の通り

スクリーンショット 2023-06-28 16.06.47.png

sarima_model_log = SARIMAX(np.log(df_train), order=(1,1,2), seasonal_order=(0,0,0,30))
sarima_fit_log = sarima_model_log.fit()

fig, ax = plt.subplots(figsize=(20, 6))

min_lag = get_key_with_min_value(results_list)[0] + 1

forecast = np.exp(sarima_fit_log.forecast(len_test))
forecast.index = df_test.index

ax.plot(forecast, ls="-", color="r", label="predicted")
ax.plot(group_train.POWER, ls="-")

予測が全くうまくいっていない

スクリーンショット 2023-06-28 16.08.32.png

モデルの妥当性

妥当性の確認方法は
・残差をプロット後定常性の確認
・残差のQQプロット
・残差の偏自己相関の確認
などの方法がある。

今回は残差の偏自己相関を見て、モデルの妥当性を評価する。

# 残差の偏自己相関を確認
sm.graphics.tsa.plot_pacf(sarima_fit.resid, lags=50)
plt.xlabel('lags')
plt.ylabel('pacf')

ラグ30あたりで偏自己相関係数の値が有意になっている。モデル自体はうまくいっていない可能性が高い。

スクリーンショット 2023-06-28 16.13.35.png

参考文献

モデルの妥当性

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1