SARIMA ajoute à ARIMA une partie saisonnière, qui compare chaque mois au même mois des années précédentes. SARIMAX y ajoute des variables externes : météo, promotions, jours fériés, prix. On obtient une prévision qui intègre ce que l'on sait déjà du futur, et une mesure chiffrée de l'effet de chaque variable.
Prévoir les ventes de boissons de juillet : on part du juillet de l'an dernier, on ajuste avec la tendance récente, puis on corrige de ce qu'on sait déjà : juillet sera plus chaud que la normale et une promotion est prévue.
Les ordres (P,D,Q) sur une période de 12 mois : on compare chaque mois au même mois de l'année précédente, ce qui absorbe le cycle annuel.
Les ordres (p,d,q) captent ce qui reste : la dépendance d'un mois au suivant, les erreurs récentes.
Chaque variable reçoit un coefficient, comme dans une régression : tant de ventes en plus par degré, tant par mois de promotion. Pour prévoir, il faut fournir leurs valeurs futures : promotions planifiées, prévisions météo, calendrier.
Huit ans de ventes mensuelles de boissons, avec la température moyenne de chaque mois et un indicateur de promotion. Faute de jeu de données avec variables externes, le code les simule : on connaît donc les vrais effets.
Le modèle estime l'effet d'un degré et d'une promotion, qui doivent rester proches des valeurs simulées (15 et 60 unités). Sur 2025, on compare la prévision avec et sans variables externes : l'écart mesure ce que la météo et les promotions apportent.
On apprend jusqu'à fin 2024 et on prévoit 2025 en fournissant la météo et les promotions réelles. En production, on n'a que des prévisions météo : l'évaluation honnête utilise les valeurs qui étaient connues au moment de prévoir.
Noms donnés pour R (forecast) et Python (statsmodels). En R, auto.arima(xreg = ...) peut aussi choisir les ordres.
La partie non saisonnière. Des valeurs de 0 à 2 suffisent presque toujours ; d = 1 si la série a une tendance.
La partie saisonnière, avec s = 12 en mensuel. D = 1 et Q = 1 est un bon départ pour des ventes. En Python, la période s est le quatrième élément de seasonal_order.
Les variables externes, une colonne par variable. Il faut les mêmes colonnes pour la prévision (xreg dans forecast, exog dans get_forecast), sur tout l'horizon.
Ne garder que des variables disponibles au moment de prévoir, et vérifier que leur coefficient a le signe et l'ordre de grandeur attendus. Une variable qui n'est connue qu'après coup gonfle artificiellement la précision.
# Ventes de boissons : SARIMAX en R
library(forecast)
# Simulation de 8 ans de ventes mensuelles : saison, météo et promotions
set.seed(42)
mois <- seq(as.Date("2018-01-01"), by = "month", length.out = 96)
m <- as.numeric(format(mois, "%m"))
temperature <- 12 + 8 * sin(2 * pi * (m - 4) / 12) + rnorm(96, 0, 1.5) # °C moyens du mois
promo <- as.numeric(runif(96) < 0.25) # mois avec promotion
bruit <- as.numeric(arima.sim(list(ar = 0.5), n = 96, sd = 20))
ventes <- ts(500 + 15 * temperature + 60 * promo + 80 * (m == 12) + bruit, start = c(2018, 1), frequency = 12)
X <- cbind(temperature, promo)
# Apprentissage jusqu'à fin 2024, test sur 2025 (météo et promos de 2025 supposées connues)
train <- window(ventes, end = c(2024, 12))
avec <- Arima(train, order = c(1, 0, 0), seasonal = c(0, 1, 1), xreg = X[1:84, ])
sans <- Arima(train, order = c(1, 0, 0), seasonal = c(0, 1, 1))
print(round(coef(avec), 2)) # effet d'un degré et d'une promo sur les ventes
mape <- function(prevu) round(mean(abs(ventes[85:96] - prevu) / ventes[85:96]) * 100, 1)
cat("MAPE 2025 avec variables :", mape(as.numeric(forecast(avec, xreg = X[85:96, ])$mean)), "%\n")
cat("MAPE 2025 sans variables :", mape(as.numeric(forecast(sans, h = 12)$mean)), "%\n")
# Ventes de boissons : SARIMAX en Python
import numpy as np
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
# Simulation de 8 ans de ventes mensuelles : saison, météo et promotions
rng = np.random.default_rng(42)
mois = pd.date_range("2018-01-01", periods=96, freq="MS")
m = mois.month.to_numpy()
temperature = 12 + 8 * np.sin(2 * np.pi * (m - 4) / 12) + rng.normal(0, 1.5, 96) # °C moyens du mois
promo = (rng.random(96) < 0.25).astype(int) # mois avec promotion
bruit = np.zeros(96)
for t in range(1, 96):
bruit[t] = 0.5 * bruit[t - 1] + rng.normal(0, 20)
y = pd.Series(500 + 15 * temperature + 60 * promo + 80 * (m == 12) + bruit, index=mois)
X = pd.DataFrame({"temperature": temperature, "promo": promo}, index=mois)
# Apprentissage jusqu'à fin 2024, test sur 2025 (météo et promos de 2025 supposées connues)
avec = SARIMAX(y.iloc[:-12], exog=X.iloc[:-12], order=(1, 0, 0), seasonal_order=(0, 1, 1, 12)).fit(disp=False)
sans = SARIMAX(y.iloc[:-12], order=(1, 0, 0), seasonal_order=(0, 1, 1, 12)).fit(disp=False)
print(avec.params.round(2)) # effet d'un degré et d'une promo sur les ventes
reel = y.iloc[-12:].values
mape = lambda prevu: round(float(np.mean(np.abs(reel - prevu) / reel) * 100), 1)
print("MAPE 2025 avec variables :", mape(avec.get_forecast(12, exog=X.iloc[-12:]).predicted_mean.values), "%")
print("MAPE 2025 sans variables :", mape(sans.forecast(12).values), "%")
ARIMA modélise une série à partir de son passé. SARIMA ajoute une partie saisonnière qui relie chaque période à la même période du cycle précédent. SARIMAX ajoute des variables externes, dont il faut connaître les valeurs futures pour prévoir.
(p,d,q) est la partie non saisonnière : autorégression, différenciation, moyenne mobile. (P,D,Q) est la même chose à l'échelle du cycle, s étant la longueur du cycle, 12 pour des données mensuelles. Le modèle « airline » (0,1,1)(0,1,1)12 est un classique des séries mensuelles.
Oui. Le modèle a besoin de leurs valeurs sur tout l'horizon de prévision. Pour un calendrier de promotions ou de jours fériés, c'est simple. Pour la météo, on utilise des prévisions ou des normales saisonnières, ce qui ajoute de l'incertitude.
Le même modèle sans partie saisonnière explicite ni variables externes. Le point de départ pour comprendre les ordres (p,d,q).
Voir la fiche → l'alternative clé en mainTendance, saisons, jours fériés et variables externes dans un modèle additif simple à lancer. Moins fin sur l'autocorrélation.
Voir la fiche → quand les séries s'influencentPrévoit plusieurs séries ensemble quand l'influence va dans les deux sens, par exemple prix et volumes.
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