Search

시계열 분석

개요

시계열 데이터는 데이터 통계의 가장 기본적인 가정 아래 3가지를 만족시키지 못하는 특이한 데이터다.
등분산성
자기상관성
정상성
따라서, 전통적인 머신러닝 기법인 ARIMA 시리즈에 그냥 냅다 데이터를 집어넣기 어렵기 때문에 데이터에 있는 특수성 을 제거해준 뒤, 모델에 집어넣어 줘야 한다.
이때, 사용하는 방법들은 다음과 같다.
차분(differencing)
로그 변환
로그 변환 + 차분

1. 차분

데이터를 차분한다는 것은 t 시점과 t - 1 시점의 값의 차이를 구하는 것이다.
즉, 데이터를 차분하면 데이터의 변동값을 알게 되어 데이터의 앞뒤에 받았던 영향을 제거하고 랜덤한 데이터만으로 머신러닝을 예측할 수 있도록 하는 것이다.
변동값 = 현재값 - 직전값
차분하는 데이터의 가장 첫 번째 값은 뺄 수 있는 직전값이 없으므로 변동값을 구할 수 없다. 따라서 차분하면 t - 1개의 데이터를 얻게 된다.
차분 후의 데이터는 백색 소음(white noise) 같은 형태의 데이터로 바뀌게 된다. 즉, 차분을 통해 완전히 random한 variation 데이터를 얻을 수 있는 것이다.
물론 한 번의 차분이 아니라 두번, 세번해야 하는 경우도 있다.

2. 로그 변환

로그 변환은 시계열 데이터 뿐만 아니라 그냥 모든 데이터의 변동성(variation=분산)이 너무 커서 분석이 어려운 데이터에 자주 씌워주는 방법이다.
변환해주면 전반적인 range를 줄여주는 원리다.

3. 로그 변환 + 차분

보통의 데이터 전처리에서는 로그 변환을 먼저 해주는 것이 일반적이다. 로그 변환을 통해 분산을 안정화시키고 차분을 통해 시계열 데이터가 정상성을 띄게 해주는 것이다.

정상성 검증

정상성을 보이는지 확인(검증)하는 방법은 통상적으로 두가지가 있는데,
그래프의 모양을 보고 눈대중으로 체크
수치를 통해 확인

정상성 검증 - 눈대중 확인

그래프를 시각화해봐서 추세성, 계절성이 제거되었는지, 분산의 변동폭이 일정한지 등을 확인하면 된다.
정상성을 가진 데이터는 b, g 다.

정상성 검증 - 수치로 확인하기

ACF(자기 상관 함수) : 데이터를 차분한 값이 ACF 의 범주 안에 들어오면 정상성을 띈 데이터라고 간주
즉, ACF의 신뢰구간 안에 들어오는지만 확인하면 된다.
Dicky Fuller test : 시계열 데이터의 안정성을 테스트하는 검증 방법
귀무 가설 : 시계열 데이터가 안정적이지 않다
즉, 귀무 가설이 기각되면 데이터가 안정적이라고 판단
from statsmodels.tsa.stattools import adfuller def augmented_dickey_fuller_test(timeseries): # statsmodels 패키지에서 제공하는 adfuller 메서드를 호출 dftest = adfuller(timeseries, autolog='AIC') # adfuller 메서드가 리턴한 결과를 정리하여 출력 dfoutput = pd.Series(dftest[:4], index=['Test Statistic', 'p-value', '#Lags Used',\ 'Number of Observations Used']) for key, vlaue in dftest[4].items(): dfoutput['Critical Value (%s)' %key] = value print(dfoutput)
Python
복사

기본 시계열 모델

AR, MR, ARMA 안정시계열 모델인데, 일상에서 볼 수 있는 데이터들은 불안정시계열이기 때문에 위 모델에서 추가적인 가정이 있는 ARIMA, SARIMA, VARMA 등을 이용하게 된다. but, 기본적인 원리를 이해하기 위해서 정리해보자.

1. AR 모델

