Un outil de prévision publié en open source par Meta (ex-Facebook), conçu pour produire rapidement des prévisions correctes sans être spécialiste. Il additionne une tendance qui peut changer de pente, des saisonnalités et des effets de jours fériés ou d'événements. Ses composantes se lisent directement, ce qui en fait un bon outil pour dialoguer avec les métiers.
Une prévision en pièces détachées : une ligne de tendance qui peut s'infléchir, à laquelle on ajoute le profil de l'année, puis les bosses des fêtes et des événements connus. Chaque pièce se montre séparément à un comité.
La tendance est une suite de segments. Le modèle place des points de rupture possibles dans l'historique et ne garde que les changements de pente utiles.
Annuelle, hebdomadaire, journalière : chacune est une courbe lisse (une somme de sinusoïdes) ajoutée à la tendance.
Jours fériés, soldes, lancements : chacun reçoit un effet propre, estimé sur les années passées et reporté sur les dates futures. On additionne le tout, avec une fourchette d'incertitude.
Une série de janvier 2017 à décembre 2025, avec une tendance à la hausse et un cycle annuel. Deux colonnes suffisent : la date (ds) et la valeur (y).
Pour chaque mois de 2025, Prophet donne la prévision, un intervalle à 80 % et sa décomposition : part de la tendance, part de la saison annuelle. Le contrôle de gestion voit d'où vient chaque chiffre.
On apprend jusqu'à fin 2024 et on prévoit 2025, puis on compare à la répétition des ventes de 2024. Sur une série mensuelle aussi régulière, le naïf saisonnier est une référence exigeante : Prophet n'est utile que s'il la bat.
Noms donnés en Python ; en R, les tirets bas deviennent des points (changepoint.prior.scale, yearly.seasonality).
La souplesse de la tendance, 0,05 par défaut. Plus haut, la tendance suit chaque inflexion et risque de sur-réagir ; plus bas, elle devient rigide. C'est le réglage qui a le plus d'effet.
À activer selon la fréquence des données. Sur des données mensuelles, seule la saison annuelle a un sens. seasonality_mode="multiplicative" quand l'amplitude grandit avec le niveau.
add_country_holidays(country_name="FR") ajoute les jours fériés français sur des données journalières. On peut aussi fournir sa propre table d'événements (soldes, promotions).
Ajoute une variable connue à l'avance (prix, promotion, météo prévue). Il faut fournir ses valeurs futures dans le tableau de prévision.
# Prévision des ventes : Prophet en R
library(prophet)
ventes <- read.csv("ventes_mensuelles.csv")
df <- data.frame(ds = as.Date(ventes$mois), y = ventes$ventes) # colonnes ds et y obligatoires
# Les 12 derniers mois (2025) servent de test
train <- head(df, -12)
test <- tail(df, 12)
modele <- prophet(train, yearly.seasonality = TRUE, weekly.seasonality = FALSE,
daily.seasonality = FALSE)
# Prévision mensuelle sur 12 mois
futur <- make_future_dataframe(modele, periods = 12, freq = "month")
prev <- tail(predict(modele, futur), 12)
mape <- function(reel, prevu) round(mean(abs(reel - prevu) / reel) * 100, 1)
cat("MAPE 2025 Prophet :", mape(test$y, prev$yhat), "%\n")
cat("MAPE 2025 naïf saisonnier :", mape(test$y, tail(train$y, 12)), "%\n")
# Décomposition : tendance + saison annuelle, avec intervalle à 80 %
print(prev[, c("ds", "yhat", "yhat_lower", "yhat_upper", "trend", "yearly")])
# Prévision des ventes : Prophet en Python
import numpy as np
import pandas as pd
from prophet import Prophet
ventes = pd.read_csv("ventes_mensuelles.csv", parse_dates=["mois"])
df = ventes.rename(columns={"mois": "ds", "ventes": "y"}) # colonnes ds et y obligatoires
# Les 12 derniers mois (2025) servent de test
train, test = df.iloc[:-12], df.iloc[-12:]
modele = Prophet(yearly_seasonality=True, weekly_seasonality=False, daily_seasonality=False)
modele.fit(train)
# Prévision mensuelle sur 12 mois (freq="MS" : dates au 1er du mois, comme les données)
futur = modele.make_future_dataframe(periods=12, freq="MS")
prev = modele.predict(futur).tail(12)
mape = lambda reel, prevu: round(float(np.mean(np.abs(reel - prevu) / reel) * 100), 1)
print("MAPE 2025 Prophet :", mape(test["y"].values, prev["yhat"].values), "%")
print("MAPE 2025 naïf saisonnier :", mape(test["y"].values, train["y"].values[-12:]), "%")
# Décomposition : tendance + saison annuelle, avec intervalle à 80 %
print(prev[["ds", "yhat", "yhat_lower", "yhat_upper", "trend", "yearly"]].round(0).to_string(index=False))
Pas en général. Des comparaisons publiées montrent qu'un ARIMA ou un lissage exponentiel bien réglés font souvent aussi bien ou mieux sur des séries régulières. L'intérêt de Prophet est sa simplicité, sa gestion des jours fériés et des saisons multiples, et la lisibilité de sa décomposition.
Oui, en désactivant les saisonnalités hebdomadaire et journalière et en prévoyant avec une fréquence mensuelle (freq="MS" en Python, freq = "month" en R). Les jours fériés sont en revanche peu utiles à ce grain.
En Python, modele.add_country_holidays(country_name="FR") avant l'entraînement ; en R, add_country_holidays(m, country_name = "FR") sur un modèle créé sans données, puis fit.prophet. Chaque jour férié reçoit alors son propre effet.
Modélise finement l'autocorrélation. Plus exigeant à régler, mais difficile à battre sur une série mensuelle régulière.
Voir la fiche → le standard supply chainNiveau, tendance et saison mis à jour à chaque période. Très rapide sur des milliers de références.
Voir la fiche → l'équivalent statistiqueSaisons et variables externes dans un cadre ARIMA. Plus rigoureux sur l'incertitude, moins simple à lancer.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus