Un modèle statistique qui prévoit une série à partir de son propre passé : ses valeurs récentes, sa tendance et ses erreurs de prévision récentes. Avec sa variante saisonnière SARIMA, c'est la référence pour prévoir des ventes mensuelles et fournir une fourchette autour de la prévision.
Prévoir les ventes de juillet en regardant juin, en tenant compte de la hausse habituelle d'un mois à l'autre, et en corrigeant l'erreur faite le mois dernier. Puis en vérifiant ce qui s'était passé en juillet l'an dernier.
Le I (intégré) signifie qu'on modélise les variations d'un mois à l'autre plutôt que le niveau brut. Une série qui monte devient une série stable autour d'une moyenne. Le paramètre d compte ces différenciations, souvent 1.
AR (autorégressif) : la valeur du mois dépend des p mois précédents. MA (moyenne mobile) : on corrige avec les q dernières erreurs de prévision. D'où la notation ARIMA(p,d,q).
Des ventes mensuelles ont presque toujours un cycle annuel. SARIMA ajoute un second jeu de termes (P,D,Q) calé sur 12 mois, qui compare chaque mois au même mois des années précédentes. En pratique, c'est la version qu'on utilise.
Le modèle prolonge la série et donne un intervalle de prévision, qui s'élargit avec l'horizon.
Une seule colonne de ventes, de janvier 2017 à décembre 2025. On y voit une tendance à la hausse et un cycle annuel qui se répète. Pas besoin d'autres variables.
Une prévision par mois pour 2026, et un intervalle à 80 % et 95 %. Les achats et la supply chain dimensionnent sur la prévision centrale, la finance regarde la borne basse.
On entraîne jusqu'à fin 2024 et on prévoit 2025, puis on compare au réel. La MAPE donne l'erreur moyenne en % des ventes. On compare toujours à la prévision naïve saisonnière (« même mois l'an dernier ») : si ARIMA ne fait pas mieux, on garde la plus simple.
En R, auto.arima explore les combinaisons pas à pas et garde la meilleure selon l'AICc. En Python, SARIMAX demande de fixer les ordres soi-même.
d retire la tendance, D retire la saisonnalité en comparant chaque mois au même mois de l'année précédente. d = 1 et D = 1 conviennent à la plupart des ventes mensuelles. Trop différencier ajoute du bruit.
Nombre de mois passés (p) et d'erreurs passées (q) pris en compte. Des petites valeurs, 0 à 2, suffisent presque toujours. auto.arima les choisit ; en Python, on compare quelques candidats par leur AIC.
La partie saisonnière, avec une période de 12 pour des données mensuelles. Le modèle « airline » (0,1,1)(0,1,1)[12] est un bon point de départ quand on ne sait pas quoi choisir.
# Prévision des ventes : ARIMA en R
library(forecast)
ventes <- read.csv("ventes_mensuelles.csv")
serie <- ts(ventes$ventes, start = c(2017, 1), frequency = 12)
# Les 12 derniers mois (2025) servent de test
train <- window(serie, end = c(2024, 12))
test <- window(serie, start = c(2025, 1))
# auto.arima choisit les ordres (p,d,q)(P,D,Q)[12] par critère AICc
modele <- auto.arima(train)
print(modele)
prev_test <- forecast(modele, h = 12)
# MAPE du modèle et de la référence naïve (même mois l'an dernier)
mape <- function(reel, prevu) mean(abs(reel - prevu) / reel) * 100
cat("MAPE ARIMA :", round(mape(test, prev_test$mean), 1), "%\n")
cat("MAPE naïf saisonnier :", round(mape(test, snaive(train, h = 12)$mean), 1), "%\n")
# Modèle final sur tout l'historique : 12 prochains mois, intervalles 80 % et 95 %
final <- auto.arima(serie)
print(forecast(final, h = 12))
# Prévision des ventes : ARIMA en Python
import numpy as np
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
ventes = pd.read_csv("ventes_mensuelles.csv", parse_dates=["mois"], index_col="mois")["ventes"]
ventes = ventes.asfreq("MS") # série mensuelle, datée au 1er du mois
# Les 12 derniers mois (2025) servent de test
train, test = ventes.iloc[:-12], ventes.iloc[-12:]
# SARIMA(0,1,1)(0,1,1)[12], le modèle « airline » : un classique des séries mensuelles
modele = SARIMAX(train, order=(0, 1, 1), seasonal_order=(0, 1, 1, 12)).fit(disp=False)
prev_test = modele.get_forecast(12).predicted_mean
# MAPE du modèle et de la référence naïve (même mois l'an dernier)
mape = lambda reel, prevu: np.mean(np.abs(reel - prevu) / reel) * 100
print("MAPE SARIMA :", round(mape(test.values, prev_test.values), 1), "%")
print("MAPE naïf saisonnier :", round(mape(test.values, train.iloc[-12:].values), 1), "%")
# Modèle final sur tout l'historique : 12 prochains mois, intervalle 95 %
final = SARIMAX(ventes, order=(0, 1, 1), seasonal_order=(0, 1, 1, 12)).fit(disp=False)
prev = final.get_forecast(12)
print(pd.concat([prev.predicted_mean, prev.conf_int()], axis=1).round(0))
p est le nombre de valeurs passées utilisées (partie autorégressive), d le nombre de différenciations pour retirer la tendance, q le nombre d'erreurs de prévision passées utilisées (partie moyenne mobile). ARIMA(1,1,1) regarde le mois précédent et la dernière erreur, sur la série des variations mensuelles.
SARIMA ajoute une partie saisonnière (P,D,Q) sur une période donnée, 12 pour des données mensuelles. Un ARIMA simple ne voit pas le cycle annuel et prévoit mal des ventes saisonnières. Dans la pratique, sur des ventes, on utilise presque toujours SARIMA.
ARIMA est souvent plus précis sur une série régulière avec une seule saisonnalité, et donne des intervalles de prévision fondés. Prophet est plus simple à lancer et gère mieux les jours fériés, les ruptures et les saisonnalités multiples. Le mieux est de comparer les deux sur la même période de test.
Un lissage qui gère tendance et saisonnalité. Souvent aussi précis qu'ARIMA, plus facile à expliquer et à industrialiser.
Voir la fiche → la version complèteARIMA avec saisons et variables externes : promotions, prix, météo, jours fériés.
Voir la fiche → la prévision clé en mainGère seul plusieurs saisonnalités et les jours fériés. Moins fin qu'un ARIMA bien réglé, mais très rapide à mettre en place.
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