Math & Statistics/Forecasting: Principles and Practice

챕터 3 연습문제

corycory 2022. 2. 12. 15:10
728x90
반응형
Forecasting: Principles and Practice 2nd Edition을 공부한 내용을 기록, 정리하고 있습니다. 

 

 

3.7 연습문제 

1. 시계열의 분산을 안정화하기 위해 박스-칵스 변환을 찾아보기.

계산값들은 아래와 같다.

> (lambda <- BoxCox.lambda(usnetelec))
[1] 0.5167714
> (lambda <- BoxCox.lambda(usgdp))
[1] 0.366352

 

2. cangas 데이터가 왜 박스-칵스를 사용하기 어려운가?

cangas 데이터

 

cangas 데이터의 시계열 그래프는 위와 같다. 박스-칵스 변환은 로그와 거듭곱변환을 사용하므로, 이 데이터처럼 뚜렷하게 로그나 거듭곱처럼 증가하거나 감소하는 모양이 없으면 크게 효과를 보기 어렵다. 

 

이 데이터의 람다를 구하면 아래처럼 나온다. 이 람다를 가지고 박스-칵스를 해 보자.

> (lambda <- BoxCox.lambda(cangas))
[1] 0.5767759

 

아래는 cangas 데이터를 박스-칵스 변환을 한 모양인데, 굴곡이 다소 줄어들긴 했지만 완전히 효과를 완만하게 펴지는 못했다. 

박스-칵스 변환 이후

 

3. 소매 데이터에 대해 어떤  변환을 선택할 것인가?

아래 스샷은 dj 데이터의 시계열이다. 박스-칵스 변환이 유용한 때는 시계열이 로그나 exponential한 트렌드를 보일때 유용하다. 아래 시계열의 경우 증가하거나, 감소하는 트렌드는 보이지 않는다. 하지만 약간의 주기는 보이므로, 날짜에 대한 조정을 하는 것이 나아보인다. 

 

dj 데이터의 시계열 차트

 

실제로 위 데이터를 박스-칵스 변환을 해 보았자 아래의 그래프가 나온다. 크게 변한것은 없다. 

dj 데이터의 박스-칵스 변환 후

 

4. 다음 시계열 데이터들의 데이터를 그래프로 그려보고, 변환이 필요할 것 같으면 변환해보기.

시계열 그래프

 

dole, usgdp, mcopper의 경우 exponential한 증가가 미약하게 보인다. enplanements는 크게 효과가 없을 것 같다. 일단 아래는 위의 네 개 데이터를 box-cox로 변환한 모습이다. dole, usgdp, mcopper의 경우 exponential하게 데이터가 증가하는  부분이 많이 스무스 해졌다. enplanements는 크게 표과를 보진 못했다.

 


> (lambda <- BoxCox.lambda(dole))
[1] 0.3290922
> ng1 <- autoplot(BoxCox(dole, lambda)) > (lambda <- BoxCox.lambda(usgdp))
[1] 0.366352
> ng2 <- autoplot(BoxCox(usgdp, lambda)) > (lambda <- BoxCox.lambda(mcopper))
[1] 0.1919047
> ng3 <- autoplot(BoxCox(mcopper, lambda))
> (lambda <- BoxCox.lambda(enplanements))
[1] -0.2269461
> ng4 <- autoplot(BoxCox(enplanements, lambda))
> ng1 + ng2 + ng3 + ng4

 

5. 1992년부터 호주 분기별 맥주 생산량 데이터에 계절성 단순 예측(seasonal naïve forecast)을 적용해서 얻은 잔차를 계산해보자. 잔차가 백색잡음이며 정규분포를 따르는지 확인해보자. 

 

beer <- window(ausbeer, start=1992)
fc <- snaive(beer)
autoplot(fc)
res <- residuals(fc)
autoplot(res)

분기별 맥주 생산량 데이터

 

