Une régression qui ne prévoit pas la moyenne, mais un quantile : la valeur sous laquelle tombent 10 %, 50 % ou 90 % des cas. En ajustant trois quantiles, on obtient un scénario bas, un scénario médian et un scénario haut. C'est l'outil pour chiffrer un risque plutôt qu'un point.
Un business plan en trois colonnes : pessimiste, central, optimiste. Au lieu de les fixer au jugé à -20 % et +20 %, on les calcule à partir de l'historique.
Le quantile 10 % est la valeur sous laquelle tombent 10 % des magasins comparables. La médiane (50 %) coupe le groupe en deux.
Pour le quantile 10 %, une prévision trop haute coûte 9 fois plus cher qu'une prévision trop basse. Le modèle se cale donc sous la plupart des points.
On répète pour 50 % et 90 %. L'écart entre le quantile 10 % et le quantile 90 % forme une fourchette à 80 %.
Pour chaque magasin : surface, budget pub local, nombre de concurrents, type de zone et chiffre d'affaires annuel en k€. Et un projet : 1 200 m², 10 k€ de pub, 3 concurrents, en périphérie.
Sur le jeu d'exemple, le projet ressort à 577 k€ en scénario bas, 641 k€ en médian et 758 k€ en haut. C'est le scénario bas qu'on confronte au loyer et au seuil de rentabilité avant de signer.
Une fourchette 10-90 % doit contenir environ 80 % des magasins jamais vus. Ici, elle en contient 82 %, pour une largeur moyenne d'environ 180 k€. Une couverture bien plus basse signale une fourchette trop optimiste.
Noms donnés pour R (quantreg) et Python (scikit-learn).
Les quantiles à estimer. 0,1, 0,5 et 0,9 donnent une fourchette à 80 %. Plus on s'approche de 0 ou de 1, plus il faut de données.
QuantileRegressor applique par défaut une pénalité Lasso (alpha = 1). Pour une régression quantile classique, comme rq() en R, il faut alpha = 0.
Chaque quantile est estimé séparément. Sur des profils rares, le quantile 10 % peut dépasser le 50 %. On le vérifie, et on trie les prévisions si besoin.
# Fourchette de CA pour une ouverture : régression quantile en R
library(quantreg)
magasins <- read.csv("magasins.csv")
magasins$zone <- factor(magasins$zone) # référence : centre_ville
set.seed(42)
idx <- sample(nrow(magasins), round(0.7 * nrow(magasins)))
train <- magasins[idx, ]
test <- magasins[-idx, ]
# Trois quantiles d'un coup : scénario bas (10 %), médian, haut (90 %)
modele <- rq(ca_k ~ surface_m2 + budget_pub_k + nb_concurrents + zone,
tau = c(0.1, 0.5, 0.9), data = train)
print(round(coef(modele), 2))
# Projet : 1 200 m², 10 k€ de pub, 3 concurrents, en périphérie
projet <- data.frame(surface_m2 = 1200, budget_pub_k = 10, nb_concurrents = 3,
zone = factor("peripherie", levels = levels(magasins$zone)))
print(round(predict(modele, newdata = projet)))
# Contrôle : environ 80 % des magasins test doivent tomber dans la fourchette
prev <- predict(modele, newdata = test)
cat("Couverture 10-90 % :", round(mean(test$ca_k >= prev[, 1] & test$ca_k <= prev[, 3]), 2), "\n")
# Fourchette de CA pour une ouverture : régression quantile en Python
import pandas as pd
from sklearn.linear_model import QuantileRegressor
from sklearn.model_selection import train_test_split
magasins = pd.read_csv("magasins.csv")
X = pd.get_dummies(magasins[["surface_m2", "budget_pub_k", "nb_concurrents", "zone"]], drop_first=True, dtype=float)
X_train, X_test, y_train, y_test = train_test_split(X, magasins["ca_k"], test_size=0.3, random_state=42)
# Projet : 1 200 m², 10 k€ de pub, 3 concurrents, en périphérie
projet = pd.DataFrame([[1200, 10, 3, 1, 0]], columns=X.columns, dtype=float)
# Un modèle par quantile : scénario bas (10 %), médian, haut (90 %)
prev = {}
for q in [0.1, 0.5, 0.9]:
modele = QuantileRegressor(quantile=q, alpha=0, solver="highs").fit(X_train, y_train)
prev[q] = modele.predict(X_test)
print("Projet, quantile", q, ":", round(modele.predict(projet)[0]), "k€")
# Contrôle : environ 80 % des magasins test doivent tomber dans la fourchette
dedans = (y_test >= prev[0.1]) & (y_test <= prev[0.9])
print("Couverture de la fourchette 10-90 % :", round(dedans.mean(), 2))
print("Largeur moyenne de la fourchette (k€) :", round((prev[0.9] - prev[0.1]).mean(), 1))
La régression linéaire prévoit la moyenne en minimisant les erreurs au carré. La régression quantile prévoit un quantile, par exemple la médiane ou le 90e centile, en pondérant les erreurs de façon asymétrique. On peut en ajuster plusieurs pour décrire toute la fourchette.
On ajuste deux modèles, par exemple aux quantiles 10 % et 90 %. Pour un nouveau cas, les deux prévisions forment un intervalle qui doit contenir environ 80 % des valeurs réelles. On vérifie cette couverture sur des données de test.
Oui, pour les valeurs extrêmes de la cible : la médiane ne bouge pas quand un point s'éloigne beaucoup. Elle reste en revanche sensible aux points extrêmes sur les variables explicatives.
Un seul chiffre, la moyenne attendue. La régression quantile y ajoute le bas et le haut de la fourchette.
Voir la fiche → des fourchettes non linéairesAvec une perte quantile, il donne des fourchettes qui suivent seuils et interactions.
Voir la fiche → l'autre parade aux extrêmesVise toujours la moyenne, mais limite l'influence des valeurs aberrantes.
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