我正在寻找一个包来检测模式,例如季节性。我有一个包含两列的数据框:日(日期)和访问次数。
当我绘制数据时,我发现夏季月份的网站访问量高于其他月份。这种模式我可以看到超过 10 年。
问题是我想用来自数百个网站的数据来分析季节性。
请给我提供一个示例来检测时间序列上的这种模式?
最佳答案
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))
现在进行先知
计算!
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)
看到“年度”图表中的增长了吗?夏季的网站流量肯定比一年中其他时间更多!
更新
为了回应评论,这里有一个快速简单的方法来测试每个网站内的任何每月季节性。它对每个组应用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
请注意,这不是执行时间序列分析的理想方法,但它回答了您提出的具体问题。
关于R 检测季节性等模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45211642/