잔차를 계산한 결과는 아래와 같다. 아래 결과를 보았을 때, 일반적으로 평균은 0에 수렴하지 않으며 정규분포는 아니긴 하다. ACF 그래프를 보면 이 데이터의 잔차가 백색소음과 다르다는 것을 확인할 수 있으며, 바로 아래의 융-박스 테스트의 결과를 보면 p-value가 유의미하게 작아서 잔차가 시계열과 다르지 않다는 가정을 기각하게 된다.

> checkresiduals(fc)

Ljung-Box test

data:  Residuals from Seasonal naive method
Q* = 32.269, df = 8, p-value = 8.336e-05

Model df: 0.   Total lags used: 8

 

6. WWWusage, bricksq 데이터를 사용해 잔차 진단해보기. snaive(), naive()중 어느게 더 적절한지?

WWWusage 데이터

WWWusage의 그래프를 그려보면 계절성이 보이지 않는다. 따라서 naive()를 사용하는 것이 더 적절할 것 같다. 

WWWusage의 그래프.

 

비교를 위해서 snaive, naive 둘다 그려보았다.

 

Snaive, naive를 각각 사용해서 그린 예측그래프와 잔차 그래프.

이제 잔차 테스트를 해 보자. naive의 잔차 테스트를 진행해 보았다. 잔차는 대강 평균이 0 근처이며, 표준분포에 비슷한 모습을 가지고 있다. 잔차와 백색소음이 같다는 가설은 기각된다. 융-박스 테스트의 결과 역시 가설을 기각하고 있다. 

 

naive 잔차 테스트

 

 

bricksq 데이터

먼저 데이터의 모양을 살펴본다. 

WWWusage 와 비교하면 계절성이 조금 있는 것 같다.&nbsp;

 

일단 계절성이 좀 있는 것 같으니 snaive를 쓰는게 나을것 같은데, 일단 한번 까 본다. 아래 스샷에서 두개를 비교해보니 snaive가 좀더 예측을 잘 하는 것 같다. 

 

 

잔차 분석을 해 본 결과는 아래와 같다. 대략적으로 평균 0에 수렴하고 있으나, 표준분포를 따른다고 보기에는 왼쪽 꼬리가 조금 긴 모양이다. ACF차트를 보았을 때, 잔차와 백색소음이 같다는 가정이 기각된다. 융-박스 검정 결과 역시 Q* = 233.2, df = 8, p-value < 2.2e-16로, 가정을 기각하고 있다. 

 

 

7. 다음의 문장들은 참인가 거짓인가?

- 좋은 예측 방법은 잔차가 표준 분산을 따른다. 

거짓. 표준 분산을 따르면 표준편차를 계산할때 편리하다는 장점이 있지만, 표준 분산을 따르지 않아도 좋은 예측일 수 있다.

 

- 적은 잔차를 가진 모델은 좋은 예측을 내놓는다. 

거짓. 잔차는 과거 값에 대한 모델과 관측값의 차이이다. 적은 잔차를 가진 것은 모델이 과거 값에 잘 맞춰져 있다는 의미이나, 반대로 과적합된 모델은 미래 예측값을 잘 예측하지 못하기도 한다.

 

- 가장 좋은 예측 정합도 측정 지표는 MAPE이다.

거짓. 데이터의 모양과 분석 방법에 따라 다른 측정지표를 쓴다.

 

- 만약 모델의 예측력이 떨어진다면, 더 복잡하게 만들어야 한다.

거짓. 일반적으로 모델이 정교해질수록 예측력이 좋아지는 경향이 있지만, 과적합은 조심해야 한다. 또한, 데이터의 모양이 변환이 필요한 상황일수도 있다.

 

- 항상 테스트 데이터의 정확도가 좋은 모델을 선택해라.

참. 트레이닝 데이터보다 테스트 데이터의 정확도가 좋다면 미래 예측값에 대한 정확도가 검증되는 것이다.

 

8. 소매 시계열 데이터를 이용, 다음 질문들에 답하기

a. 데이터 쪼개기

myts.train <- window(myts, end=c(2010,12))
myts.test <- window(myts, start=2011)

 

