susinlee 님의 블로그

시계열 모델링과 MLops 적용 - 2 본문

학습/머신러닝

시계열 모델링과 MLops 적용 - 2

susinlee 2025. 3. 26. 11:29

목표

  • 시계열의 핵심 모형 AR(자기회귀)와 이동평균(MA)에 대해서 이해
  • 시계열의 자기상관성을 측정하는 ACF와 PACF의 정의를 이해하고, AR(q)와 MA(p)의 차수를 찾는 방법을 숙지
  • 시계열 모델인 AR, MA, ARMA, ARIMA, SARIMA 모델을 학습
  • 시계열 예측평가를 위한 잔차분석과 성능지표를 학습

1. 정상시계열 검정방법

1. ADF 검정과 단위근(Unit root)

시계열 데이터에서 정상성을 확인하는 것은 매우 중요합니다. 정상성은 데이터의 평균과 분산이 시간에 따라 일정한 상태를 의미합니다. 시계열이 정상성을 만족하지 않으면, 예측 모델의 성능이 저하될 수 있습니다.

  • AR 모형을 적용하기 전에, 시계열 데이터가 정상성을 만족하는지 검정 필요
  • ADF(Augmented Dickey Fuller)는 단위근의 존재 여부를 테스트하여 시계열의 정상성 여부를 판단
  • 단위근(Unit Root)란 자기회귀 계수 Φ가 1인 경우를 말함

  • 이 경우 현재 값은 단순히 과거의 랜덤워크(Random walk)를 더한 값이며, 시간이 지나도 평균으로 돌아오지 않는 성질을 가진다는 것. 그러면 평균이나 분산이 일정하지 않게 되며, 정상성을 잃어버리므로 비정상 시계열이라는 것

ADF 테스트의 귀무가설과 대립가설

자연에서 일어나는 시계열은 비정상 시계열로 보는 게 알려진 사실이며, 정상시계열이라는 가설이 대립가설, 즉 주장이 됩니다.

  • 귀무가설 : 시계열에 단위근(unit root)이 존재한다. 즉, 시계열이 비정상적이다.
  • 대립가설 : 데이터에서는 단위근이 존재하지 않는다. 즉, 정상 시계열이다.

ADF 테스트는 다음과 같은 수식을 기반으로 시계열 데이터의 정상성을 평가

 

2. 이동평균(Moving Average)

이동평균(MA) 정의

이동평균 모델은 과거의 예측 오류가 누적되어 현재의 값에 영향을 줄 수 있는 패턴이 있다고 가정하고 전개하게 됩니다. 예컨데 과거의 데이터가 예측을 실패하면 누적되어 오차항에 내재될 것임으로 이를 모델링하여 보완하겠다는 의미입니다.

  • 이동평균과정은 이전 시점들의 오차항들이 현재값에 미치는 영향을 선형 방정식으로 표현
  • MA(q)에서 q는 현재값에 영향을 미치는 이전 오차항의 개수

 

 

예를 들어, MA(1) 모형은 다음과 같이 현재 값이 상수와 가장 최근 시점의 오차항에 의해서만 결정됩니다.

 

다음은 MA(이동평균)과정의 차수 q를 식별하는 과정을 보여줍니다.

 

현재 값에 영향을 미치는 오차항 개수가 몇 개인지, 자기상관함수(ACF)를 통해 차수 q를 찾는 방법에 대해 알아봅시다.

 

자기상관관계(AutoCorrelation)

자기상관관계는 현재 시점과 모든 과거 시점들 사이의 상관관계를 계산할 때, 중간 값들의 영향을 포함하여 상관관계를 구합니다.

  • 자기상관관계함수(ACF)는 각 시차(lag)에 대해 현재 값과 과거 값 사이의 상관관계를 계산

이 상관관계를 시각화하여, 시사차 증가함에 따라 상관관계가 어떻게 변하는지를 파악할 수 있습니다. ACF는 MA 모델의 차수 q를 결정하는 데 매우 유용합니다. ACF는 MA 도델의 차수 q를 결정하는 데 매우 유용합니다. ACF 그래프에서 유의미한 상관계수가 0이 되는 마지막 시차를 q로 설정합니다.

 

아래의 ACF 그래프를 해석해 봅시다.

x축은 시차(Lag)를, y축은 자기상관계수를 나타내며, 각 시차에서 현재 값과 과거 값들 간의 상관관계를 보여줍니다. 파란 점선은 유의성 경계를 나타내며, 이 선을 넘는 값은 통계적으로 유의한 상관관계를 의미합니다.

 

  • 시차 0은 자기 자신과느이 상관계수로 1인 것을 볼 수 있습니다.
  • 시차 1은 0.6 으로 양의 상관관계를 가짐을 알 수 있습니다.
  • 시차 2는 0.48정도로 여전히 유의미한 양의 상관관계를 볼 수 있습니다.
  • 시차 3은 0.3의 상관관계가 존재합니다/
  • 시차 4 이후로는 시차가 증가할 수록 상관계수는 급격히 감소해 0에 근사하여 유의하지 않은 상관관계를 보입니다.

