본문 바로가기
IT 지식/빅데이터 & 분석

[시계열 분석 모델] AR, MA, ARIMA

by 이민우 2021. 10. 12.
728x90
반응형

시계열 데이터

 

시계열 데이터란, 시간의 순서에 따라 관찰되고 나열된 데이터이다.

 

이는 시퀀스 데이터의 일종으로, 과거 정보가 미래 정보에 영향을 끼치고, 이러한 특성으로 인해 한 시점의 데이터 단독으로는 예측 및 분석이 불가능하다.

 

 

 

정상성과 비정상성

 

정상성이란 다음 항목들을 만족하는 시계열이다.

  • 평균이 일정해야 한다.
  • 분산이 시점에 의존하지 않아야 한다.
  • 공분산은 시차에만 의존한다. 즉, 시점 자체에 의존하지 않는다.

한 마디로 표현하자면, 관찰을 하는 시간에 상관 없이 일정한 평균과 분산을 갖고, 공분한은 시차에만 의존한 데이터이다.

 

그래서 특정 시기, 혹은 특정 순간에 값이 크게 변동되는 추세나 계절성이 있는 시계열은 정상성을 만족하지 않는 비정상 시계열이다.

 

그런데 당연히 현실 세계의 시계열 데이터는 대부분 정상성을 만족하지 못하는 비정상 시계열이다.

하지만 비정상 시계열은 분석이 어렵기 때문에 가능하면 분석이 쉬운 정상 시계열로 바꿔주는 작업이 필요하다.

 

비정상 시계열을 정상 시계열로 변환하는 방법은 아래와 같다.

  • 평균이 일정하지 않으면 차분한다.
  • 분산이 일정하지 않으면 변환한다.

 

 

변환과 차분

 

분산각 값들이 평균으로부터 얼마나 떨어져 있는가를 의미한다. 그리고 정상 시계열을 만족하기 위해서는 앞서 말했듯 해당 자료를 변환해야 한다.

여기서 변환은 주로 로그 변환을 이용한다. 로그 변환이란, 각 변수 x를 log(x)로 바꾸어 데이터의 분산을 맞추는 작업이다.

파이썬에서는 numpy.log(data) 함수를 사용하면 쉽게 변환이 가능하다. 된다.

 

차분현재 시점의 데이터에서 인접 시점의 데이터를 빼는 것이다.

차분은 n차 차분으로 나눌 수 있는데, 이 n이 1이면 바로 전의 시점 데이터만 고려하여 차분함을 의미한다.

마찬가지로 파이썬에서 numpy.diff(data, n) 함수를 사용하면 쉽게 차분이 가능하다.

 

랜덤한 배열을 만들어 파이썬을 활용하여 변환과 차분을 하는 방법은 아래와 같다.

import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(30)

fig = plt.figure(figsize=(16,6))

#원본
ax1 = fig.add_subplot(1, 4, 1)
ax1.plot(list(range(0, 30)), data)
ax1.set_ylim(-5, 5)
ax1.set_title("random")

#변환
data_transformation = np.log(data)
ax2 = fig.add_subplot(1, 4, 2)
ax2.plot(list(range(0, 30)), data_transformation)
ax2.set_ylim(-5, 5)
ax2.set_title("transformation")

#차분
data_diff = np.diff(data, 1)
ax3 = fig.add_subplot(1, 4, 3)
ax3.plot(list(range(0, 29)), data_diff)
ax3.set_ylim(-5, 5)
ax3.set_title("difference")

#변환 + 차분
data_normal = np.log(data)
data_normal = np.diff(data_normal, 1)
ax4 = fig.add_subplot(1, 4, 4)
ax4.plot(list(range(0, 29)), data_normal)
ax4.set_ylim(-5, 5)
ax4.set_title("transformation" + " difference")

plt.show()

해당 코드를 돌리면 랜덤 값에 따라 다르겠지만, 아래와 같은 결과를 얻을 수 있다.

 

 

AR, MA, ARIMA

 

AR 모형자기회귀 모형이다.

이 모형은 p 시점 전의 자료가 현재 자료에 영향을 주는 모형으로, ARn 모형으로 표현이 가능한데, 여기서 n은 차분 때와 마찬가지로 얼마만큼 전의 데이터를 활용하여 분석할 것인지를 결정한다.

 

MA 모형은 이동평균 모형이다. 이는 유한한 개수의 백색잡음의 결합으로, 늘 정상성을 만족한다.

마찬가지로 n차 MA 모형으로 나눌 수 있는데, 여기서 n은 마찬가지로 n만큼 전 데이터의 백색잡음을 결합하여 분석을 할 것인지 결정한다.

 

ARIMA 모형은 위의 두 개를 합친 모형이다.

그렇기에 ARIMA 모형은 차분하면 MA가 되고, 변환하면 AR이 된다.

 

ARIMA 모형을 만드는 방법은 여러 가지가 있다. ex) auto_arima

하지만 지금은 statsmodels.tsa.arima_model을 사용하여 구현해본다.

 

데이터는 10씩 증가하다, 두 번 증가 후 5가 떨어지는 추세가 있는 데이터를 임의로 만들어 사용한다.

데이터는 아래와 같다.

from statsmodels.tsa.arima_model import ARIMA
import pandas as pd

data = [10, 20, 15, 25, 35, 30, 
        40, 50, 45, 55, 65, 60,
        70, 80, 75, 85, 95, 90,
        100, 110, 105, 115, 125, 120,
        130, 140, 135, 145, 155, 150]
float_data = np.array(data, dtype=np.float)
#24번째 데이터까지만 학습에 활용
#25~30 데이터는 추론

 

24번째 데이터까지는 학습용, 25부터는 추론으로 사용할 것이다.

그렇다면 이제 학습용 데이터를 ARIMA에 넣고 학습을 시키자.

p=2 #AR모형의 lag. p개만큼 AR이 과거 데이터 활용
q=2 #MA모형의 lag. q개만큼 MA가 과거 데이터 활용
d=2 #차분 횟수

model = ARIMA(data[:24], order = (p, d, q))
model = model.fit(trend = "nc")
predict = model.predict(24, 30, typ='levels')[1:]

간단하게 ARIMA(2, 2, 2) 모형을 사용한다.

ARIMA 자체와 ARIMA.fit 안의 파라미터는 아래의 링크들을 보면 확인할 수 있다.

https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima.model.ARIMA.html

https://www.statsmodels.org/v0.12.2/generated/statsmodels.tsa.arima_model.ARIMA.fit.html

 

학습은 데이터가 적기 때문에 빨리 끝난다. 결과를 확인해보면 다음의 결과를 얻을 수 있다.

plt.plot(list(range(0, 25)), data[:25])
plt.plot(list(range(24, 30)), data[24:])
plt.plot(list(range(24, 30)), predict)
plt.show()

728x90
반응형