b. 플롯을 그려서 데이터가 잘 쪼개졌는지 확인하기

autoplot(myts) +
  autolayer(myts.train, series="Training") +
  autolayer(myts.test, series="Test")

 

training, test 데이터의 플롯

 

c. snaive를 이용해서 트레이닝 데이터로 예측을 계산하기

fc <- snaive(myts.train)

 

d. 실제 관측값과 예측값을 비교해 정확도 평가하기.

accuracy(fc, myts.test)

## 결과값
                    ME     RMSE      MAE       MPE      MAPE     MASE      ACF1 Theil's U
Training set  7.772973 20.24576 15.95676  4.702754  8.109777 1.000000 0.7385090        NA
Test set     55.300000 71.44309 55.78333 14.900996 15.082019 3.495907 0.5315239  1.297866

 

e. 잔차 확인하기.

융-박스 검정에서는 잔차가 백색소음이라는 가설을 기각하고 있다. 아래 잔차를 보면 평균은 0보다 좀더 크고, 분포는 평균 분포와 비슷하다. ACF를 보면 잔차가의 상관관계가 좀 있다.

> checkresiduals(fc_myts)

Ljung-Box test

data:  Residuals from Seasonal naive method
Q* = 624.45, df = 24, p-value < 2.2e-16

Model df: 0.   Total lags used: 24

 

snaive 잔차 그래프

 

f. 트레이닝/테스트 데이터로 나눈 것에 정확도 지표가 얼마나 민감하게 반응하는가?

2005년부터 테스트 데이터를 쓰는 거로 테스트 데이터를 더 늘려보자.

 

2005년부터로 테스트 데이터 범위를 늘렸다.

 

똑같이 snaive 모델을 만들고 정확도 지표를 계산한 결과는 아래와 같다. 테스트 데이터에 관한 정확도 지표들의 값이 대폭 줄어든 것을 확인할 수 있다.  

> accuracy(fc_myts,myts.test)
                    ME      RMSE       MAE       MPE     MAPE      MASE      ACF1 Theil's U
Training set  9.926054 20.437887 16.298467  6.053582 8.956591 1.0000000 0.7207990        NA
Test set     -0.687500  7.066087  5.820833 -0.219073 2.103361 0.3571399 0.2251253 0.1707345

 

 

9. visnights 데이터는 98년부터 2016년까지 호주 20개 지역에서 분기별 방문자 수를 담고 있다. 

a. window()를 사용해서 첫 1, 2, 3해를 빼고 트레이닝 데이터 셋을 만들어보자; 이들을 각각 train1, train2, train3으로 이름한다. 

## training sets
> train1 <- window(visnights[, "QLDMetro"], end = c(2015, 4))
> train2 <- window(visnights[, "QLDMetro"], end = c(2014, 4))
> train3 <- window(visnights[, "QLDMetro"], end = c(2013, 4))

## test sets
> test1 <- window(visnights[, "QLDMetro"], start = c(2016, 1))
> test2 <- window(visnights[, "QLDMetro"], start = c(2015, 1))
> test3 <- window(visnights[, "QLDMetro"], start = c(2014, 1))

 

b. 각 트레이닝 데이터를 snaive를 이용해 1년치 예측치를 만들어보자. 이들을 각각 fc1, fc3, fc3으로 이름지어 보자.

> fc1 <- snaive(train1)
> fc2 <- snaive(train2)
> fc3 <- snaive(train3)

 

c. accuracy()를 사용해서 세 가지 테스트 데이터에 대한 MAPE를 계산해본다. 

training set 2번의 경우가 RMSE, MAPE가 최소화 되고, 3번이 가장 크다. 

> accuracy(fc1, test1)
                     ME      RMSE       MAE        MPE     MAPE      MASE       ACF1 Theil's U
Training set 0.02006107 1.0462821 0.8475553 -0.2237701 7.976760 1.0000000 0.06014484        NA
Test set     0.56983879 0.9358727 0.7094002  4.6191866 6.159821 0.8369957 0.09003153 0.4842061

