5.4 몇 가지 유용한 예측변수

시계열 데이터에 대해 회귀를 사용할 때 몇 가지 유용한 예측변수(predictor variable)가 있습니다. 이러한 예측변수(predictor variable)는 자주 나타납니다.

추세

시계열 데이터에 추세가 나타나는 것은 흔한 일입니다. 선형 추세는 다음과 같이 단순히 \(x_{1,t}=t\)를 예측변수(predictor variable)로 사용하여 모델링할 수 있습니다. \[ y_{t}= \beta_0+\beta_1t+\varepsilon_t, \] 여기에서 \(t=1,\dots,T\)입니다. tslm() 함수에서 trend 예측변수(predictor variable)를 사용하여 추세 변수를 정할 수 있습니다. 5.8 절에서 비선형 추세를 어떻게 모델링할 수 있는지 다루겠습니다.

가변수

지금까지는, 각 예측변수(predictor variable)가 숫자 값들로 나타나는 것을 가정했습니다. 하지만 예측변수(predictor variable)가 두 가지 값만 갖는(예를 들면, “예”와 “아니오”) 범주형(categorical) 변수일 때는 어떻겠습니까? 이러한 변수는 일별 판매량을 예측할 때 나타날 수 있습니다. 예를 들어, 날짜가 공휴일인지 아닌지 고려하고 싶은 경우를 생각해봅시다. 그러면 이 경우에 예측변수(predictor variable)는 공휴일이면 “예” 그렇지 않으면 “아니오” 값을 가질 것입니다.

이 상황도 다중 회귀 모델의 틀에서 1을 “예”로 0을 “아니오”로 갖는 “가변수(dummy variable)”를 만들어 다룰 수 있습니다. 모의 변수를 “지표 변수(indicator variable)”라고도 부릅니다.

가변수(dummy variable)는 데이터의 이상값(outlier)을 설명할 때도 사용할 수 있습니다. 이상값(outlier)을 생략하는 대신, 가변수(dummy variable)는 이러한 효과를 없앱니다. 이 경우에, 가변수는 이러한 관측치에 대해 1 이외에는 0입니다. 특별한 사건이 일어나는 경우도 한 가지 예가 됩니다. 예를 들어, 브라질에 방문하는 여행자를 예측하는 상황에서는, 2016년에 열린 리우 올림픽 효과를 고려할 필요가 있을 것입니다.

세 개 이상의 범주가 있을 때는, 변수를 (전체 범주의 수보다 1만큼 작은) 몇 가지 가변수(dummy variable)로 부호화할 수 있습니다. 인자 변수(factor variable)를 예측변수로 명시할 때, tslm()은 자동으로 이러한 경우를 다룰 것입니다. 보통은 관련 가변수(dummy variable)를 직접 만들 필요가 없습니다.

계절성 가변수

일별 데이터를 예측하고 있고 요일을 고려하고 싶다고 합시다. 그러면 다음과 같은 가변수(dummy variable)를 만들 수 있습니다.

\(d_{1,t}\) \(d_{2,t}\) \(d_{3,t}\) \(d_{4,t}\) \(d_{5,t}\) \(d_{6,t}\)
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
0 0 0 0 0 0
1 0 0 0 0 0

7개의 범주를 부호화하기 위해 6개의 가변수(dummy variable)만 필요하다는 것에 주목합시다. 이것은 모든 가변수를 0으로 둘 때, 절편이 7번째 범주(이 경우에는 일요일)를 잡아내고, 가변수를 모두 0으로 둘 때 명시적으로 정합니다.

많은 입문자는 7번째 범주에 대해 7번째 가변수(dummy variable)를 넣으려고 할 것입니다. 이것 때문에 회귀가 실패할 것이라는 이유에서 이러한 실수를 “가변수 함정(dummy variable trap)”이라고 부릅니다. Y절편도 포함되었을 때 추정하기 위해 너무 많은 매개변수가 있는 것입니다. 일반적인 규칙은 범주보다 하나 적은 수의 가변수(dummy variable)를 사용하는 것입니다. 그래서 분기별 데이터에서는 3개의 가변수를, 월별 데이터에서는 11개의 가변수를, 일별 데이터에서는 6개의 가변수를 사용합니다.

