📈📉 비즈니스 어낼리틱스/🕑 시계열 분석

🕑시계열데이터 분석 07 - 평활기법

nyamin9 2023. 4. 14. 13:34

모바일은 화면을 돌려 가로화면으로 보시는 게 읽으시기 편할 수 있습니다. 돌려서 보시는 걸 추천드릴게요!!

 

 


🕑 평활기법 (Smoothing)

 

평활기법은 대부분 prediction 혹은 projection을 위한 방법입니다.

만약 계절성이 있는 데이터라면, 반드시 계절성을 제거한 다음 진행해야합니다.

 


🕑 1. 선형평활 - naive : naive(TS_DATA)

 

가장 최근 값을 사용해서 예측하는 방법입니다.

 

setwd("C:\\Users\\yamingu\\Desktop\\고급비즈니스어낼리틱스")
oil.df=read.csv("[Ch1.시계열자료준비시계열분해]_files\\BOK_energy_oil.csv")
oil.ts=ts(oil.df$oil, start=c(1994,1), frequency=12)

## 파란색 -> 예측값
## 회색부분 -> 95% 신뢰구간
library(forecast)
plot(naive(oil.ts))
lines(oil.ts)

image

 


🕑 2. 이동평균평활 - MA(moving average) : ma(TS_DATA, order)

 

가장 간단한 평활 방법으로써, 이동평균선을 사용하는 방법입니다.

앞뒤로 잡아서 평균을 내는 방법이지만 예측한 값을 다시 예측에 사용하기 때문에 정확도가 낮습니다.

평균을 내는 값의 개수가 늘어날수록, 즉 time 축을 넓게 잡을수록 더욱 평탄해집니다.

 

보통 monthly 데이터인 경우 12달을 모두 잡아주지만, 보통 window는 홀수로 주기에 13개를 줍니다.

월별 평균을 통해 계절성을 잡는다는 점에서 decompose() 함수와 동일합니다.

 

분산이 큰 경우 승법 모형을 사용하며, 로그변환의 형태를 띕니다.

 


☑️ order = 5 모델 : 5개월 단위 이동평균법으로 평활

## 검은색 -> 원본
## 빨간색 -> 이동평균선
## 5개
oil_ma<-ma(oil.ts,order=5)
plot(oil.ts)
lines(oil_ma,col="red")

image

 

## 5개 ma 값을 통한 예측
## 검은색 -> 원본
## 빨간색 -> moving average
## 파란색 -> 예측

plot(forecast(oil_ma))
lines(oil_ma,col="red")
lines(oil.ts)

image

 


☑️ order = 13 모델 : 13개월 단위 이동평균법으로 평활

## 13개
oil_ma13<-ma(oil.ts,order=13)
plot(oil.ts)
lines(oil_ma13,col="red")

image

 

## 13개 ma 값을 통한 예측
plot( forecast(oil_ma13) )
lines(oil_ma13,col="red")
lines(oil.ts)

image

 


🕑 3. 단순지수평활 - Simple Exponential Smoothing : ses(TS_DATA)

 

대상과 가까운 값에 좀 더 높은 가중치를 부여하는 방식으로 이동평균을 구합니다.

80% 신뢰구간, 95% 신뢰구간에 대한 예측값을 출력합니다.

 

 

 

☑️ alpha를 지정한 모델

oil.ses1 <- ses(oil.ts,alpha=0.2)
oil.ses1
##          Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## May 2016       9421.265 8347.001 10495.53 7778.320 11064.21
## Jun 2016       9421.265 8325.726 10516.80 7745.784 11096.75
## Jul 2016       9421.265 8304.857 10537.67 7713.867 11128.66
## Aug 2016       9421.265 8284.371 10558.16 7682.536 11159.99
## Sep 2016       9421.265 8264.247 10578.28 7651.759 11190.77
## Oct 2016       9421.265 8244.468 10598.06 7621.509 11221.02
## Nov 2016       9421.265 8225.015 10617.51 7591.759 11250.77
## Dec 2016       9421.265 8205.874 10636.66 7562.485 11280.04
## Jan 2017       9421.265 8187.030 10655.50 7533.665 11308.86
## Feb 2017       9421.265 8168.469 10674.06 7505.279 11337.25

 

 

☑️ alpha를 알아서 구해주는 모델

