Time Series Analysis

[์‹œ๊ณ„์—ด ๋ถ„์„] ARIMA ๋ชจ๋ธ | ํŒŒ์ด์ฌ ์˜ˆ์ œ

์Šค์œ„๋ฏผ 2024. 1. 25. 01:58

 

ARIMA๋ฅผ ๋‹ค๋ฃฌ ์œ ํŠœ๋ธŒ ๊ฐ•์˜์™€ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ

ARIMA ๋ชจ๋ธ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด์•˜๊ณ 

๊ฐ„๋‹จํ•œ ํŒŒ์ด์ฌ ์˜ˆ์ œ๋กœ ์ฝ”๋“œ๋„ ๋‹ค๋ค„๋ณด๋ ค ํ•œ๋‹ค.


 

ARIMA ๋ชจ๋ธ์€

Autoregressive Integrated Moving Average ๋ผ๋Š” ๋œป์œผ๋กœ, 

AR(Autoregression) ๋ชจํ˜•๊ณผ MA(Moving Average) ๋ชจํ˜•์„ ํ•ฉ์นœ ๋ชจํ˜•์ด๋‹ค.

 

๋…๋ฆฝ๋ณ€์ˆ˜๊ณผ ์ข…์†๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์‹œ๊ฐ„์„ ๋…๋ฆฝ๋ณ€์ˆ˜๋กœ ์ข…์†๋ณ€์ˆ˜๋ฅผ ์˜ˆ์ธกํ•œ๋‹ค.

๋˜ํ•œ, ์ „ํ†ต์ ์ธ ํ†ต๊ณ„ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•œ ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ†ต๊ณ„์ ์ธ ์ดํ•ด๊ฐ€ ์–ด๋А์ •๋„ ํ•„์š”ํ•˜๋‹ค.

 

 

0. ์ •์ƒ์„ฑ

์‹œ๊ณ„์—ด ๋ถ„์„์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์„ฑ์„ ๋ ์–ด์•ผ ํ•œ๋‹ค

์‹œ๊ฐ„์— ๊ด€๊ณ„์—†์ด ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์ด ์ผ์ •ํ•œ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ƒ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋ฉด, ์˜ˆ๋กœ ์ถ”์„ธ๋‚˜ ๊ณ„์ ˆ์„ฑ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์ •์ƒ ์‹œ๊ณ„์—ด์ด ์•„๋‹ˆ๋‹ค.

 

 

๋น„์ •์ƒ์ ์ธ ๋ฐ์ดํ„ฐ๋Š” ์˜ˆ์ธก์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜์‹œ์ผœ์•ผ ํ•œ๋‹ค.

  • ๋กœ๊ทธ

(b) ๊ทธ๋ž˜ํ”„๋Š” (a) ๊ทธ๋ž˜ํ”„๋ฅผ ๋กœ๊ทธ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์ด๋‹ค.

๋กœ๊ทธ ๋ณ€ํ™˜์€ ์ข€ ๋” ๋‹จ์ˆœํ™”๋œ ์ผ์ •ํ•œ ๋ถ„์‚ฐ์„ ๊ฐ–๊ฒŒ ํ•ด์ค€๋‹ค

  • ์ฐจ๋ถ„

ํ˜„์žฌ ์ƒํƒœ์—์„œ ์ด์ „ ์ƒํƒœ๋ฅผ ๋นผ์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. (Yt - Yt-1) 

(c) ๊ทธ๋ž˜ํ”„๋Š” (a) ๊ทธ๋ž˜ํ”„๋ฅผ ์ฐจ๋ถ„ํ•œ ๊ฒƒ์ด๋‹ค.

์ฐจ๋ถ„์€ 0์„ ์ค‘์‹ฌ์œผ๋กœ ํ‰๊ท ์ด ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋˜๋Š” ํŒจํ„ด์œผ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ค€๋‹ค.

 

 

 

1. AR ๋ชจ๋ธ