가변수와 관계된 각 계수는 생략된 범주에 관한 해당 범주의 효과를 나타냅니다. 위의 예제에서, 월요일과 관계된 \(d_{1,t}\)의 계수는 목표 예상변수(forecast variable)에 대해 일요일의 효과와 비교하여 월요일의 효과를 나타냅니다. 다음 예제는 호주 맥주 생산량의 분기별 계절성을 포착하는 추정된 가변수(dummy variable) 계수의 의미를 나타냅니다.

여러분이 예측변수(predictor variable) season을 명시하면 tslm() 함수는 자동으로 이러한 상황을 다룹니다.

예제: 호주 분기별 맥주 생산량

그림 5.14에 있는 호주 분기별 맥주 생산량 데이터로 돌아가봅시다.

beer2 <- window(ausbeer, start=1992)
autoplot(beer2) + xlab("연도") + ylab("백만 리터")
호주 분기별 맥주 생산량.

Figure 5.14: 호주 분기별 맥주 생산량.

미래의 맥주 생산량 값을 예측하려고 합니다. 선형 추세와 분기별 가변수(dummy variable)를 고려하는 회귀 모델로 이 데이터를 다음과 같이 모델링 할 수 있습니다. \[ y_{t} = \beta_{0} + \beta_{1} t + \beta_{2}d_{2,t} + \beta_3 d_{3,t} + \beta_4 d_{4,t} + \varepsilon_{t}, \] 여기에서 \(t\)가 분기 \(i\)이면 \(d_{i,t} = 1\)이고, 아니면 0입니다. 첫 번째 분기 변수는 생략되었기 때문에, 다른 분기와 관계된 계수는 첫 번째 분기와 다른 분기와의 차이를 나타냅니다.

fit.beer <- tslm(beer2 ~ trend + season)
summary(fit.beer)
#> 
#> Call:
#> tslm(formula = beer2 ~ trend + season)
#> 
#> Residuals:
#>    Min     1Q Median     3Q    Max 
#> -42.90  -7.60  -0.46   7.99  21.79 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept) 441.8004     3.7335  118.33  < 2e-16 ***
#> trend        -0.3403     0.0666   -5.11  2.7e-06 ***
#> season2     -34.6597     3.9683   -8.73  9.1e-13 ***
#> season3     -17.8216     4.0225   -4.43  3.4e-05 ***
#> season4      72.7964     4.0230   18.09  < 2e-16 ***
#> ---
#> Signif. codes:  
#> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 12.2 on 69 degrees of freedom
#> Multiple R-squared:  0.924,	Adjusted R-squared:  0.92 
#> F-statistic:  211 on 4 and 69 DF,  p-value: <2e-16

R workspace에서 trendseason은 객체가 아니라는 것에 주목하시길 바랍니다; 이러한 방식으로 명시할 때 tslm()에서 이것을 자동으로 생성합니다.

분기별 -0.34 백만리터 값에 평균적인 하향 추세가 있습니다. 평균적으로, 2번째 분기는 생산량이 첫 번째 분기보다 34.7 백만리터 작고, 3번째 분기는 첫 번째 분기보다 17.8 백만리터 작고, 4번째 분기는 첫 번째 분기보다 72.8 백만리터 큽니다.

autoplot(beer2, series="데이터") +
  autolayer(fitted(fit.beer), series="적합값") +
  xlab("연도") + ylab("백만 리터") +
  guides(colour=guide_legend(title=" ")) +
  ggtitle("분기별 맥주 생산량")
맥주 생산량과 예측된 맥주 생산량의 시간 그래프.

Figure 5.15: 맥주 생산량과 예측된 맥주 생산량의 시간 그래프.

cbind(Data=beer2, Fitted=fitted(fit.beer)) %>%
  as.data.frame() %>%
  ggplot(aes(x = Data, y = Fitted,
             colour = as.factor(cycle(beer2)))) +
    geom_point() +
    ylab("적합값") + xlab("실제 값") +
    ggtitle("분기별 맥주 생산량") +
    scale_colour_brewer(palette="Dark2", name="분기") +
    geom_abline(intercept=0, slope=1)
