logo

Introducción

El análisis discriminante (DA por sus siglas en inglés Discriminat analysis) es una técnica multivariada que se encarga primero de separar o discriminar la información en grupos, y segundo, trabaja en la predicción o asignación de un objeto nuevo en uno de los diferentes grupos previamente encontrados, con base en los valores de las variables que lo identifican.

Esta metodología permite identificar la función lineal o cuadrática que mejor separa los grupos, maximizando la diferencia entre ellos. Originalmente desarrollada para resolver problemas de clasificación en la psicología y las ciencias sociales, hoy en día el DA se utiliza ampliamente en diversas disciplinas, incluyendo el marketing, la biomedicina y las ciencias empresariales.

En este contexto, el DA es particularmente útil para tareas donde la clasificación precisa es crucial, como el diagnóstico médico de enfermedades, la segmentación de clientes en función de su valor para una empresa o la predicción de categorías de riesgo financiero. A diferencia de otras técnicas de clasificación, el Análisis Discriminante proporciona una interpretación detallada de cómo cada variable contribuye a la separación entre grupos, lo cual facilita la toma de decisiones y la comprensión de los factores que afectan la clasificación.

Algunas situaciones en las que se puede pensar aplicar análisis discriminante:

  • Una persona que aspira a ocupar un cargo en una empresa, es sometida a una serie de pruebas; de acuerdo con su puntaje se sugiere ubicarlo en alguno de los departamentos de la empresa.

  • Un biólogo quiere clasificar una “nueva” planta en una de varias especies conocidas (taxonomía numérica).

  • Un gerente quiere predecir el riesgo de quiebra de su empresa.

  • De acuerdo con los registros de calificaciones del primer año, se quiere predecir la tasa de graduación de los estudiantes de nuevo ingreso.

¿Cómo funciona el DA?

No entraremos en la explicación matemática de sus fundamentos, que puede ser algo compleja. Sin embargo, comprender los cinco pasos siguientes puede dar una mejor idea de cómo funciona DA.

Paso 1. Preparación de los datos:

Antes de comenzar, es importante evaluar si los datos son adecuados para un DA. Es decir, comprobar que el objetivo del problema a desarrollar y la base de datos contenga una variable para discriminar. Además, es muy importante revisar la normalidad multivariada en cada grupo.

Por otra parte, en este paso de divide el conjunto de datos en dos conjuntos: de entrenamiento y prueba. El primer conjunto es con el que se construye el modelo y el segundo conjunto se utiliza para evaluar la clasificación. En general, se recomienda reservar entre un 20% y un 30% de los datos para el conjunto de prueba y el resto para entrenamiento.

Paso 2. Selección del método:

Una vez preparados los datos, el siguiente paso es elegir el tipo de Análisis Discriminante que mejor se adapte a las características de los datos y al objetivo del análisis. Existen dos métodos principales para el Análisis Discriminante: el Análisis Discriminante Lineal (LDA) y el Análisis Discriminante Cuadrático (QDA). La selección entre estos métodos depende de los supuestos sobre las varianzas y covarianzas entre los grupos, así como del tipo de frontera de decisión que se quiera obtener.

LDA:

Análisis Discriminante Lineal:

Este método intenta encontrar una combinación lineal de las variables predictoras que maximice la separación entre los grupos. La frontera de decisión entre los grupos es una línea (o un plano en dimensiones superiores).

Para aplicar ADL es porque existe las matrices de covarianza son similares entre los grupos. Esto implica que los grupos deben tener una estructura de varianza y covarianza semejante.

QDA:

Análisis Discriminante Cuadrático:

A diferencia del LDA, el QDA permite una frontera de decisión más flexible al incorporar términos cuadráticos en la función discriminante. Esto permite obtener fronteras no lineales, lo cual es útil para problemas de clasificación donde la separación entre grupos es más compleja.

Para aplicar AQL es porque existe las matrices de covarianza son diferentes entre los grupos. Esto implica que cada grupo puede tener su propia estructura de covarianza, lo que permite una mayor flexibilidad en la clasificación.

Prueba de Box’s M:

Prueba de homogeneidad de varianzas:

