时间序列预测首先要确定预测的内容。
- 本文预测共享单车的日租借量
- 使用的是每日数据
- 预测的时间范围是需要提前一个月、半年还是一年?根据预测范围,会使用到不同的模型。
- 首先安装加载本文所需要的包
install.packages("modeltime")
library(tidymodels)
library(modeltime)
library(timetk)
library(lubridate)
library(tidyverse)
library(forecast)
1.数据准备/处理
我们研究的数据集为共享自行车的租用量,我们将数据集简化为具有“日期”和“值”列的单变量时间序列。
df_bike = bike_sharing_daily %>%
select(dteday, cnt) %>%
set_names(c("date", "value"))
glimpse(df_bike)
## Rows: 731
## Columns: 2
## $ date <date> 2011-01-01, 2011-01-02, 2011-01-03, 2011-01-04, 2011-01-05, 201…
## $ value <dbl> 985, 801, 1349, 1562, 1600, 1606, 1510, 959, 822, 1321, 1263, 11…
接下来,使用 plot_time_series() 函数可视化数据集。调参 .interactive = TRUE 以获得可交互的绘图,若为FALSE 返回 ggplot2 静态图,默认为TRUE。
df_bike %>%
plot_time_series(date, value, .interactive = F) +
xlab("Date") +
ylab("Count of total rent bikes")
数据的时间跨度为2011-01-11至2013-01-01,共计731个数据,从图中可以看出数据量较大,不易于分析,为更好地观察趋势,应该将数据再划分为更小的时间跨度,具体根据结果确定。可以看出,这张图没有特别明显的趋势,是否有很强的季节性(每周/每月)?
- 接着检测数据是否具有季节性
df_bike %>%
plot_seasonal_diagnostics(date, value, .interactive = FALSE)
可以看到共享单车租用量具有月度季节性,在第2、3季度租用量大于第1、4季度。这很可能是因为第1、4季度是冬天。
2.训练/测试
使用函数time_series_split() 去创建训练集和测试集
- 设置 assess = "3 months 表明后3个月为测试集
- 设置 cumulative = TRUE 表明采样使用所有前面的先验数据作为训练集。
splits = df_bike %>%
time_series_split(assess = "3 mont