14  Análisis discriminante

Published

June 29, 2026

14.1 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 (Hair et al. 2019). 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.

TipEquivalencia 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.

14.2 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.

14.3 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).

14.4 Evaluación del modelo: ¿discrimina bien la función?

14.4.1 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.

14.4.2 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.

14.4.3 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.

14.4.4 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.

14.5 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.

14.6 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.

14.7 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.

14.7.1 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.

14.7.2 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.

Code
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)
          RC1        RC2         RC3                 segment
1 -1.52900201 -1.7017107 -0.65982226       Cazadores_ofertas
2  0.78275214  0.2523664  0.01431981          Estetas_diseno
3  0.80823689 -0.9488465 -1.12246430          Estetas_diseno
4 -1.23504496  1.4025765  0.08524468 Pragmaticos_rendimiento
5 -0.07464597 -0.1158922  1.01651403     Entusiastas_premium
6 -0.09146697 -0.1464500 -0.56609322          Estetas_diseno

14.7.3 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:

Code
biotools::boxM(component_scores[, c("RC1", "RC2", "RC3")], component_scores$segment)

    Box's M-test for Homogeneity of Covariance Matrices

data:  component_scores[, c("RC1", "RC2", "RC3")]
Chi-Sq (approx.) = 44.027, df = 18, p-value = 0.0005719

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.

14.7.4 Ejecución del análisis discriminante

Code
discriminant_model <- MASS::lda(segment ~ RC1 + RC2 + RC3, data = component_scores)
discriminant_model
Call:
lda(segment ~ RC1 + RC2 + RC3, data = component_scores)

Prior probabilities of groups:
Pragmaticos_rendimiento       Cazadores_ofertas     Entusiastas_premium 
              0.2600000               0.2166667               0.2466667 
         Estetas_diseno 
              0.2766667 

Group means:
                               RC1        RC2        RC3
Pragmaticos_rendimiento -0.9353664  0.7263410 -0.1794226
Cazadores_ofertas       -0.4788838 -1.2958582 -0.1091468
Entusiastas_premium      0.4448192  0.2108357  1.1423253
Estetas_diseno           0.8574627  0.1442692 -0.7643683

Coefficients of linear discriminants:
          LD1        LD2        LD3
RC1 0.9606692  1.0636964  0.2436327
RC2 1.0079945 -0.6695170 -0.7769051
RC3 0.4944452 -0.7017783  1.1104680

Proportion of trace:
   LD1    LD2    LD3 
0.3751 0.3401 0.2848 

14.7.5 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.

Code
# 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")
           Df   Wilks approx F num Df den Df    Pr(>F)    
segment     3 0.11309    115.2      9 715.67 < 2.2e-16 ***
Residuals 296                                             
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

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.

14.7.6 Interpretación de las funciones: matriz de estructura y centroides

Code
# Group centroids in the discriminant space
discriminant_model$means
                               RC1        RC2        RC3
Pragmaticos_rendimiento -0.9353664  0.7263410 -0.1794226
Cazadores_ofertas       -0.4788838 -1.2958582 -0.1091468
Entusiastas_premium      0.4448192  0.2108357  1.1423253
Estetas_diseno           0.8574627  0.1442692 -0.7643683
Code
# 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)
         LD1         LD2         LD3                 segment
1 -3.5104261 -0.02402076  0.21684127       Cazadores_ofertas
2  1.0134302  0.65359771  0.01054093          Estetas_diseno
3 -0.7349809  2.28270869 -0.31238415          Estetas_diseno
4  0.2694685 -2.31258462 -1.29590456 Pragmaticos_rendimiento
5  0.3140817 -0.71517633  1.20065738     Entusiastas_premium
6 -0.5153924  0.39802960 -0.53713505          Estetas_diseno

14.7.7 Visualización del espacio discriminante

Code
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")
Figure 14.1: Espacio discriminante de los cuatro segmentos de consumidores

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.

14.7.8 Evaluación de la clasificación: matriz de confusión

Code
predicted_segment <- discriminant_pred$class

confusion_matrix <- table(Real = component_scores$segment, Predicho = predicted_segment)
confusion_matrix
                         Predicho
Real                      Pragmaticos_rendimiento Cazadores_ofertas
  Pragmaticos_rendimiento                      78                 0
  Cazadores_ofertas                             0                62
  Entusiastas_premium                           1                 0
  Estetas_diseno                                0                 0
                         Predicho
Real                      Entusiastas_premium Estetas_diseno
  Pragmaticos_rendimiento                   0              0
  Cazadores_ofertas                         1              2
  Entusiastas_premium                      72              1
  Estetas_diseno                            0             83
Code
accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
cat("Porcentaje de clasificaciones correctas:", round(accuracy * 100, 1), "%\n")
Porcentaje de clasificaciones correctas: 98.3 %

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.

14.7.8.1 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:

Code
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")
Porcentaje de aciertos con validación cruzada: 97.7 %

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.

14.7.9 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.

Code
new_consumer <- data.frame(RC1 = 1.5, RC2 = -0.3, RC3 = -1.2)

predict(discriminant_model, newdata = new_consumer)
$class
[1] Estetas_diseno
4 Levels: Pragmaticos_rendimiento Cazadores_ofertas ... Estetas_diseno

$posterior
  Pragmaticos_rendimiento Cazadores_ofertas Entusiastas_premium Estetas_diseno
1            0.0005168661       0.003099475         0.001959727      0.9944239

$x
        LD1      LD2        LD3
1 0.5452712 2.638534 -0.7340411

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.

14.7.10 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…”.