Facebook 发布了prophet 包以简化时间序列分析。有很多其他方法可以寻找季节性,但我认为prophet 是最容易使用且无需调整的方法。我推荐阅读 Facebook 的 documentation。
首先让我们创建一个数据样本。
library(tidyverse)
website <-
tibble(date = seq(as.Date('2015/01/01'), as.Date('2017/01/01'), by = "day"),
visits = round(rnorm(732, mean = 327, sd = 100)))
让我们在夏季增加网站流量。
library(lubridate)
website <-
mutate(website, ifelse(month(date) %in% c(6, 7, 8), visits + 10, visits))
现在进行prophet 计算!
library(prophet)
website <- website %>%
rename(ds = date, y = visits)
m <- prophet(website)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)
可视化结果。
plot(m, forecast)
看起来夏天的流量肯定会更多,但很难确定。幸运的是,prophet 具有检查每日和每周季节性的功能。
prophet_plot_components(m, forecast)
看到“年度”图表中的增长了吗?您在夏季的网站流量肯定比一年中的其他时间多!
更新
针对 cmets,这里有一种快速简便的方法来测试每个网站内的任何月度季节性。它将anova 测试应用于每个组。此示例为网站 B 提供了季节性影响,您可以在 statistic 和 p.value 列中看到它。
首先创建演示数据...
library(tidyverse)
library(lubridate)
library(purrr)
library(broom)
website <-
tibble(
site = c(rep("A", 732), rep("B", 732), rep("C", 732)),
date = rep(seq(
as.Date('2015/01/01'), as.Date('2017/01/01'), by = "day"
), 3),
visits = rep(round(rnorm(
732, mean = 327, sd = 100
)), 3)
) %>%
mutate(month = month(date))
website <-
mutate(website, visits = ifelse(month %in% c(6,7,8) &
site == "B", visits + 1000, visits))
现在使用 tidyverse 的奇迹在每个组中运行测试...
website %>%
split(.$site) %>%
map(~ tidy(aov(visits ~ month, data = .)))
#$A
# term df sumsq meansq statistic p.value
#1 month 1 3645.896 3645.896 0.3529069 0.5526563
#2 Residuals 730 7541662.108 10331.044 NA NA
#$B
# term df sumsq meansq statistic p.value
#1 month 1 1086355 1086355.5 5.426011 0.02011086
#2 Residuals 730 146155160 200212.5 NA NA
#$C
# term df sumsq meansq statistic p.value
#1 month 1 3645.896 3645.896 0.3529069 0.5526563
#2 Residuals 730 7541662.108 10331.044 NA NA
请注意,这不是执行时间序列分析的理想方法,但它回答了您提出的具体问题。