ํŠน์ • ๋ณ€์ˆ˜์˜ ๊ณผ๊ฑฐ ๊ด€์ธก๊ฐ’์˜ ์„ ํ˜•๊ฒฐํ•ฉ์œผ๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ฏธ๋ž˜๊ฐ’์„ ์˜ˆ์ธกํ•˜๋Š” ๋ชจํ˜•์ด๋‹ค.

๊ณผ๊ฑฐ p๊ฐœ์˜ ๊ด€์ธก๊ฐ’์˜ ์„ ํ˜•๊ฒฐํ•ฉ์œผ๋กœ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ์„ p์ฐจ MA๋ชจ๋ธ (AR(p))๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

 

2. MA ๋ชจ๋ธ

์˜ˆ์ธก์˜ค์ฐจ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฏธ๋ž˜์˜ ๊ฐ’์„ ์˜ˆ์ธกํ•˜๋Š” ๋ชจํ˜•์ด๋‹ค.

๊ณผ๊ฑฐ q๊ฐœ ์˜ˆ์ธก์˜ค์ฐจ์˜ ์„ ํ˜•๊ฒฐํ•ฉ์œผ๋กœ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ์„ q์ฐจ MA๋ชจ๋ธ (MA(q))๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

 

3. ARMA ๋ชจ๋ธ

ARMA๋ชจ๋ธ์€ AR๋ชจ๋ธ๊ณผ MA๋ชจ๋ธ์„ ๊ฒฐํ•ฉํ•œ ๋ชจ๋ธ๋กœ ARMA(p,q)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

 

 

4. ARIMA ๋ชจ๋ธ

ARIMA(p,d,q) ๋ชจ๋ธ์€ ARMA๋ชจ๋ธ์— ์ฐจ๋ถ„ ๊ณผ์ •์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.

์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ dํšŒ ์ฐจ๋ถ„ํ•˜๊ณ  ๊ณผ๊ฑฐ p๊ฐœ์˜ ๊ด€์ธก๊ฐ’๊ณผ q๊ฐœ ์˜ค์ฐจ์— ์˜ํ•ด ์˜ˆ์ธก๋˜๋Š” ๋ชจ๋ธ์ด๋‹ค.

 

 


 

์ตœ์ ์˜ p์™€ q๋Š” ACF์™€ PACF ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

1. ACF(์ž๊ธฐ์ƒ๊ด€ํ•จ์ˆ˜, AutoCorrelation Function)

์ž๊ธฐ์ƒ๊ด€์€ ๋‹ค๋ฅธ ์‹œ์ ์˜ ๊ด€์ธก๊ฐ’ ๊ฐ„ ์ƒํ˜ธ์—ฐ๊ด€์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์‹œ์ฐจ๋ฅผ ์ ์šฉํ•œ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

ACF ๊ตฌํ•˜๋Š” ์‹, ์ผ๋ฐ˜ Correlation ๊ตฌํ•˜๋Š” ์‹๊ณผ ๋™์ผํ•˜๋‹ค

 

2. PACF(ํŽธ์ž๊ธฐ์ƒ๊ด€ํ•จ์ˆ˜, Partial AutoCorrelation Function)

ํŽธ์ž๊ธฐ์ƒ๊ด€์€ ์‹œ์ฐจ๊ฐ€ ๋‹ค๋ฅธ ๋‘ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์ˆœ์ˆ˜ํ•œ ์ƒํ˜ธ ์—ฐ๊ด€์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

PACk๋Š” ์›๋ž˜์˜ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ(Yt)์™€ ์‹œ์ฐจ k ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ(Yt-k)๊ฐ„์˜ ์ˆœ์ˆ˜ํ•œ ์ƒ๊ด€๊ด€๊ณ„๋กœ์„œ ๋‘ ์‹œ์  ์‚ฌ์ด์— ํฌํ•จ๋œ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ(Yt-1, Yt-2, ... , Yt-k+1)์˜ ์˜ํ–ฅ์€ ์ œ๊ฑฐ๋œ๋‹ค.

 

 

acf๊ฐ’์ด ์„œ์„œํžˆ ์ค„์–ด๋“ค๊ณ  ์žˆ๋Š” ๋ชจ์Šต์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฐ„ ์ž๊ธฐ์ƒ๊ด€์ด ๋†’๋‹ค. ์ฆ‰, ์ •์ƒ์ ์ด์ง€ ์•Š๋‹ค.

 

pacf๊ฐ’์€ ์‹œ์ฐจ 4์—์„œ๋ถ€ํ„ฐ ์ ˆ๋‹จ๋ฉด (์‹ ๋ขฐ๊ตฌ๊ฐ„ 95%) ์•ˆ์— ๋“ค์–ด๊ฐ„๋‹ค.

 

ACF ๋„ํ‘œ์—์„œ ํŒŒ๋ž€์ƒ‰ ์Œ์˜ ์•ˆ์— ๋“ค์–ด์˜ค๋Š” ์‹œ์ฐจ(์ ˆ๋‹จ์ ) - 1์„ q๋กœ ์„ค์ •ํ•œ๋‹ค.

PACF ๋„ํ‘œ์—์„œ ํŒŒ๋ž€์ƒ‰ ์Œ์˜ ์•ˆ์— ๋“ค์–ด์˜ค๋Š” ์‹œ์ฐจ(์ ˆ๋‹จ์ ) - 1์„ p๋กœ ์„ค์ •ํ•œ๋‹ค.


 

ํŒŒ์ด์ฌ ์˜ˆ์ œ

 

# ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

from statsmodels.tsa.stattools import adfuller # ADF ๊ฒ€์ •
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf # ACF, PACF ๊ทธ๋ž˜ํ”„
from statsmodels.tsa.arima.model import ARIMA # ARIMA ๋ชจ๋ธ

from sklearn.metrics import mean_absolute_error, mean_squared_error
import math
import itertools

import warnings
warnings.filterwarnings('ignore')

 

df = pd.read_csv("Aquifer_Petrignano.csv")

df.Depth_to_Groundwater = df.Depth_to_Groundwater.interpolate()
df.Depth_to_Groundwater.plot()

 

 

์˜ˆ์ธกํ•˜๊ณ ์ž ํ•˜๋Š” Depth_to_Groundwater ๋ณ€์ˆ˜ ์‹œ๊ฐํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ ํ™•์ธ

 

# Date๋ฅผ 7์ผ ๊ฐ„๊ฒฉ์œผ๋กœ ์žฌ์กฐ์ •
df_downsampled = df[['Date', 'Depth_to_Groundwater']].resample('7D', on = 'Date').mean()
df = df_downsampled.reset_index()

plt.figure(figsize = (15,8))

# 1๋…„ = 52์ฃผ
rolling_window = 52

sns.lineplot(x = df.Date, y = df.Depth_to_Groundwater, color = 'indianred')
sns.lineplot(x = df.Date, y = df.Depth_to_Groundwater.rolling(rolling_window).mean(), color = 'black', label = 'rolling mean') 
sns.lineplot(x = df.Date, y = df.Depth_to_Groundwater.rolling(rolling_window).std(), color = 'blue', label = 'rolling std')
plt.xlim([date(2009,1,1), date(2020,6,30)])
plt.title('Feature : Depth_to_Groundwater', fontsize = 14)
plt.ylabel(ylabel = 'Depth_to_Groundwater', fontsize = 14)
plt.show()

์ฃผ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋กœ 1๋…„์— ๋Œ€ํ•œ ์ด๋™ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ์‹œ๊ฐํ™”ํ•˜์˜€๋‹ค.

 

plt.figure(figsize = (15,7))
sns.distplot(df.Depth_to_Groundwater,  color = 'indianred')
plt.title('Histogram : Depth_to_Groundwater', fontsize = 14)
plt.ylabel(ylabel = 'Depth_to_Groundwater', fontsize = 14);

 

