【问题标题】:R detect pattern like seasonalityR检测季节性模式
【发布时间】:2017-07-20 10:07:47
【问题描述】:

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

当我绘制数据时,我发现夏季月份网站上的访问量高于其他月份。这种模式我可以看到超过 10 年。

问题是我想用来自数百个网站的数据来分析季节性。

请提供一个示例来检测时间序列上的这种模式?

【问题讨论】:

  • 也许在这里看到最佳答案:stats.stackexchange.com/questions/57705/…
  • 查看 stl() 函数。
  • 感谢有用的答案!我的问题实际上是我有两个变量日期和访问。但是当我使用 TS 时,我只需要一列,然后我得到答案“y 应该是单变量时间序列”?有人知道这个问题吗?我在使用时遇到问题: x
  • @user860480,大多数时间序列分析需要一个单变量时间序列,其中每个值涵盖一个时期(天、年等)。这是我喜欢prophet 并在我的回答中使用它的一个重要原因。它专为像您这样的时间序列数据而设计。

标签: r time-series


【解决方案1】:

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)

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

更新

针对 cme​​ts,这里有一种快速简便的方法来测试每个网站内的任何月度季节性。它将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

请注意,这不是执行时间序列分析的理想方法,但它回答了您提出的具体问题。

【讨论】:

  • 这是一个很棒的答案谢谢!!这是一个非常有趣的包! :) 是否有可能获得网站季节性的价值?所以这个网站有季节性而另一个没有?在有趣的年度情节中:三年的情节解决方案是否与预测(2015-2017)无关?我问是因为字体中有一个 01。
  • 您是否希望回答“这些网站中哪些网站在夏季的流量比一年中其他时间多?”这个问题?因为有一个非常简单的方法,我可以在那里向你展示。另外,您说您的数据中只有两列,那么您怎么知道哪个数据点指的是哪个网站?一旦您给我更多信息,很高兴编辑我的答案。如果您最喜欢,请记住使用分数下方的复选框选择此答案。
  • 是的,我正在寻找答案“这些网站中的哪些网站在某些月份(例如在夏季或 12 月)拥有更多流量?”回答这个问题很简单,用一个值来决定是或否?我有三列:网站、日期和访问。但由于包预测中的 ts-form,我只使用日期和访问列。我对你的回答很兴奋!如果您的解决方案有效,我会使用复选框来选择您的答案!
  • 在有趣的年度情节中:三年(三年总结)的情节解决方案与预测(2015-2017)是否一致?我问是因为字母中有一个 01。是否有可能改变“一年中的某一天”的比例,因为不可能在图中看到确切的月份,例如六月。
  • 我更新了我的回复。请注意,如果您想查看不同网站之间的差异,则必须包含 website 变量。
猜你喜欢
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2016-10-31
  • 2020-02-21
  • 2020-06-27
相关资源
最近更新 更多