Esta prueba ayuda a decidir si los grupos tienen matrices de covarianza similares. La función boxM() de la librería biotools es comúnmente utilizada para realizar esta prueba en R. Esta prueba plantea:

\[\begin{align*} H_0: & \text{Las matrices de covarianzas son iguales.} \\ H_a: & \text{Las matrices de covarianzas son diferentes.} \end{align*}\]

¿Cuál método es el más adecuado?

Esto depende de las implicaciones que tiene, el asumir que todos los grupos comparten una matriz de covarianza común. LDA produce límites de decisión lineales, lo que se traduce en menor flexibilidad y por lo tanto menor problema de varianza. Sin embargo, si la separación de los grupos no es lineal, tendrá un sesgo grande. El método QDA produce límites cuadráticos y por lo tanto curvos, lo que aporta mayor flexibilidad permitiendo ajustarse mejor a los datos, menor sesgo pero mayor riesgo de varianza.

En términos generales, LDA tiende a conseguir mejores clasificaciones que QDA cuando hay pocas observaciones con las que entrenar al modelo, escenario en el que evitar la varianza es crucial. Por lo contrario, si se dispone de una gran cantidad de observaciones de entrenamiento o si no se puede asumir que existe una matriz de covarianza común entre clases, QDA es más adecuado.

Cuando \(\Sigma_1 \not = \Sigma_2\), la función de clasificación cuadrática \(Q(x)\) es óptima de manera asintótica; aunque para muestras pequeñas \(S_i\) no es un estimador estable, es decir, \(S_i\) varía bastante en muestras de la misma población o grupo. En tales casos se recomienda emplear la regla de discriminación lineal. Para muestras de tamaño grande y con amplias diferencias entre \(\Sigma_1\) y \(\Sigma_2\), la función de discriminación cuadrática es la más recomendable.

En la siguiente figura se puede observar como se comporta la discriminación en dos grupos cuando:

  • \((a)\) se supone la matriz de covarianza igual (discriminación lineal).

  • \((b)\) se suponen diferentes (discriminación cuadrática).

En la figura \((a)\) y \((b)\) se muestra la ubicación de las variables en el plano. Para los datos de la figura \((a)\), donde \(\Sigma_1 = \Sigma_2\) ya que la forma de las nubes de puntos es similar, es conveniente una regla de discriminación lineal; mientras que para los datos de la figura \((b)\), donde \(\Sigma_1 \not = \Sigma_2\), la discriminación lineal no es conveniente, pues las observaciones están superpuestas, en este caso la discriminación de tipo cuadrático resulta más apropiada.

Paso 3. Creación de la función discriminante:

La función discriminante se construye para cada grupo en el análisis. Esta función puede ser lineal o cuadrática, dependiendo del método seleccionado:

  • Análisis Discriminante Lineal (LDA): Genera una función lineal en las variables predictoras, lo que implica que la frontera de separación entre los grupos será una línea (en 2D), un plano (en 3D) o un hiperplano en dimensiones superiores.

  • Análisis Discriminante Cuadrático (QDA): Genera una función cuadrática, lo que permite una mayor flexibilidad en la forma de la frontera de separación entre los grupos.

La fórmula general de la función discriminante es:

\[ D_i(x) = \beta_{0i} + \sum_{j=1}^p \beta{ij}x_j \] donde:

  • \(D_i(x)\) es el puntaje de discriminación para el grupo \(i\).
  • \(\beta_{0i}\) es el termino constante en el grupo \(i\).
  • \(\beta_{ij}\) son los coeficientes de las variables predictoras \(x_j\) en cada grupo \(i\).
  • \(x_j\) representa las variables predictoras.

En el caso del QDA, se añaden términos cuadráticos y de interacción, que permiten que las fronteras de decisión no sean lineales.

Estimación de los coeficientes:

Los coeficientes de la función discriminante \((\beta_{ij})\) se estiman utilizando el conjunto de datos de entrenamiento.

En R, los coeficientes son estimados automáticamente mediante las funciones lda() para LDA y qda() para QDA de la librería MASS.

Paso 4. Validación del modelo:

