R 检测季节性等模式

标签 r time-series

我正在寻找一个包来检测模式,例如季节性。我有一个包含两列的数据框:日(日期)和访问次数。

当我绘制数据时,我发现夏季月份的网站访问量高于其他月份。这种模式我可以看到超过 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)

enter image description here

看起来夏天的交通确实会更多,但很难确定。幸运的是,prophet 具有检查每日和每周季节性的功能。

prophet_plot_components(m, forecast)

enter image description here

看到“年度”图表中的增长了吗?夏季的网站流量肯定比一年中其他时间更多!

更新

为了回应评论,这里有一个快速简单的方法来测试每个网站内的任何每月季节性。它对每个组应用anova 测试。此示例为网站 B 提供了季节性效应,您可以在 statisticp.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/

相关文章:

R XML - 将父节点和子节点组合成数据框

r - 如果 R 中满足条件,则打印列中的值

r - 在 R 中预测后对值进行非规范化

python - 计算年份数据的逐月和逐年变化

python - Pandas 中的日期范围

python - 连接 DataFrame 的日期时间并转发填充数据

r - 如何在 R 中计算圆形域(工作日)中的相对差

r - 使用单个采样命令在数据框中创建多行

machine-learning - 用于预测某些事件何时发生的机器学习模型

regex - 删除最后一次出现的字符