이 패턴을 통해, MA(q) 모델에서 q차수를 결정할 수 있습니다. 자기상관계수가 유의한 마지막 시차가 q차가 되며, 이 그래프에서 시차 3까지 유의한 상관관계가 있으므로, MA(3) 모델이 적합합니다.

 

3. 자기회귀(Auto Regressive)

시계열은 이전데이터가 현재데이터 영향을 미치는 경향을 보입니다. 이를 자기 상관성의 개념으로 설명합니다. 이를 자기 상관성의 개념으로 설명합니다.

 

자기회귀(AR)의 정의

자기회귀는 특정 이전 시점의 데이터가 현재 데이터를 예측하는데 도움이 될 것이라고 보는 모델입니다.

  • 자기회귀과정 AR(p)
    • p:현재값에 영향을 미치는 과거 시점의 개수

현재 값은 백색소음인 오차항, 그리고 과거 값들의 선형 결합으로 표현됩니다. AR(p) 모델의 계수는 p 이전 시점의 과거 데이터가 현재 값에 미치는 영향의 크기를 나타냅니다.

 

예를 들어, '1차 자기회귀과정, AR(1)'의 경우 다음 수식처럼 현재 값이 상수와 바로 전 시점의 값, 그리고 백색소음(오차항)에 의해서만 결정됩니다.

그럼 현재 값에 영향을 미치는 과거 시점의 개수(p)는 어떻게 정할 수 있을까요?

 

편자기상관관계(Partial AutoCorrelation)

  • 편자기상관함수(PACF)는 지연이 증가함에 따라 상관관계가 어떻게 변화하는지를 보여주며, AR(p) 모형의 차수 p를 결정하는 데 사용
  • 차수 p는 유의한 상관계수가 나타나는 마지막 시점을 의미

예를 들어, 아래의 AR(2) 모형에서 현재값은 한 시점전의 값과 두 시점전의 값에 의해 결정되는 것을 알 수 있습니다.

이때, 현재값과 두 시점전의 값의 상관관계를 구할 때 한 시점전의 영향을 제거해야 하며, 이를 통해 편자기상관관계를 구할 수 있습니다. PACF 그래프로 AR모형의 적절한 차수 p를 결정할 수 있습니다. 즉, 지연이 증가함에 따라 상관관계가 어떻게 변화하는지를 보여줍니다.

 

지연(lag)이란?

현재 값이 과거의 특정 시점 값에 영향을 받는 시차를 의미합니다. 예를 들어, 지연 1은 바로 전 시점의 값을, 지연 2는 두 시점 전의 값을 가리킵니다.

 

ACF와 PACF의 공통점은 상관관계를 구한다는 것이고, PACF의 특징은 중간 시차의 영향을 제거하는 특징을 가집니다. 이 원리에 회귀모형으로 중간 시차의 영향을 제거하는 방법을 사용합니다.

 

 

아래의 PACF 그래프를 해석해 봅시다.

x축은 시차를, y축은 편자기 상관계수를 나타내며, 각 시차에서 중간 값들의 영향을 제거한 상관관계를 보여줍니다. 파란 점선은 유의성 경계를 나타내며, 이 선을 넘는 값은 통계적으로 유의합니다.

  • 시차 1에서 상관계수는 약 0.8로, 매우 강한 양의 상관관계를 나타냅니다
  • 시차 2에서 상관계수는 약 -0.25로 현재값과 음의 상관관계라는 점을 보여줍니다.
  • 시차 3 이후부터는 대부분의 상관계수가 0에 가까워져서 더 이상 유의한 상관관계가 없습니다.

AR(p) 모델의 차수는 유의한 상관계수가 있는 마지막 시차에서 결정됩니다.

따라서, 유의한 상관관계가 있는 마지막 시차는 시차 2이며, 따라서 AR(2) 모델이 적절할 가능성이 높습니다.

 

 

모델 이동평균(MA) 자기회귀(AR)
표현 MA(q) AR(p)
가정 과거의 오차항(예측오차)가 현재의 데이터에 영향을 미친다. 과거의 데이터가 현재 데이터에 영향을 준다.
평가지표 자기상관함수(ACF) 부분 자기 상관함수(PACF)
설명 ACF는 현재 이전 시점의 값들의 총 상관관계를 나타냄 PACF는 중간에 있는 시점을 제외한 순수한 자기의 상관을 나타냄

 

정리하자면

1. 이동평균 누적된 예측오차를 모두 고려해야함으로 일반적인 자기상관함수(ACF)를 사용