์ •์ƒ์„ฑ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋Š” ํ‰๊ท , ๋ถ„์‚ฐ์ด ๊ฐ€์šฐ์‹œ์•ˆ ๋ถ„ํฌ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์ด ์–ด๋А์ •๋„ ์ข… ๋ชจ์–‘์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์„œ์„ ๋”ฐ๋ฅด๋Š”์ง€ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ ADF ๊ฒ€์ •์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ADF ๊ฒ€์ • ๊ฒฐ๊ณผ์˜ p-value ๊ฐ€ 0.05 ์ดํ•˜์ด๋ฉด, ๋‹จ์œ„๊ทผ์ด ์—†๋‹ค๋Š” ๊ท€๋ฌด๊ฐ€์„ค์„ ๊ธฐ๊ฐํ•˜๋ฏ€๋กœ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

result = adfuller(df.Depth_to_Groundwater.values)

print(f'adf_stat : {result[0] : 0.3f}')
print(f'p_val : {result[1] : 0.3f}')
print(f'crit_val_1 : %0.3f' % result[4]['1%'])
print(f'crit_val_1 : %0.3f' % result[4]['5%'])
print(f'crit_val_1 : %0.3f' % result[4]['10%'])

ADF ๊ฒ€์ • ๊ฒฐ๊ณผ p value๊ฐ€ 0.05๋ณด๋‹ค ๋‚ฎ์ง€๋งŒ ์‹œ๊ฐํ™” ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์ด์ง€ ์•Š์€ ๋ชจ์Šต์„ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ๊ฑฐ์ณ์ค€๋‹ค.

 

# ๋กœ๊ทธ ๋ณ€ํ™˜

df['Depth_to_Groundwater_log'] = np.log(abs(df.Depth_to_Groundwater)) #์Œ์ˆ˜๋ฅผ ๋กœ๊ทธ ๋ณ€ํ™˜ ์‹œ NaN ๋ฐ˜ํ™˜

f, ax = plt.subplots(nrows = 2, ncols = 2, figsize= (15,6))

visualize_adfuller_results(abs(df.Depth_to_Groundwater), 
                           'Depth_to_Groundwater \n Absolute', ax[0,0])
sns.distplot(df.Depth_to_Groundwater, ax = ax[0,1])

visualize_adfuller_results(df.Depth_to_Groundwater_log, 
                           'Depth_to_Groundwater_log', ax = ax[1,0])
sns.distplot(df.Depth_to_Groundwater_log, ax = ax[1,1])

plt.tight_layout()
plt.show()

ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์ด ์ข€ ๋” ๋Œ€์นญ์„ ์ด๋ฃจ๋ฉฐ ์ข… ๋ชจ์–‘๊ณผ ๊ฐ€๊นŒ์›Œ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

# 1์ฐจ ์ฐจ๋ถ„
ts_diff = np.diff(df.Depth_to_Groundwater)
df['Depth_to_Groundwater_df_1']= np.append([0], ts_diff) #์ฐจ๋ถ„์œผ๋กœ ์‚ญ์ œ๋œ ์ฒซ ํ–‰ ๋ถ™์—ฌ์ฃผ๊ธฐ

# 2์ฐจ ์ฐจ๋ถ„
ts_diff = np.diff(df.Depth_to_Groundwater_df_1)
df['Depth_to_Groundwater_df_2'] = np.append([0], ts_diff)

# ์ฐจ๋ถ„ํ•œ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”
f, ax = plt.subplots(nrows = 2, ncols = 1, figsize = (15,6))

visualize_adfuller_results(df.Depth_to_Groundwater_df_1, 
                           'Depth_to_Groundwater_df_1', ax[0])
visualize_adfuller_results(df.Depth_to_Groundwater_df_2, 
                           'Depth_to_Groundwater_df_2', ax[1])
plt.tight_layout()
plt.show()

2์ฐจ ์ฐจ๋ถ„ํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๊ฐ€ 1์ฐจ ์ฐจ๋ถ„ํ•œ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ์ผ์ •ํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

# 2์ฐจ ์ฐจ๋ถ„ acf, pacf ํ™•์ธ

plot_acf(df.Depth_to_Groundwater_df_2)
plt.show()

plot_pacf(df.Depth_to_Groundwater_df_2)
plt.show()

ACF๋Š” ์‹œ์ฐจ 2๋ถ€ํ„ฐ ์ ˆ๋‹จ๋ฉด ์•ˆ์— ๊ฐ’์ด ๋“ค์–ด์˜ค๊ณ  PACF๋Š” ์‹œ์ฐจ 4๋ถ€ํ„ฐ ์ ˆ๋งŒ๋ฉด ์•ˆ์— ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, p๋Š” 3 q๋Š” 1๋กœ ์„ค์ •ํ•˜์˜€๋‹ค

 

train_df = df[['Date', 'Depth_to_Groundwater_df_2']]
train_df.set_index('Date', inplace = True)

train = train_df.loc['2009-01-01' : '2019-11-28']
test = train_df.loc['2019-12-05':'2020-06-25']

model = ARIMA(train['Depth_to_Groundwater_df_2'], order = (3,2,1))
model_fit = model.fit()
print(model_fit.summary())

AIC๊ฐ€ -507.6์ด ๋‚˜์™”๋Š”๋ฐ AIC๋Š” 0์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ค์ง€ ์ข‹์€ ๊ฒฐ๊ณผ๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค

 

# ๋‹ค์Œ 30๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์˜ˆ์ธก
pred = model_fit.forecast(steps = 30)
pred = pd.Series(pred, index = test.index)

fig, ax = plt.subplots(figsize = (15,5))

sns.lineplot(x = 'Date', y = 'Depth_to_Groundwater', data = train)
pred.plot(ax = ax, color = 'red', label = 'Predicted', legend = True)
test.plot(ax = ax, color = 'blue', legend = True)

์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐํ™”ํ•œ ๊ฒฐ๊ณผ, ์˜ˆ์ƒ๋Œ€๋กœ ๋ณ„๋กœ ์ข‹์ง€ ์•Š๋‹ค

 

endog_variable = 'Depth_to_Groundwater'
train_y = train[endog_variable]

# ํŒŒ๋ผ๋ฏธํ„ฐ ์ตœ์ ํ™”
p = range(0,4)
d = range(0,3)
q = range(0,4)
pdq = list(itertools.product(p,d,q))

aic = []
for i in pdq:
    model = ARIMA(train_y, order = i)
    model_fit = model.fit()
    print(f'ARIMA : {i} >> AIC : {round(model_fit.aic, 2)}')
    aic.append(abs(round(model_fit.aic,2)))

optimal = [(pdq[i],j) for i,j in enumerate(aic) if j == min(aic)]
optimal

 

AIC ๊ฐ’์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด p,d,q ์กฐํ•ฉ์„ ์ฐพ๋Š” ์ฝ”๋“œ๋‹ค.

p = 1, d = 0, q = 0์˜ ์กฐํ•ฉ์ด AIC ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ€์žฅ 0์— ๊ฐ€๊น๊ฒŒ ๋‚˜์™”๋‹ค.


 

Ref

https://www.youtube.com/watch?v=abOIK40QvDA&t=640s

https://www.kaggle.com/code/iamleonie/intro-to-time-series-forecasting

https://dacon.io/competitions/official/236200/codeshare/9519 ( ์ตœ์ ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ • ์ฝ”๋“œ ์ฐธ๊ณ )

 

๋น„์ „๊ณต์ž์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋…ํ•™ ๋ธ”๋กœ๊ทธ๋กœ

์–ธ์ œ๋“  ํ”ผ๋“œ๋ฐฑ ํ™˜์˜์ž…๋‹ˆ๋‹ค!