실제 맥주 생산량을 예측된 맥주 생산량에 대해 나타낸 것.

Figure 5.16: 실제 맥주 생산량을 예측된 맥주 생산량에 대해 나타낸 것.

개입 변수

예측하려는 변수에 영향을 줄 수도 있는 개입(intervention)값을 모델링하는 것이 종종 필요합니다. 예를 들면, 경쟁자의 활동, 광고 지출, 산업 행동 등이 모두 영향을 미칠 수 있습니다.

효과가 한 주기만 지속될 때는, “스파이크(spike)” 변수를 사용합니다. 이것은 개입 기간에는 1로 두고 그 외에는 0으로 두는 가변수(dummy variable)입니다. 스파이크 변수는 이상값을 처리하기 위한 가변수와 같습니다.

다른 개입(intervention)은 즉각적이고 영구적인 효과가 있습니다. 개입(intervention)이 수준 변화를 일으킬 때(즉, 시계열의 값이 개입 시점부터 갑자기 영구적으로 변하는 경우), “단계(step)” 변수를 사용합니다. 개입 전에는 단계 변수(step variable)를 0으로 두고 개입 이후에는 1로 둡니다.

영구적인 효과의 또 다른 형태는 기울기의 변화입니다. 여기에서 구간 선형 추세로 개입을 다룹니다; 개입 시점에서 추세가 구부러지기 때문에 따라서 추세는 비선형적입니다. 이것을 5.8 절에서 다룰 것입니다.

거래일

매월 거래일의 날짜 수는 많이 변할 수 있고 판매량 데이터에 상당한 영향을 미칠 수 있습니다. 이러한 효과를 고려하기 위해, 각 월의 거래일 수를 예측변수로 포함시킬 수 있습니다.

월별이나 분기별 데이터에 대해, bizdays() 함수가 각 주기 안에 있는 거래일 수를 계산할 것입니다.

주마다 날짜 수가 다른 효과를 고려할 때는 다음과 같은 예측변수(predictor variable)가 들어갑니다: \[\begin{align*} x_{1} &= \text{월의 월요일 수;} \\ x_{2} &= \text{월의 화요일 수;} \\ & \vdots \\ x_{7} &= \text{월의 일요일 수.} \end{align*}\]

분포된 시차 값

광고 지출을 예측변수(predictor variable)로 넣는 것은 종종 유용합니다. 하지만, 광고 효과는 실제 캠페인 기간보다 오래 갈 수 있기 때문에, 광고 지출의 시차값(lagged value)을 넣을 필요가 있습니다. 따라서 다음과 같은 예측변수(predictor variable)가 유용할 수 있습니다. \[\begin{align*} x_{1} &= \text{이전 달의 광고 지출;} \\ x_{2} &= \text{이전 2개월 동안 광고 지출;} \\ & \vdots \\ x_{m} &= \text{이전 $m$개월 동안 광고 지출.} \end{align*}\]

이 책의 범위를 벗어나기는 합니다만, 시차가 증가함에 따라, 일반적으로 계수가 감소하도록 둡니다.

부활절

부활절은 매년 날짜가 다르고 효과가 며칠 동안 지속될 수 있기 때문에 대부분의 휴일과는 다릅니다. 이 경우에는, 특정 기간에 속하면 가변수(dummy variable)를 1로, 그 외에는 0으로 둘 수 있습니다.

월별 데이터에서, 부활절이 3월이면 3월에 가변수(dummy variable) 1을 두고 4월이면 4월에 가변수(dummy variable) 1을 두고, 3월에 시작하여 4월에 끝날 때는 가변수(dummy variable)를 월 사이에 비례하여 나눕니다.

easter() 함수가 가변수(dummy variable)를 계산할 것입니다.

푸리에 급수

계절성 가변수(seasonal dummy variable) 대신에, 긴 계절성 주기(seasonal period)에 대해서는 특별히, 푸리에 항(Fourier term)을 사용합니다. 장-밥티스트 푸리에(Jean-Baptiste Fourier)는 1700년대에 태어난 프랑스 수학자입니다. 사인과 코사인 항의 급수로 임의의 주기적 함수의 근사치를 낼 수 있다는 것을 보였습니다. 이러한 항을 계절성 패턴을 다룰 때 사용할 수 있습니다.

