2 votes

Grandes incertitudes pour les vacances dans le modèle Prophète

Je suis en train de construire un modèle de série temporelle avec Prophet et j'obtiens un comportement bizarre avec les incertitudes autour des vacances que je ne comprends pas.

Les données proviennent de Google Trends et concernent les recherches pour le terme "fleurs".

library(dplyr)
library(gtrendsR)
library(prophet)

flowers <- gtrends("flowers")$interest_over_time

flowers <- flowers %>% select(ds = date, y = hits)

Comme vous pouvez vous y attendre, cette série chronologique présente des pics autour de deux jours importants : la Saint-Valentin et la fête des mères.

Pour prendre en compte ces jours dans mon modèle, j'ai créé un cadre de données avec les dates pertinentes pour la période d'intérêt.

holidays <- rbind(
  data.frame(
    holiday = "mothers_day",
    ds = as.Date(c(
      # Second Sunday of May.
      '2014-05-11',
      '2015-05-10',
      '2016-05-08',
      '2017-05-14',
      '2018-05-13',
      '2019-05-12',
      '2020-05-10'
    )),
    lower_window = -7,       # Extend holiday to 7 days before nominal date
    upper_window = +7,       # Extend holiday to 7 days after nominal date
    prior_scale = 1
  ),
  data.frame(
    holiday = "valentines_day",
    ds = as.Date(c(
      '2014-02-14',
      '2015-02-14',
      '2016-02-14',
      '2017-02-14',
      '2018-02-14',
      '2019-02-14',
      '2020-02-14'
    )),
    lower_window = -7,       # Extend holiday to 7 days before nominal date
    upper_window = +7,       # Extend holiday to 7 days after nominal date
    prior_scale = 1
  )
)

Comme les données de la série temporelle sont à intervalles hebdomadaires, j'ai utilisé la fonction lower_window y upper_window pour prolonger l'effet des vacances de part et d'autre de la date nominale.

Maintenant, mettez un moment en utilisant ces vacances.

flowers_prophet <- prophet(
  holidays = holidays,
  mcmc.samples = 300
)

flowers_prophet <- fit.prophet(
  flowers_prophet,
  flowers
)

Avec le modèle en main, nous pouvons faire des prédictions.

flowers_future <- make_future_dataframe(flowers_prophet,
                                        periods = 52,
                                        freq = 'week')

flowers_forecast <- predict(flowers_prophet, flowers_future)

prophet_plot_components(flowers_prophet, flowers_forecast)

Et c'est là que les choses deviennent bizarres.

Components of time series predictions

La tendance et la variation annuelle semblent parfaitement raisonnables. Les variations associées aux fêtes historiques semblent également bonnes. La fête des mères en 2020 semble parfaite. Cependant, la Saint-Valentin 2020 présente une faible valeur prédite (par rapport aux valeurs historiques) et des incertitudes extrêmement importantes.

La série chronologique actuelle semble bonne : les valeurs historiques sont bien ajustées et la prédiction pour la fête des mères 2020 semble éminemment raisonnable. Mais la valeur et les incertitudes pour la Saint-Valentin 2020 ne semblent pas correctes.

Time series prediction

Si quelqu'un peut m'aider à comprendre pourquoi les prévisions pour ces deux fêtes sont si différentes, je lui en serais extrêmement reconnaissant.

2voto

Jon Spring Points 4096

Comme la Saint-Valentin est toujours le 14, mais que les données de google trends sont tous les 7 jours, il y a un décalage dans les données historiques. En 2016, le pic a été atteint pendant la semaine appelée "2016-02-07", soit une semaine entière avant la fête, tandis que l'année suivante, la semaine de pointe a été appelée "2017-02-12", soit seulement deux jours avant.

library(lubridate)
flowers %>%  
  filter(month(date) == 2) %>%
  group_by(yr = year(date)) %>%
  arrange(-hits) %>%
  slice(1)

# A tibble: 5 x 7
# Groups:   yr [5]
  date                 hits keyword geo   gprop category    yr
  <dttm>              <int> <chr>   <chr> <chr>    <int> <dbl>
1 2015-02-08 00:00:00    87 flowers world web          0  2015
2 2016-02-07 00:00:00    79 flowers world web          0  2016
3 2017-02-12 00:00:00    88 flowers world web          0  2017
4 2018-02-11 00:00:00    91 flowers world web          0  2018
5 2019-02-10 00:00:00    89 flowers world web          0  2019

Je pense que le problème est que, dans certains cas, Prophète interprète le 14 comme étant proche du pic et parfois une semaine entière après le pic. Il voit un pic, mais son timing n'est pas aligné de manière cohérente avec la date de vacances que vous avez spécifiée. Je ne sais pas vraiment comment contourner ce problème sans supprimer manuellement l'incohérence temporelle.

Si nous décalons les jours fériés pour les aligner sur les dates auxquelles ils correspondent dans les données, nous obtenons un meilleur ajustement :

...  # using this list for valentines day dates, corresponding to peaks in data
holiday = "valentines_day",
    ds = as.Date(c(
      '2015-02-08',
      '2016-02-07',
      '2017-02-12',
      '2018-02-11',
      '2019-02-10',
      '2020-02-09'  # Corresponds to the Sunday beforehand, like prior spikes here
    ))
...

Résultant en :

trend chart

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X