Un arbre de décision qui choisit ses découpages par des tests du khi-deux et peut ouvrir plusieurs branches d'un coup : moins de 35 ans, 35-49 ans, 50 ans et plus. Né en 1980, il reste l'outil de segmentation des études marketing, parce que chaque segment est statistiquement justifié et se lit comme un tableau croisé.
Un chargé d'études qui croise la variable à expliquer avec chaque critère, garde le tableau croisé le plus significatif, puis recommence dans chaque case.
Pour chaque variable, les classes dont le taux d'achat ne diffère pas significativement (test du khi-deux) sont regroupées. Pour une variable ordonnée comme l'âge, seules des classes voisines peuvent l'être.
La variable dont le test du khi-deux donne la plus petite p-valeur, corrigée du nombre de regroupements testés (correction de Bonferroni), crée le découpage. Une branche par groupe de classes restant.
L'arbre s'arrête quand plus aucun découpage n'est significatif ou que les segments deviennent trop petits. Il n'y a pas d'élagage a posteriori.
Âge, ancienneté, panier moyen, nombre de visites sur 30 jours, tous découpés en 4 classes. Et la réponse : le client a-t-il acheté après la campagne ?
Chaque feuille est un segment avec son taux d'achat. Sur le jeu d'exemple, l'âge est la variable la plus liée à l'achat : environ 17 % d'acheteurs chez les moins de 35 ans, contre 11 à 12 % au-delà.
On juge un arbre CHAID à l'utilité de ses segments : assez gros pour être ciblés, assez différents pour justifier des messages différents. La performance prédictive globale passe au second plan.
Noms donnés pour R (package CHAID). En Python, le package CHAID reprend les mêmes idées avec d'autres noms.
Seuil du test qui décide si deux classes se fusionnent. Plus il est bas, plus les classes sont regroupées et moins l'arbre a de branches.
Seuil de significativité pour accepter un découpage. À 0,05 par défaut ; le baisser donne un arbre plus prudent.
Taille minimale d'un segment. Fixez-la selon ce qui est actionnable : un segment de 30 clients ne justifie pas une campagne.
CHAID ne travaille que sur des classes. Le choix des tranches (quartiles, seuils métier) conditionne le résultat autant que les paramètres.
# Profils acheteurs d'une campagne : CHAID en R
# CHAID n'est pas sur le CRAN : install.packages("CHAID", repos = "http://R-Forge.R-project.org")
library(CHAID)
campagne <- read.csv("campagne_marketing.csv")
cibles <- campagne[campagne$groupe == "cible", ]
# CHAID ne prend que des facteurs : on découpe les variables numériques en classes
# (facteurs ordonnés : seules des classes voisines peuvent être fusionnées)
d <- data.frame(
achat = factor(cibles$achat, levels = c(0, 1), labels = c("non", "oui")),
age = cut(cibles$age, c(0, 35, 50, 65, 120), right = FALSE, ordered_result = TRUE),
anciennete = cut(cibles$anciennete_mois, c(0, 12, 36, 72, 200), right = FALSE, ordered_result = TRUE),
panier = cut(cibles$panier_moyen, quantile(cibles$panier_moyen, 0:4 / 4), include.lowest = TRUE, ordered_result = TRUE),
visites = cut(cibles$visites_30j, c(-1, 1, 3, 5, 20), ordered_result = TRUE)
)
# Seuils des tests du khi-deux et taille minimale des segments
modele <- chaid(achat ~ age + anciennete + panier + visites, data = d,
control = chaid_control(alpha2 = 0.05, alpha4 = 0.05, minbucket = 100, maxheight = 2))
print(modele)
# Contrôle : taux d'achat par tranche d'âge
print(round(prop.table(table(d$age, d$achat), 1), 3))
# Profils acheteurs d'une campagne : CHAID en Python
import pandas as pd
from CHAID import Tree # pip install CHAID
campagne = pd.read_csv("campagne_marketing.csv")
cibles = campagne[campagne["groupe"] == "cible"].copy()
# CHAID travaille sur des classes : on découpe les variables numériques
# age : 0 = moins de 35 ans, 1 = 35-49, 2 = 50-64, 3 = 65 ans et plus
cibles["age"] = pd.cut(cibles["age"], [0, 35, 50, 65, 120], right=False, labels=False)
cibles["anciennete"] = pd.cut(cibles["anciennete_mois"], [0, 12, 36, 72, 200], right=False, labels=False)
cibles["panier"] = pd.qcut(cibles["panier_moyen"], 4, labels=False)
cibles["visites"] = pd.cut(cibles["visites_30j"], [-1, 1, 3, 5, 20], labels=False)
# Variables ordinales : seules des classes voisines peuvent être fusionnées
types = {v: "ordinal" for v in ["age", "anciennete", "panier", "visites"]}
arbre = Tree.from_pandas_df(cibles, types, "achat", alpha_merge=0.05,
max_depth=2, min_child_node_size=100)
arbre.print_tree()
# Contrôle : taux d'achat par tranche d'âge
print(cibles.groupby("age")["achat"].mean().round(3))
CHAID choisit ses découpages par des tests du khi-deux, ouvre plusieurs branches à la fois et s'arrête dès qu'aucun découpage n'est significatif. CART découpe toujours en deux, optimise un critère de pureté et élague par validation croisée. CHAID décrit des segments, CART prédit mieux.
Chi-squared Automatic Interaction Detection : détection automatique d'interactions par le khi-deux. La méthode a été publiée par Gordon Kass en 1980. Elle est diffusée depuis longtemps dans SPSS, d'où sa popularité dans les instituts d'études.
Pas directement : il faut les découper en classes, par quantiles ou seuils métier. Certains logiciels le font automatiquement. Pour la variable à expliquer, une version de CHAID accepte une cible continue avec un test F à la place du khi-deux.
Découpages binaires sur des seuils fins, élagage par validation croisée. Meilleur pour prédire.
Voir la fiche → l'autre arbre multi-branchesChoisit ses découpages au gain d'information et livre des règles si / alors.
Voir la fiche → pour mesurer l'effetCompare ciblés et témoins pour trouver les clients que la campagne fait vraiment changer d'avis.
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