Facebook a publié le package prophet
pour simplifier l'analyse des séries chronologiques. Il y a des tonnes d'autres façons de rechercher la saisonnalité, mais je pense que prophet
est le plus facile à utiliser sans peaufiner. Je recommande de lire documentation de Facebook.
D'abord, créons un échantillon de vos données.
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)))
Augmente le trafic du site pendant l'été.
library(lubridate)
website <-
mutate(website, ifelse(month(date) %in% c(6, 7, 8), visits + 10, visits))
Maintenant pour les calculs prophet
!
library(prophet)
website <- website %>%
rename(ds = date, y = visits)
m <- prophet(website)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)
Visualisez les résultats.
plot(m, forecast)
Il ressemble vraiment à il y a plus de trafic en été, mais il est difficile d'être certain. Heureusement, prophet
a une fonction pour examiner la saisonnalité quotidienne et hebdomadaire.
prophet_plot_components(m, forecast)
Voir cette augmentation dans le tableau "annuel"? Vous avez certainement plus de trafic de site Web en été que le reste de l'année!
Mise à jour
En réponse aux commentaires, voici un moyen rapide et facile à tester une saisonnalité mensuelle dans chaque site Web. Il applique un test anova
à chaque groupe. Cet exemple donne un effet saisonnier au site Web B, que vous pouvez voir dans les colonnes statistic
et p.value
.
d'abord créer les données de démonstration ...
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))
maintenant utiliser les merveilles du tidyverse
pour exécuter le test dans chaque groupe ...
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
Notez que ce n'est pas l'idéal méthode pour effectuer l'analyse des séries temporelles, mais il répond à la question spécifique que vous posez.
Peut-être voir la meilleure réponse ici: https://stats.stackexchange.com/questions/57705/identify-seasonality-in-time-series-data – Florian
Découvrez la fonction stl(). – Odysseus210
https://cran.r-project.org/view=TimeSeries – ulfelder