Une méthode de prévision conçue pour les demandes intermittentes, où la plupart des périodes sont à zéro : pièces détachées, produits à rotation lente, consommables spécialisés. Plutôt que de lisser directement une série pleine de zéros, Croston lisse séparément la taille des commandes et l'intervalle entre deux commandes.
Un magasinier ne se demande pas « combien en vendrai-je cette semaine ? ». Il se demande « tous les combien on me la demande, et en quelle quantité ? ». Croston fait exactement ce calcul.
Dans la série, on isole les semaines avec demande. Pour chacune, on note la quantité et le nombre de semaines écoulées depuis la précédente.
Un lissage exponentiel sur les quantités donne la taille typique d'une commande (z). Un autre sur les intervalles donne la fréquence typique (p). Les deux ne bougent que lorsqu'une commande arrive.
La prévision par période est z / p : 4 pièces toutes les 4 semaines donnent 1 pièce par semaine. Elle sert à dimensionner le stock, pas à prédire la semaine exacte de la prochaine commande.
Une ligne par semaine et par pièce. Selon la référence, 58 à 88 % des semaines sont à zéro sur la période d'apprentissage.
On apprend sur 130 semaines et on prévoit le besoin des 26 suivantes. Sur la référence la plus intermittente, restée 18 semaines sans commande, le lissage simple s'effondre à 6 pièces pour un réel de 29 ; Croston prévoit 26. Sur une autre, les deux méthodes surestiment après une commande récente : aucune méthode ne devine l'avenir d'une série aussi irrégulière.
La MAPE divise par la demande réelle, souvent nulle : elle est inutilisable ici. On compare le besoin prévu sur l'horizon de réapprovisionnement au réel, et surtout le taux de service obtenu avec le stock de sécurité qui en découle.
Noms donnés pour R (forecast) et pour la version Python écrite à la main ; statsforecast propose aussi CrostonClassic et CrostonSBA.
Le coefficient de lissage, appliqué à la taille et à l'intervalle. 0,1 est la valeur usuelle ; au-delà de 0,2, la prévision devient nerveuse. Il est rarement utile de l'optimiser sur des séries aussi pauvres en information.
La méthode de Croston surestime légèrement la demande. La correction de Syntetos-Boylan multiplie la prévision par (1 - alpha / 2), soit 0,95 pour alpha = 0,1. C'est la version recommandée par défaut.
Semaine ou mois. Agréger au mois réduit la part de zéros et peut suffire à rendre une méthode classique utilisable. Le bon grain est celui du réapprovisionnement.
# Pièces détachées : méthode de Croston en R
library(forecast)
pieces <- read.csv("pieces_detachees.csv")
# 130 semaines pour apprendre, les 26 dernières (6 mois) pour vérifier
for (ref in unique(pieces$reference)) {
y <- pieces$quantite[pieces$reference == ref]
train <- ts(y[1:130])
test <- y[131:156]
# Croston : lisse séparément la taille des commandes et l'intervalle entre commandes
prev_croston <- croston(train, h = 26, alpha = 0.1)$mean
# Lissage exponentiel simple, pour comparer
prev_ses <- ses(train, h = 26, alpha = 0.1)$mean
cat(ref, "| semaines à zéro :", round(mean(train == 0) * 100), "%",
"| besoin sur 26 sem. Croston :", round(sum(prev_croston)),
"| lissage simple :", round(sum(prev_ses)), "| réel :", sum(test), "\n")
}
# Pièces détachées : méthode de Croston en Python
import numpy as np
import pandas as pd
pieces = pd.read_csv("pieces_detachees.csv")
def croston(demande, alpha=0.1):
# z : taille lissée des commandes ; p : intervalle lissé entre deux commandes (en semaines)
non_nuls = np.flatnonzero(demande)
z, p, q = demande[non_nuls[0]], non_nuls[0] + 1, 1
for d in demande[non_nuls[0] + 1:]:
if d > 0:
z, p, q = z + alpha * (d - z), p + alpha * (q - p), 1
else:
q += 1
return z / p # demande moyenne attendue par semaine
# 130 semaines pour apprendre, les 26 dernières (6 mois) pour vérifier
for ref, serie in pieces.groupby("reference")["quantite"]:
y = serie.to_numpy()
train, test = y[:130], y[130:]
ses = pd.Series(train).ewm(alpha=0.1, adjust=False).mean().iloc[-1] # lissage simple, pour comparer
print(ref, "| semaines à zéro :", round(np.mean(train == 0) * 100), "%",
"| besoin sur 26 sem. Croston :", round(croston(train) * 26),
"| lissage simple :", round(ses * 26), "| réel :", test.sum())
Une demande où beaucoup de périodes sont à zéro, et où les commandes arrivent de façon irrégulière en taille et en date. On la repère avec l'intervalle moyen entre deux demandes : au-delà de 1,32 période, la classification de Syntetos et Boylan la range parmi les demandes intermittentes, ou « lumpy » si les quantités varient aussi fortement.
SBA (Syntetos-Boylan Approximation) est Croston corrigé d'un biais : la prévision est multipliée par (1 - alpha / 2). Sans cette correction, Croston surestime systématiquement la demande moyenne, ce qui gonfle les stocks.
Deux colonnes de lissage exponentiel suffisent : l'une met à jour la taille moyenne quand la demande est non nulle, l'autre l'intervalle moyen. La prévision est le rapport des deux. Les semaines à zéro ne modifient rien, elles incrémentent seulement le compteur d'intervalle.
Croston en applique deux. Utilisé seul sur une série pleine de zéros, il s'effondre après un silence et s'emballe après une commande.
Voir la fiche → la référence à battreSur une demande intermittente stable, une moyenne longue fait souvent presque aussi bien. À toujours calculer.
Voir la fiche → pour expliquer la demandeModélise un nombre de pièces demandées selon des variables (parc installé, âge des machines) au lieu du seul passé.
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