PythonでNumpyを使って時系列解析のためのARIMAモデルを実装する方法

スポンサーリンク

今回は、よく知られた時系列予測モデルである「ARIMAモデル」について学びます。

時系列データは、データが一定の時間間隔で記録されているという意味で異なります。

時系列データには時間的な要素が加わっており、系列の各データポイントは前のデータポイントに依存します。

時系列予測のための統計的手法として広く使われているのがARIMAモデルです。

例えば、リンゴの売上を予測する必要があり、各日の過去の売上記録があるとします。

この問題は、時系列モデリングに分類される。

この記事では、ARIMAモデルを実装するつもりです。

スポンサーリンク

ARIMAとは?

ARIMAとは、Autoregressive Integrated Moving Averageの略です。

データの自己相関を記述することに基づいており、時系列データを分析・予測するための一般的で強力な時系列アルゴリズムの1つです。

ARIMAの意味を分解してみましょう。

  • 自己回帰(AR): あるオブザベーションといくつかのラグされたオブザベーションの間の従属関係。次の値を予測するために使用される過去の値を意味します。
  • 統合(I): 定常性を持たせるために、系列に行われる差分操作を指す。
  • 移動平均(MA): 将来の値を予測するために使用される過去の予測誤差の数を意味します。

1. ARIMAモデルのパラメータ

ARIMAはモデルを構築するために3つの要素、pdqを必要とします。

  • p: 自己回帰ラグの数を表し、モデルの自己回帰的な側面に必要です。
  • d: d はモデルの積分部分に関連している。これは、系列を定常化するために必要な差分処理の次数です。
  • q: q は移動平均のラグ数です。これは、モデルの移動平均部分に関連している。

2. 定常系列

定常系列とは、時間の経過とともに性質が変化しない系列のことです。

つまり、時系列の平均、分散、共分散などの統計的性質はすべて時間と共に一定です。

時系列が定常でない場合、時系列モデルを構築することはできません。

ARIMAモデルはデータが定常系列であることが必要です。

時系列を定常化する一般的な方法として、Augmented Dickey-Fullerテスト、Differencing、Detrendingなどがあります。

PythonによるARIMAモデルのデモ

ここでは、auto_arima関数を実装します。

この関数はARIMAモデルに最適なパラメータを自動的に求める。

言い換えると、この関数はARIMAモデルのパラメータ p, d, q を自動的に決定します。

これは、データ準備とパラメータチューニングに非常に時間がかかるため、非常に便利です。

ここでは、auto_arima関数を持つpmdarimaモジュールを使用します。

1. データセットのインポート

今回のデモで使用するデータセットは Electrical_Production dataset (Downloaded from Kaggle) です。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
 
series = pd.read_csv('Electric_Production.csv' , index_col = 0)
 
#divide into train and validation set
train = series[:int(0.7*(len(series)))]
valid = series[int(0.7*(len(series))):]
 
#Plotting the data
plt.figure(figsize = (8,5))
ax = plt.gca()
ax.xaxis.set_major_locator(plt.MaxNLocator(20))
plt.xticks(rotation = 45)
plt.plot(series)
plt.show()
# Importing required modules
from pmdarima.arima import ADFTest
 
adf_test = ADFTest(alpha = 0.05)
adf_test.should_diff(series)

2. 系列が定常かどうかをチェックする

Augmented Dickey-Fuller 検定を実行し、データが定常かどうかを確認します。

#Importing the module
import pmdarima as pmd
 
arima_model = pmd.auto_arima(train,
                              start_p=0,d = 1,start_q=0,
                              test="adf", supress_warnings = True,
                              trace=True)
 
#Summary of the model
arima_model.summary()
Output: (0.01, False)

pmdarima.arimaにはADFTest` クラスがあり、Augmented Dickey-Fuller 検定を実行することができる。

また、statsmodels.tsa.stattools モジュールの adfuller クラスを使用して、テストを実行することもできます。

上のコードの出力は、系列が定常でないことを意味します。

ARIMAを実装するためには、まず系列を定常化する必要があります。

ここで、auto Arimaが役に立つのですが、これは自動的に差分パラメータ ‘d’ を決定して、系列を定常化します。

3. ARIMAモデルの実装

#Predict the future values
valid['predicted'] = arima_model.predict(n_periods = len(valid))
 
def MAPE(true, pred):
    true, pred = np.array(true), np.array(pred)
    return np.mean(np.abs((true - pred) / true)) * 100
 
MAPE(valid.IPG2211A2N, valid.predicted)
Plot Of Electrical Production Dataset
Plot Of Electrical Production Dataset

関数に渡す重要な入力引数がいくつかある。

関数の重要なパラメータは以下の通りです。

    1. ARIMAモデルを適用する時系列。
    1. start_p: 自己回帰(AR)モデルの次数.
  1. start_q`: 移動平均(MA)モデルの次数。
  2. d` : 第一次微分法の次数. デフォルトでは None に設定されています。
    1. test : 定常性を検出するために使用する単位根検定の種類。

4. MAPEを用いたモデル性能の確認

平均絶対誤差(MAPE)を用いて、モデルの性能を確認します。

Summary Stats Of The Fitted Model
Summary Stats Of The Fitted Model

を出力します。

12.44044096590272

MAPEの値はできるだけ低くする必要があり、それは我々のモデルがより少ないエラーを行っていることを示す指標となります。

まとめ

今回は、時系列予測のためのARIMAモデルを学習し、Pythonで実装しました。

モデルがうまく機能するための時系列データセットの定常条件を決定し、定常性を確認するためにAugmented Dickey-Fuller Testを実装しました。

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