1. 미래를 예측한다는 것은 가능할까?
- 생각해 볼 수 있는 미래 예측 시나리오
1) 지금까지의 주가변곡선을 바탕으로 다음 주가변동 예측
2) 특정 지역의 기후데이터를 바탕으로 내일의 온도변화 예측
3) 공장 센터데이터 변화이력을 토대로 이상 발생 예측
- 위 예시의 공통점은 예측의 근거가 되는 시계열(Time-Series) 데이터가 있다는 것이다.
- 시계열이란 시간 순서대로 발생한 데이터의 수열이라는 뜻이다.
- 일정 시간 간격으로 발생한 데이터일 때가 많지만 꼭 그래야만 하는 것은 아니다. 매일의 주식 거래 가격을 날짜-가격 형태로 날짜순으로 모아둔 데이터가 있다면 시계열 데이터가 될 것이다. 이 때 날짜가 인덱스(index) 역할을 하게 된다.
- 그럼 저런 주식 데이터로 미래를 예측 할 수 있겠는가? 결론은 불가능하다. 미래의 데이터를 예측하려 한다면 적어도 다음 두 가지의 전제가 필요하다.
1) 과거의 데이터에 일정한 패턴이 발견된다.
2) 과거의 패턴은 미래에도 동일하게 반복될 것이다.
- 위 두 가지 전제를 요약하자면 "안정적(Stationary) 데이터에 대해서만 미래 예측이 가능하다." 라고 할 수 있다.
- 여기서 안정적(Stationary)이라는 것은 시계열 데이터의 통계적 틍성이 변하지 않는다는 것을 의미한다. 직관적으로 시계열 데이터를 만들어내는 시간의 변화에 무관하게 일정한 프로세스가 존재한다는 뜻이다.
- 시계열 데이터 분석은 완벽한 미래 예측을 보장하지는 않는다. 어떤 예측하지 못한 외부적 변수에 의해 시계열 데이터 분석의 전제가 되는 안정적이 훼손될 여지가 있기 때문이다.
2. Stationary한 시계열 데이터
- 안정적 시계열이란 3가지 특징을 가진 시계열을 말한다.
1) 시간의 추이와 관계 없이 평균이 불변하다.
2) 시간의 추이와 관계 없이 분산이 불변하다.
3) 두 시점 간의 공분산이 기준시점과 무관하다.
- 시계열이 안정적인지 여부가 중요한 이유는 일반적인 시계열 분석에서 시계열이 안정적이여야 하기 때문이다. 시계열이 안정적이지 않다면 로그를 이용하거나, 차분을 통해 시계열을 안정적으로 변환한 뒤에 분석을 진행해야 한다.
- 시계열을 배우기 전에 알아야 하는 통계학 개념 몇 가지가 있다.
1) 평균 : 분포의 중간부분이 어디인가
2) 분산 : 분포가 얼마나 퍼져있는가
3) 공분산 : 각 확률변수들이 어떻게 퍼져있는가, 두 확률변수 X, Y가 어떤 모양으로 퍼져있는가. 즉, X가 커지면 Y도 커지거나 작아지거나 혹은 아무 변화가 없거나 등을 말함. 공분산은 X의 편차와 Y의 편차를 곱한것의 평균이란 뜻임.
4) 상관계수 : 공분산의 문제점으로 X와 Y의 단위 크기에 영향을 받는다는 것이 있는데, 이를 보완하기 위해 나온 개념이라 볼 수 있다. 확률변수의 절대적 크기에 영향을 받지 않도록 단위화 시켰다고 생각하면 될 것 같다. (분산의 크기만큼 나눔으로)
- 그럼 몇 가지 질문이 생긴다.
1) 만약 X와 X의 Covariance를 계싼한다면 이것은 무엇과 같아지나? -> Variance
2) 두 확률변수 X, Y가 서로 독립이면 Covariance와 Correlation은 어떻게 되나? -> Covariance와 Correlation이 모두 0이 된다.
3) 자기와의 공분산이라면 그냥 분산이 되는데, 왜 분산이라 하지 않고 자기공분산이라 하는가? -> X(t)와 X(t) 사이의 공분산이 아니라 X(t)와 X(t+h) 사이의 공분산이기 때문이다. 즉, 일정 시차 h 사이를 둔 자기자신과의 공분산이기 때문이다.
4) X(t)와 X(t+h) 사이의 공분산과 X(t-h)와 X(t) 사이의 공분산은 항상 일정한가? -> X가 Stationary한 시계열 변수라는 조건 하에서만 성립한다. 즉, 안정적인 시계열에 한해서 시차 h가 같다면 데이터의 상관성이 동일한 주기성이 나타난다.
3. 시계열 데이터 사례분석
- 이번 노드에서는 잘 알려진 작은 시계열 데이터를 토대로 시계열 데이터의 안정성의 개념을 시각적으로 봤다.
- 데이터는 Daily Minimum Temperatures in Melbourne이다.
- pandas를 통해 데이터를 가져오고 plt를 이용하여 시각화해서 데이터를 봤다.
- 그리고 결측치 유무를 확인하고 만약 있다면 삭제와 보간의 방법 중 보간을 선택했다. 보간은 interpolate(method = "time")을 이용했다.
- 다음은 일정 시간 내 구간 통계치(Rolling Statistics)를 시각화하는 함수를 만들었다. 현재 타임스텝부터 window에 주어진 타임스텝 이전사이 구간의 평균(rolling mean, 이동평균)과 표준편차(rolling std, 이동표준편차)를 원본 시계열과 함께 시각화했다.
- 그리고 다른 데이터인 International airline passengers 데이터셋을 가져와서 위와 동일하게 분석해봤다.
- 두 데이터 중 시각화로 봤을 때 International airline passengers 데이터셋이 더 안정적이지 않아 보여서 이 데이터를 가지고 실습을 진행했다.
4. Stationary 여부를 체크하는 통계적 방법
- Augmented Dickey-Fuller Test(ADF Test)
1) 이 테스트는 주어진 시계열 데이터가 안정적이지 않다 라는 귀무가설(Null Hypothesis)를 세운 후, 통계적 가설 검정 과정을 통해 귀무가설이 기각될 경우에 이 시계열 데이터가 안정적이다 라는 대립가설(Alternative Hypothesis)를 채택한다는 내용이다.
2) 시계열 분석은 탄탄한 통계학적 기반에 입각한 만큼 제대로 이해하려면 전문적인 훈련이 필요해서 ADF Test의 세부 알고리즘은 생량하고, statsmodels패키지에서 제공하는 adfuller 메소드를 이용하여 손쉽게 ADF Test의 결과를 이용했다.
- 가설 검정의 기본 개념을 이루는 p-value(유의확률)이란 무엇일까?
1) 귀무가설을 가정했을 때의 확률분포 상에서 현재의 관측보다 더 극단적인 관측이 나올 확률이다.
2) 귀무가설의 가정이 틀렸다고 볼 수 있는 확률이기도 하다.
3) 보통 이 값이 0.05 미만으로 매우 낮게 나온다면 p-value 만큼의 오류 가능성 하에 귀무가설을 기각하고 대립가설을 채택할 수 있는 근거가 된다.
- statsmodels 패키지는 R에서 제공하는 통계검정, 시계열분석 등의 기능을 파이썬에서도 이용할 수 있도록 하는 강력한 통계 패키지이다.
- 이번 노드에서는 statsmodels 패키지의 기능을 자주 활용한다. adfuller 메소드를 이용해 주어진 timeseries에 대한 Augmented Dickey-Fuller Test를 수행할 수 있다.
5. Stationary하게 만들 방법은 없을까?
- 위에서 언급했듯, 안정적이지 않은 시계열을 분석하려면 이것을 안정적인 시계열로 바꾸어 내야 한다. 어떻게 가능할까?
- 크게 두 가지를 언급할 수 있다.
1) 정성적인 분석을 통해 보다 안정적(stationary)인 특성을 가지도록 기존의 시계열 데이터를 가공 / 변형하는 시도
2) 시계열 분해(Time series decomposition)라는 기법을 적용
- 보다 Stationary한 시계열로 가공해 가기
1) 로그함수 변환
(1) 시간 추이에 따라 분산이 점점 커지는 특성을 보이는 시계열일 경우 로그함수로 변환을 해주는 것이 도움이 된다.
2) Moving average 제거 - 추세(Trend) 상쇄하기
(1) 시계열 분석에서 시간 추이에 따라 나타나는 평균값 변화를 추세(Trend)라 한다. 이 변화량을 제거해 주려면 거꾸로 Moving Average, 즉 rolling mean을 구해서 빼주면 된다. 이 때 window size로 인해 생기는 결측치는 제거해주는 것이 좋다.
3) 차분(Differencing) - 계절성(Seasonality) 상쇄하기
(1) Trend에는 잡히지 않지만 시계열 데이터 안에 포함된 패턴이 파악되지 않은 주기적 변화는 예측에 방해가 되는 불안정성 요소이다. 이것은 Moving Average제거로는 상쇄되지 않는 효과이다. 이런 주기적 패턴을 계절성(Seasonality)라 한다.
(2) 이런 패턴을 상쇄하기 위해 효과적인 방법에는 차분(Differencing)이 있다. 마치 미분(Differentiation)을 떠올리게 하는 개념이다.
(3) 위 개념은 시계열을 한 스텝 앞으로 시프트한 시계열을 원래 시계열에 빼 주는 방법이다. 이렇게 되면 남은 것은 현재 스텝 값 - 직전스텝 값이 되어 정확히 이번 스텝에서 발생한 변화량을 의미하게 된다.
(4) 데이터에 따라서는 2차 차분(2nd order differencing, 차분의 차분), 3차 차분(3rd order differencing, 2차 차분의 차분)을 적용하면 p-value를 더 낮출 수도 있다.
- 시계열 분해(Time series decomposition)
1) statsmodels 라이브러리 안에는 seasonal_decompose 메소드를 통해 시계열 안에 존재하는 trend, seasonality를 직접 분리해 낼 수 있는 기능이 있다.
2) 이 기능을 활용하면 위에서 직접 했던 moving average 제거, differencing 등을 거치지 않고도 훨씬 안정적인 시게열을 분리해 낼 수 있다.
3) original 시계열에서 Trend와 Seasonality를 제거하고 난 나머지를 Residual이라고 한다. 뒤집어서 생각하면 Trend + Seasonality + Residual = original 이 성립한다는 말이 된다.
4) 이런 Decomposing은 시계열 데이터를 이해하는 중요한 관점을 제시해 준다.
6. ARIMA 모델의 개념
- 위에서 시계열 데이터가 Trend와 Seasonality와 Residual로 Decompose되며, Trend와 Seasonality를 효과적으로 분리하면 안정적인 시계열 데이터로 변환 가능하다는 것을 알았다.
- 이런 원리를 활용하여 시계열 데이터 예측모델을 자동으로 만들어 주는 모델이 있는데, 그것이 ARIMA(Autoregressive Integrated Moving Average)이다.
- ARIMA는 AR(Autoregressive) + I(Integrated) + MA(Moving Average)가 합쳐진 모델이다. 각각 개념을 살펴보면 지금까지 다루어온 개념들과 닮아 있다.
1) AR(자기회귀, Autoregressive)
(1) 자기회귀(AR)란 Y(t)가 이전 p개의 데이터 Y(t-1), Y(t-2), ... , Y(t-p)의 가중합으로 수렴한다고 보는 모델이다.
(2) 가중치의 크기가 1보다 작은 Y(t-1), Y(t-2), ... , Y(t-p)의 가중합으로 수렴하는 자기회귀 모델과 안정적 시계열은 통계학적으로 동치이다.
(3) AR은 일반적인 시계열에서 Trend와 Seasonality를 제거한 Residual에 해당하는 부분을 모델링한다고 볼 수 있다.
(4) 주식값이 항상 일정한 균형 수준을 유지할 것이라고 예측하는 관점이 바로 주식 시계열을 AR로 모델링 하는 관점이라고 볼 수 있다.
2) MA(이동평균, Moving Average)
(1) 이동평균(MA)은 Y(t)가 이전 q개의 예측오차값 e(t-1), e(t-2), ... , e(t-q)의 가중합으로 수렴한다고 보는 모델이다.
(2) MA는 일반적인 시계열에서 Trend에 해당하는 부분을 모델링한다고 볼 수 있다. 예측오차값 e(t-1)이 +라면 모델 예측보다 관측값이 더 높았다는 뜻이므로, 다음 Y(t) 예측 시에는 예측치를 올려잡게 된다.
(3) 주식값은 항상 최근의 증감 패턴이 지속될 것이라고 예측하는 관점이 바로 주식 시계열을 MA로 모델링하는 관점이라고 볼 수 있다.
3) I(차분누적, Integration)
(1) 차분누적은 Y(t)이 이전 데이터와 d차 차분의 누적(integration) 합이라고 보는 모델이다.
(2) 예를 들어서 d = 1이라면 Y(t)는 Y(t-1)과 ΔY(t-1)의 합으로 보는 것이다.
(3) I는 일반적인 시계열에서 Seasonality에 해당하는 부분을 모델링한다고 볼 수 있다.
- ARIMA는 위 3개의 모델을 한번에 고려하는 모델이다.
- ARIMA의 모수(parameter)를 데이터에 맞게 설정해야 시계열 예측 모델을 성공적으로 만들 수 있다.
1) p : 자기회귀 모형(AR)의 시차를 의미한다.
2) d : 차분(Difference) 횟수를 의미한다.
3) q : 이동평균(MA)의 시차를 의미한다.
- 위 3개 중 p와 q에 대해서 통상적으로 p + q < 2이고, p * q = 0인 값들을 사용하는데 이는 p나 q 중 하나의 값이 0이라는 뜻이 된다.
- 이렇게 하는 이유는 실제로 대부분의 시계열 데이터는 자기회귀 모형(AR)이나 이동평균 모형(MA) 중 하나의 경향만을 강하게 띄기 때문이다.
- 이 p와 q를 결정하는 방법이 어렵기 때문에 결론만 적자면 statsmodels 패키지의 plot_acf, plot_pacf를 이용한다.
1) ACF(Autocorrelation Function)는 시차(lag)에 따른 관측치들 사이의 관련성을 측정하는 함수이다.
2) PACF(Partial Autocorrelation Function)은 다른 관측치의 영향력을 배제하고 두 시차의 관측치간 관련성을 측정하는 함수이다.
3) ACF를 통해 MA 모델의 시차 q를 결정하고, PACF를 통해 AR 모델의 시차 p를 결정할 수 있다.
- 학습데이터를 분리했는데 train data는 0.9, test data는 0.1로 했다.
7. ARIMA 모델 훈련과 추론
- ARIMA 모델을 훈련하는 것은 간단하다.
- ARIMA(train_data, order = (p, d, q))로 모델을 생성하고, fit함수로 훈련시킨다. 예측은 forecast 메소드를 이용한다.
8. 프로젝트 : 주식 예측에 도전해 보자
- 지금까지 배운 내용을 가지고 주식데이터를 예측한다.
- 먼저 삼성전자를 예시로 하여 노드에서 아래 단계를 진행한 후 다른 주식 데이터 3개를 가지고 배운 내용을 실습한다. 오차율이 10%미만으로 하는 모델을 만드는 것이 최종 목표이다.
1) 시계열 데이터 준비
2) 각종 전처리 수행
3) 시계열 안정성 분석
4) 학습, 테스트 데이터셋 생성
5) 적정 ARIMA 모수 찾기
6) ARIMA 모델 훈련과 테스트
'공부 > AIFFEL' 카테고리의 다른 글
Exploration 14 : 폐렴아 기다려라! (0) | 2021.03.02 |
---|---|
FUNDAMENTAL 24. 맵리듀스로 그리는 빅데이터 지도 (0) | 2021.03.01 |
Exploration 12 : 프로젝트 시각화(gif파일) - 번호는 과제파일의 번호와 일치함. (0) | 2021.02.25 |
FUNDAMENTAL 23. 파이썬으로 이미지 파일 다루기 (0) | 2021.02.24 |
Exploration 12 : 인공지능으로 세상에 없던 새로운 패션 만들기 (0) | 2021.02.23 |