library(tidyverse)
data_path <- if (file.exists("../atelier-04-recapitulation/data/cas_integrateur_quebec.csv")) {
"../atelier-04-recapitulation/data/cas_integrateur_quebec.csv"
} else {
"modules/atelier-04-recapitulation/data/cas_integrateur_quebec.csv"
}
service <- read_csv(
data_path,
show_col_types = FALSE
) |>
mutate(
date = as.Date(date),
succursale = factor(succursale),
cible = service_insuffisant_mois_suivant
) |>
arrange(date, succursale)
entrainement <- service |>
filter(date < as.Date("2025-01-01"))
test <- service |>
filter(date >= as.Date("2025-01-01"))Exercices - Module 10
Préparation
Les capsules classent des clients selon leur risque de départ. Le cas de transfert classe plutôt des mois de succursale selon le risque de service insuffisant le mois suivant.
Jeu de données de transfert : cas_integrateur_quebec.csv.
Exercice 1 - Définir le problème
Définissez précisément :
- l’unité d’observation;
- la classe positive;
- la date à laquelle les variables explicatives sont mesurées;
- l’horizon de la cible;
- le coût opérationnel d’un faux négatif;
- le coût d’un faux positif.
Expliquez pourquoi l’intitulé « succursale à risque » serait trop vague.
Exercice 2 - Probabilités et coefficients
Ajustez une régression logistique avec des mesures du mois courant, puis comparez deux profils qui diffèrent seulement par le nombre de ruptures de stock.
modele_service <- glm(
cible ~ taux_utilisation + ruptures_stock + temps_attente + satisfaction,
data = entrainement,
family = binomial()
)
profils <- tibble(
taux_utilisation = c(0.90, 0.90),
ruptures_stock = c(0, 5),
temps_attente = c(5, 5),
satisfaction = c(7, 7)
)
profils |>
mutate(
probabilite_predite = predict(
modele_service,
newdata = profils,
type = "response"
)
)Interprétez la différence comme une comparaison conditionnelle au modèle, sans la présenter comme une certitude individuelle ni comme un effet causal.
Exercice 3 - Deux seuils
Comparez les seuils 0,25 et 0,50 sur l’année 2025.
mesures_seuil <- function(observe, probabilite, seuil) {
predit <- if_else(probabilite >= seuil, 1, 0)
vp <- sum(observe == 1 & predit == 1)
vn <- sum(observe == 0 & predit == 0)
fp <- sum(observe == 0 & predit == 1)
fn <- sum(observe == 1 & predit == 0)
tibble(
seuil = seuil,
sensibilite = vp / (vp + fn),
specificite = vn / (vn + fp),
precision = vp / (vp + fp),
proportion_ciblee = mean(predit == 1),
faux_negatifs = fn,
faux_positifs = fp
)
}
evaluation <- test |>
mutate(
probabilite = predict(
modele_service,
newdata = test,
type = "response"
)
)
bind_rows(
mesures_seuil(evaluation$cible, evaluation$probabilite, 0.25),
mesures_seuil(evaluation$cible, evaluation$probabilite, 0.50)
)Choisissez un seuil lorsque manquer un mois de service insuffisant coûte quatre fois plus cher qu’une intervention inutile.
Exercice 4 - Règle de capacité
L’équipe peut intervenir dans deux succursales par mois. Construisez une règle qui retient les deux probabilités les plus élevées à chaque date.
ciblage_capacite <- evaluation |>
group_by(date) |>
slice_max(probabilite, n = 2, with_ties = FALSE) |>
ungroup() |>
select(date, succursale, probabilite, cible)
ciblage_capaciteComparez cette règle au seuil choisi dans l’exercice 3. Vérifiez si une succursale est systématiquement priorisée et proposez une surveillance de cette concentration.
Exercice de synthèse
Rédigez une recommandation de huit lignes maximum. Elle doit nommer la cible et l’horizon, choisir entre seuil et capacité, rapporter les deux types d’erreur, indiquer le coût prioritaire et prévoir une vérification de stabilité entre les succursales.