Un modèle qui décrit la base clients comme un mélange de plusieurs nuages en forme d'ellipses, chacun étant un segment. Chaque client reçoit une probabilité d'appartenance à chaque segment, au lieu d'une affectation tranchée. On repère ainsi les clients à cheval entre deux profils.
Dans une salle, on entend plusieurs conversations en même temps. Pour chaque mot, on estime de quelle table il vient le plus probablement, en tenant compte du volume et de la position de chaque table.
Chaque segment est décrit par un centre, une forme (étalement et orientation) et un poids, sa part dans la base.
Étape E de l'algorithme EM : pour chaque client, la probabilité de venir de chaque nuage, compte tenu de sa position.
Étape M : chaque ellipse est recalculée à partir des clients pondérés par leur probabilité. On alterne E et M jusqu'à stabilité. Le BIC compare ensuite les solutions à 2, 3, 4… groupes.
Panier moyen, jours depuis le dernier achat, part d'achats en promotion. Les variables de comptage (achats par mois, nombre de catégories) sont écartées : leurs valeurs plafonnées créent de faux petits groupes que le modèle prend pour des segments.
Le BIC désigne 4 segments. Chaque client reçoit sa probabilité d'appartenance : 6,4 % des clients n'atteignent 80 % pour aucun segment. Ils sont surtout à la frontière entre les fidèles à gros panier et les très gros clients.
Le BIC pénalise la complexité : on garde le nombre de groupes qui l'optimise (le plus bas dans scikit-learn, le plus haut dans mclust). Côté action, on réserve les campagnes très ciblées aux clients dont la certitude est élevée.
Noms donnés pour R (mclust) et Python (scikit-learn).
Le nombre de segments. On teste une plage (1 à 7 ici) et on garde le meilleur BIC. Attention au signe : scikit-learn cherche le BIC le plus bas, mclust le plus haut.
La forme des ellipses. "full" : chaque segment a sa forme et son orientation. "diag" : ellipses alignées sur les axes. "spherical" : des boules, proche de K-means. mclust teste 14 formes et choisit par le BIC.
EM peut s'arrêter sur une mauvaise solution. Plusieurs départs (n_init=5) limitent ce risque. mclust part d'une classification hiérarchique, ce qui rend le résultat reproductible.
# Segmentation clients avec probabilités : mélange gaussien en R
library(mclust)
clients <- read.csv("clients_segmentation.csv")
# Variables continues uniquement : les comptages créent de faux petits groupes
variables <- c("panier_moyen", "recence_jours", "part_promo")
X <- scale(clients[, variables])
# mclust teste 1 à 7 groupes et 14 formes d'ellipses ; il garde le BIC le plus haut
modele <- Mclust(X, G = 1:7)
print(summary(modele))
# Probabilité d'appartenance de chaque client à son segment
clients$segment <- modele$classification
clients$certitude <- 1 - modele$uncertainty
# Clients à cheval : aucun segment ne dépasse 80 % de probabilité
cat("Part de clients à cheval :", round(mean(clients$certitude < 0.8), 3), "\n")
print(round(aggregate(clients[, c(variables, "certitude")], by = list(segment = clients$segment), FUN = mean), 2))
# Segmentation clients avec probabilités : mélange gaussien en Python
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.mixture import GaussianMixture
clients = pd.read_csv("clients_segmentation.csv")
# Variables continues uniquement : les comptages créent de faux petits groupes
variables = ["panier_moyen", "recence_jours", "part_promo"]
X = StandardScaler().fit_transform(clients[variables])
# Choix du nombre de groupes par le BIC (plus bas = mieux dans scikit-learn)
for k in range(1, 8):
gm = GaussianMixture(n_components=k, covariance_type="full", n_init=5, random_state=42).fit(X)
print(k, "groupes, BIC :", round(gm.bic(X)))
modele = GaussianMixture(n_components=4, covariance_type="full", n_init=5, random_state=42).fit(X)
proba = modele.predict_proba(X)
clients["segment"] = proba.argmax(axis=1)
clients["certitude"] = proba.max(axis=1)
# Clients à cheval : aucun segment ne dépasse 80 % de probabilité
print("Part de clients à cheval :", round((clients["certitude"] < 0.8).mean(), 3))
print(clients.groupby("segment")[variables + ["certitude"]].mean().round(2).to_string())
K-means affecte chaque client à un seul segment et suppose des groupes ronds de taille comparable. Le mélange gaussien donne une probabilité d'appartenance à chaque segment et accepte des ellipses de formes, tailles et orientations différentes. K-means est un cas limite du mélange gaussien, avec des boules identiques et des affectations tranchées.
On ajuste le modèle pour plusieurs nombres de groupes et on compare le BIC, qui récompense l'ajustement et pénalise le nombre de paramètres. On vérifie ensuite que les segments ont un sens métier. Un BIC qui continue de s'améliorer avec de nombreux petits groupes signale souvent des valeurs plafonnées ou discrètes.
Elle mesure la certitude du classement. Un client à 99 % dans un segment peut recevoir une offre très ciblée ; un client partagé entre deux segments mérite une offre plus générale, ou une surveillance, car il est peut-être en train de changer de profil.
Chaque client dans un seul segment, groupes supposés ronds. Plus simple et plus robuste aux données imparfaites.
Voir la fiche → le moteurLa méthode d'estimation qui alterne probabilités d'appartenance et mise à jour des ellipses.
Voir la fiche → densité sans hypothèse de formeCherche les sommets de densité sans supposer d'ellipses. Plus lent, et sans probabilités d'appartenance.
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