홍동이의 성장일기
[👩💻TIL 23일차 ] 유데미 스타터스 취업 부트캠프 4기 본문
목차
섹션 8: 일반 예측 모델
SARIMA - 계절성 자기회귀 통합 이동평균 외생 변수
예측 모델 소개 Part1
➡️ 홀트-윈터스 계절성 기법 모델을 사용하여 미래 날짜를 예측하는 방법 살펴보기
시계열의 테스트 데이터셋: 가장 최근 데이터
→ 예측 모델을 훈련 데이터에 피팅한 다음 훈련 데이터를 기반으로 테스트 데이터와 동일한 기간 만큼을 예측한다. 그리고 예측 결과를 이미 정답을 알고 있는 실제 테스트 데이터와 비교한다.
- 테스트 데이터셋의 크기: 전체 샘플의 20% 정도
→ 테스트 데이터의 크기는 특정 문제 또는 해결하려는 대상에 요구되는 최대 예측 수평선보다 커야 한다. (= 테스트 데이터는 예측하려는 기간보다 길어야 한다.) 하지만 예측 수평선이 길수록 더 많은 예측을 수행하면서 더 많은 잡음이 추가되고 예측의 정확도가 떨어질 가능성이 높아진다.
train_data = df.iloc[:109] # Goes up to but not including 109
test_data = df.iloc[108:]
from statsmodels.tsa.holtwinters import ExponentialSmoothing
fitted_model = ExponentialSmoothing(train_data['Thousands of Passengers'],
trend='mul',seasonal='mul',seasonal_periods=12).fit()
test_predictions = fitted_model.forecast(36).rename('HW Forecast')
train_data['Thousands of Passengers'].plot(legend=True,label='TRAIN')
test_data['Thousands of Passengers'].plot(legend=True,label='TEST',figsize=(12,8))
test_predictions.plot(legend=True,label='PREDICTION')
➡️ 예측이 꽤 잘 되었다는 것을 확인할 수 있다.
예측 평가
정확도, 재현율, 정밀도와 같은 지표는 시계열 예측 문제에서 유용하지 않다. 시계열 예측에는 연속적인 값을 위해 설계된 지표가 필요하다.
- 회귀 평가 지표
- y: 테스트 데이터의 실제값
- y hat: 예측한 값- 평균 절대 오차(MAE): 모든 오차의 절댓값에 대한 평균값이기 때문에 간단하고 이해하기 쉽지만 예측이 실제값과 많이 차이날경우 그 사실을 알 수 없다.
- 평균 제곱 오차(MSE): 단위가 제곱된다.
- 평균 제곱근 오차(RMSE)
➡️ 스스로의 판단 하에 평균 제곱근 오류와 테스트 데이터셋의 평균 값을 비교해야 한다. 그 다음 오차의 허용도를 결정해야 한다. (평균적으로는 5~10% 범위 내에 있어야 한다.) 즉, 좋은 평균 제곱근 오차를 판단하기는 힘들며 이를 위해서는 데이터셋과 데이터의 맥락에 대한 정보가 필요하다.
➡️ 데이터셋 분리를 통해 아직 존재하지 않는 데이터에 대해 예측 모델이 얼마나 잘 수행되는지 파악할 수 있다.
예측 모델 소개 Part2
Evaluating Model against Test Set
train_data['Thousands of Passengers'].plot(legend=True,label='TRAIN')
test_data['Thousands of Passengers'].plot(legend=True,label='TEST',figsize=(12,8))
test_predictions.plot(legend=True,label='PREDICTION',xlim=['1958-01-01','1961-01-01'])
두 데이터가 얼마나 일치하는지 시각적으로 확인할 수 있지만 우리가 원하는 것은 이러한 정보를 수량적으로 표시하는 것이다.
Evaluation Metrics
from sklearn.metrics import mean_squared_error,mean_absolute_error
mean_absolute_error(test_data,test_predictions) # 46.30
mean_squared_error(test_data,test_predictions) # 3075.33
np.sqrt(mean_squared_error(test_data,test_predictions)) # 55.46
test_data.describe()
➡️평균 제곱근 오차가 실제 데이터의 표준 편차보다 작다.
Forecasting into Future
final_model = ExponentialSmoothing(df['Thousands of Passengers'],trend='mul',seasonal='mul',seasonal_periods=12).fit()
forecast_predictions = final_model.forecast(36) # 36개월 예측
df['Thousands of Passengers'].plot(figsize=(12,8))
forecast_predictions.plot();
정상성과 차분
시계열 데이터셋이 추세나 계절성을 나타내지 않는 경우 정상적이라고 말한다. 이때 데이터의 변동은 전적으로 외부의 힘이나 잡음에 의해 발생한다.
df2['a'].plot(ylim=[0,100],title="STATIONARY DATA").autoscale(axis='x',tight=True);
df2['b'].plot(ylim=[0,100],title="NON-STATIONARY DATA").autoscale(axis='x',tight=True);
df2['c'].plot(ylim=[0,10000],title="MORE NON-STATIONARY DATA").autoscale(axis='x',tight=True);
NON-STATIONARY DATA(비정상 데이터): 추세가 증가하고 있다.
➡️ 추세나 계절성 중 하나를 나타내거나 둘 다 나타낸다.
STATIONARY DATA (정상 데이터): 계절성이나 추세 요소가 없다.
- 특히 추세가 가파르거나 완만하지 않은 경우 구별하기 어렵다.
➡️ 따라서 시계열 데이터셋이 수량적으로 정상적인지 비정상적인지 알 수 있는 통계적 테스트에 대해 알아본다.
차분
추세를 띠는 비정상 데이터를 차분을 통해 정상적으로 보이게 만들 수 있다. 간단한 차분 메소드는 연속적인 지점 간의 차를 계산한다.
# 차분 방법 1
df2['b'] - df2['b'].shift(1)
# 차분 방법 2
from statsmodels.tsa.statespace.tools import diff
diff(df2['b'], k_diff=1).plot()
- k_diff: 차수 매개변수
1차 차분을 하면 비정상 데이터가 정상 데이터로 보이게 된다.
자기상관 함수와 부분 자기상관 함수
- ACF: 자기상관함수
- PACF: 부분 자기상관함수
➡️ ARIMA 기반 모델의 차수 매개변수 선택에 도움을 준다.
- 상관: 두 변수 간의 선형 관계 강도
- 상관계수: -1 ~ +1 사이에 값을 갖는데,
- 양수에 가까울수록 양의 선형 관계가 더 강하다는 것을 의미한다.
- 음수에 가까울수록 음의 상관관계가 강하다는 것을 의미한다.
- 0에 가까울수록 전반적인 선형 관계가 약하다는 것을 의미한다. - 자기상관(ACF): 자기 상관관계에서 플롯은 현재 시계열과 그 시계열의 x차 시점 간의 상관관계를 보여준다.
자기 상관은 하나의 시계열만 사용하며 다른 시계열과 비교하지는 않는다. 동일한 데이터 배열에 대해 특정 시간 단위만큼 지연 또는 이동한 시점의 데이터를 비교하는 것이다.- y축: 상관관계, x축: 지연 시간 단위의 수
- 단순히 x차 시점의 자기 자신과의 상관관계를 보여주는 것이다. 가능한 모든 시차에 대해 이 작업을 계속하면 플롯을 정의할 수 있다.
- 점진적인 감소추세는 계절성 데이터에서 특히 흔한 유형이다. 이동 횟수가 늘수록 상관계수가 점차 감소하는 것을 보면 오래된 데이터와는 상관관계가 줄어든다는 것을 알 수 있다.
- 급격히 감소하는 플롯 또한 매우 일반적인 유형으로 특정 날짜와 하루 전의 데이터는 높은 상관관계를 보이지만, 2~3일 전으로 거슬러가면 시차에 따른 상관관계가 없는 경우이다.
➡️멀리 이동할수록 시계열이 자신과 상관관계를 가질 가능성이 줄어든다.
- 부분 자기상관(PACF): i일과 i - 1일의 판매 실적 사이에 선형 적합이 존재한다면 잔차는 오차이다. 자기상관보다 더 복잡한 이유는 전날의 데이터에 피팅된 잔차를 그 전날의 실제 데이터와 비교하여 플롯을 그리는 단계가 있기 때문이다.
- 부분 자기상관 플롯은 기본적으로 전날의 잔차와 현재의 실제 값 사이의 관계에 대한 플롯을 그리는 것으로 보통 급격히 감소하는 형태를 보인다.
ACF: 현재 관측값과 이전 시점 관측값 간의 직간접 종속성 정보를 포함한 자기 상관관계를 보여준다.
PACF는 현재 관측값과 이전 시점 관측값 간의 직접적 관계만 보여준다.
import statsmodels.api as sm #statsmodel을 호출하기 위한 일반적 규칙
from statsmodels.tsa.stattools import acovf,acf,pacf,pacf_yw,pacf_ols
df = pd.DataFrame({'a':[13, 5, 11, 12, 9]})
arr2 = acovf(df['a'],unbiased=True)
# array([ 8. , -5. , -2.66666667, 5.5 , -3. ])
arr4 = pacf_yw(df['a'],nlags=4,method='mle')
# array([ 1. , -0.5 , -0.6 , -0.38541667, -0.40563273])
arr6 = pacf_ols(df['a'],nlags=4)
# array([ 1. , -0.49677419, -0.43181818, 0.53082621, 0.25434783])
- pacf
- yw = 율-워커 방정식
- 지연 차수 nlags = (n-1)
- mle = 최대 우도 추정법의 약자: 편향 자기상관 계수를 사용하기 위해 입력한 것
- pacf_ols: 최소 제곱법의 부분 자기상관 함수를 제공하여, 율-워커 방정식 대신 각 시차를 추정한다.
📍 강의에 나온대로 method를 'unbiased'로 바꾸면 오류가 발생했는데 수업 시작 전 설정한 가상환경에 접속하는 것을 까먹어서 그랬다 ㅎㅎ
statsmodel의 플롯 그리기
from pandas.plotting import lag_plot
lag_plot(df1['Thousands of Passengers']);
lag_plot(df2['Births']);
- lag_plot: 시계열의 현재 데이터와 자신의 과거 데이터와의 상관관계 플롯을 그리는 유용한 플롯이다.
그래프 1️⃣: 아주 강한 자기상관 관계를 보인다.
그래프 2️⃣: y(t)와 y(t+1)의 상관관계가 강하지 않다.
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
df1.plot();
plot_acf(df1, lags=40);
df2.plot();
plot_acf(df2, lags=40);
plot_pacf(df2, lags=40);
- 각각의 극대값은 자기상관 관계까 증가하기 시작하는 특정 지점을 나타내는데 연간 주기로 발생하므로 합리적인 형태라고 볼 수 있다.
- 음영 표시된 영역: 기본적으로 95% 신뢰 구간을 나타낸다. 즉, 신뢰 구간을 벗어난 상관계수는 상관관계일 가능성이 높다. 그래프를 보면 시차가 커질수록 음영 표시 영역도 점점 커지는데, 시차자 클 때보다 작을수록 상관관계가 더 명확해짐을 감안하면 합리적인 형태이다.
- 정상적 데이터의 전형적인 자기상관 플롯이 나온다. 정상 데이터라서 매우 급격한 감소를 보여주는 한편 계절성을 나타내는 위와 같은 형태는 볼 수 없다.
- 일반적으로 부분 자기상관 플롯은 정상적인 데이터에서 잘 작동한다.
- PACF 플롯에서 급격한 감소 패턴이 있다는 것은 모델에 오차항을 추가해야 함을 나타낸다. 또한 급격히 감소하는 시점은 AR 항의 차수를 나타낸다.
→ 이런 플롯을 읽기는 매우 어렵기 때문에 격자 탐색을 하는 것이 더 효과적인 경우가 많다.
아리마(자기회귀 누적 이동평균모델)의 개요
- 자기 회귀: AR
- 단순히 현재의 관측치와 이전 기간의 관측치 간의 종속 관계를 활용하는 회귀 모델
- 누적 (구성요소): I
- 차분을 의미하는 매개변수 D와 연관되어있다.
- 단순히 관측치의 차이를 보고한다. 시계열을 정상화하기 위해, 이전 기간의 관측치에서 현재의 관측치를 차감하는 것이다.
- = 데이터를 정상화하기 위한 차분 횟수
- 이동 평균: MA
- 매개변수 q와 관련되어있다.
- 지연된 관측값에 적용된 이동 평균 모델의 잔차 오차와 관측값 간의 종속성을 사용한다.
➡️ 아리마가 모든 시계열 데이터를 완벽하게 예측할 수 없다. 초보자들은 아리마를 시계열 데이터에 직접 적용하려는 경우가 많은데, 주식 데이터와 마찬가지로 시계열 데이터는 시간과 직접적인 연관성이 없다. 주식 데이터에는 외부 요인이 너무 많기 때문에 타임스탬프가 찍힌 주가 정보만으로는 실제 주가를 알려줄 방대한 정보를 얻을 수 없다. 시간 경과에 따른 주가 정보만으로는 향후 주가를 예측할 수 없다.
아리마가 효과적인 경우는 전체 시계열의 데이터와 타임스탬프가 직접적인 관련성이 있을 때다. 하지만 이러한 데이터에 대한 아리마 모델도 외부 요인을 이해할 수 없다. 따라서 단순히 타임스탬프가 찍힌 데이터셋이 있다고 해서 아리마 모델을 통해 미래의 다른 시점의 데이터 포인트를 성공적으로 예측할 수 있는 충분한 정보를 획득한 것이 아니다.
자기회귀 이동평균 모델 + 누적 = ARIMA
- 두 모델 모두 시계열 데이터에 피팅하여 현재 보유한 데이터에 모델을 피팅하는 것과 같이 데이터를 더 잘 이해하거나 대부분은시계열 예측에서 미래의 데이터 값을 예측하는데 쓰인다.
→ ARIMA 모델은 데이터가 비정상성의 증거를 나타내는 경우에 적용되는데, I 구성요소라고도 불리는 ARIMA 모델의 '누적'된 부분에 해당하는 초기 차분 단계를 한 번 이상 적용하여 비정상성을 제거할 수 있다.
- Non-seasonal ARIMA: 비계절성 아리마 ARIMA(p, d, q)
[비계절성 정수 p, d, q] - Seasonal ARIMA (SARIMA): 계절성 아리마
- SARIMAX: 외생 변수가 추가된 모델
정상 시계열은 상수이고 시간에 따른 평균과 분산이 일정하다. 따라서 정상 데이터셋은 모델로 하여금 미래의 평균과 분산이 현재와 동일하다는 것을 예측하게 해준다.
자기 회귀 모델 개요
자기 회귀 모델을 Statsmodel로의 구현
기술 통계학과 검정
ARIMA 이론 개요
ARIMA 차수 선택
ARIMA와 ARIMA 모델 자기회귀 통합 이동평균
SARIMA - 계절성 자기회귀 통합 이동평균
SARIMA - 계절성 자기회귀 통합 이동평균 외생 변수
벡터 자기 회귀 모델
벡터 자기 회귀 이동 평균
예측 연습
✍️ 마무리하며
* 유데미 큐레이션 바로가기 : https://bit.ly/3HRWeVL
* STARTERS 취업 부트캠프 공식 블로그 : https://blog.naver.com/udemy-wjtb
📌 본 후기는 유데미-웅진씽크빅 취업 부트캠프 4기 데이터분석/시각화 학습 일지 리뷰로 작성되었습니다.
'교육 > 유데미 스타터스 4기' 카테고리의 다른 글
유데미 스타터스 취업 부트캠프 4기 - 데이터분석/시각화(태블로) 5주차 학습 일지 (0) | 2023.03.12 |
---|---|
[👩💻TIL 24일차 ] 유데미 스타터스 취업 부트캠프 4기 (0) | 2023.03.12 |
[👩💻TIL 22일차 ] 유데미 스타터스 취업 부트캠프 4기 (0) | 2023.03.09 |
[👩💻TIL 21일차 ] 유데미 스타터스 취업 부트캠프 4기 (0) | 2023.03.08 |
[👩💻TIL 20일차 ] 유데미 스타터스 취업 부트캠프 4기 (0) | 2023.03.06 |