# Análisis discriminante
```{r}
#| echo: false
#| message: false
#| warning: false
source("script.R")
```
## Introducción: del descubrimiento a la clasificación
El capítulo de análisis clúster cerró con un addendum importante: una vez que un
algoritmo de clustering produce una partición de los datos en segmentos, el
siguiente paso es el **perfilado**, validado estadísticamente con chi-cuadrado o
ANOVA según el tipo de variable externa que se utilice para caracterizar cada
grupo.
Ese addendum dejó una pregunta sin resolver: si se sabe que un conjunto de
variables (edad, ingresos, frecuencia de compra...) difiere significativamente
entre los segmentos, ¿es posible ir un paso más allá y **combinar todas esas
variables en una única regla de clasificación** que prediga a qué segmento
pertenece un nuevo individuo, sin necesidad de volver a ejecutar el algoritmo de
clustering completo? Esa es exactamente la pregunta que responde el **análisis
discriminante**.
El análisis discriminante es una técnica de dependencia cuyo objetivo es doble:
por un lado, **explicar** qué variables cuantitativas diferencian mejor a dos o
más grupos ya conocidos; por otro, **clasificar** nuevos casos en esos grupos a
partir de sus valores en esas variables [@Hair2019]. A diferencia del análisis
clúster —de naturaleza no supervisada, donde los grupos se descubren—, el
análisis discriminante es una técnica de **clasificación supervisada**: los
grupos están definidos a priori, y el algoritmo aprende a distinguirlos.
::: callout-tip
## Equivalencia con SPSS
El análisis discriminante tiene equivalente exacto en SPSS:
`Analizar > Clasificar > Discriminante`. Los estadísticos desarrollados en este
capítulo —autovalores, correlación canónica, lambda de Wilks, coeficientes
estandarizados, estructura de matriz, centroides de grupo y matriz de
clasificación— se corresponden directamente con la salida de ese procedimiento.
:::
## El paralelismo (y el contraste) con el ANOVA
El análisis discriminante puede entenderse como el **reverso del ANOVA**, y esa
analogía es la forma más rápida de situarlo conceptualmente:
- En el **ANOVA**, la variable cualitativa (los grupos) es la variable
**independiente**, y se pregunta si produce diferencias significativas en una
variable cuantitativa **dependiente**.
- En el **análisis discriminante**, la variable cualitativa (los grupos) es la
variable **dependiente** que se quiere explicar y predecir, y un conjunto de
variables cuantitativas actúa como **independientes**.
Dicho de otro modo: el ANOVA pregunta "¿el grupo al que pertenece un individuo
afecta a su puntuación?"; el análisis discriminante pregunta "¿la combinación de
puntuaciones de un individuo permite predecir a qué grupo pertenece?". Son,
literalmente, la misma estructura de datos mirada en direcciones opuestas.
## La lógica del modelo: la función discriminante
El análisis discriminante busca una (o varias) combinación lineal de las
variables predictoras que **maximice la separación entre los grupos** y
**minimice la varianza dentro de cada grupo**. Esa combinación lineal se
denomina **función discriminante**:
$$D = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k$$
donde $D$ es la puntuación discriminante de un individuo, y
$\beta_1, \dots, \beta_k$ son los coeficientes que ponderan cada variable
predictora. Es formalmente muy similar a la ecuación de una regresión, pero el
objetivo de la estimación es distinto: en la regresión se minimiza el error de
predicción de una variable continua; en el análisis discriminante se maximiza la
razón entre la varianza **entre** grupos y la varianza **dentro** de los grupos
(un criterio análogo al que usa el propio ANOVA para construir su estadístico
F).
Cuando hay más de dos grupos, el análisis puede extraer **varias funciones
discriminantes**, cada una ortogonal (no correlacionada) con las anteriores,
igual que sucede con los componentes en un ACP. El número máximo de funciones
que pueden extraerse es el menor valor entre (número de grupos − 1) y (número de
variables predictoras).
## Evaluación del modelo: ¿discrimina bien la función?
### Autovalor y correlación canónica
Cada función discriminante lleva asociado un **autovalor**, que indica la
cantidad de varianza entre grupos que esa función es capaz de explicar; cuanto
mayor, más poder discriminante tiene la función. La **correlación canónica**
asociada a cada función es la correlación entre las puntuaciones discriminantes
y la pertenencia a los grupos: cuanto más cercana a 1, mejor discrimina la
función.
### Lambda de Wilks
Es el estadístico de significación más utilizado en el análisis discriminante.
Compara la varianza dentro de los grupos con la varianza total, y su valor va de
0 a 1:
- **Lambda cercano a 0**: gran parte de la varianza total se debe a las
diferencias entre grupos; el modelo discrimina muy bien.
- **Lambda cercano a 1**: apenas hay diferencias entre grupos; el modelo
discrimina mal.
Se contrasta mediante una transformación a chi-cuadrado, con H₀: las medias de
los grupos son iguales en el conjunto de variables discriminantes. Un p-valor
significativo (p \< 0,05) indica que el modelo, en su conjunto, discrimina
significativamente entre los grupos.
### Coeficientes estandarizados y estructura de matriz
Una vez confirmado que el modelo discrimina de forma significativa, hay dos
formas complementarias de interpretar la contribución de cada variable:
- **Coeficientes estandarizados de la función discriminante**: análogos a los
coeficientes Beta de una regresión, indican el peso relativo de cada variable
en la función, controlando el efecto de las demás.
- **Matriz de estructura**: la correlación simple entre cada variable original y
la función discriminante. Es más estable e interpretable que los coeficientes
estandarizados cuando existe multicolinealidad entre los predictores, y suele
ser el criterio preferido para nombrar e interpretar cada función.
### Centroides de grupo
El **centroide** de un grupo es la media de las puntuaciones discriminantes de
todos los individuos de ese grupo. Representan la posición "típica" de cada
grupo en el espacio discriminante, y su distancia relativa es una forma visual e
intuitiva de apreciar cuán bien separados están los grupos.
## Evaluación de la clasificación: la matriz de confusión
Más allá de si la función discrimina de forma estadísticamente significativa,
interesa saber **cuántos casos clasifica correctamente**. Para ello se construye
una matriz de confusión que cruza la pertenencia real al grupo con la
pertenencia predicha por el modelo, exactamente con la misma lógica que se usó
para evaluar la regresión logística:
- **Porcentaje de clasificaciones correctas**: el porcentaje total de casos bien
clasificados.
- **Criterio de referencia**: este porcentaje debe compararse con el que se
obtendría clasificando al azar (la proporción del grupo mayoritario, o
1/número de grupos si están equilibrados). Una regla habitual es exigir que el
modelo supere ese azar en al menos un 25%.
- **Validación cruzada (leave-one-out)**: el porcentaje de aciertos calculado
sobre los mismos datos con los que se entrenó el modelo (clasificación
"original") suele estar inflado. Es buena práctica reportar también la
clasificación validada cruzadamente, donde cada caso se clasifica con una
función estimada excluyéndolo a él mismo de la muestra de entrenamiento — una
estimación más realista del rendimiento del modelo con datos nuevos.
## Supuestos del análisis discriminante
Como técnica paramétrica clásica, el análisis discriminante (en su forma lineal,
LDA) asume:
1. **Normalidad multivariante**: las variables predictoras deben seguir,
conjuntamente, una distribución normal multivariante dentro de cada grupo.
2. **Igualdad de matrices de covarianza** (homogeneidad): la matriz de
varianzas-covarianzas de las variables predictoras debe ser similar entre
los grupos. Se contrasta con el **test M de Box**. Si este supuesto se viola
de forma severa, se recomienda el **análisis discriminante cuadrático
(QDA)**, una variante que no lo exige, a costa de necesitar muestras más
grandes por grupo.
3. **Ausencia de multicolinealidad severa** entre las variables predictoras,
por las mismas razones ya vistas en regresión múltiple.
## Aplicación práctica: clasificación de segmentos de consumidores de smartphones
Se retoma el caso práctico del capítulo de análisis clúster: los 300
consumidores de smartphones segmentados en 4 perfiles ("Pragmáticos del
rendimiento", "Cazadores de ofertas", "Entusiastas premium", "Estetas del
diseño") a partir de sus puntuaciones en tres componentes principales. El
análisis clúster reveló *que* existen estos cuatro grupos; el análisis
discriminante permitirá confirmar *qué tan bien* se diferencian entre sí y
construir una regla de clasificación para nuevos consumidores.
### Objetivo de la investigación
> **Objetivo**: utilizar análisis discriminante para confirmar que los cuatro
> segmentos de consumidores identificados mediante clustering son
> estadísticamente distinguibles a partir de las tres dimensiones de percepción
> de marca, y construir una función de clasificación que permita asignar nuevos
> consumidores a su segmento más probable.
### Preparación de los datos
Se recrean los datos del capítulo de clúster: las puntuaciones de los 300
consumidores en los tres componentes principales, junto con su asignación de
segmento obtenida mediante k-medias.
```{r}
#| echo: true
#| message: false
set.seed(456)
n <- 300
latent_performance <- rnorm(n, 0, 1)
latent_design <- rnorm(n, 0, 1)
latent_value <- rnorm(n, 0, 1)
smartphone_data <- data.frame(
battery = 7 + 0.80 * latent_performance + rnorm(n, 0, 0.5),
camera = 7 + 0.85 * latent_performance + rnorm(n, 0, 0.5),
performance = 7 + 0.90 * latent_performance + rnorm(n, 0, 0.4),
screen = 7 + 0.75 * latent_performance + rnorm(n, 0, 0.6),
design = 8 + 0.90 * latent_design + rnorm(n, 0, 0.4),
materials = 8 + 0.85 * latent_design + rnorm(n, 0, 0.5),
exclusivity = 8 + 0.75 * latent_design + rnorm(n, 0, 0.6),
low_price = 4 + 0.90 * latent_value + rnorm(n, 0, 0.4),
promotions = 5 + 0.70 * latent_value + rnorm(n, 0, 0.7)
)
smartphone_data <- as.data.frame(lapply(smartphone_data,
function(x) round(pmin(10, pmax(1, x)))))
pca_model <- psych::principal(smartphone_data, nfactors = 3, rotate = "varimax", scores = TRUE)
component_scores <- as.data.frame(pca_model$scores)
# Recreate the k-means segmentation from the clustering chapter
set.seed(123)
kmeans_result <- kmeans(component_scores, centers = 4, nstart = 25)
component_scores$segment <- factor(kmeans_result$cluster,
labels = c("Pragmaticos_rendimiento", "Cazadores_ofertas",
"Entusiastas_premium", "Estetas_diseno"))
head(component_scores)
```
### Comprobación de supuestos
Antes de estimar el modelo se comprueba la homogeneidad de las matrices de
covarianza entre segmentos con el test M de Box:
```{r}
#| echo: true
biotools::boxM(component_scores[, c("RC1", "RC2", "RC3")], component_scores$segment)
```
El test M de Box puede ser significativo con muestras grandes incluso ante
diferencias modestas; combinado con tamaños de grupo similares (el escenario más
robusto frente a violaciones de este supuesto), se procede con el análisis
discriminante lineal estándar.
### Ejecución del análisis discriminante
```{r}
#| echo: true
discriminant_model <- MASS::lda(segment ~ RC1 + RC2 + RC3, data = component_scores)
discriminant_model
```
### Evaluación del modelo: ¿discriminan bien las funciones?
Con 4 grupos y 3 variables predictoras, el modelo extrae 3 funciones
discriminantes (el mínimo entre grupos−1 = 3 y número de predictores = 3). La
proporción de traza (`Proportion of trace`) en la salida anterior indica qué
porcentaje de la capacidad discriminante total captura cada función.
```{r}
#| echo: true
# Wilks' lambda significance test for the full model, via MANOVA
manova_model <- manova(cbind(RC1, RC2, RC3) ~ segment, data = component_scores)
summary(manova_model, test = "Wilks")
```
El lambda de Wilks es muy pequeño y el p-valor asociado es prácticamente cero:
se rechaza H₀ de igualdad de medias entre grupos. El conjunto de variables
discrimina de forma altamente significativa entre los cuatro segmentos —una
confirmación estadística formal de que la segmentación obtenida por clustering
no es artefacto del azar.
### Interpretación de las funciones: matriz de estructura y centroides
```{r}
#| echo: true
# Group centroids in the discriminant space
discriminant_model$means
```
```{r}
#| echo: true
# Predicted scores on the discriminant functions, for visualization
discriminant_pred <- predict(discriminant_model)
plot_data <- data.frame(discriminant_pred$x, segment = component_scores$segment)
head(plot_data)
```
### Visualización del espacio discriminante
```{r}
#| label: fig-discriminant-space
#| fig-cap: Espacio discriminante de los cuatro segmentos de consumidores
#| echo: true
ggplot2::ggplot(plot_data, ggplot2::aes(x = LD1, y = LD2, color = segment)) +
ggplot2::geom_point(alpha = 0.7) +
ggplot2::stat_ellipse(level = 0.68) +
ggplot2::scale_color_manual(values = c("#076fa2", "#c40000", "#f0a202", "#2ca02c")) +
ggplot2::labs(
title = "Espacio discriminante de los segmentos de consumidores",
x = "Primera función discriminante (LD1)",
y = "Segunda función discriminante (LD2)",
color = "Segmento"
) +
ggplot2::theme_minimal() +
ggplot2::theme(legend.position = "bottom")
```
Los cuatro segmentos aparecen claramente separados en el espacio discriminante,
con muy poco solapamiento entre sus elipses de confianza: una confirmación
visual de que la función discriminante distingue bien a los grupos.
### Evaluación de la clasificación: matriz de confusión
```{r}
#| echo: true
predicted_segment <- discriminant_pred$class
confusion_matrix <- table(Real = component_scores$segment, Predicho = predicted_segment)
confusion_matrix
```
```{r}
#| echo: true
accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
cat("Porcentaje de clasificaciones correctas:", round(accuracy * 100, 1), "%\n")
```
El porcentaje de aciertos obtenido está muy por encima del 25% que se obtendría
clasificando al azar entre 4 grupos equilibrados (25% de base), confirmando un
excelente poder de clasificación del modelo.
#### Validación cruzada (leave-one-out)
Para obtener una estimación más realista y no inflada del rendimiento, se repite
la clasificación con validación cruzada:
```{r}
#| echo: true
discriminant_model_cv <- MASS::lda(segment ~ RC1 + RC2 + RC3, data = component_scores, CV = TRUE)
confusion_matrix_cv <- table(Real = component_scores$segment, Predicho = discriminant_model_cv$class)
accuracy_cv <- sum(diag(confusion_matrix_cv)) / sum(confusion_matrix_cv)
cat("Porcentaje de aciertos con validación cruzada:", round(accuracy_cv * 100, 1), "%\n")
```
El porcentaje validado cruzadamente es ligeramente inferior al de la
clasificación original, como es esperable, pero se mantiene muy alto: el modelo
generaliza bien a casos no utilizados en su propia estimación.
### Clasificación de un nuevo consumidor
Una de las grandes utilidades prácticas del modelo: clasificar a un nuevo
consumidor, del que solo se conocen sus puntuaciones en los tres componentes de
percepción, sin necesidad de repetir el proceso de clustering completo.
```{r}
#| echo: true
new_consumer <- data.frame(RC1 = 1.5, RC2 = -0.3, RC3 = -1.2)
predict(discriminant_model, newdata = new_consumer)
```
El modelo asigna a este nuevo consumidor el segmento más probable según su
perfil de percepción, junto con las probabilidades posteriores de pertenencia a
cada uno de los cuatro grupos.
### Conclusiones
El análisis discriminante ha cumplido un doble propósito en este capítulo:
1. **Validación estadística de la segmentación**: el lambda de Wilks confirma
que los cuatro segmentos identificados mediante k-medias son
estadísticamente distintos en sus puntuaciones de percepción de marca, no un
artefacto del algoritmo de clustering.
2. **Construcción de una regla de clasificación operativa**: la función
discriminante permite clasificar nuevos consumidores en uno de los cuatro
segmentos sin necesidad de volver a ejecutar el análisis clúster completo,
con un porcentaje de acierto alto y confirmado mediante validación cruzada.
Esta combinación —clúster para *descubrir* segmentos y discriminante para
*validarlos y operacionalizarlos*— es uno de los flujos de trabajo más robustos
y habituales en segmentación de mercados. El siguiente capítulo presenta una
alternativa a este enfoque paramétrico: la segmentación mediante árboles de
decisión CHAID, una técnica no paramétrica que produce reglas de clasificación
directamente interpretables en forma de "si... entonces...".