Une grille de neurones qui se déforme pour épouser les données : chaque client est rangé dans une case, et des clients qui se ressemblent tombent dans des cases voisines. On obtient une carte de la base, sur laquelle on colore ensuite un indicateur métier comme le churn ou le chiffre d'affaires.
Un plan de salle où chaque invité doit s'asseoir près de ceux qui lui ressemblent. Au début, les places sont attribuées au hasard, puis on réajuste la salle entière jusqu'à ce que les voisins de table se ressemblent.
Chaque case de la grille, par exemple 6 x 6, porte un profil type : une valeur par variable. Au départ, ces profils sont tirés au hasard ou le long des axes d'une ACP.
On présente les clients un par un. La case dont le profil est le plus proche gagne et se rapproche du client. Ses voisines sur la grille bougent aussi, un peu moins. C'est ce voisinage qui ordonne la carte.
Au fil de l'entraînement, le rayon d'influence et la vitesse d'ajustement diminuent. La carte se fige : chaque client est rangé dans sa case, et des cases proches décrivent des clients proches.
Ancienneté, appels au support, montant mensuel, incidents des 3 derniers mois, type de contrat. La colonne churn n'est pas donnée à la carte : elle sert seulement à la lire ensuite.
Chaque case regroupe quelques dizaines d'abonnés au profil proche. En colorant les cases par leur taux de churn, on voit apparaître des zones à risque, par exemple des abonnés récents qui appellent souvent le support, et on peut nommer chaque région de la carte avec les équipes métier.
L'erreur de quantification mesure la distance moyenne entre un client et le profil de sa case. L'erreur topographique mesure la part des clients dont les deux cases les plus proches ne sont pas voisines : si elle est élevée, la carte est mal dépliée. Ensuite, le vrai test est métier : des zones qui ont du sens et des écarts nets de churn entre zones.
Noms donnés pour R (kohonen) et Python (MiniSom). Les variables sont standardisées au préalable.
Taille de la grille. La règle empirique de Vesanto propose environ 5 x racine du nombre de lignes cases au total, souvent trop pour une lecture métier. Ici 36 cases pour 3 000 clients, soit plus de 80 clients par case en moyenne.
Grille hexagonale ou rectangulaire. L'hexagonale donne six voisins équidistants et des cartes plus lisibles. Elle n'est pas le défaut (rectangulaire dans kohonen comme dans MiniSom) : il faut la demander.
Rayon du voisinage au départ. Trop petit, la carte ne s'ordonne pas et ressemble à un K-means. Trop grand, tout se moyenne. kohonen le fait décroître automatiquement ; dans MiniSom, sigma est le rayon de départ.
Durée d'entraînement. En R, rlen compte les passages sur toute la base ; en Python, num_iteration compte les clients présentés. On vérifie que l'erreur de quantification se stabilise.
# Carte de la base abonnés : carte de Kohonen (SOM) en R
library(kohonen)
clients <- read.csv("clients_churn.csv")
X <- cbind(clients[, c("anciennete", "appels_support", "montant", "incidents_3m")],
mensuel = as.numeric(clients$contrat == "mensuel"),
deux_ans = as.numeric(clients$contrat == "deux_ans"))
X <- scale(X) # même échelle pour toutes les variables
set.seed(42)
carte <- som(X, grid = somgrid(xdim = 6, ydim = 6, topo = "hexagonal"), rlen = 200)
# Le churn n'a pas servi à construire la carte : on le projette dessus après coup
clients$neurone <- carte$unit.classif
profil <- aggregate(cbind(churn, anciennete, appels_support) ~ neurone, data = clients, FUN = mean)
profil$clients <- as.vector(table(clients$neurone))
print(round(head(profil[order(-profil$churn), ], 6), 2))
# Carte colorée par taux de churn (neurones vides sans couleur)
taux <- tapply(clients$churn, factor(clients$neurone, levels = 1:36), mean)
plot(carte, type = "property", property = taux, main = "Taux de churn par neurone")
# Carte de la base abonnés : carte de Kohonen (SOM) en Python
import pandas as pd
from minisom import MiniSom
clients = pd.read_csv("clients_churn.csv")
X = pd.get_dummies(clients[["anciennete", "appels_support", "montant", "incidents_3m", "contrat"]], dtype=float)
X = ((X - X.mean()) / X.std()).values # même échelle pour toutes les variables
# Grille de 6 x 6 neurones ; sigma : rayon du voisinage au départ
som = MiniSom(6, 6, X.shape[1], sigma=1.5, learning_rate=0.5, random_seed=42)
som.pca_weights_init(X)
som.train(X, 20000, random_order=True)
print("Erreur de quantification :", round(som.quantization_error(X), 3))
print("Erreur topographique :", round(som.topographic_error(X), 3))
# Chaque client est rangé dans son neurone le plus proche
clients["neurone"] = [f"{i}-{j}" for i, j in (som.winner(x) for x in X)]
# Le churn n'a pas servi à construire la carte : on le projette dessus après coup
carte = clients.groupby("neurone").agg(clients=("churn", "size"), taux_churn=("churn", "mean"),
anciennete=("anciennete", "mean"), appels=("appels_support", "mean"))
print(carte.sort_values("taux_churn", ascending=False).head(6).round(2))
C'est la traduction de Self-Organizing Map (SOM), le réseau de neurones proposé par Teuvo Kohonen au début des années 1980. Elle est dite auto-organisatrice parce qu'aucune étiquette n'est fournie : la grille s'ordonne seule, de sorte que des cases voisines décrivent des données proches.
Les deux cherchent des profils types. Dans un K-means, les groupes n'ont aucun lien entre eux. Dans une carte de Kohonen, chaque profil est tiré vers ses voisins sur la grille pendant l'entraînement, ce qui donne une carte ordonnée que l'on peut lire et colorer. Avec un voisinage réduit à zéro, l'algorithme se comporte comme un K-means en ligne.
La règle empirique de Vesanto propose environ 5 x racine du nombre de lignes cases au total, puis on ajuste. Il faut assez de cases pour voir des nuances, et assez de clients par case pour que les taux calculés, comme un taux de churn, soient fiables. Une case de 5 clients ne permet pas de conclure.
Même idée de profils types, mais sans lien entre les groupes. Plus simple quand on veut seulement quelques segments.
Voir la fiche → la carte moderneProjette chaque client en 2D en gardant les voisinages. Plus fidèle sur des données complexes, mais sans cases à nommer.
Voir la fiche → l'étape suivanteSouvent appliquée aux profils des cases pour les regrouper en quelques grandes régions de la carte.
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