Después de construir la función discriminante, es fundamental evaluar su desempeño para asegurarse de que el modelo clasifica correctamente las observaciones y que es aplicable a nuevos datos. La validación permite determinar si el modelo es robusto y generalizable.

Existen dos formas para realizar esta validación: validación cruzada o evaluar el conjunto de prueba.

Validación cruzada

Es un método de validación que consiste en dividir el conjunto de datos en varias partes (o “folds”) y entrenar y evaluar el modelo en distintas combinaciones de estas particiones. Este enfoque es útil para medir el desempeño del modelo en diferentes subconjuntos de los datos, lo cual ayuda a verificar que el modelo no esté sobreajustado y sea generalizable a datos nuevos.

Evaluación conjunto de prueba

Si el conjunto de datos fue dividido en entrenamiento y prueba, otra forma de validar el modelo es usar el conjunto de prueba, que no fue utilizado durante el entrenamiento. Esto simula cómo el modelo clasificaría datos completamente nuevos y proporciona una evaluación de su desempeño en condiciones de aplicación real. Se puede usar la función predict() para realizar este proceso.

Luego de aplicar el método de validación, se pueden revisar los resultados por medio de la matriz de consfusión.

Matriz de Confusión

Es una herramienta clave para evaluar la precisión de un modelo de clasificación. Muestra el número de observaciones correctamente e incorrectamente clasificadas en cada grupo, comparando las predicciones del modelo con las etiquetas reales de los datos.

  • Cada celda en la matriz indica el número de observaciones clasificadas en un grupo específico.
  • La diagonal principal de la matriz muestra las observaciones correctamente clasificadas, mientras que las celdas fuera de la diagonal representan los errores de clasificación.

La matriz de confusión permite calcular varias métricas de rendimiento, como:

  • Precisión: Proporción de predicciones correctas respecto al total de observaciones. Se calcula como: \[\text{Presición} = \dfrac{\text{Clasificaciones correctas}}{\text{total de observaciones}} \]

  • Sensibilidad: Proporción de observaciones de un grupo correctamente identificadas. Es particularmente útil si un grupo es de mayor interés.

  • Especificidad: Proporción de observaciones de los otros grupos que no fueron clasificadas erróneamente en el grupo de interés.

  • Valor predictivo positivo: Proporción de observaciones correctamente clasificadas como pertenecientes a un grupo entre todas las predichas en ese grupo.

Todas estas métricas pueden calcularse con la función confusionMatrix() de la librería caret, que muestra estos valores automáticamente en su salida.

Paso 5. Interpretación de Resultados:

El objetivo final del Análisis Discriminante es interpretar los resultados de manera que ofrezcan información valiosa y permitan tomar decisiones informadas. En este paso, se analizan tanto los coeficientes de la función discriminante como las métricas de desempeño del modelo para entender cómo cada variable contribuye a la clasificación y cuán efectivo es el modelo en su conjunto.

Coeficientes

  • Los coeficientes indican la contribución de cada variable en la separación entre grupos. Un coeficiente alto sugiere que la variable tiene una influencia significativa en la clasificación.
  • Los signos de los coeficientes revelan la dirección de la relación entre la variable y el grupo específico:
    • Un coeficiente positivo indica que un mayor valor en la variable aumenta la probabilidad de pertenencia a un grupo en particular.
    • Un coeficiente negativo sugiere que un valor más alto en la variable reduce la probabilidad de pertenencia a ese grupo.
  • En el caso del QDA, los términos cuadráticos y de interacción indican relaciones más complejas entre las variables y la pertenencia a los grupos.
  • Los puntajes discriminantes de cada grupo muestran las posiciones relativas de las observaciones en el espacio discriminante.

Matriz de confusión

La matriz de confusión y las métricas de desempeño calculadas en el paso anterior proporcionan información crucial sobre la precisión del modelo y sus capacidades de clasificación:

  • Precisión general: Indica el porcentaje de observaciones correctamente clasificadas. Una precisión alta significa que el modelo es efectivo en su tarea de clasificación.
  • Sensibilidad y Especificidad: Evalúan el desempeño del modelo para cada grupo. La sensibilidad mide la proporción de observaciones de un grupo que el modelo identifica correctamente, mientras que la especificidad evalúa qué tan bien el modelo evita clasificar incorrectamente a otros grupos en el grupo de interés.
  • Valor predictivo positivo y negativo: Indican la proporción de observaciones clasificadas correctamente en un grupo particular frente a las predichas en dicho grupo.

