10.1 계층적 시계열

그림 10.1\(K=2\)-수준 계층 구조를 나타냅니다. 수준 0이라고 부르는 계층 구조의 꼭대기는 “전체(Total)”이고, 데이터를 모두 포함하는 수준입니다. \(t=1,\dots,T\)에 대한 전체(Total) 시계열의 \(t\)번째 관측값을 \(y_t\)라고 씁니다. “전체(Total)”는 수준 1에서 2개의 시계열로 나뉘고, 이것은 다시 계층의 밑바닥 수준에서 각각 3개와 2개로 나뉩니다. 가장 꼭대기의 수준 아래, 마디(node) \(j\)에 해당하는 시계열의 \(t\)번째 관측값을 \(\y{j}{t}\)로 씁니다. 예를 들어, 수준 1의 마디 A에 대응되는 시계열의 \(t\)번째 관측값을 \(y_{A,t}\)로 쓰고, 수준 2의 마디 AB에 대응되는 시계열의 \(t\)번째 관측값을 \(y_{AB,t}\)으로 쓰고, 다른 수준에 대한 값도 마찬가지 방식으로 씁니다.

두 단계 계층 구조 도식.

Figure 10.1: 두 단계 계층 구조 도식.

이 간단한 예제에서, 계층 구조에서 시계열의 전체 수는 \(n=1+2+5=8\) 이고, 가장 밑바닥 수준의 시계열 개수 \(m=5\)입니다. 모든 계층에서 \(n>m\)이라는 것에 주목합시다.

어떤 시간 \(t\)에 대해, 계층 구조의 가장 밑바닥 수준의 관측값은 위의 시계열의 관측값에 더해질 것입니다. \[\begin{equation} y_{t}=\y{AA}{t}+\y{AB}{t}+\y{AC}{t}+\y{BA}{t}+\y{BB}{t} \tag{10.1} \end{equation}\] 그리고 \[\begin{equation} \y{A}{t}=\y{AA}{t}+\y{AB}{t}+\y{AC}{t}\quad \text{and} \quad \y{B}{t}=\y{BA}{t}+\y{BB}{t}. \tag{10.2} \end{equation}\] (10.2)(10.1) 에 대입하여, \(y_{t}=\y{A}{t}+\y{B}{t}\) 도 얻습니다. 이것을 합산 제한 조건이나 합산 등식으로 생각할 수 있고 행렬 표기법을 가지고 효과적으로 나타낼 수 있습니다. \(n\times n_K\) 행렬 \(\bm{S}\)을 구성합니다. \(\bm{S}\)는 “합산 행렬(summing matrix)”이라고 부릅니다. \(\bm{S}\)는 밑바닥 수준의 시계열을 어떻게 모았는지 나타냅니다.

