본문 바로가기
AI/Machine-Learning

시계열 데이터 분석 - ARIMA

by Wikinist 2023. 9. 2.

정상성(Stationarity)

정상성(Stationarity)은 시계열 데이터에서 중요한 개념으로, 시간에 따라 평균과 분산이 일정하며 시계열 데이터의 자기상관이 시간에 독립적으로 유지되는 특성을 의미합니다. 정상성을 가진 시계열 데이터는 이전 시간과 미래 시간 사이의 관계가 변하지 않기 때문에 통계 분석이나 예측 모델링이 더 간단하고 신뢰성 있게 수행될 수 있습니다.

정상성을 만족하는 시계열 데이터는 다음의 세 가지 조건을 충족해야 합니다:

시간에 대한 평균이 일정: 시계열 데이터의 평균값은 시간에 따라 크게 변하지 않아야 합니다. 추세나 계절성과 같은 패턴이 없어야 합니다.

시간에 대한 분산이 일정: 시계열 데이터의 분산은 시간에 따라 일정해야 합니다. 데이터의 변동성이 일정하게 유지되어야 합니다.

시간 간 자기상관이 없거나 약한 상관성: 시계열 데이터의 자기상관 함수(자신과의 과거 관측치와의 상관 관계)는 시간에 따라 지속적으로 감소하거나 없어야 합니다. 즉, 시간 간의 상관 관계가 미약하거나 없어야 합니다.

정상성을 만족하지 않는 시계열 데이터는 비정상 데이터(non-stationary)로 간주되며, 이러한 데이터의 경우 분석이나 모델링을 위해 변환 또는 전처리가 필요할 수 있습니다. 주로 추세나 계절성 요소를 제거하거나 차분(differencing)과 같은 기법을 사용하여 정상성을 만족시키는 과정이 수행됩니다.

정상성 데이터 (Stationary Data)

정상성 데이터는 시간에 따라 평균, 분산 및 자기공분산(moments)이 일정한 특성을 가지는 데이터를 말합니다. 즉, 시간의 변화에 따라 데이터의 통계적 특성이 변하지 않습니다. 정상성 데이터의 경우에는 시계열 분석이나 예측 모델링이 더 용이하며, 과거의 패턴이 미래에도 계속 유지될 가능성이 높습니다.

정상성 데이터의 특징

  • 평균과 분산이 시간에 따라 일정하게 유지됨.
  • 시간에 따른 패턴이 안정적이고 변하지 않음.
  • 자기상관성(autocorrelation)이 일정한 범위 내에서 유지됨.
  • 예측이나 모델링이 비교적 쉬움.

비정상성 데이터 (Non-Stationary Data)

비정상(non-stationary) 데이터는 시간에 따라 평균, 분산 또는 자기상관과 같은 통계적 특성이 변하는 데이터를 의미합니다. 정상성(stationarity)은 시계열 데이터에서 중요한 개념으로, 시계열 데이터가 정상성을 가지면 이전 시간과 미래 시간 사이의 관계가 일정하게 유지되며 통계 분석이나 예측 모델링이 더 쉬워집니다. 그러나 비정상 데이터는 이러한 특성이 없어서 분석이 더 복잡해질 수 있습니다.

비정상성 데이터의 특징:

  • 평균과 분산이 시간에 따라 변동함.
  • 시간에 따른 패턴이 불안정하고 변화함.
  • 자기상관성이 시간에 따라 변동함.
  • 예측이나 모델링이 어려울 수 있음.

시계열 데이터를 다룰 때, 데이터의 정상성 여부를 고려하는 것이 중요합니다. 정상성 데이터인 경우에는 추세나 계절성을 고려하여 적절한 모델을 선택하고 예측할 수 있지만, 비정상성 데이터인 경우에는 데이터 변환, 차분(differencing), 변환 등의 전처리 기법을 사용하여 정상성 특성을 갖도록 만들어주는 것이 일반적입니다.

비정상성 데이터 종류

다음은 비정상성 데이터의 주요 종류입니다:

추세(Trend) 비정상성 데이터