Documentación de resultados

Para fines de un reporte o presentación, es útil documentar los resultados del modelo, incluyendo:

  • La función discriminante con sus coeficientes, que permite entender cómo las variables afectan la clasificación.
  • La matriz de confusión y métricas de desempeño, que resumen la efectividad del modelo.
  • Un análisis de las variables clave que influyen en la clasificación, explicando su relevancia en el contexto del análisis.
  • Una visualización gráfica, como los gráficos de los puntajes discriminantes o las fronteras de decisión, puede facilitar la comprensión de los resultados y ayudar a comunicar los hallazgos de manera efectiva.

Ejemplo 1

Para este primer ejemplo, trabajaremos con la base de datos denominada Banco , que podemos descargar desde la plataforma de Moodle. Esta base contiene información acerca de 32 clientes a los que se les concedió un préstamo instantáneo por un importe de 12000 dólares cada uno. Una vez pasados tres años desde la concesión de los préstamos había 16 clientes que fueron clasificados como deudores, mientras que los otros clientes cumplieron, ya que reintegraron el préstamo. Para cada uno de los clientes se dispone de información sobre su patrimonio neto y deudas pendientes correspondientes al momento de la solicitud. Con la información sobre las variables de patrimonio neto y deudas pendientes se desea construir una función discriminante que clasifique con los menores errores posibles a los clientes en dos grupos: deudores y no deudores.

Solución paso a paso:

Paso 1

Preparación de los datos:

data1 <- read.csv("Banco.csv")
str(data1)
## 'data.frame':    100 obs. of  3 variables:
##  $ patrimonio: num  17198 18849 27794 20353 20646 ...
##  $ deuda     : num  4309 16269 12132 8525 14476 ...
##  $ grupo     : int  1 1 1 1 1 1 1 1 1 1 ...

Debemos convertir la variable “grupo” en una variable categórica. Esto se puede hacer de la siguiente manera:

data1$grupo <- factor(data1$grupo,levels=c(1,2),labels=c("deudor","no_deudor"))
str(data1)
## 'data.frame':    100 obs. of  3 variables:
##  $ patrimonio: num  17198 18849 27794 20353 20646 ...
##  $ deuda     : num  4309 16269 12132 8525 14476 ...
##  $ grupo     : Factor w/ 2 levels "deudor","no_deudor": 1 1 1 1 1 1 1 1 1 1 ...

Luego de verificar que los datos están cargados de forma correcta, podrías visualizar los datos, verificar la normalidad multivariada en cada grupo y dividir de los datos en conjuntos de entrenamiento y prueba.

Visualización:

Para obtener una visión general de cómo se distribuyen los datos, generaremos un gráfico de dispersión de patrimonio frente a deuda, diferenciando los puntos por el grupo (deudores o no deudores). Esto permite observar si existe alguna separación natural entre los dos grupos.

library(ggplot2)

ggplot(data1) + aes(x=patrimonio,y=deuda,color=grupo) + 
  geom_point()  + 
  theme_bw() 

Prueba de normalidad multivariada:

Podemos utilizar cualquiera de las pruebas de normalidad multivariada vistas en clase. Por ejemplo, la prueba de Mardia para evaluar la normalidad multivariada simultánea de las variables patrimonio y deuda dentro de cada grupo.

library(MVN)

# Dividir los datos en dos grupos
deudores    <- subset(data1, grupo == "deudor")
no_deudores <- subset(data1, grupo == "no_deudor")

