# Segmentación mediante árboles de decisión: CHAID
```{r}
#| echo: false
#| message: false
#| warning: false
source("script.R")
```
## Introducción: segmentación mediante reglas, no mediante distancias
El análisis clúster construye segmentos a partir de distancias en un espacio
numérico; el análisis discriminante valida esos segmentos y construye una
función lineal de clasificación. Ambas técnicas comparten una limitación
práctica: sus resultados —centroides, coeficientes, funciones discriminantes—
son estadísticamente rigurosos, pero no siempre fáciles de comunicar a una
audiencia no técnica. Decir "el segmento 3 tiene un centroide de 1,2 en la
primera función discriminante" no es el lenguaje con el que un departamento de
marketing toma decisiones.
El **CHAID** (*Chi-squared Automatic Interaction Detection*) resuelve este
problema desde una perspectiva completamente distinta: en lugar de combinaciones
lineales de variables, produce un **árbol de decisión** que segmenta a la
muestra mediante una secuencia de reglas categóricas del tipo "si el cliente
tiene menos de 35 años y ha comprado en el último mes, entonces pertenece al
segmento de alto valor". Es, con diferencia, la técnica de segmentación más
fácil de comunicar e implementar operativamente, y por eso sigue siendo
enormemente popular en marketing directo, banca y estudios de mercado, más de
cuarenta años después de su publicación original [@Kass1980].
::: callout-tip
## Equivalencia con SPSS
CHAID tiene equivalente exacto en SPSS, donde forma parte del módulo
`Árboles de decisión` (`Analizar > Clasificar > Árbol`), junto a otros
algoritmos como CART y QUEST. En R, el paquete de referencia es `CHAID`,
construido sobre el motor de particionamiento recursivo de `partykit`, que
reproduce fielmente la lógica del algoritmo original de Kass.
:::
## La lógica del algoritmo: fusión, división y parada
A diferencia del análisis discriminante (que combina linealmente las variables
predictoras) o de la regresión logística (que estima probabilidades continuas),
CHAID es un algoritmo de **particionamiento recursivo**: en cada paso divide la
muestra en subgrupos cada vez más homogéneos respecto a la variable dependiente,
usando como criterio de división el **test chi-cuadrado** desarrollado en
capítulos anteriores. El algoritmo opera en tres fases que se repiten en cada
nodo del árbol [@Kass1980; @Ritschard2013]:
### Fase 1: fusión (*merging*)
Para cada variable predictora categórica, el algoritmo evalúa todas las
categorías y fusiona aquellas que **no difieren significativamente** entre sí
respecto a la variable dependiente. Por ejemplo, si "Soltero" y "Divorciado" no
muestran diferencias significativas en la tasa de respuesta a una campaña, se
fusionan en una única categoría antes de continuar. Este proceso se repite hasta
que todas las categorías restantes de la variable son significativamente
distintas entre sí, aplicando una corrección de Bonferroni para controlar el
problema de comparaciones múltiples.
### Fase 2: división (*splitting*)
Una vez fusionadas las categorías de cada variable predictora, el algoritmo
calcula el estadístico chi-cuadrado (ajustado por la corrección de Bonferroni de
la fase anterior) para cada predictor, y selecciona la variable con el
chi-cuadrado **más significativo** —la que mejor discrimina la variable
dependiente— como criterio para dividir el nodo actual. A diferencia de otros
algoritmos de árboles como CART, que solo permiten divisiones binarias, CHAID
permite **divisiones múltiples** (*multiway splits*): un nodo puede dividirse
directamente en tres, cuatro o más nodos hijos si así lo sugieren las categorías
fusionadas de la variable ganadora.
### Fase 3: parada (*stopping*)
El proceso de fusión y división se repite recursivamente en cada nuevo nodo
hijo, hasta que se cumple alguno de los criterios de parada: que ninguna
variable predictora restante produzca una división estadísticamente
significativa, que se alcance la profundidad máxima del árbol especificada por
el analista, o que el tamaño de un nodo caiga por debajo de un mínimo de
observaciones predefinido (necesario para que las pruebas chi-cuadrado
posteriores tengan suficiente potencia estadística).
## Una característica distintiva: predictores categóricos
A diferencia de la mayoría de las técnicas vistas en capítulos anteriores, CHAID
en su formulación original está diseñado para trabajar con **predictores
categóricos** (nominales u ordinales). Las variables cuantitativas continuas
—edad, ingresos, gasto mensual— deben **discretizarse** previamente en
categorías o intervalos antes de incluirse en el modelo, normalmente en
cuartiles, deciles, o tramos con sentido de negocio (por ejemplo, edad en
"18-25", "26-40", "41-60", "60+"). Esta necesidad de discretización es, a la
vez, una limitación y una ventaja: se pierde algo de información granular, pero
el árbol resultante es directamente interpretable como reglas de segmentación de
negocio.
## Interpretación del árbol resultante
El resultado de un CHAID es un diagrama de árbol que se lee de arriba hacia
abajo:
- El **nodo raíz** contiene a toda la muestra, con la distribución de la
variable dependiente en su estado inicial.
- Cada **división** muestra la variable seleccionada como mejor predictor en ese
punto, el valor del estadístico chi-cuadrado que justifica la división y su
significación.
- Cada **nodo terminal** (los nodos finales del árbol, sin más divisiones)
representa un segmento de la muestra definido por la secuencia completa de
reglas que lo llevaron hasta ahí, junto con la distribución de la variable
dependiente dentro de ese segmento.
La gran ventaja interpretativa de CHAID es que cada nodo terminal se traduce
directamente en una regla de negocio explícita: "los clientes con tarjeta de
fidelización y más de 3 compras en el último trimestre tienen una tasa de
respuesta del 68% a la campaña", sin necesidad de traducir coeficientes ni
puntuaciones discriminantes.
## CHAID frente a otras técnicas de segmentación
| Característica | Clúster (k-medias) | Discriminante | CHAID |
|:------------------|:-----------------------|:------------------|:-----------------|
| Naturaleza | No supervisada | Supervisada | Supervisada |
| Tipo de variables | Cuantitativas | Cuantitativas (predictoras) | Categóricas (predictoras) |
| Resultado | Centroides en el espacio | Función lineal | Reglas tipo "si... entonces..." |
| Interpretabilidad | Media (requiere perfilado) | Media (requiere interpretar coeficientes) | Alta (reglas explícitas) |
| Relaciones detectadas | — | Lineales | No lineales e interacciones |
| Uso típico | Descubrir segmentos | Validar y clasificar | Segmentar y explicar con reglas |
Una de las grandes fortalezas de CHAID frente al análisis discriminante es su
capacidad para detectar **interacciones**: el árbol puede revelar, por ejemplo,
que la edad solo predice la respuesta a una campaña *dentro* del segmento de
clientes sin tarjeta de fidelización, mientras que para los clientes con tarjeta
la edad no importa en absoluto. Estas relaciones condicionales son difíciles de
capturar con una función lineal, pero emergen de forma natural en la estructura
jerárquica de un árbol.
## Aplicación práctica: segmentación de respuesta a una campaña de marketing directo
Se desarrolla el caso de una empresa de retail que ha lanzado una campaña de
marketing directo y quiere entender qué perfiles de clientes responden mejor,
con el objetivo de optimizar el segmento objetivo de futuras campañas.
### Objetivo de la investigación
> **Objetivo**: construir un árbol de decisión CHAID que identifique los
> segmentos de clientes con mayor y menor probabilidad de respuesta a una
> campaña de marketing directo, a partir de variables demográficas y de
> comportamiento de compra, generando reglas de segmentación directamente
> accionables para el departamento de marketing.
### Preparación de los datos
Se simulan los datos de 800 clientes que recibieron la campaña, con tres
variables predictoras categóricas (edad agrupada, posesión de tarjeta de
fidelización, frecuencia de compra) y la variable dependiente binaria "respuesta
a la campaña":
```{r}
#| echo: true
#| message: false
set.seed(99)
n <- 800
campaign_data <- data.frame(
age_group = sample(c("18-25", "26-40", "41-60", "60+"), n, replace = TRUE,
prob = c(0.2, 0.35, 0.30, 0.15)),
loyalty_card = sample(c("Yes", "No"), n, replace = TRUE, prob = c(0.4, 0.6)),
purchase_freq = sample(c("Low", "Medium", "High"), n, replace = TRUE,
prob = c(0.4, 0.4, 0.2))
)
# Build response probability with a realistic interaction:
# age matters mainly for customers WITHOUT a loyalty card
campaign_data <- campaign_data |>
dplyr::mutate(
response_prob = dplyr::case_when(
loyalty_card == "Yes" & purchase_freq == "High" ~ 0.70,
loyalty_card == "Yes" & purchase_freq == "Medium" ~ 0.55,
loyalty_card == "Yes" & purchase_freq == "Low" ~ 0.45,
loyalty_card == "No" & age_group %in% c("18-25", "26-40") ~ 0.35,
loyalty_card == "No" & age_group %in% c("41-60", "60+") ~ 0.10,
TRUE ~ 0.20
),
response = factor(
ifelse(runif(n) < response_prob, "Responde", "No_responde")
)
) |>
dplyr::select(-response_prob)
# CHAID requires all predictors to be factors (nominal or ordinal)
campaign_data <- campaign_data |>
dplyr::mutate(
age_group = factor(age_group, levels = c("18-25", "26-40", "41-60", "60+"), ordered = TRUE),
loyalty_card = factor(loyalty_card),
purchase_freq = factor(purchase_freq, levels = c("Low", "Medium", "High"), ordered = TRUE)
)
dplyr::glimpse(campaign_data)
```
Nótese que la respuesta simulada incluye deliberadamente una **interacción**: la
edad solo es relevante para diferenciar la respuesta entre los clientes *sin*
tarjeta de fidelización; entre los clientes *con* tarjeta, lo que importa es la
frecuencia de compra. Esta es exactamente el tipo de estructura condicional que
CHAID está diseñado para detectar.
### Ejecución del análisis CHAID
```{r}
#| echo: true
chaid_control <- CHAID::chaid_control(minsplit = 50, minbucket = 30, alpha2 = 0.05, alpha4 = 0.05)
chaid_model <- CHAID::chaid(response ~ age_group + loyalty_card + purchase_freq,
data = campaign_data,
control = chaid_control)
print(chaid_model)
```
Los argumentos de control son los habituales en SPSS y en la literatura de
CHAID: `minsplit` es el número mínimo de casos que debe tener un nodo para que
se intente dividirlo; `minbucket`, el número mínimo de casos permitido en un
nodo terminal; `alpha2` y `alpha4`, los niveles de significación para las fases
de división y fusión, respectivamente.
### Visualización del árbol
```{r}
#| label: fig-chaid-tree
#| fig-cap: Árbol de decisión CHAID para la respuesta a la campaña
#| echo: true
#| fig-width: 12
#| fig-height: 7
plot(chaid_model)
```
### Interpretación del árbol
El árbol revela exactamente la estructura de interacción simulada en los datos:
1. **Primera división — `loyalty_card`**: la variable más predictiva en el nodo
raíz es la posesión de tarjeta de fidelización, separando a la muestra en
dos grandes ramas.
2. **Rama de clientes CON tarjeta**: dentro de esta rama, la variable que mejor
sigue discriminando es `purchase_freq` (frecuencia de compra), generando
nodos terminales con tasas de respuesta crecientes a medida que aumenta la
frecuencia de compra. La edad no aparece como variable relevante en esta
rama: para los clientes fidelizados, lo que importa es cuánto compran, no su
edad.
3. **Rama de clientes SIN tarjeta**: en esta rama, la variable relevante pasa a
ser `age_group`, que separa a los clientes más jóvenes (mayor tasa de
respuesta) de los de mayor edad (menor tasa de respuesta). La frecuencia de
compra no resulta significativa en esta rama.
Esta es precisamente la interacción condicional que el análisis discriminante,
al combinar linealmente todas las variables a la vez, tendría dificultades para
revelar con la misma claridad.
### Extracción de las reglas de segmentación
Para traducir el árbol en una tabla de reglas de negocio directamente
accionable:
```{r}
#| echo: true
# Predicted node for each customer, and predicted class
campaign_data$node <- predict(chaid_model, type = "node")
campaign_data$predicted <- predict(chaid_model, type = "response")
segment_rules <- campaign_data |>
dplyr::group_by(node) |>
dplyr::summarise(
n = dplyr::n(),
response_rate = round(mean(response == "Responde") * 100, 1),
.groups = "drop"
) |>
dplyr::arrange(dplyr::desc(response_rate))
segment_rules
```
```{r}
#| label: fig-segment-response-rates
#| fig-cap: Tasa de respuesta por nodo terminal del árbol
#| echo: true
ggplot2::ggplot(segment_rules, ggplot2::aes(x = reorder(factor(node), response_rate), y = response_rate)) +
ggplot2::geom_col(fill = "#076fa2") +
ggplot2::geom_text(ggplot2::aes(label = paste0(response_rate, "%")), hjust = -0.1) +
ggplot2::coord_flip() +
ggplot2::scale_y_continuous(limits = c(0, 100)) +
ggplot2::labs(x = "Nodo terminal", y = "Tasa de respuesta (%)") +
ggplot2::theme_minimal()
```
Esta tabla y este gráfico son, en la práctica, el entregable final de un
análisis CHAID en un contexto de marketing directo: una lista ordenada de
segmentos por tasa de respuesta esperada, cada uno definido por reglas
explícitas y fácilmente comunicables a un equipo no técnico.
### Aplicación a la selección de público objetivo
Con el árbol ya entrenado, su uso más directo es decidir a qué segmentos dirigir
—o excluir de— futuras campañas, priorizando los nodos terminales con mayor tasa
de respuesta esperada y descartando aquellos con tasas muy bajas, optimizando
así el retorno de la inversión en marketing directo.
### Conclusiones
El análisis CHAID ha permitido construir un árbol de segmentación que:
1. **Identifica la jerarquía de importancia de los predictores**: la posesión
de tarjeta de fidelización es el factor más determinante, seguido de la
frecuencia de compra o la edad, según la rama del árbol.
2. **Revela una interacción** entre variables que un modelo lineal tendría
dificultades para mostrar con la misma claridad: la edad solo importa para
los clientes sin tarjeta de fidelización.
3. **Produce reglas de segmentación directamente accionables**, sin necesidad
de interpretar coeficientes ni puntuaciones discriminantes, ideales para su
traslado a un equipo de marketing no especializado en estadística.
Este capítulo cierra el bloque de técnicas de segmentación y clasificación del
libro: desde el descubrimiento no supervisado de segmentos con clúster, pasando
por su validación y clasificación paramétrica con el análisis discriminante,
hasta esta alternativa no paramétrica y basada en reglas que ofrece CHAID. Tres
enfoques distintos para una misma familia de preguntas de negocio, cada uno con
sus propias fortalezas según el objetivo y la naturaleza de los datos
disponibles.