> accuracy(fc2, test2)
                    ME      RMSE       MAE        MPE     MAPE      MASE         ACF1 Theil's U
Training set 0.0161876 1.0735582 0.8809432 -0.2744747 8.284216 1.0000000  0.066108793        NA
Test set     0.3669560 0.8516202 0.6644561  2.8431247 6.085501 0.7542553 -0.002021023 0.5102527

> accuracy(fc3, test3)
                       ME     RMSE       MAE        MPE     MAPE      MASE        ACF1 Theil's U
Training set -0.007455407 1.074544 0.8821694 -0.5625865 8.271365 1.0000000  0.07317746        NA
Test set      0.411850940 1.035878 0.8800104  4.4185560 8.635235 0.9975526 -0.21876890 0.8365723

 

10. 다우존스 지수 데이터를 사용해서 다음을 실행해보기

a. 시계열 플롯 해보기

아래 스샷을 보면 크게 계절성이나 주기는 눈에 띄지 않는다. 시간이 지나면서 우상향하는 트렌드가 보인다.

 

다우존스 지수 데이터의 시계열플롯

 

b. 표류 방법을 사용해서 예측 그래프 그려보기

> autoplot(dowjones) + autolayer(rwf(dowjones, h=10, drift=TRUE))

 

prediction plot with drift method

 

 

c. 첫 관측값과 마지막 관측값을 선으로 그은 것과 예측이 동일하다는 것 확인하기

위 그래프에서 보면 시작값과 마지막 관측값을 일직선으로 이었을때, 예측값과 일치한다.

 

d. 같은 데이터 셋으로 벤치마크 함수를 좀 사용해보자. 어떤 함수가 제일 낫다고 생각하는지

아래 스샷은 네가지 벤치마크를 사용해 본 결과이다. rwf는 상승을 추정하고, naive는 마지막값을 유지, 그리고 forecast는 하락을 예상한다. 이런 주가지수 예측에는 naive가 가장 나은게 아닐까 싶다.

 

네가지 벤치마크를 사용해 봄

 

11. ibm 주가지수를 이용해 다음 질문들 대답하기

a. 플롯 그려보기

 

b. 데이터를 300개의 트레이닝 데이터와 69개의 테스트 데이터로 나눠보기

> test_ibm <- subset(ibmclose, start=length(ibmclose)-69)
> train_ibm <- subset(ibmclose, end=length(ibmclose)-69)
> autoplot(ibmclose) + autolayer(test_ibm) + autolayer(train_ibm)

 

트레이닝/테스트로 구분

 

c. 다양한 벤치마크 방법을 써서 예측해보고 테스트 데이터와 맞춰보기. 어떤 방법이 가장 나았는지?

결과는 아래 스샷처럼 나온다. 테스트 데이터와 맞춰봤을때 나이브 방식이 가장 나은 것으로 보인다. 

 

d. c에서 맘에 들었던 방법의 잔차를 확인하자. 백색소음과 유사한가?

잔차의 분포는 표준분포와 유사하고, 평균역시 0에 근접하다. 하지만 ACF 그래프를 보았을 때 백색소음과 유사하지는 않으며, 약간의 상관관계가 있는 것으로 보인다. 융-박스 검정의 결과 역시 백색소음과 유사하다는 가정을 기각한다.

 

잔차 확인.

 

> checkresiduals(fc3)

Ljung-Box test

data:  Residuals from Naive method
Q* = 22.555, df = 10, p-value = 0.01251

 

 

12. 새로운 가족 주택의 판매량 데이터를 살펴보기

a. 플롯 그려보기

b. 데이터를 트레이닝/테스트로 쪼개되, 마지막 2년치 데이터를 테스트로 쪼개기

c. 다양한 벤치마크 방법을 써서 예측해보고 테스트 데이터와 맞춰보기. 어떤 방법이 가장 나았는지?

d. c에서 맘에 들었던 방법의 잔차를 확인하자. 백색소음과 유사한가?

반응형