1 tidyverts 생태계 1 2

시계열 데이터에 대해서도 tidyverse 패러다임을 적용하는 시도가 다수 있었고 그중 하나나 tidyverts, “Tidy R packages for time series analysis”다. 기존 시계열 데이터를 바탕으로 예측모형을 개발할 경우 통일되지 않은 시계열 자료구조로 인해서 다양한 예측모형이 있음에도 불구하고 사례별로 시계열 자료구조와 예측모형을 맞춰야하는 문제가 있었다.

tidyverse 문제

기존 forecast 팩키지는 함수 즉, 예측모형에 신경을 많이 썼다면 tidyverts에서는 자료구조에 대해서 관심을 많이 두고 있다. 그 노력의 일환으로 tisible은 시계열 자료구조, fable은 예측모형에 대한 부분을 담당하게 되었다.

tidyverse 문제

2 tidyverts 헬로월드

nycflights13 팩키지 weather 데이터셋을 가져오면 전형적인 데이터프레임이다. 즉, time_hour 변수가 날짜시간(dttm) 형태로 담겨져 있다. origin이 공항을 나타내고 있으며 EWR, JFK, LGA 3개 지점에서 2013-01-01 01:00:00 ~ 2013-12-30 18:00:00까지 날씨에 대해 측정한 정보가 시계열로 들어가 있다.

# A tibble: 3 x 2
  origin     n
  <chr>  <int>
1 EWR     8703
2 JFK     8706
3 LGA     8706
# A tibble: 1 x 2
  첫_시간             마지막_시간        
  <dttm>              <dttm>             
1 2013-01-01 01:00:00 2013-12-30 18:00:00

2.1 tsibble 객체 변환

상기 데이터프레임으로 tsibble 시계열 자료구조로 변경하게 되면 시킬 수 있다. 이를 위해서 index에 시계열 변수를 key에 식별변수를 지정한다. index + key를 통해 시계열 기본키가 준비된다.

  • integer/numeric: either “unit” or “year” (Y)
  • yearquarter/yearqtr: “quarter” (Q)
  • yearmonth/yearmon: “month” (M)
  • yearweek: “week” (W)
  • Date: “day” (D)
  • POSIXct: “hour” (h), “minute” (m), “second” (s), “millisecond” (us), “microsecond” (ms)
  • nanotime: “nanosecond” (ns)
# A tsibble: 26,115 x 5 [1h] <America/New_York>
# Key:       origin [3]
   origin time_hour            temp humid precip
   <chr>  <dttm>              <dbl> <dbl>  <dbl>
 1 EWR    2013-01-01 01:00:00  39.0  59.4      0
 2 EWR    2013-01-01 02:00:00  39.0  61.6      0
 3 EWR    2013-01-01 03:00:00  39.0  64.4      0
 4 EWR    2013-01-01 04:00:00  39.9  62.2      0
 5 EWR    2013-01-01 05:00:00  39.0  64.4      0
 6 EWR    2013-01-01 06:00:00  37.9  67.2      0
 7 EWR    2013-01-01 07:00:00  39.0  64.4      0
 8 EWR    2013-01-01 08:00:00  39.9  62.2      0
 9 EWR    2013-01-01 09:00:00  39.9  62.2      0
10 EWR    2013-01-01 10:00:00  41    59.6      0
# ... with 26,105 more rows

2.2 tsibble 연산작업

dplyr 동사에 친숙한 경우, group_by() + summarize() 콤보 연산은 tsibble 팩키지 index_by() + summarize() 콤보연산에 대응된다. 예를 들어 현재 시간대별로 나눠진 데이터를 일자별로 요약할 경우 날짜/시간 → 날짜로 변환하는데 as_date() 함수를 사용하고, index_by() 함수로 날짜별로 최대, 최소 온도를 구해서 새로운 자료형을 만들 수 있다.

# A tsibble: 1,092 x 5 [1D]
# Key:       origin [3]
   origin date       temp_high temp_mean temp_low
   <chr>  <date>         <dbl>     <dbl>    <dbl>
 1 EWR    2013-01-01      41        36.8     28.0
 2 EWR    2013-01-02      34.0      28.7     24.1
 3 EWR    2013-01-03      34.0      29.6     26.1
 4 EWR    2013-01-04      39.9      34.3     28.9
 5 EWR    2013-01-05      44.1      36.6     32  
 6 EWR    2013-01-06      48.0      39.9     33.1
 7 EWR    2013-01-07      46.9      40.3     32  
 8 EWR    2013-01-08      48.9      38.6     28.9
 9 EWR    2013-01-09      50        42.1     34.0
10 EWR    2013-01-10      50        43.6     39.0
# ... with 1,082 more rows

2.3 불규칙 시계열

tsible은 기본디폴트 설정으로 규칙적인 시계열 데이터를 염두에 두고 있다. 시계열이 불규칙적인 경우 regular = FALSE를 지정하여 이를 반영하고 index_by() + summarize() 콤보연산으로 추후 보정한다.

nycflights13 팩키지 flights 데이터프레임을 시계열 데이터 관점에서 살펴보자. 먼저 make_datetime() 함수로 시계열 데이터를 생성시킨다.

carrier, flight를 키값으로 삼아 앞서 생성한 sched_dep_datetime를 시계열 index로 삼는 다. regular = FALSE 인자를 명시적으로 선언해서 불규칙 시계열임을 확실히 한다. 이를 통해서 336,776 x 20 [!]으로부터 [!]을 통해 불규칙 시계열임을 확인할 수 있게된다.

# A tsibble: 336,776 x 20 [!] <America/New_York>
# Key:       carrier, flight [5,725]
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013    11     3     1531           1540        -9     1653
 2  2013    11     4     1539           1540        -1     1712
 3  2013    11     5     1548           1540         8     1708
 4  2013    11     6     1535           1540        -5     1657
 5  2013    11     7     1549           1540         9     1733
 6  2013    11     8     1539           1540        -1     1706
 7  2013    11     9     1535           1540        -5     1714
 8  2013    11    10     1538           1540        -2     1718
 9  2013    11    11     1527           1540       -13     1710
10  2013    11    12     1535           1540        -5     1709
# ... with 336,766 more rows, and 13 more variables: sched_arr_time <int>,
#   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#   minute <dbl>, time_hour <dttm>, sched_dep_datetime <dttm>

3 시계열 애니메이션

공항별(dplyr) 월별(tsibble) 온도변화(ggplot) 애니메이션(gganimate)을 조합하여 순차적으로 파이프에 연결시키게 되면 월별 혹은 경우에 따라서는 일별 시각화 애니메이션을 수월하게 작성시킬 수 있다.