2. 자기회귀는 과거의 데이터와 현재의 데이터만 보고 상관관계를 보아야 하므로 편자기 상관관계함수(PACF)를 사용


4. ARMA

ARMA 모형은 자기회귀(AR)와 이동평균(MA) 모델을 결합한 방식으로, 현재값이 과거값과거 오차항에 모두 의존한다고 가정합니다.

 

자기회귀이동평균(ARMA) 정의

  • ARMA(Autoregressive Moving Average) 모형은 자기회귀(AR) 모형과 이동평균(MA) 모형을 결합한 모형
  • ARMA 모형은 현재 값이 과거 값과 과거 오차항에 모두 영향을 받는다고 가정

ARMA(p, q) 로 나타내며, p는 AR 모형의 차수 (과거 값의 개수)를 의미하고 q는 MA 모형의 차수(오차항의 개수)를 의미합니다. 이 모형의 수식은 AR 모형과 MA 모형을 결합한 형태로, 현재 값이 과거 값들(Yt-1, Yt-2, ...)과 과거 오차항들(εt-1, εt-2)에 의존합니다.

from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(data, order=(p, 0, q)) # 데이터에 ARMA(p, q) 모형 적용하기
model_fit = model.fit()
model_fit.summary() # 모델 출력

 


5. ARIMA

ARIMA 모델은 비정상 시계열에서 차분(differencing)을 통해 추세와 계절성을 제거해 정상성을 확보한 후, ARMA 모델을 적용하는 방식입니다.

 

비정상 데이터의 차분

비정상 데이터를 정상성으로 만들기 위해 차분으로 시계열 데이터에서 현재값과 바로 전 시점의 차이를 계산하여 비정상성을 제거합니다.

 

1차 차분을 통해 비정상성을 제거하고, ADF 검정을 통해 정상성을 확인합니다. 아래는 1차 차분 후 ADF 검정으로 정상성을 확인하는 코드입니다.

# 1차 차분 적용
data_diff = data.diff().dropna()

# ADF 검정으로 정상성 확인
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(data_diff)
print(f"ADF Statistic: {adf_result[0]}")
print(f"P-value: {adf_result[1]}")

 

ARIMA 정의

ARIMA 모형은 ARIMA(p, d, q)로 나타내며 비정상 시계열을 차분하여 ARMA 모델을 적용하는 방법입니다.

 

현재값이 과거값들과 과거 오차항들에 의존하는 ARMA모형을 차분한 것과 같습니다. p는 자기회귀 차수로 과거데이터 갯수를 의미하며, d는 데이터에서 비정상성을 제거하기위한 차분 횟수, 그리고 q는 이동평균 차수로 오차항 갯수를 의미합니다.

 

ARIMA 모형을 statsmodels로 구현할 때, 적합한 차수와 차분횟수인 p, d, q를 넣어주시면 됩니다. p와 q는 각각 PACF와 ACF 그래프를 통해 결정할 수 있으며, d는 데이터에 차분이 몇 번 필요한지를 통해 결정됩니다. 

from statsmodels.tsa.arima.model import ARIMA

# ARIMA 모형적용
model = ARIMA(data, order=(p, d, q))
model_fit = model.fit()

model_fit.summary() # 결과 출력

6. SARIMA

SARIMA 모형은 ARIMA 모형에 계절성(Seasonality)을 포함하여 비정상적 시계열 데이터를 모델링하는 방식입니다. 계절성은 일정 간격으로 반복되는 패턴을 나타내며, SARIMA는 이를 효과적으로 반영하여 예측 성능을 높입니다.

 

SARIMA의 소개

SARIMA 모델은 비계절 부분(p, d, q)과 계절 부분(P, D, Q, s)으로 구성됩니다. 계절성 데이터를 처리할 떄, SARIMA는 계절 주기에 따른 반복적인 패턴을 포함한 시계열 모델링을 가능하게 합니다.

  • 계절성은 일정한 간격으로 반복되는 패턴을 의미

예를 들어, 월간 기온 데이터나 계절별 소비 패턴에서는 계절적 변동이 중요한 예측 요인이 됩니다. SARIMA는 이러한 계절적 패턴을 반영하여 모델을 구성합니다.

 

SARIMA 구현

SARIMA 모델을 사용하면 데이터 내 계절적 변동을 반영한 시계열 예측이 가능합니다.

from statsmodels.tsa.statespace.sarimax import SARIMAX

# SARIMA 모형 적용 (p, d, q), (P, D, Q, s)
model = SARIMAX(data, order=(p, d, q), seasonal_order=(P, D, Q, s))
model_fit = model.fit()
model_fit.summary() # 결과 출력

 

 

7. 잔차분석과 모델평가

잔차 분석과 모델 평가의 목적은 시계열 모델이 데이터를 얼마나 잘 설명하고 예측하는지 평가하고, 더 나은 모델을 선택하기 위한 도구를 제공하는 것입니다.

 