추세는 시간에 따라 데이터 값이 증가하거나 감소하는 경향을 나타냅니다. 이러한 추세는 주로 장기적 변동을 나타내며, 시계열 데이터에서 평균값이 지속적으로 증가하거나 감소할 때 나타납니다. 추세는 예측 모델링을 어렵게 만들 수 있으며, 추세를 제거하거나 조정하기 위한 전처리가 필요할 수 있습니다.

추세를 가진 데이터의 경우, 시간에 따라 값이 증가하거나 감소하는 추세가 존재하기 때문에 자기상관관계 그래프에서는 장기적인 상관성이 나타납니다. 시간 간격이 증가할수록 상관관계가 감소할 수 있습니다.

계절성(Seasonality) 비정상성 데이터

계절성은 특정한 주기로 반복되는 패턴을 나타냅니다. 예를 들어, 매년 동일한 시기에 발생하는 패턴이나 행동은 계절성의 예입니다. 계절성은 주로 연도, 분기, 월 등의 주기로 나타나며, 이러한 주기적인 패턴은 예측 모델에서 고려해야 할 요소입니다.

계절성을 가진 데이터의 경우, 주기적인 패턴이 반복되기 때문에 자기상관관계 그래프에서는 주기적인 상관성이 나타납니다. 특정 시차(라그, lag)만큼의 간격에서 상관계수가 높게 나타날 수 있습니다.

주기(Cyclical) 비정상성 데이터

주기는 계절성과 유사하지만 더 긴 시간 스케일을 갖습니다. 주기는 일반적으로 경제적 흐름이나 사회적 변동과 관련이 있을 수 있으며, 긴 기간 동안 반복되는 패턴을 나타냅니다. 주기는 예측 모델링에서 고려해야 할 요소 중 하나일 수 있습니다.

주기적인 변동을 가지는 데이터의 경우, 장기적인 주기에 따른 상관관계를 보여주는 자기상관관계 그래프가 나타날 수 있습니다. 주기의 길이에 따라 다양한 시차에서 상관계수가 높게 나타날 수 있습니다.

변동(Volatility) 비정상성 데이터

변동은 데이터의 분산이 시간에 따라 변화하는 현상을 의미합니다. 금융 데이터에서 주로 나타나며, 특정 시간 동안의 변동성이 크게 변할 수 있습니다.

변동성을 가진 데이터의 경우, 특정 시간 동안의 변동성이 크게 변할 수 있으므로 자기상관관계 그래프에서는 불규칙한 패턴을 보일 수 있습니다. 변동이 급격한 구간에서는 상관계수가 갑자기 증가할 수 있습니다.

비정상성 데이터의 경우, 주로 추세나 계절성을 분석하고 이를 고려한 모델링 기법을 사용하여 예측을 시도하게 됩니다. 이를 위해 차분(differencing), 변환(transformations), 분해(decomposition) 등의 전처리 기법과 ARIMA, SARIMA, Prophet과 같은 모델들이 널리 사용됩니다.

시계열 분석

자기회귀(Autoregressive) 모델

자기회귀(Autoregressive) 모델은 시계열 데이터에서 현재 시간의 값이 이전 시간의 값들에 의존하는 모델입니다. 다시 말해, 현재 시간의 값은 과거의 시간 간격 내 값들의 가중합으로 예측됩니다. 이 모델은 "AR(p)"로 표기되며, "p"는 몇 개의 이전 시간 간격을 고려할 것인지를 나타냅니다.

자기회귀 모델은 시계열 데이터의 자기상관성을 활용하여 미래 값을 예측하거나 분석하는데 사용됩니다. 간단한 예시를 통해 자기회귀 모델의 개념을 설명해보겠습니다.

AR(1) 모델의 예시:
자기회귀 모델 중 가장 간단한 형태인 AR(1) 모델은 다음과 같이 나타낼 수 있습니다:

AR(1)

여기서,

변수 설명

이러한 AR(1) 모델은 현재 시간의 값이 이전 시간의 값에 가중치를 곱한 후 노이즈를 더한 결과로 예측되는 모델입니다.

일반적으로 p 차수의 AR 모델은 p 개의 이전 시간 간격을 고려하여 다음과 같이 나타낼 수 있습니다:

p차수 AR모델

자기회귀 모델은 시계열 데이터 분석에서 많이 사용되며, 자기회귀 계수와 백색잡음의 특성을 통해 모델의 적합성을 평가하고 미래 값을 예측하거나 분석합니다.

