La courbe de survie de base : quelle part des clients est encore là après 6, 12 ou 24 mois. Elle tient compte des clients arrivés récemment, qu'on n'a pas encore pu suivre longtemps. C'est le premier graphique à tracer sur une question de rétention, avant tout modèle.
Une course de fond où des coureurs rejoignent le départ à des moments différents. À chaque abandon, on calcule la part des coureurs encore en course parmi ceux qui étaient là, et on enchaîne ces fractions.
Pour chaque client : durée d'observation et statut, parti ou encore présent. Les présents sont « censurés ».
À chaque mois où des clients partent, on divise le nombre de départs par le nombre de clients encore présents à ce moment-là.
La part de clients restants à 12 mois est le produit des parts restantes mois après mois. Un client censuré compte tant qu'il est observé, puis sort du calcul sans être compté comme départ.
Pour chaque client : ancienneté en mois, départ ou non, et type de contrat (mensuel, annuel, deux ans). Aucune autre variable n'est nécessaire.
Sur le jeu d'exemple, 94 % des clients sont encore là à 12 mois et 90 % à 24 mois. À 24 mois, 86 % des clients mensuels restent, contre 93 % des annuels et 95 % des contrats deux ans.
On lit la survie à des horizons métier (12, 24 mois) avec leur intervalle de confiance. Le test du log-rank dit si les courbes des contrats diffèrent plus que ne le voudrait le hasard. Les derniers mois, où il reste peu de clients, se lisent avec prudence.
Aucun hyperparamètre, mais trois décisions qui changent la courbe. Noms donnés pour R (survival) et Python (lifelines).
Qu'est-ce qu'un départ : résiliation, non-renouvellement, inactivité de 90 jours ? Deux définitions donnent deux courbes différentes. À fixer avec le métier.
La date de souscription pour une rétention, la mise en service pour une machine. Mélanger des origines différentes rend la courbe illisible.
Les horizons de lecture. On choisit des dates qui parlent au métier (fin de période d'engagement, 12 mois) plutôt que la médiane, parfois jamais atteinte.
# Rétention client par type de contrat : Kaplan-Meier en R
library(survival)
clients <- read.csv("clients_churn.csv")
# Durée = ancienneté en mois, événement = départ ; les clients encore là sont « censurés »
km <- survfit(Surv(anciennete, churn) ~ contrat, data = clients)
# Part de clients encore présents à 12 et 24 mois, avec intervalle à 95 %
print(summary(km, times = c(12, 24)))
# Courbes de survie par contrat
plot(km, col = c("black", "darkcyan", "orange"), xlab = "Ancienneté (mois)",
ylab = "Part de clients restants", ylim = c(0.5, 1))
legend("bottomleft", legend = levels(factor(clients$contrat)),
col = c("black", "darkcyan", "orange"), lty = 1)
# Test du log-rank : les courbes diffèrent-elles vraiment ?
print(survdiff(Surv(anciennete, churn) ~ contrat, data = clients))
# Rétention client par type de contrat : Kaplan-Meier en Python
import pandas as pd
from lifelines import KaplanMeierFitter
from lifelines.statistics import multivariate_logrank_test
clients = pd.read_csv("clients_churn.csv")
# Durée = ancienneté en mois, événement = départ ; les clients encore là sont « censurés »
kmf = KaplanMeierFitter()
kmf.fit(clients["anciennete"], event_observed=clients["churn"], label="tous")
print("Tous les clients :", kmf.survival_function_at_times([12, 24]).round(3).tolist())
# Une courbe par type de contrat
for contrat, groupe in clients.groupby("contrat"):
kmf.fit(groupe["anciennete"], event_observed=groupe["churn"], label=contrat)
print(contrat, ":", kmf.survival_function_at_times([12, 24]).round(3).tolist())
# kmf.plot_survival_function() pour tracer la courbe
# Test du log-rank : les courbes diffèrent-elles vraiment ?
test = multivariate_logrank_test(clients["anciennete"], clients["contrat"], clients["churn"])
print("Test du log-rank, p-value :", test.p_value)
Parce que les clients récents n'ont pas encore eu le temps de partir. Un taux brut à 24 mois ignorerait tous les clients de moins de 24 mois, ou les compterait à tort comme restés. Kaplan-Meier utilise chaque client tant qu'il est observé, ce qui donne une estimation non biaisée.
L'axe horizontal donne le temps, l'axe vertical la part d'individus sans événement. Chaque marche vers le bas correspond à des départs. On lit la survie à un horizon donné, et on compare les courbes de plusieurs groupes : plus une courbe est haute, meilleure est la rétention.
Il teste si deux courbes de survie ou plus diffèrent significativement. Il compare, à chaque départ, le nombre de départs observés dans chaque groupe au nombre attendu si tous les groupes avaient le même risque.
Explique la survie par plusieurs variables à la fois et donne des hazard ratios.
Voir la fiche → à horizon fixePrévoit le départ à une date donnée, mais ignore les clients arrivés trop récemment.
Voir la fiche → pour les parcoursModélise le passage entre plusieurs états (actif, dormant, parti) au lieu d'un seul événement.
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