Un lissage exponentiel qui suit trois choses à la fois : le niveau des ventes, leur tendance et leur profil saisonnier. Chaque composante se met à jour à chaque nouvelle période, avec son propre coefficient. Simple à expliquer, rapide sur des milliers de références, c'est un standard des outils de prévision en supply chain.
Un acheteur expérimenté prévoit décembre ainsi : le niveau actuel des ventes, plus la hausse habituelle d'un mois sur l'autre, plus le surplus propre à décembre. Et il ajuste un peu chacun des trois à chaque mois écoulé.
Comme un lissage exponentiel simple, corrigé de l'effet saisonnier. Coefficient alpha.
La pente, lissée elle aussi : de combien le niveau monte ou baisse par période. Coefficient beta.
Un indice par mois, mis à jour chaque fois que ce mois revient. Coefficient gamma. La prévision assemble les trois : niveau + tendance × horizon + saison du mois visé.
Une série de janvier 2017 à décembre 2025, avec une hausse régulière, un cycle annuel et un pic de décembre. Elle alimente le plan d'approvisionnement à 12 mois.
Le modèle donne les 12 prochains mois et trois coefficients. Un alpha faible signifie un niveau stable, un gamma faible un profil saisonnier qui change peu d'une année à l'autre. Ces chiffres se discutent avec les équipes supply, contrairement aux ordres d'un ARIMA.
On apprend jusqu'à fin 2024 et on prévoit 2025. On compare les versions additive et multiplicative, et la référence « même mois l'an dernier ». La version retenue doit battre cette référence, sinon elle n'apporte rien au plan.
Les coefficients de lissage s'estiment seuls ; les choix de structure sont à faire. Noms donnés pour R (HoltWinters, ou hw dans forecast) et Python (statsmodels).
Additive si l'écart saisonnier reste à peu près le même en unités quand les ventes montent. Multiplicative s'il grossit avec le niveau (décembre toujours 20 % au-dessus). On compare les deux sur une période de test.
Les trois coefficients entre 0 et 1, estimés en minimisant l'erreur passée. On les regarde pour vérifier la cohérence : un coefficient proche de 1 signale une composante instable.
Fait décroître la tendance avec l'horizon au lieu de la prolonger indéfiniment. Souvent plus prudent au-delà de quelques mois (hw(damped = TRUE) dans forecast en R, damped_trend=True en Python).
La longueur du cycle : 12 pour des données mensuelles, 52 pour des données hebdomadaires. En R, elle se déclare dans ts(frequency = 12).
# Plan d'approvisionnement : Holt-Winters en R
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))
mape <- function(reel, prevu) mean(abs(as.numeric(reel) - as.numeric(prevu)) / as.numeric(reel)) * 100
# Saison additive (écart fixe), puis multiplicative (écart proportionnel au niveau)
for (saison in c("additive", "multiplicative")) {
modele <- HoltWinters(train, seasonal = saison)
cat("Saison", saison, "| MAPE 2025 :", round(mape(test, predict(modele, n.ahead = 12)), 1), "%\n")
}
cat("Naïf saisonnier | MAPE 2025 :", round(mape(test, window(train, start = c(2024, 1))), 1), "%\n")
# Modèle final : les trois coefficients de lissage (niveau, tendance, saison)
final <- HoltWinters(serie, seasonal = "additive")
print(round(c(alpha = unname(final$alpha), beta = unname(final$beta), gamma = unname(final$gamma)), 3))
# Les 12 prochains mois, avec intervalle de prévision à 95 %
print(round(predict(final, n.ahead = 12, prediction.interval = TRUE)))
# Plan d'approvisionnement : Holt-Winters en Python
import numpy as np
import pandas as pd
from statsmodels.tsa.holtwinters import ExponentialSmoothing
ventes = pd.read_csv("ventes_mensuelles.csv", parse_dates=["mois"], index_col="mois")["ventes"].asfreq("MS")
# Les 12 derniers mois (2025) servent de test
train, test = ventes.iloc[:-12], ventes.iloc[-12:]
mape = lambda reel, prevu: np.mean(np.abs(reel - prevu) / reel) * 100
# Saison additive (écart fixe), puis multiplicative (écart proportionnel au niveau)
for saison in ["add", "mul"]:
modele = ExponentialSmoothing(train, trend="add", seasonal=saison, seasonal_periods=12).fit()
print("Saison", saison, "| MAPE 2025 :", round(mape(test.values, modele.forecast(12).values), 1), "%")
print("Naïf saisonnier | MAPE 2025 :", round(mape(test.values, train.iloc[-12:].values), 1), "%")
# Modèle final : les trois coefficients de lissage (niveau, tendance, saison)
final = ExponentialSmoothing(ventes, trend="add", seasonal="add", seasonal_periods=12).fit()
print({p: round(final.params[p], 3) for p in ["smoothing_level", "smoothing_trend", "smoothing_seasonal"]})
# Les 12 prochains mois
print(final.forecast(12).round(0))
On trace la série : si l'amplitude du cycle saisonnier reste stable quand le niveau augmente, on choisit l'additif ; si elle grandit avec le niveau, le multiplicatif. En cas de doute, on compare les deux sur une période de test.
La méthode de Holt est un lissage exponentiel avec tendance, sans saison. Holt-Winters ajoute une composante saisonnière. On parle aussi de lissage exponentiel double et triple.
Sur des séries mensuelles régulières, les deux donnent souvent des précisions proches. Holt-Winters est plus simple à expliquer et à industrialiser sur des milliers de références. ARIMA est plus souple quand la série a une structure d'autocorrélation particulière. Le mieux est de comparer les deux sur la même période de test.
Modélise la série par ses propres valeurs et erreurs passées. Précision souvent comparable, moins intuitif à expliquer.
Voir la fiche → pour les calendriers complexesGère jours fériés, saisonnalités multiples et ruptures de tendance. Plus simple à enrichir, parfois moins précis.
Voir la fiche → la version simpleSuit uniquement un niveau. Le point de départ quand la série n'a ni tendance ni saison.
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