이동평균(Moving Average)

이동평균(Moving Average)은 시계열 데이터에서 사용되는 필터링 기법 중 하나로, 시계열 데이터의 잡음을 줄이거나 추세를 부드럽게 만들기 위해 사용되는 방법입니다. 이동평균은 주어진 시간 간격 내에서 데이터의 평균값을 계산하여 새로운 값을 생성합니다.

간단한 예시를 통해 이동평균의 개념을 설명해보겠습니다. 이동평균은 "MA(q)"로 표기되며, "q"는 몇 개의 이전 값들을 고려할 것인지를 나타냅니다.

MA(1) 모델의 예시:
이동평균의 가장 간단한 형태인 MA(1) 모델은 다음과 같이 나타낼 수 있습니다:

MA(1)

여기서, 

변수 설명

θ 값이 1보다 작으면 이전 노이즈의 영향이 감소하는 효과를 가져옵니다.
일반적으로 q 차수의 MA 모델은 q 개의 이전 노이즈 값을 고려하여 다음과 같이 나타낼 수 있습니다:

q차수 MA모델

이동평균은 주어진 시간 간격 내에서 데이터의 평균을 사용하기 때문에 주변의 노이즈를 부드럽게 만들어 추세를 확인하는 데 도움이 됩니다. MA 모델은 자기상관관계를 제어하는 데에도 사용될 수 있습니다. 이동평균과 자기회귀(AR) 모델을 결합한 ARMA 모델도 널리 사용됩니다.

통합 필터(Integration Filter)

통합 필터(Integration Filter)는 시계열 데이터의 추세를 제거하거나 시계열 데이터를 정상성(stationarity)을 갖는 데이터로 변환하기 위해 사용되는 필터링 기법입니다. 시계열 데이터가 추세나 계절성과 같은 비정상적인 패턴을 가지고 있는 경우, 이러한 패턴을 제거하여 정상성을 갖는 데이터로 변환하는 과정이 중요합니다.

Integration 필터는 시계열 데이터에 대한 차분(differencing)을 의미하며, 시간 간격에 따른 변화량을 계산하여 데이터를 변환합니다. 정확히는 "차분 차수"를 의미하는 "d"로 표기되며, "d"값이 0보다 큰 경우, 해당 차분 차수만큼 시계열 데이터에 차분을 적용합니다.

다음은 Integration 필터의 기본적인 개념을 설명하는 예시입니다:

시계열 데이터

차분(d=1):
차분 차수 "d"가 1인 경우, 현재 시간의 값과 이전 시간의 값과의 차이를 계산하여 새로운 시계열 데이터를 생성합니다.

차분(d=1)

이를 통해 추세나 계절성과 같은 비정상성이 제거된 데이터를 얻을 수 있습니다.

차분(d=2):
차분 차수 "d"가 2인 경우, 먼저 1차 차분을 적용한 데이터에 대해 다시 1차 차분을 적용하여 변환합니다.

차분(d=2)

이를 통해 비정상성을 더욱 강력하게 제거한 데이터를 얻을 수 있습니다.

통합 필터는 정상성을 가지는 시계열 데이터를 얻기 위한 중요한 단계로, 시계열 분석 및 모델링에서 활발하게 사용됩니다. ARIMA(자기회귀누적이동평균) 모델은 통합 필터와 자기회귀, 이동평균을 결합하여 비정상성을 제거하고 모델링하는 방법론의 한 예시입니다.

ARIMA(자기회귀누적이동평균, Autoregressive Integrated Moving Average)

ARIMA(자기회귀누적이동평균, Autoregressive Integrated Moving Average)는 시계열 데이터 분석과 예측에 널리 사용되는 통계적 모델링 방법 중 하나입니다. ARIMA 모델은 자기회귀(AR)와 이동평균(MA) 모델을 결합하며, 시계열 데이터의 추세나 계절성을 고려하여 데이터를 모델링하고 예측합니다.

ARIMA 모델은 다음 세 가지 주요 요소로 구성됩니다:

자기회귀(Autoregressive, AR)