그림 10.1의 계층 구조에 대해 다음과 같이 쓸 수 있습니다. \[ \begin{bmatrix} y_{t} \\ \y{A}{t} \\ \y{B}{t} \\ \y{AA}{t} \\ \y{AB}{t} \\ \y{AC}{t} \\ \y{BA}{t} \\ \y{BB}{t} \end{bmatrix} = \begin{bmatrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 & 1 \\ 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \y{AA}{t} \\ \y{AB}{t} \\ \y{AC}{t} \\ \y{BA}{t} \\ \y{BB}{t} \end{bmatrix} \] 또는 더 간결한 기호로 적을 수 있습니다. \[\begin{equation} \bm{y}_t=\bm{S}\bm{b}_{t}, \tag{10.3} \end{equation}\] 여기에서 \(\bm{y}_t\)는 시간 \(t\)에서 계층 구조의 모든 관측값의 \(n\)-차원 벡터이고, \(\bm{S}\)는 합산 행렬(summing matrix)이고, \(\bm{b}_{t}\)는 시간 \(t\)에서의 계층 구조의 밑바닥 수준의 모든 관측값의 \(m\)-차원 벡터입니다. 합산 행렬\(\bm{S}\)의 첫 번째 행은 위의 식 (10.1)을 나타내고, 두 번째와 세 번째 행은 식 (10.2)을 나타냅니다. 아래의 단위 행렬에 대한 이러한 행은 \(m\)-차원 단위 행렬 \(\bm{I}_m\)로 이뤄져 있어, 식의 우변에 있는 가장 아래에 있는 수준의 관측값이 좌변에 있는 것과 같도록 합니다.

예제: 호주 여행객 계층구조

호주는 8개의 지역으로 구분합니다(어떤 것은 주(state)로 어떤 것은 영역(territory)이라고 부릅니다). 각각은 정부와 몇몇 경제적 행정적 자치권을 가지고 있습니다. 각각을 지역(zone)이라고 부르는 영역으로 더 자세히 나눌 수 있습니다. 사업 계획하는 사람이나 관광청은 호주 전체, 주별, 영역별, 그리고 지역 구분에 대한 예측값에 관심이 있습니다. 이 예제에서는 호주 사람이 집을 떠나 묵는 숙박일수로 분기별 국내선 여행객 수요에 집중하겠습니다. 분석을 단순화하기 위해, 2개의 영역과 태즈매니아를 “기타(Other)” 주로 묶겠습니다. 그래서 다음과 같이 6개 주를 가지고 분석을 진행합니다: 뉴 사우스 웨일즈(NSW), 퀸즐랜드(QLD), 남 호주(SAU), 빅토리아(VIC), 서 호주(WAU), 기타(OTH). 각각의 주에서 다음과 같은 지역의 숙박일 수를 다루겠습니다.

State Zones
NSW 대도시 (NSWMetro), 북부 해안 (NSWNthCo), 남부 해안 (NSWSthCo), 남부 내륙 (NSWSthIn), 북부 내륙 (NSWNthIn)
QLD 대도시 (QLDMetro), 중앙 (QLDCntrl), 북부 해안 (QLDNthCo)
SAU 대도시 (SAUMetro), 해안가 (SAUCoast), 내륙 (SAUInner)
VIC 대도시 (VICMetro), 서부 해안 (VICWstCo), 동부 해안 (VICEstCo), 내륙 (VICInner)
WAU 대도시 (WAUMetro), 해안가 (WAUCoast), 내륙 (WAUInner)
OTH 대도시 (OTHMetro), 비-도심 (OTHNoMet)

NSW에서 5개의 지역, VIC에서 4개의 지역, QLD, SAU, WAU에서 3개의 지역을 다룹니다. 대도시 지역은 주도(capital city)와 대도시권이라고 부르는 주변 지역을 포함합니다. OTH에서는 대도시권(OTHMetro)과 그렇지 않은 곳(OTHNoMet)을 다룹니다. 지리적인 지역에 대한 자세한 내용은 Wickramasuriya, Athanasopoulos, & Hyndman (2019) 의 Appendix C를 참조하시길 바랍니다.

계층적 시계열을 만들기 위해서 아래의 코드와 같이 hts() 함수를 사용하겠습니다. 함수에는 2개의 입력값이 필요합니다: 계층적 구조에 관한 밑바닥 수준 시계열과 정보. visnights는 밑바닥 수준 시계열을 포함하는 시계열 행렬입니다. 다른 방식으로도 계층 구조를 함수로 넘길 수 있습니다. 이 경우에는 characters 입력을 사용하겠습니다. visnights의 각 행의 이름 첫 3글자는 계층 구조에서 첫 번째 수준(주-state-단위)를 나타내고, 첫 5글자는 밑바닥 수준(지역-zone-단위)을 나타냅니다.

library(hts)
tourism.hts <- hts(visnights, characters = c(3, 5))
tourism.hts %>% aggts(levels=0:1) %>%
  autoplot(facet=TRUE) +
  xlab("연도") + ylab("백만") + ggtitle("숙박일수")
1998년 1분기부터 2016년 4분기까지 호주 국내 여행객 숙박일수를 주 단위로 분배한 것.

Figure 10.2: 1998년 1분기부터 2016년 4분기까지 호주 국내 여행객 숙박일수를 주 단위로 분배한 것.

그림 10.2의 위쪽 그래프는 방문객의 전체 숙박일 수를 나타내고, 아래쪽 그래프는 데이터를 주(state)별로 분배한 것을 나타냅니다. 이 결과는 국가 전체로 합산한 수준에서와 주별로 쪼갠 수준에서의 패턴을 나타냅니다. aggts() 함수는 hts 객체에서 어떠한 합산 수준에 대해 시계열을 추출합니다.

그림 10.3의 그래프는 밑바닥 수준의 시계열을 나타냅니다. 즉, 각 지역의 방문객의 숙박일 수를 나타냅니다. 이 그래프는 각 지역마다 변화 양상을 확인하는 것과, 지난 몇 년간 눈에 띄게 증가한 해안가 WAU 지역과 같이 특이하고 중요한 시계열을 알아내는데 도움이 됩니다.

library(tidyverse)
cols <- sample(scales::hue_pal(h=c(15,375),
  c=100,l=65,h.start=0,direction = 1)(NCOL(visnights)))
as_tibble(visnights) %>%
  gather(Zone) %>%
  mutate(Date = rep(time(visnights), NCOL(visnights)),
         State = str_sub(Zone,1,3)) %>%
  ggplot(aes(x=Date, y=value, group=Zone, colour=Zone)) +
    geom_line() +
    facet_grid(State~., scales="free_y") +
    xlab("연도") + ylab("백만") +
    ggtitle("지역별 숙박일수") +
    scale_colour_manual(values = cols)
1998년 1분기부터 2016년 4분기까지 호주 국내 여행객 숙박일수를 지역 단위로 분배한 것.

Figure 10.3: 1998년 1분기부터 2016년 4분기까지 호주 국내 여행객 숙박일수를 지역 단위로 분배한 것.

이 그림을 생성하기 위해, tidyverse 패키지 모음의 다양한 함수를 사용하고 있습니다. 자세한 내용은 이 책의 범위를 벗어납니다. 이러한 패키지를 사용하는 방법을 배울 수 있는 좋은 자료가 온라인에 많이 있으니 참조하시길 바랍니다.

참고 문헌

Wickramasuriya, S. L., Athanasopoulos, G., & Hyndman, R. J. (2019). Optimal forecast reconciliation for hierarchical and grouped time series through trace minimization. J American Statistical Association, 114(526), 804–819. https://robjhyndman.com/publications/mint/