# Prueba de Mardia para normalidad multivariada en deudores
mvn(deudores[, c("patrimonio", "deuda")], mvnTest = "mardia")$multivariateNormality
##              Test          Statistic           p value Result
## 1 Mardia Skewness   1.53543364349599 0.820346851064475    YES
## 2 Mardia Kurtosis -0.479454425691982 0.631615382639936    YES
## 3             MVN               <NA>              <NA>    YES
# Prueba de Mardia para normalidad multivariada en no deudores
mvn(no_deudores[, c("patrimonio", "deuda")], mvnTest = "mardia")$multivariateNormality
##              Test           Statistic           p value Result
## 1 Mardia Skewness    6.79599866648899 0.147069562078214    YES
## 2 Mardia Kurtosis -0.0409299744273628 0.967351721325921    YES
## 3             MVN                <NA>              <NA>    YES

Conjuntos de entrenamiento y prueba:

Para evaluar el rendimiento del modelo de clasificación, dividiremos los datos en dos conjuntos: entrenamiento (80%) y prueba (20%). Esto nos permitirá entrenar el modelo en un subconjunto de los datos y luego evaluar su desempeño en el conjunto de prueba, simulando datos nuevos.

Para esta división se recomienda la función createDataPartition() de la librería caret. Esta función divide los datos de manera estratificada según el grupo, manteniendo la proporción de deudores y no deudores en ambos conjuntos.

library(caret)

# División de los datos: 80% entrenamiento y 20% prueba
set.seed(1234)  # Para reproducibilidad
Index         <- createDataPartition(data1$grupo, p = 0.8, list = F)
entrenamiento <- data1[Index, ]
prueba        <- data1[-Index, ]

Paso 2

Selección del método:

Para realizar el Análisis Discriminante en este conjunto de datos, tenemos dos métodos principales: el Análisis Discriminante Lineal (LDA) y el Análisis Discriminante Cuadrático (QDA). La selección entre estos dos métodos depende de la homogeneidad de las matrices de covarianza entre los grupos (deudores y no deudores).

La prueba de Box’s M: es una prueba estadística que evalúa si las matrices de covarianza de los grupos son iguales.

library(biotools)

# Aplicar la prueba de Box's M
boxM <- boxM(entrenamiento[, c("patrimonio", "deuda")], entrenamiento$grupo)
boxM
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  entrenamiento[, c("patrimonio", "deuda")]
## Chi-Sq (approx.) = 5.4221, df = 3, p-value = 0.1434

Como el \(p-value=0.1434>0.05\), el método elegido sería LDA.

Paso 3

Creación de la función discriminante:

Dado que el LDA es el método adecuado, ajustaremos un modelo lineal que clasifique a los clientes en “deudores” y “no deudores” en función de las variables patrimonio y deuda.

library(MASS)

# Ajustar el modelo de ADL utilizando el conjunto de entrenamiento
modelo_lda <- lda(grupo ~ patrimonio + deuda, data = entrenamiento)
modelo_lda
## Call:
## lda(grupo ~ patrimonio + deuda, data = entrenamiento)
## 
## Prior probabilities of groups:
##    deudor no_deudor 
## 0.2839506 0.7160494 
## 
## Group means:
##           patrimonio     deuda
## deudor      20237.10 11677.066
## no_deudor   39013.98  8499.432
## 
## Coefficients of linear discriminants:
##                      LD1
## patrimonio  1.730611e-04
## deuda      -8.500117e-05

Paso 4

Validación del modelo:

Primero, evaluaremos el rendimiento del modelo en el conjunto de prueba, comparando las predicciones del modelo con los valores reales de los grupos (“deudor” o “no deudor”) mediante una matriz de confusión. Esto nos permitirá calcular métricas de desempeño como la precisión, la sensibilidad y la especificidad.

library(caret)

# Realizar predicciones en el conjunto de prueba
predicciones_lda <- predict(modelo_lda, prueba)

# Crear la matriz de confusión para el conjunto de prueba
MC_prueba <- confusionMatrix(predicciones_lda$class, prueba$grupo)
MC_prueba
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  deudor no_deudor
##   deudor         5         0
##   no_deudor      0        14
##                                      
##                Accuracy : 1          
##                  95% CI : (0.8235, 1)
##     No Information Rate : 0.7368     
##     P-Value [Acc > NIR] : 0.003021   
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 1.0000     
##          Pos Pred Value : 1.0000     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.2632     
##          Detection Rate : 0.2632     
##    Detection Prevalence : 0.2632     
##       Balanced Accuracy : 1.0000     
##                                      
##        'Positive' Class : deudor     
## 