oil.ses2 <- ses(oil.ts)
oil.ses2
##          Point Forecast    Lo 80     Hi 80    Lo 95    Hi 95
## May 2016       9066.095 8139.845  9992.345 7649.518 10482.67
## Jun 2016       9066.095 7853.241 10278.949 7211.195 10920.99
## Jul 2016       9066.095 7622.457 10509.732 6858.242 11273.95
## Aug 2016       9066.095 7423.790 10708.399 6554.407 11577.78
## Sep 2016       9066.095 7246.689 10885.501 6283.553 11848.64
## Oct 2016       9066.095 7085.359 11046.831 6036.821 12095.37
## Nov 2016       9066.095 6936.215 11195.975 5808.725 12323.47
## Dec 2016       9066.095 6796.852 11335.338 5595.587 12536.60
## Jan 2017       9066.095 6665.566 11466.624 5394.803 12737.39
## Feb 2017       9066.095 6541.097 11591.093 5204.444 12927.75

 

해당 평활모델의 요약값을 살펴보면, alpha 값에 따라 AIC / BIC 값이 다르게 나옵니다.

R-square과 반대로 AIC / BIC 값이 작을수록 좋은 모델이며, 추세나 계절성이 없는 경우에만 예측용으로 사용 가능합니다.

 

 

 

☑️ alpha를 지정한 모델 결과

oil.ses1$model
## Simple exponential smoothing 
## 
## Call:
##  ses(y = oil.ts, alpha = 0.2) 
## 
##   Smoothing parameters:
##     alpha = 0.2 
## 
##   Initial states:
##     l = 7290.3397 
## 
##   sigma:  838.2523
## 
##      AIC     AICc      BIC 
## 5108.364 5108.409 5115.546

 

 

☑️ alpha를 지정해주는 모델 결과

oil.ses2$model
## Simple exponential smoothing 
## 
## Call:
##  ses(y = oil.ts) 
## 
##   Smoothing parameters:
##     alpha = 0.8453 
## 
##   Initial states:
##     l = 7928.9645 
## 
##   sigma:  722.7569
## 
##      AIC     AICc      BIC 
## 5030.904 5030.995 5041.677

 

각 모델의 예측값을 파악해보기 위해, 서로 다른 색으로 plot 해주었습니다.

파란색 선이 alpha가 0.2인 모델이고, 붉은색 선이 alpha를 알아서 지정해준, 0.8인 모델입니다.

 

결과를 살펴보면, 어느 부분부터는 플랫한 예측이 지속됩니다.

해당 방법은 최근 값에 큰 가중치를 주는 방식을 통해 이동평균선으로 예측하기 때문에, 예측값을 다시 예측에 사용합니다.

따라서, 어느 부분부터는 최근 값에 계속해서 수렴하게 됩니다.

 

plot(oil.ses1)
lines(oil.ses2$mean,col="red")
lines(oil.ses2$fitted,col="red")
lines(oil.ses1$fitted,col="blue")

image

 


🕑 3. 단순지수평활 - Simple Exponential Smoothing : ets(TS_DATA, model, alpha)

 

ses() 함수와는 달리, 여러 모델을 general 하게 지정 가능한 함수입니다.

 

## simple exponential: random=A(additive), trend=None, season=none
oil.ses1<-ets(oil.ts, model="ANN",alpha=0.2)

## simple exponential: random=A(additive), trend=None, season=none
oil.ses2<-ets(oil.ts, model="ANN")

 

 

☑️ alpha를 정해준 모델

plot(forecast(oil.ses1))
lines(oil.ses1$fitted,col="blue")

image

 

 

☑️ alpha를 자동으로 정해주는 모델

plot(forecast(oil.ses2))
lines(oil.ses2$fitted,col="blue")

image

 


🕑 4. 홀트지수평활 - Holt Exponential Smoothing : holt(TS_DATA)

 

Double Exponential Smoothing 이라고도 부르는 방법입니다.

 

단순지수평활법과 다르게 계절성이 없거나 이미 조정된 시계열에 대해, 즉 트렌드만 있을 때 사용하는 평활법입니다.

데이터에 남아있는 트렌드에 대해서 평활해줘야 하기 때문에, 트렌드에 대한 가중치를 하나 더 만들어줍니다.

트렌드 평활 한번, 나머지 평활 한번을 합쳐 smoothing을 두번 진행합니다. 즉, 평활상수가 2개인 모델을 사용합니다.

 

해당 함수는 damped 옵션을 사용해서 감쇠추세법을 사용할 수 있습니다.

이를 통해서, 미래의 값을 과하게 예측하는 것을 방지합니다.

 