\(m\)이 계절성 주기(seasonal period)라면, 처음 몇 개의 푸리에 항(Fourier term)은 다음과 같이 주어집니다. \[ x_{1,t} = \sin\left(\textstyle\frac{2\pi t}{m}\right), x_{2,t} = \cos\left(\textstyle\frac{2\pi t}{m}\right), x_{3,t} = \sin\left(\textstyle\frac{4\pi t}{m}\right), x_{4,t} = \cos\left(\textstyle\frac{4\pi t}{m}\right), x_{5,t} = \sin\left(\textstyle\frac{6\pi t}{m}\right), x_{6,t} = \cos\left(\textstyle\frac{6\pi t}{m}\right), \] 나머지도 이와 같습니다. 월별 계절성을 다루고 이러한 예측변수(predictor variable) 중에서 처음 11개를 사용한다면, 11개의 가변수(dummy variable)를 사용하여 정확하게 같은 예측값을 얻을 것입니다.

푸리에 항(Fourier term)이 있으면, 가변수(dummy variable)가 있는 경우에 필요한 예측변수(predictor variable)보다 (특히 \(m\)이 클 때) 종종 적은 수의 예측변수(predictor variable)를 사용한다는 것입니다. 예를 들어, \(m\approx 52\)인 주별 데이터에 대해 이러한 장점이 유용할 수 있습니다. 짧은 계절성 주기를 다룰 때는(예를 들면, 분기별 데이터), 계절성 가변수(dummy variable)에 대해 푸리에 항(Fourier term)을 사용해도 딱히 좋은 점이 없습니다.

R에서는 이러한 푸리에 항(Fourier term)을 fourier() 함수로 구합니니다. 예를 들어, 호주 맥주 데이터를 아래와 같이 모델링할 수 있습니다.

fourier.beer <- tslm(beer2 ~ trend + fourier(beer2, K=2))
summary(fourier.beer)
#> 
#> Call:
#> tslm(formula = beer2 ~ trend + fourier(beer2, K = 2))
#> 
#> Residuals:
#>    Min     1Q Median     3Q    Max 
#> -42.90  -7.60  -0.46   7.99  21.79 
#> 
#> Coefficients:
#>                           Estimate Std. Error t value
#> (Intercept)               446.8792     2.8732  155.53
#> trend                      -0.3403     0.0666   -5.11
#> fourier(beer2, K = 2)S1-4   8.9108     2.0112    4.43
#> fourier(beer2, K = 2)C1-4  53.7281     2.0112   26.71
#> fourier(beer2, K = 2)C2-4  13.9896     1.4226    9.83
#>                           Pr(>|t|)    
#> (Intercept)                < 2e-16 ***
#> trend                      2.7e-06 ***
#> fourier(beer2, K = 2)S1-4  3.4e-05 ***
#> fourier(beer2, K = 2)C1-4  < 2e-16 ***
#> fourier(beer2, K = 2)C2-4  9.3e-15 ***
#> ---
#> Signif. codes:  
#> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 12.2 on 69 degrees of freedom
#> Multiple R-squared:  0.924,	Adjusted R-squared:  0.92 
#> F-statistic:  211 on 4 and 69 DF,  p-value: <2e-16

fourier()의 첫 번째 입력은 계절성 주기 \(m\)과 돌려줄 예측변수(predictor variable)의 길이를 찾을 수 있도록 합니다. 두 번째 입력 K으로 사인과 코사인 항을 몇 개 넣을 지 정합니다. 최대 \(K=m/2\)까지 정할 수 있습니다. 여기에서 \(m\)은 계절성 주기입니다. 여기에서 최대값을 사용했기 때문에, 얻은 결과가 계절성 가변수를 사용했을 때와 같습니다.

두 개의 푸리에 항(\(x_{1,t}\)\(x_{2,t}\))만 사용한다면, 계절성 패턴은 단순한 사인 파형으로 나타날 것입니다. 연이은 푸리에 항이 처음 두 푸리에 항의 조화를 나타내기 때문에 푸리에 항을 포함하는 회귀 모델을 보통 조화회귀(harmonic regression)라고 부릅니다.