De igual forma, por medio de validación cruzada permite evaluar la capacidad del modelo para generalizarse a datos nuevos. Usaremos una validación cruzada de \(k = 10\) (es decir, dividimos el conjunto de entrenamiento en 10 partes y entrenamos y evaluamos el modelo en cada una de ellas).

# Configurar la validación cruzada con caret
control <- trainControl(method = "cv", number = 10,savePredictions = "all")

# Realizar validación cruzada en el modelo de ADL
modelo_lda_cv <- train(grupo ~ patrimonio + deuda, data = entrenamiento,
                       method = "lda", trControl = control)
# Extraer las predicciones de todas las particiones
predicciones_cv <- modelo_lda_cv$pred

# Crear una matriz de confusión combinada
MC_cv <- confusionMatrix(predicciones_cv$pred, predicciones_cv$obs)

MC_cv
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  deudor no_deudor
##   deudor        23         2
##   no_deudor      0        56
##                                          
##                Accuracy : 0.9753         
##                  95% CI : (0.9136, 0.997)
##     No Information Rate : 0.716          
##     P-Value [Acc > NIR] : 9.658e-10      
##                                          
##                   Kappa : 0.9408         
##                                          
##  Mcnemar's Test P-Value : 0.4795         
##                                          
##             Sensitivity : 1.0000         
##             Specificity : 0.9655         
##          Pos Pred Value : 0.9200         
##          Neg Pred Value : 1.0000         
##              Prevalence : 0.2840         
##          Detection Rate : 0.2840         
##    Detection Prevalence : 0.3086         
##       Balanced Accuracy : 0.9828         
##                                          
##        'Positive' Class : deudor         
## 

Paso 5

Interpretación de los resultados:

De la salida del modelo podemos interpretar:

Probabilidades a priori de los grupos:

  • deudor: 0.284
  • no_deudor: 0.716

Estas probabilidades representan la proporción de observaciones en cada grupo dentro del conjunto de entrenamiento. Aquí, el 28.4% de los clientes en el conjunto de entrenamiento son deudores, mientras que el 71.6% son no deudores. Valores bastante similares a los reales de todo el conunto de datos.

Interpretación de los coeficientes:

  • Patrimonio (1.730611e-04): Este coeficiente es positivo, lo que sugiere que a medida que aumenta el patrimonio, es más probable que el cliente sea clasificado como no deudor. La magnitud relativamente alta de este coeficiente (en comparación con el coeficiente de deuda) indica que patrimonio es una variable importante para distinguir entre deudores y no deudores.

  • Deuda (-8.500117e-05): Este coeficiente es negativo, lo que implica que un aumento en la deuda incrementa la probabilidad de que el cliente sea clasificado como deudor. Aunque el coeficiente es menor en magnitud comparado con patrimonio, también tiene una contribución significativa a la función discriminante.

Este análisis sugiere que un cliente con un patrimonio alto y una deuda baja tiene más probabilidades de ser clasificado como no deudor, mientras que un cliente con un patrimonio bajo y una deuda alta es más probable que sea clasificado como deudor.

Interpretación de las matrices de confusión:

Al comparar ambas matrices de confusión, observamos lo siguiente:

  • Desempeño en el Cconjunto de prueba: El modelo mostró un rendimiento perfecto en el conjunto de prueba, clasificando correctamente a todos los clientes en “deudores” y “no deudores”. Esto sugiere que el modelo es capaz de generalizar bien a nuevos datos, aunque el tamaño reducido del conjunto de prueba podría estar influyendo en este resultado positivo.

  • Desempeño en validación cruzada: La precisión promedio en la validación cruzada fue del 97.53%, con un equilibrio adecuado entre sensibilidad y especificidad. Aunque se observan algunos errores de clasificación en diferentes particiones, el modelo sigue mostrando una buena capacidad de clasificación. El índice de Kappa de 0.9408 indica un buen acuerdo y refuerza la fiabilidad del modelo.