자기회귀 (Autoregressive Model) 의 약어로, 자기 자신의 과거 데이터를 이용해 미래를 예측하는 모델이다.
순수한 변동의 variation을 잡아내기 위해 고안된 모델이라고 이해하면 된다.
y_t = c + Φ1 * y_t-1 + Φ2 * y_t-2 + ... + Φp * y_t-p + ε_t
Plain Text
복사

2. MA 모델 (=이동 평균 모델)

AR 모델과 반대로 이전 예측치 오차에 현재값이 영향을 받는 모델이다. 즉, 직전 값에 더 영향을 받는다고 가정한 단기 시계열 모델이다.
y_t = c + Θ1 * ε_t-1 + Θ2 * ε_t-2 + ... + Θq * ε_t-q + ε_t
Python
복사
c : 평균값, Θ : 가중치
위 모델을 활용해서 나온 실제값들을 그래프로 그려보면 평균 C를 중심으로 데이터들이 왔다갔다 형성되는 것을 확인할 수 있다.
또한, 위의 이동 평균 모델은 q시점까지의 데이터에 영향을 받는 모델이라고 보면 된다.

3. ARMA 모델

AR + MA AR(p) 모델과 MA(q) 모델을 결합해 ARMA 모델을 도출할 수 있는데, 즉, p개의 자기 자신의 과거값q개의 과거 백색 잡음의 선형 조합으로 정의할 수 있다는 뜻이다. 그래서, 두 공식을 더하면 아래와 같은 모양의 공식이 나오게 된다.
y_t = AR(p) + MA(q) y_t = Φ1 * y_t-1 + Φ2 * y_t−2 + ... + Φp * y_t−p + ϵ_t + Θ1 * ϵ_t−1 + Θ2 * ϵ_t−2 + ... + Θq * ϵ_t−q
Plain Text
복사
변수로 작용하는 p, q를 아래와 같은 형식으로 부르게 된다.
- ARMA(1, 0) = AR(1) - ARMA(0, 1) = MA(1) - ARMA(1, 1)
Plain Text
복사
가장 흔하게 볼 수 있는 정상 시계열의 모습은 위의 ARMA(1,1) 이다. 차수가 올라간다고 해서 모델의 성과나 예측의 정확도가 올라가는 것은 아니다.

시계열 모델의 종류들

1. 시간 영역의 시계열 모델

AR, MA 모델, 가장 유명하고 전통적인 ARIMA 모델들의 파생 모델로부터 나온 모델들이다. 이들은 시간 변동 폭이 discrete(이산적, 불연속적) 하지 않고 연속적(=이상적)일 때 사용한다.
계량 통계학, 경제학에서 생겨난 모델이고 차후의 모델들과 다르게 조금 더 variation이 작고 인간이 이해할 수 있는 데이터에 주로 적용한다.

2. 진동수 영역 시계열 모델

데이터 값들이 더 연속적인 시간적인 개념들이 들어가 있는 경우, 변동성이 좀 더 심한 경우, 등 센서 데이터, 라디오 전파 데이터, 심박수 데이터 등의 ‘일정한 진폭 안에서 주기성을 띄는 데이터’에 이용한다.

3. 비선형 모형

변동이 선형적이지 않고 (중간에 뭔가 꺾이거나 확 올라가거나 등) 굉장히 irregular 해서 인간이 이해하고 예상하기 어려운 데이터들에 대해 딥러닝 기법을 이용해 예측하는 영역이다. 비교적 최근에 등장한 영역으로 앞선 위의 두 가지 방식과 다른 접근법이라고 생각하면 된다.

모델 선정 단계

다음의 4가지 단계를 거쳐서 적합한 모델들을 선정해 나가야 한다.
1.
모형 설정
ACF, PACF 같은 지표와 auto.arima 와 같은 자동 함수를 이용해서 시계열 자료에 적합한 모델 모형 선택
2.
모수 추정
설정한 모형에 따라 모수(계수)를 추정하고 적합성을 검토
3.
분석결과의 검정
모형 적합도에 따른 잔차의 정상성 및 분석결과 검정을 수행
4.
예측
시계열 자료와 분석모형을 토대로 미래 값을 예측