tibble
forecast
팩키지 티블 1Econometrics and Free Software 블로그에 그동안 측정해서 보관하고 있던 개인정보(체중)을 인터넷에 공개하였다. 데이터프레임이 티블(tibble)로 확장되고 티블 자료구조에 시계열 자료형을 추가하는 시도가 많이 되고 있다. 그중 하나의 움직임이 tsibble
이다.
시계열 체중 데이터를 필요한 부분만 추출하여 뽑아내고, 이를 시각화한다.
# 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()
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)
시계열 예측모형을 적합시키려면 자료구조를 기존 데이터프레임에서 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]>
“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)