Una forma de visualizar la clasificación la podemos obtener con la función partimat() de la librería klar. Permite visualizar la clasificación de un modelo de discriminante para cada combinación de variables, mostrando cómo el modelo separa los grupos en el espacio de predicción. Este tipo de gráfico puede ayudarte a visualizar la frontera de decisión y la separación entre los grupos (“deudores” y “no deudores”) en función de las variables patrimonio y deuda.

library(klaR)
partimat(grupo ~ deuda+patrimonio,data1,main="Discriminación con LDA",
         method = "lda", image.colors = c("lightgreen", "skyblue2"),
         col.mean = "red")

Ejemplo 2

Para este segundo ejemplo, trabajaremos con la base de datos denominada banknote , de la librería mclust. En esta base de datos se han registrado múltiples variables para 100 billetes auténticos y 100 billetes falsos.

La base de datos contiene las siguientes variables:

  • Status: si es autentico (genuine) o falso (counterfeit).
  • Length: longitud.
  • Left: Ancho del borde izquierdo.
  • Right: Ancho del borde derecho.
  • Bottom: Ancho del borde inferior.
  • Top: Ancho del borde superior.
  • Diagonal: longitud diagonal.

Vamos a explorar cómo se puede aplicar el Análisis Discriminante para clasificar los billetes en dos categorías (auténtico o falso) basándonos en sus características.

Solución paso a paso

Paso 1

Preparación de los datos:

library(mclust)

# Cargar los datos de banknote
data2 <- banknote

str(data2)
## 'data.frame':    200 obs. of  7 variables:
##  $ Status  : Factor w/ 2 levels "counterfeit",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Length  : num  215 215 215 215 215 ...
##  $ Left    : num  131 130 130 130 130 ...
##  $ Right   : num  131 130 130 130 130 ...
##  $ Bottom  : num  9 8.1 8.7 7.5 10.4 9 7.9 7.2 8.2 9.2 ...
##  $ Top     : num  9.7 9.5 9.6 10.4 7.7 10.1 9.6 10.7 11 10 ...
##  $ Diagonal: num  141 142 142 142 142 ...

Como R ya reconoce la variable categórica, no es necesario hacer ningún ajuste en las variables. Además, como tenemos más de tres variables es imposible intentar hacer una visualización de todas las variables, pero podemos revisar por lo menos las gráficas pareadas de las diferentes variables.

pairs(x = data2[,-1], col = c("blue", "green3")[banknote$Status],
      pch = 20)

En este gráfico de pares, cada variable se grafica contra todas las demás, lo que permite observar posibles patrones de separación entre los billetes auténticos y falsos en cada combinación de variables. Las combinaciones donde se observa una clara separación de los puntos rojos y azules son buenas candidatas para contribuir de manera efectiva a la clasificación entre los grupos.

Ahora dividamos el conjunto en entrenamiento y prueba.

library(caret)

# División de los datos: 75% entrenamiento y 25% prueba
set.seed(1234)  # Para reproducibilidad
Index         <- createDataPartition(data2$Status, p = 0.75, list = F)
entrenamiento <- data2[Index, ]
prueba        <- data2[-Index, ]

Paso 2

Selección del método:

Aplicamos la prueba de Box’s M.

library(biotools)

# Aplicar la prueba de Box's M para evaluar la homogeneidad de las matrices de covarianza
boxM2 <- boxM(entrenamiento[, -1], entrenamiento$Status)
boxM2
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  entrenamiento[, -1]
## Chi-Sq (approx.) = 85.717, df = 21, p-value = 8.753e-10

Como el \(p−value \approx 0\), el método elegido sería QDA.

Paso 3

Creación de la función discriminante:

Dado que el QDA es el método adecuado, ajustaremos un modelo cuadrático.

# Ajustar el modelo de ADQ utilizando el conjunto de entrenamiento
modelo_qda <- qda(Status ~ ., data = entrenamiento)
modelo_qda
## Call:
## qda(Status ~ ., data = entrenamiento)
## 
## Prior probabilities of groups:
## counterfeit     genuine 
##         0.5         0.5 
## 
## Group means:
##               Length     Left    Right   Bottom      Top Diagonal
## counterfeit 214.8040 130.3080 130.1973 10.61333 11.07467 139.4413
## genuine     214.9587 129.9253 129.7227  8.26800 10.21600 141.4707