자기회귀는 현재 값이 이전 시간 간격의 값들에 의존하는 모델입니다. AR 부분은 시계열 데이터의 자기상관성을 나타내며, 현재 값이 이전 값들의 가중합으로 예측됩니다.

통합(Integrated, I)

통합은 시계열 데이터의 정상성을 갖도록 변환하는 과정을 나타냅니다. 시계열 데이터가 비정상성을 가지면 추세나 계절성을 모델링하기 어렵기 때문에, 통합 단계에서 데이터에 대한 차분(differencing)을 적용하여 정상성을 확보합니다.

이동평균(Moving Average, MA)

이동평균은 시간 간격 내의 노이즈를 모델링하는 부분입니다. MA 부분은 현재 값이 이전 시간 간격 내의 백색잡음(White noise)의 가중합으로 예측됩니다.

따라서 ARIMA 모델은 "AR(p)IMA(d)MA(q)"로 표기되며, "p"는 자기회귀 계수의 차수, "d"는 차분 차수, "q"는 이동평균 계수의 차수를 나타냅니다.

ARIMA 모델은 다음과 같은 단계로 진행됩니다:

데이터 전처리: 시계열 데이터의 비정상성을 확인하고 필요한 경우 통합 차분을 적용하여 정상성을 확보합니다.

모델 선택: 자기회귀 계수(p), 차분 차수(d), 이동평균 계수(q)를 결정합니다. 이는 ACF(Autocorrelation Function)와 PACF(Partial Autocorrelation Function)를 통해 결정될 수 있습니다.

모델 피팅: 선택한 모수로 ARIMA 모델을 피팅합니다. 이때 최적의 매개변수를 찾기 위해 최적화 과정이 수행될 수 있습니다.

모델 평가: 피팅된 모델의 성능을 평가하고, 잔차 분석을 통해 모델의 적합성을 확인합니다.

예측: 피팅된 ARIMA 모델을 사용하여 미래 값을 예측합니다.

ARIMA 모델은 시계열 데이터의 변동성과 패턴을 모델링하여 예측하고 분석하는 강력한 방법입니다. ARIMA 모델의 변형으로는 계절성을 고려한 SARIMA(SARIMAX) 모델 등이 있습니다.

p, d, q

ARIMA 모델을 설정할 때 중요한 매개변수인 p, d, q에 대해 자세히 설명해 드리겠습니다. 이 매개변수들은 ARIMA 모델의 자기회귀(Autoregressive, AR), 통합(Integrated, I), 이동평균(Moving Average, MA) 부분을 정의하는 데 사용됩니다.

ARIMA 모델은 p, d, q를 각각의 부분에 할당하여 모델의 특성을 설정합니다.

자기회귀 부분 (p) - AR (AutoRegressive)

p는 자기회귀 계수의 차수를 나타냅니다. 자기회귀 부분은 현재 값이 이전 시간 간격의 값들에 어떻게 의존하는지를 정의합니다. p이 클수록 현재 값은 과거 값들에 더 강하게 의존하게 됩니다. 자기회귀 부분을 나타내는 식은 다음과 같습니다:

자기회귀

통합 부분 (d) - I (Integrated)

d는 차분 차수를 나타냅니다. 통합 부분은 시계열 데이터의 비정상성을 제거하기 위해 차분(differencing)을 얼마나 적용할 것인지를 정의합니다. d 값이 0보다 크면 차분이 적용되며, 시계열 데이터가 정상성을 갖도록 변환됩니다.

이동평균 부분 (q) - MA (Moving Average)

q는 이동평균 계수의 차수를 나타냅니다. 이동평균 부분은 현재 값이 이전 시간 간격 내의 백색잡음(White noise)의 가중합으로 어떻게 예측되는지를 정의합니다. q이 클수록 현재 값은 노이즈에 더 강하게 의존하게 됩니다. 이동평균 부분을 나타내는 식은 다음과 같습니다:

이동평균

따라서 ARIMA 모델의 특성은 p, d, q 매개변수에 의해 결정됩니다. 이 매개변수들은 ACF(Autocorrelation Function)와 PACF(Partial Autocorrelation Function)를 분석하여 결정하는 방법이 일반적입니다. 최적의 p, d, q 값을 찾는 것은 ARIMA 모델의 성능과 예측 정확도에 큰 영향을 미치는 중요한 과정입니다.

