Sarimax : Solusi Otomatis Model Seasional Time Series

Artikel ini menyimpan syntax yang digunakan untuk proses Sarimax pada analisis Time series. Sarimax digunakan untuk seasional time series, jika auto Arima dirasa belum tepat melakukan peramalan bisnis. Kriteria yang perlu diperhatikan untuk mencerminkan model Auto Arima perlu diperbaiki menggunakan Sarimax adalah:

  1. Ada lag tertentu pada output ACF dan PACF yang signifikan. Ini adalah salah satu indikator yang perlu ditelusuri apakah data memiliki sifat musiman.
  2. Nilai Sigma2 pada output Auto Arima signifikan. Ini adalah indikator ada variabel lain yang mempengaruhi nilai Y. variabel itu bisa saja nilai AR atau MA atau seasional. Indikator yang patut dicoba dan memperkuat poin no 1.

Jika kedua poin itu ditemukan pada model arima atau auto arima, maka patut dicoba menggunakan model sarima.

Syntax sarimax di phyton

from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
from tqdm import tqdm_notebook
import numpy as np
import pandas as pd
from itertools import product
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
data = pd.read_csv('ekspor.csv')
print(data.tail())

kode diatas adalah import module-module yang akan digunakan dalam analisis sarimax. selanjutnya inti dari proses sarimax adalah dengan menuliskan kode dibawah ini:

#setting sarima

def optimize_SARIMA(parameters_list, d, D, s, exog):
    """
        Return dataframe with parameters, corresponding AIC and SSE
        
        parameters_list - list with (p, q, P, Q) tuples
        d - integration order
        D - seasonal integration order
        s - length of season
        exog - the exogenous variable
    """
    
    results = []
    
    for param in tqdm_notebook(parameters_list):
        try: 
            model = SARIMAX(exog, order=(param[0], d, param[1]), seasonal_order=(param[2], D, param[3], s)).fit(disp=-1)
        except:
            continue
            
        aic = model.aic
        results.append([param, aic])
        
    result_df = pd.DataFrame(results)
    result_df.columns = ['(p,q)x(P,Q)', 'AIC']
    #Sort in ascending order, lower AIC is better
    result_df = result_df.sort_values(by='AIC', ascending=True).reset_index(drop=True)
    
    return result_df
#simulasi mencari model sarimax terbaik

p = range(0, 2, 1)
d = 0
q = range(0, 2, 1)
P = range(0, 2, 1)
D = 0
Q = range(0, 2, 1)
s = 6
parameters = product(p, q, P, Q)
parameters_list = list(parameters)
print(len(parameters_list))

result_df = optimize_SARIMA(parameters_list, 1, 1, 2, data['Eskpor'])
result_df

kode diatas kita langsung mensimulasikan beberapa ordo dalam model [(p,d,q) (P,D,Q) S] dan memerintahkan pyton untuk langsung melisting model yang memiliki AIC terendah. d dan D bernilai 0 karena kebetulan dalam contoh kali ini tidak perlu di differencing datanya. kemudian nilai s = 6 adalah hasil identifikasi seasional yang telah dilakukan sebelumnya. Selanjutnya model inilah yang akan terpilih untuk melakukan forecasting. hasilnya terlihat sbb:

hasil terlihat bahwa model (0,0,1)(0,0,1) merupakan model terbaik karena memiliki nilai AIC paling rendah. selanjutnya kita ingin melihat hasil dari model tersebut dengan menulis syntax sbb:

best_model = SARIMAX(data['Eskpor'], order=(0, 0, 1), seasonal_order=(0, 0, 1, 6)).fit(dis=-1)
print(best_model.summary())

best_model.plot_diagnostics(figsize=(15,12));
data['arima_model'] = best_model.fittedvalues
data['arima_model'][:4+1] = np.NaN
forecast = best_model.predict(start=data.shape[0], end=data.shape[0] + 8)
forecast = data['arima_model'].append(forecast)
plt.figure(figsize=(15, 7.5))
plt.plot(forecast, color='r', label='model')
plt.axvspan(data.index[-1], forecast.index[-1], alpha=0.5, color='lightgrey')
plt.plot(data['Eskpor'], label='actual')
#plt.plot(data['data'], label='actual')
plt.legend()
plt.show()

maka hasil yang akan diperoleh adalah sebagai berikut:

Secara teknis, step by step dijelaskan lebih detil pada video dibawah ini:

Tutorial lengkap sarimax

Sedangkan pembahasan outputnya ada disini:

Jangan pusing dulu yaaaa…. Selamat belajar!

Similar Posts

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *