1 forecast 팩키지 티블 1

Econometrics and Free Software 블로그에 그동안 측정해서 보관하고 있던 개인정보(체중)을 인터넷에 공개하였다. 데이터프레임이 티블(tibble)로 확장되고 티블 자료구조에 시계열 자료형을 추가하는 시도가 많이 되고 있다. 그중 하나의 움직임이 tsibble이다.

2 시계열 체중 데이터

시계열 체중 데이터를 필요한 부분만 추출하여 뽑아내고, 이를 시각화한다.

# 0. 팩키지 -----
library(tidyverse)
library(forecast)
library(tsibble)
library(tibbletime)

# 1. 데이터 -----
## 1.1. 데이터 가져오기 -----
weight_df <- read_csv("https://gist.githubusercontent.com/b-rodrigues/ea60679135f8dbed448ccf66a216811f/raw/18b469f3b0720f76ce5ee2715d0f9574b615f170/gistfile1.txt") %>% 
  as_tsibble()

## 1.2. 훈련/시험 데이터 분할 -----

weight_train_df <- weight_df %>% 
  filter(Date >= "2016-07-11", Date <= "2018-05-31") %>% 
  rename(date = Date, weight = Poids)

# 2. 시각화 -----
## 2.1. 원본 데이터 시각화 -----
ggplot(weight_train_df, aes(date, weight)) +
  geom_line()

2.1 이동평균 추세선 추가

RcppRoll::roll_meanr() 함수를 사용해서 이동평균을 추가해서 시각화한다.

## 2.2. 이동평균 추가 -----
weight_train_df %>% 
  mutate(roll_10 = RcppRoll::roll_meanr(weight, n = 10, fill = NA)) %>% 
  ggplot(aes(date, weight)) +
    geom_line() + 
    geom_line(aes(date, roll_10), color="red", size=1)

2.2 시계열 예측모형 적합

시계열 예측모형을 적합시키려면 자료구조를 기존 데이터프레임에서 ts로 변경시켜야 한다. auto.arima.df() 함수로 ARIMA 모형으로 적합시키고 나서, 객체를 weight_models_tbl에 원데이터, ARIMA 모형, 예측값 모두 한 곳에 저장시킨다.

# 3. ARIMA 예측모형 -----
## 3.1. 예측모형 함수: DF --> TS 변환 -----
auto.arima.df <- function(data, y, ...){
  
  y <- enquo(y)
  
  yts <- data %>% 
    pull(!!y) %>% 
    as.ts()
  
  auto.arima(yts, ...)
}

## 3.2. 예측모형 적합 -----
weight_train_tbl <- weight_train_df %>% 
  mutate(group = "1") %>% 
  group_by(group) %>% 
  nest()
  
weight_models_tbl <- weight_train_tbl %>% 
  mutate(model = map(data, auto.arima.df, y = weight)) %>% 
  mutate(predictions = map(model, forecast, h = 18)) %>% 
  mutate(predictions = map(predictions, as_tibble))

weight_models_tbl
# A tibble: 1 x 4
  group data                model       predictions      
  <chr> <list>              <list>      <list>           
1 1     <tsibble [456 x 2]> <S3: ARIMA> <tibble [18 x 5]>

2.3 시계열 예측 시각화

“2018-06-01” 기간 이후 시험데이터를 별도로 생성시켜 이를 ARIMA 예측모형 데이터와 결합하여 데이터프레임으로 제작시키고, 이를 ggplot으로 시각화한다.

# 4. 예측모형 적합 -----

weight_test_df <- weight_df %>% 
  filter(Date >= "2018-06-01") %>% 
  rename(date=Date, weight = Poids)

weight_test_fcst_df <- bind_cols(weight_test_df, weight_models_tbl$predictions[[1]])

weight_test_fcst_df
# A tsibble: 18 x 7 [1DAY]
   date       weight `Point Forecast` `Lo 80` `Hi 80` `Lo 95` `Hi 95`
   <date>      <dbl>            <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1 2018-06-01   71.8             71.5    70.7    72.3    70.3    72.8
 2 2018-06-03   71.2             71.6    70.7    72.4    70.2    72.9
 3 2018-06-06   70.8             71.4    70.5    72.3    70.0    72.8
 4 2018-06-07   70.5             71.5    70.5    72.4    70.0    72.9
 5 2018-06-08   70.1             71.4    70.4    72.4    69.8    72.9
 6 2018-06-09   70.3             71.4    70.4    72.5    69.8    73.0
 7 2018-06-11   71.3             71.3    70.3    72.4    69.7    73.0
 8 2018-06-12   71.3             71.4    70.3    72.5    69.7    73.0
 9 2018-06-13   71.2             71.3    70.2    72.4    69.6    73.0
10 2018-06-14   70.5             71.3    70.2    72.5    69.6    73.1
11 2018-06-15   71.3             71.3    70.1    72.5    69.5    73.1
12 2018-06-16   70.8             71.3    70.1    72.5    69.4    73.1
13 2018-06-18   71.3             71.2    70.0    72.5    69.3    73.1
14 2018-06-19   70.7             71.2    70.0    72.5    69.3    73.2
15 2018-06-20   70.8             71.2    69.9    72.5    69.2    73.2
16 2018-06-21   70.8             71.2    69.9    72.5    69.2    73.2
17 2018-06-23   72               71.2    69.8    72.5    69.1    73.2
18 2018-06-24   71               71.2    69.8    72.5    69.1    73.2
weight_test_fcst_df %>% 
  ggplot(aes(x=date, y=weight)) +
    geom_point() +
    geom_line() +
    geom_line(aes(x=date, y=`Point Forecast`), color="red", size=1) +
    geom_line(aes(x=date, y = `Hi 95`), color="pink", size=1) + 
    geom_line(aes(x=date, y = `Lo 95`), color="pink", size=1)