예제

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 주식 가격 데이터 불러오기
stock_data = yf.download('AAPL', start='2022-01-01', end='2022-12-31', progress=False)
stock_price = stock_data['Adj Close']

# 데이터 시각화
plt.figure(figsize=(10, 6))
plt.plot(stock_price.index, stock_price, label='AAPL Stock Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.title('AAPL Stock Price Time Series')
plt.legend()
plt.show()

# ACF와 PACF 그래프를 통해 ARIMA(p,d,q)의 매개변수 설정
plot_acf(stock_price, lags=20)
plot_pacf(stock_price, lags=20)
plt.show()

# ARIMA 모델 피팅
order = (1, 1, 1)  # (p, d, q) 값 설정
model = ARIMA(stock_price, order=order)
result = model.fit()

# 모델 결과 요약
print(result.summary())

# 예측 및 시각화
forecast_steps = 20
forecast = result.forecast(steps=forecast_steps)

forecast_index = pd.date_range(start=stock_price.index[-1], periods=forecast_steps, freq=stock_price.index.freq)

plt.figure(figsize=(10, 6))
plt.plot(stock_price.index, stock_price, label='AAPL Stock Price')
plt.plot(forecast_index, forecast, label='Forecast')
plt.xlabel('Date')
plt.ylabel('Price')
plt.title('AAPL Stock Price Forecast with ARIMA')
plt.legend()
plt.show()

auto_arima

auto_arima는 Python의 pmdarima 패키지에서 제공하는 함수로, 자동으로 최적의 ARIMA 모델을 찾아주는 기능을 제공합니다. 이 함수는 AIC, BIC, HQIC와 같은 정보 기준을 사용하여 다양한 ARIMA 모델을 시도하고, 데이터에 가장 잘 맞는 모델을 선택합니다.

auto_arima 함수는 사용자가 지정한 최대 계절성 주기, 계절성 여부 등의 매개변수를 기반으로 다양한 ARIMA 모델을 시도하며, 최적의 모델을 선택합니다. 이를 통해 모델 선택 과정을 자동화하고 더 나은 예측 결과를 얻을 수 있습니다.

아래는 auto_arima 함수의 간단한 예제 코드입니다.

import yfinance as yf
import pmdarima as pm
import pandas as pd

# 주식 가격 데이터 불러오기
stock_data = yf.download('AAPL', start='2022-01-01', end='2022-12-31', progress=False)
stock_price = stock_data['Adj Close']

# auto_arima를 사용하여 최적의 ARIMA 모델 찾기
model = pm.auto_arima(stock_price, seasonal=False, stepwise=True, suppress_warnings=True)

# 모델 결과 요약
print(model.summary())

# 예측
forecast_steps = 20
forecast, conf_int = model.predict(n_periods=forecast_steps, return_conf_int=True)

forecast_index = pd.date_range(start=stock_price.index[-1], periods=forecast_steps, freq=stock_price.index.freq)

# 예측 결과 시각화
plt.figure(figsize=(10, 6))
plt.plot(stock_price.index, stock_price, label='AAPL Stock Price')
plt.plot(forecast_index, forecast, label='Forecast')
plt.fill_between(forecast_index, conf_int[:, 0], conf_int[:, 1], color='gray', alpha=0.2)
plt.xlabel('Date')
plt.ylabel('Price')
plt.title('AAPL Stock Price Forecast with auto_arima')
plt.legend()
plt.show()


이 예제에서는 pmdarima 패키지를 사용하여 auto_arima 함수를 호출하여 주식 가격 데이터에 대해 자동으로 최적의 ARIMA 모델을 찾고, 예측 결과를 시각화하고 있습니다. pmdarima 패키지는 sklearn과 유사한 API를 제공하여 사용하기 쉬우며, 다양한 모델 선택과 피팅 옵션을 지원합니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

모델별 적합한 상황과 장단점  (0) 2023.09.04
불균형 데이터 처리 - 샘플링  (0) 2023.09.03
[sklearn] KMeans  (0) 2023.08.31
[sklearn] KFold와 cross_val_score  (0) 2023.08.31
앙상블(Ensemble)  (0) 2023.08.30