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.

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"))

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_capacite

Comparez 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.

Assistant IA Ouvrir le GPT du cours