La idea seria mirar cuales variables tiene alguna diferencia entre los dos grupos. Por ejemplo, las variables: Botton, Top y Diagonal, presentan diferencias importantes que ayudarán en la discriminación.

Paso 4

Validación del modelo:

Evaluamos el conjunto de prueba.

# Realizar predicciones en el conjunto de prueba
predicciones_qda <- predict(modelo_qda,prueba)

library(caret)

# Crear la matriz de confusión usando las predicciones en el conjunto de prueba
MC2 <- confusionMatrix(predicciones_qda$class, prueba$Status)
MC2
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    counterfeit genuine
##   counterfeit          25       0
##   genuine               0      25
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9289, 1)
##     No Information Rate : 0.5        
##     P-Value [Acc > NIR] : 8.882e-16  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : 1.0        
##             Specificity : 1.0        
##          Pos Pred Value : 1.0        
##          Neg Pred Value : 1.0        
##              Prevalence : 0.5        
##          Detection Rate : 0.5        
##    Detection Prevalence : 0.5        
##       Balanced Accuracy : 1.0        
##                                      
##        'Positive' Class : counterfeit
## 

La validación cruzada permite evaluar el modelo de ADQ en diferentes particiones del conjunto de datos, proporcionando una medida más estable de su rendimiento. Aquí realizaremos una validación cruzada de 10 partes (10-fold cross-validation) en el conjunto de entrenamiento.

# Configurar la validación cruzada con caret
control <- trainControl(method = "cv", number = 10, savePredictions = "all")

# Entrenar el modelo de ADQ con validación cruzada
modelo_qda_cv <- train(Status ~ Length + Left + Right + Bottom + Top + Diagonal, 
                       data = entrenamiento, method = "qda", trControl = control)

# Extraer las predicciones de todas las particiones
predicciones2_cv <- modelo_qda_cv$pred

# Crear una matriz de confusión combinada
MC2_cv <- confusionMatrix(predicciones2_cv$pred, predicciones2_cv$obs)

MC2_cv
## Confusion Matrix and Statistics
## 
##              Reference
## Prediction    counterfeit genuine
##   counterfeit          75       1
##   genuine               0      74
##                                           
##                Accuracy : 0.9933          
##                  95% CI : (0.9634, 0.9998)
##     No Information Rate : 0.5             
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9867          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.9867          
##          Pos Pred Value : 0.9868          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.5000          
##          Detection Rate : 0.5000          
##    Detection Prevalence : 0.5067          
##       Balanced Accuracy : 0.9933          
##                                           
##        'Positive' Class : counterfeit     
## 

Paso 5

Interpretación de resultados:

Las probabilidades a priori del 50% para cada grupo, muestran el buen trabajo hecho en la repartición de observaciones.

Las matrices de confusión muestran un gran desempeño por cualquier de los dos métodos.

Finalmente podemos visualizar como se hicieron las discriminaciones entre cada par de variables.

partimat(Status ~ .,data2, main="Discrminación",
         method = "qda", image.colors = c("lightgreen", "skyblue2"),
         col.mean = "red")

Tarea 13:

Aplique todo lo aprendido en clase sobre “Análisis Discriminante” para solucionar los siguientes ejercicios. Las bases de datos necesarias para trabajar los ejercicios las puedes descargar desde la plataforma de Moodle Institucional.

Ejercicio 1. Admitidos: Se tiene la base de datos denominada Academico , que podemos descargar desde la plataforma de Moodle. Esta base de datos fue creada para discriminar la admisión de estudiantes a la Escuela Graduada de Negocios. Se hicieron tres pruebas (Economía, Finanzas y Matemáticas), y se cuenta con la puntuación de la universidad de procedencia y su GPA. La codificación de los grupos es (1) admitido y (2) no admitido. Realice un análisis de discriminante para evaluar si la función discriminante que se está aplicando es adecuada.

Ejercicio 2. Iris: Aplique la técnica de análisis de discriminante a la base de datos iris de R y compruebe si es sencillo discriminar cada especie.

\[ \]