oil.holt1 <- holt(oil.ts)
oil.holt2 <- holt(oil.ts, damped=TRUE)
plot(oil.holt1)
lines(oil.holt1$fitted, col="blue")
lines(oil.holt2$mean, col="red") 
lines(oil.holt2$fitted, col="red")

image

 

 

또는, ets( ) 함수를 통해 모델을 지정할 수도 있습니다.

 

##or
## holt exponetial smoothing: random=A(additive), trend=A(additive), season=none##
B<-ets(oil.ts, model="AAN")

 


🕑 5. Holt-Winter smoothing : hw(TS_DATA, seasonal, damped)

 

데이터에 트렌드와 계절성이 모두 있는 경우 사용하는 평활법입니다.

 

seasonal 옵션을 통해 가법모형(additive)과 승법모형(multiplicative)을 지정할 수 있습니다.

가법모형과 승법모형의 선택을 위해서는 AIC값과 BIC값을 비교해주면 됩니다!!

 

 

☑️ 가법모형

oil.hw1<- hw(oil.ts,seasonal="additive",damped=TRUE)
oil.hw1$model
## Damped Holt-Winters' additive method 
## 
## Call:
##  hw(y = oil.ts, seasonal = "additive", damped = TRUE) 
## 
##   Smoothing parameters:
##     alpha = 0.7311 
##     beta  = 1e-04 
##     gamma = 1e-04 
##     phi   = 0.9733 
## 
##   Initial states:
##     l = 7278.8048 
##     b = 48.8789 
##     s = 1428.477 333.0349 -83.4214 -500.8026 -413.5748 -731.5362
##            -737.3773 -467.4779 -335.1581 552.5858 -32.7399 987.9909
## 
##   sigma:  441.5788
## 
##      AIC     AICc      BIC 
## 4781.252 4783.999 4845.890

 

 

☑️ 승법모형

oil.hw2<- hw(oil.ts,seasonal="multiplicative")
oil.hw2$model
## Holt-Winters' multiplicative method 
## 
## Call:
##  hw(y = oil.ts, seasonal = "multiplicative") 
## 
##   Smoothing parameters:
##     alpha = 0.3859 
##     beta  = 0.0092 
##     gamma = 0.3393 
## 
##   Initial states:
##     l = 7576.5779 
##     b = 48.2089 
##     s = 1.2187 1.0319 0.986 0.8763 0.8946 0.8554
##            0.8396 0.9007 0.9963 1.1449 1.0722 1.1834
## 
##   sigma:  0.0522
## 
##      AIC     AICc      BIC 
## 4778.587 4781.035 4839.634

 

또는, ets 함수를 통해 모델을 지정할 수도 있습니다.

 

## or
## holt-winter exponential : random=A(additive), trend=A(additive), season=A(additive)
C<-ets(oil.ts, model="AAA") 
summary(C)
## ETS(A,Ad,A) 
## 
## Call:
##  ets(y = oil.ts, model = "AAA") 
## 
##   Smoothing parameters:
##     alpha = 0.7309 
##     beta  = 1e-04 
##     gamma = 1e-04 
##     phi   = 0.9734 
## 
##   Initial states:
##     l = 7278.8051 
##     b = 48.8772 
##     s = 1428.477 333.0355 -83.4216 -500.8028 -413.5741 -731.536
##            -737.3764 -467.4771 -335.1584 552.5859 -32.7402 987.9885
## 
##   sigma:  441.5788
## 
##      AIC     AICc      BIC 
## 4781.253 4783.999 4845.890 
## 
## Training set error measures:
##                    ME     RMSE      MAE        MPE     MAPE      MASE
## Training set 1.074213 427.3441 309.8274 -0.1594955 3.710796 0.6882245
##                    ACF1
## Training set 0.01883762

 

각 모델의 예측값을 파악해보기 위해, 서로 다른 색으로 plot 해주었습니다.

파란색 선이 가법모형이고, 붉은색 선이 승법모형입니다.

 

예측의 결과를 보면 가법모형이 seasonality를 반영하는 느낌이기 때문에 가법이 좀 더 낫습니다.

승법 모형은 쪼그라드는 느낌이기에 큰 분산에 사용하는 로그 변환에 대한 이유를 잃어버리는 느낌이 있습니다.

정확한 비교를 위해서는 AIC / BIC를 사용해서 비교해 선택하면 됩니다.

 

plot(oil.hw1)
lines(oil.hw1$fitted,col="blue")
lines(oil.hw2$mean,col="red") 
lines(oil.hw2$fitted,col="red")

image