성능 지표

Prophet 모형의 performance_metrics() 함수로 MSE, MAE, MAPE 등의 성능 지표를 구할 수 있어 쉽게 모델의 예측 성능을 평가할 수 있습니다. 아래 코드는 시계열 데이터 df(반드시 컬러명이 ds, y)를 가지고 교차검증 후 performance_metrics 함수로 성능지표를 확인합니다. 

from fbprophet import Prophet
from fbprophet.diagnostics import cross_validation, performance_metrics

# Prophet 모델 생성 및 피팅 !
model = Prophet()
model.fit(df)

# 미래 예측
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)

# 교차검증 (cutoff 날짜를 기준으로 데이터를 나누고 예측)
df_cv = cross_validation(model, initial='730 days', period='180 days', horizon='365 days')

# 성능 지표 계산
df_p = performance_metrics(df_cv)

# 성능 지표 확인
print(df_p.head())  # MSE, RMSE, MAE, MAPE 등이 포함된 데이터프레임 출력

 

잔차 분석

잔차분석은 회귀분석에서도 진행하는 분석입니다. 결국 우리가 모델링하지 못한 에러가 무작위성을 띄는지 검증하는 방법이며, 시계열에서는 자기상관함수와 Ljung-Box 검정방법을 이용해 확인합니다.

 

잔차가 백색소음인지 확인하는 방법

1. ACF(자기상관함수): 잔차의 자기상관이 없는지 확인하는 도구로, ACF 그래프에서 모든 시차에서 유의미한 상관관계가 없을 때, 잔차가 백색소음임을 의미합니다. 즉, 잔차가 과거 값과 상관성이 없어야 좋은 모델이라고 할 수 있습니다.

 

2. Ljung-Box Q 통계량:

 

Ljung-Box 통계량과 ACF 분석을 통해 잔차가 백색소음이라면 모델이 데이터를 적절하게 설명한 것으로 간주할 수 있습니다. 잔차에 패턴이 발견된다면, 모델을 다시 설정하거나 더 복잡한 모형을 사용할 필요가 있습니다.

from statsmodels.stats.diagnostic import acorr_ljungbox

# Ljung-Box test for white noise
lb_test = acorr_ljungbox(model_fit.resid, lags=[10], return_df=True)
print(lb_test)

 

 

 AIC와 BIC를 통한 모델 평가

역시 AIC, BIC도 선형회귀모델에서 모델의 변수선택법을 위한 평가 방법에 사용됩니다.

모델 선택에서 AIC(Akaike Information Criterion)와 BIC(Bayesian Information Criterion)는 중요한 평가 지표로 사용됩니다. 이들은 모델의 적합도와 모델의 복잡성을 동시에 고려하여, 데이터에 가장 적합한 모델을 선택할 수 있도록 돕습니다.

 

AIC

모델이 데이터를 얼마나 잘 설명하는지(모델의 적합도)와 모델의 복잡성 사이의 균형을 고려합니다. 모델의 복잡성을 고려하여, 적합도와 모델의 자유도를 조정한 지표입니다. AIC는 낮을수록 좋은 모델이며, 다음과 같이 계산합니다. AIC는 모델이 데이터를 얼마나 잘 설명하는 지와 동시에 모델의 복잡성을 페널티로 부여합니다.

 

BIC

BIC는 AIC와 달리 샘플 수 n에 대한 로그값을 사용해 모델 복잡성에 더 큰 패널티를 부여합니다.

 

AIC와 BIC의 차이점

  • AIC는 모델의 적합도와 복잡성 사이의 균형을 중시하며, 적합도가 더 높은 모델을 선호
  • BIC는 복잡성을 더 많이 고려하므로 단순한 모델을 선호하며, 샘플 수가 클수록 더 엄격한 패널티를 부여

 

AIC와 BIC 평가 코드

AIC와 BIC는 가장 낮은 값을 가진 모델을 선택하는 것이 원칙입니다. 두 지표 모두 낮을수록 더 좋은 모델로 간주하지만, BIC는 더 간소한 모델을 선호합니다. 특히, 샘플 수가 많을 때 BIC는 더 엄격한 기준을 제시합니다.

# 모델링
model_arima = ARIMA(data, order=(p, d, q))
model_fit = model_arima.fit()

# AIC, BIC확인
print(f"AIC: {model_fit.aic}")
print(f"BIC: {model_fit.bic}")

'학습 > 머신러닝' 카테고리의 다른 글

시계열 모델링과 MLops 적용 - 1  (0) 2025.03.25
Support Vector Machine (SVM) 구현하기  (0) 2025.03.06
LogisticRegression 구현하기  (0) 2025.03.03
LinearRegression 구현하기  (0) 2025.03.02
군집  (0) 2025.01.26