EJERCICIO 1

Data <- read.csv("Academico.csv")
str(Data)
## 'data.frame':    54 obs. of  7 variables:
##  $ Estudiante  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Quimica     : num  52.2 50.9 52.6 52.6 50.5 ...
##  $ Fisica      : num  51.2 51.5 48.9 52.5 51.9 ...
##  $ Matematicas : num  49.9 52.7 47.9 48.6 50.1 ...
##  $ Clasecolegio: int  6 7 5 5 5 6 7 7 6 5 ...
##  $ GPA         : num  3.04 3.04 3.44 3.44 2.88 3.28 3.76 2.8 3.28 3.36 ...
##  $ Grupo       : int  1 1 1 1 1 1 1 1 1 1 ...

Paso 1: Preparacion de los datos

Procedemos a convertir la variable “Clas_colegio” y “Grupo” en una variable categorica.

Data$Grupo <- factor(Data$Grupo,levels=c(1,2),labels=c("admitido","no_admitido"))
str(Data)
## 'data.frame':    54 obs. of  7 variables:
##  $ Estudiante  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Quimica     : num  52.2 50.9 52.6 52.6 50.5 ...
##  $ Fisica      : num  51.2 51.5 48.9 52.5 51.9 ...
##  $ Matematicas : num  49.9 52.7 47.9 48.6 50.1 ...
##  $ Clasecolegio: int  6 7 5 5 5 6 7 7 6 5 ...
##  $ GPA         : num  3.04 3.04 3.44 3.44 2.88 3.28 3.76 2.8 3.28 3.36 ...
##  $ Grupo       : Factor w/ 2 levels "admitido","no_admitido": 1 1 1 1 1 1 1 1 1 1 ...
Data$Clasecolegio <- factor(Data$Clasecolegio, 
                            levels = c(2, 3, 4, 5, 6, 7), 
                            labels = c("Clase 2", "Clase 3", "Clase 4", 
                                       "Clase 5", "Clase 6", "Clase 7"))
str(Data)
## 'data.frame':    54 obs. of  7 variables:
##  $ Estudiante  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Quimica     : num  52.2 50.9 52.6 52.6 50.5 ...
##  $ Fisica      : num  51.2 51.5 48.9 52.5 51.9 ...
##  $ Matematicas : num  49.9 52.7 47.9 48.6 50.1 ...
##  $ Clasecolegio: Factor w/ 6 levels "Clase 2","Clase 3",..: 5 6 4 4 4 5 6 6 5 4 ...
##  $ GPA         : num  3.04 3.04 3.44 3.44 2.88 3.28 3.76 2.8 3.28 3.36 ...
##  $ Grupo       : Factor w/ 2 levels "admitido","no_admitido": 1 1 1 1 1 1 1 1 1 1 ...

Ya que los datos se encuentran cargados de forma correcta, procedemos a visualizar los datos, verificando la normalidad multivariada en cada grupo y dividir 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 que relacione dos de las variables continuas, como las puntuaciones en Matemáticas frente a Física , diferenciando los puntos por el grupo (admitidos o no admitidos). Esto permitirá observar si existe alguna separación natural entre los dos grupos en función de estas variables.

Visualizacion de todas las variables:

Estudiantes admitidos en rojo y no adimitidos en azul

pairs(x = Data[,c(2,3,4,6)], col = c("red", "blue")[Data$Grupo], pch = 20)

La gráfica de pares muestra la relación entre las variables cuantitativas del conjunto de datos, como puntajes en Matemáticas, Física, y Química, para diferenciar entre estudiantes admitidos (rojo) y no admitidos (azul). Se observa que las variables tienen alta correlacion especialmente los admitidos tienden a tener valores más altos en los cursos, mientras que los no admitidos suelen concentrarse en valores más bajos.Las combinaciones con la variable GPA 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.

Comprobamos normalidad de los datos

Dividir los datos en dos grupos:

admitido    <- subset(Data, Grupo == "admitido")      # 1: Admitidos
no_admitido <- subset(Data, Grupo == "no_admitido")      # 2: No admitido

Prueba de Mardia para normalidad multivariada en admitidos

library(MVN) 
## Warning: package 'MVN' was built under R version 4.3.3
mvn(admitido[, c("Matematicas", "Fisica", "Quimica", "GPA")], mvnTest = "mardia")$multivariateNormality
##              Test          Statistic           p value Result
## 1 Mardia Skewness   10.9557514232931 0.947361957881306    YES
## 2 Mardia Kurtosis -0.859137876973054 0.390264452338552    YES
## 3             MVN               <NA>              <NA>    YES

Prueba de Mardia para normalidad multivariada en no admitidos

mvn(no_admitido[, c("Matematicas", "Fisica", "Quimica","GPA")], mvnTest = "mardia")$multivariateNormality
##              Test         Statistic            p value Result
## 1 Mardia Skewness  34.1215598453403 0.0253140490119236     NO
## 2 Mardia Kurtosis 0.720108463414653  0.471458216968328    YES
## 3             MVN              <NA>               <NA>     NO

Los datos del grupo de los estudiantes admitidos siguen una distribucion normal sin embargo, el grupo de los no admitido no muestra normalidad.

library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.3
## Loading required package: lattice

División de los datos: 80% entrenamiento y 20% prueba

set.seed(1234)  # Para reproducibilidad
Index         <- createDataPartition(Data$Grupo, p = 0.80,list = F)
entrenamiento <- Data[Index, ]
prueba        <- Data[-Index, ]

Paso 2: Seleccion del metodo

La prueba de Box’s M:

library(biotools)
## Warning: package 'biotools' was built under R version 4.3.3
## Loading required package: MASS
## ---
## biotools version 4.2

Aplicar la prueba de Box’s M

boxM <- boxM(entrenamiento[, c("Matematicas", "Fisica", "Quimica","GPA")], entrenamiento$Grupo)
boxM
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  entrenamiento[, c("Matematicas", "Fisica", "Quimica", "GPA")]
## Chi-Sq (approx.) = 4.743, df = 10, p-value = 0.9077

Como el p−value = 0.9681 > 0.05, el método elegido sería LDA.

Paso 3: Creacion de la funcion discriminante

Dado que el análisis discriminante lineal (LDA) es el método adecuado, ajustaremos un modelo lineal que clasifique a los estudiantes en “admitidos” y “no admitidos” en función de las variables académicas.Este modelo evaluará cómo estas características pueden separar de manera efectiva ambos grupos y predecir la probabilidad de admisión de nuevos candidatos.

library(MASS)

Ajustar el modelo de ADL utilizando el conjunto de entrenamiento

modelo_lda <- lda(Grupo ~ Matematicas + Fisica + Quimica + GPA, 
                  data = entrenamiento)
modelo_lda
## Call:
## lda(Grupo ~ Matematicas + Fisica + Quimica + GPA, data = entrenamiento)
## 
## Prior probabilities of groups:
##    admitido no_admitido 
##   0.6363636   0.3636364 
## 
## Group means:
##             Matematicas   Fisica  Quimica      GPA
## admitido       49.89464 49.80500 51.09071 3.171429
## no_admitido    45.15750 44.73062 46.69875 2.450000
## 
## Coefficients of linear discriminants:
##                      LD1
## Matematicas -0.035654974
## Fisica       0.004665773
## Quimica     -0.016064554
## GPA         -2.553760136

Observaciones:

Hay más estudiantes admitidos (64%) que no admitidos (36%). Los estudiantes admitidos tienen puntajes más altos en todas las materias y un GPA promedio mayor en comparación con los no admitidos. En detalle:

Interpretación de los coeficientes: * Matemáticas (0.0485): Este coeficiente positivo indica que los estudiantes con puntajes más altos en Matemáticas tienen una mayor probabilidad de ser admitidos. * Física (-0.0382): El coeficiente negativo sugiere que, para este modelo, puntajes más altos en Física están asociados con una menor probabilidad de admisión, aunque su impacto es menor comparado con Química o GPA. * Química (-0.0523): Similar a Física, este coeficiente negativo implica que los puntajes más altos en Química están asociados con una menor probabilidad de ser admitido. * GPA (-2.4204): Este coeficiente negativo, de mayor magnitud, tiene un impacto significativo en la clasificación. A pesar de ser contraintuitivo, podría reflejar un efecto de interacción con otras variables o una estructura compleja en los datos.

Conclusión: Los resultados sugieren que Matemáticas es la variable con el impacto positivo más claro en la probabilidad de admisión, mientras que Física y Química contribuyen negativamente, aunque con menor magnitud.

Paso 4: VAlidacion del modelo

library(caret)

Realizar predicciones en el conjunto de prueba

predicciones_lda <- predict(modelo_lda, prueba)
predicciones_lda
## $class
##  [1] admitido    admitido    admitido    admitido    admitido    admitido   
##  [7] no_admitido no_admitido no_admitido no_admitido
## Levels: admitido no_admitido
## 
## $posterior
##       admitido no_admitido
## 1  0.881564215 0.118435785
## 11 0.956210167 0.043789833
## 20 0.983566899 0.016433101
## 21 0.981596591 0.018403409
## 27 0.776755753 0.223244247
## 31 0.995635309 0.004364691
## 35 0.136512466 0.863487534
## 50 0.467581377 0.532418623
## 51 0.003605286 0.996394714
## 53 0.294561717 0.705438283
## 
## $x
##           LD1
## 1  -0.4227534
## 11 -0.9456772
## 20 -1.4355920
## 21 -1.3795980
## 27 -0.0532603
## 31 -2.0856680
## 35  1.4487887
## 50  0.6156534
## 51  3.2840301
## 53  0.9768897

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    admitido no_admitido
##   admitido           6           0
##   no_admitido        0           4
##                                      
##                Accuracy : 1          
##                  95% CI : (0.6915, 1)
##     No Information Rate : 0.6        
##     P-Value [Acc > NIR] : 0.006047   
##                                      
##                   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.6        
##          Detection Rate : 0.6        
##    Detection Prevalence : 0.6        
##       Balanced Accuracy : 1.0        
##                                      
##        'Positive' Class : admitido   
## 

La matriz de confusión para el conjunto de prueba indica que el modelo tiene un alto nivel de precisión global (90%), clasificando correctamente a 9 de los 10 estudiantes. sensibilidad del 100% sugiere que el modelo identifica perfectamente a los estudiantes admitidos (6 de 6). Sin embargo, la especificidad del 75% muestraque, aunque el modelo identifica correctamente a la mayoría de los no admitidos (3 de 4), comete un error al clasificar a un estudiante no admitido como admitido. El valor predictivo positivo (85.71%) y el valor predictivo negativo (100%) refuerzan la confiabilidad del modelo en clasificar adecuadamente a los admitidos y no admitidos. El índice Kappa (0.7826) refleja un buen nivel de acuerdo entre las predicciones del modelo y las clasificaciones reales, superando significativamente la tasa de información por azar (60%).

Configurar la validación cruzada con caret:

A través de la validación cruzada, es posible evaluar la capacidad del modelo para generalizar su desempeño a datos no observados. Para este caso, se implementará una validación cruzada con𝑘=10, lo que implica dividir el conjunto de entrenamiento de la base de datos Académico en 10 partes. El modelo se entrenará utilizando 9 de estas partes y se evaluará en la restante, repitiendo este proceso de manera iterativa para cada partición. Esto garantiza una evaluación más robusta del modelo en la clasificación de estudiantes admitidos y no admitidos.

control <- trainControl(method = "cv", number = 10,savePredictions = "all")

Realizar validación cruzada en el modelo de ADL:

modelo_lda_cv <- train(Grupo ~ Matematicas + Fisica + Quimica, 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    admitido no_admitido
##   admitido          21          10
##   no_admitido        7           6
##                                          
##                Accuracy : 0.6136         
##                  95% CI : (0.455, 0.7564)
##     No Information Rate : 0.6364         
##     P-Value [Acc > NIR] : 0.6846         
##                                          
##                   Kappa : 0.1302         
##                                          
##  Mcnemar's Test P-Value : 0.6276         
##                                          
##             Sensitivity : 0.7500         
##             Specificity : 0.3750         
##          Pos Pred Value : 0.6774         
##          Neg Pred Value : 0.4615         
##              Prevalence : 0.6364         
##          Detection Rate : 0.4773         
##    Detection Prevalence : 0.7045         
##       Balanced Accuracy : 0.5625         
##                                          
##        'Positive' Class : admitido       
## 

La matriz de confusión combinada muestra que el modelo tiene una precisión del 63.64%, con una buena capacidad para identificar estudiantes admitidos (sensibilidad del 75%) pero un desempeño limitado al clasificar no admitidos (especificidad del 43.75%). El índice Kappa (0.1927) sugiere un bajo acuerdo entre las predicciones y las clasificaciones reales. Aunque el modelo predice razonablemente bien a los admitidos, tiene dificultades significativas con los no admitidos, lo que limita su efectividad general.

Paso 5: Interpretacion de los resultados

Probabilidades a priori de los grupos:

Interpretación de los coeficientes:

Interpretación de las matrices de confusión:

Visualización de la clasificación:

library(klaR)
## Warning: package 'klaR' was built under R version 4.3.3
Datan <- Data[,c(2,3,4,6,7)]

partimat(Grupo ~ .,data=Datan, main="Discriminación con LDA",
         method = "lda", image.colors = c("lightgreen", "skyblue2"),
         col.mean = "red")

En la gráfica, el fondo verde claro representa la región de clasificación para los estudiantes admitidos, mientras que el fondo celeste corresponde a los no admitidos.

El modelo muestra un error de clasificación relativamente alto en las relaciones entre los puntajes de los cursos (Matemáticas, Física, Química), lo que sugiere que estas variables no separan claramente a los grupos en el espacio discriminante. Por el contrario, las relaciones que incluyen el GPA como variable destacan por una separación más definida entre admitidos y no admitidos. Esto indica que el GPA tiene un poder discriminante significativamente mayor en comparación con las materias individuales, lo que lo convierte en un factor clave para la clasificación.

EJERCICIO 2

iris <- iris
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Paso 1: Preparacion de los datos

Procedemos a convertir la variable “Species” en una variable categorica.

Ya que los datos se encuentran cargados de forma correcta, procedemos a visualizar los datos, verificando la normalidad multivariada en cada grupo y dividir 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 que relacione dos de las variables continuas, como el Sepal.Length frente a Sepal.Width, diferenciando los puntos por la especie de la planta. Esto permitirá observar si existe alguna separación natural entre las especies en función de estas variables.

Visualización de todas las variables:

‘setosa’ en rojo, ‘versicolor’ en azul y ‘virginica’ en verde

pairs(x = iris[,c(1,2,3,4)], col = c("red", "blue", "green")[iris$Species], pch = 20)

La gráfica de pares muestra una clara separación entre setosa (rojo) y las otras dos especies, especialmente en las dimensiones de los pétalos (Petal.Length y Petal.Width), lo que indica que estas variables son las más discriminantes. Sin embargo, hay un solapamiento significativo entre versicolor (azul) y virginica (verde), lo que sugiere que estas especies tienen características más similares y podrían ser más difíciles de distinguir. También se observan relaciones positivas marcadas entre las variables de pétalos para las tres especies, mientras que las dimensiones de los sépalos (Sepal.Length y Sepal.Width) muestran patrones menos evidentes, siendo menos útiles para la clasificación. En general, las variables de pétalos ofrecen mayor capacidad para discriminar entre las especies, especialmente para diferenciar a setosa del resto.

Comprobamos normalidad de los datos

Dividir los datos en dos grupos:

setosa   <- subset(iris,Species == "setosa")      
versicolor <- subset(iris,Species == "versicolor")      
virginica <- subset(iris,Species == "virginica")
library(MVN) 

Prueba de Mardia para setosa

mvn(setosa[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], mvnTest = "mardia")$multivariateNormality
##              Test        Statistic           p value Result
## 1 Mardia Skewness 25.6643445196298 0.177185884467652    YES
## 2 Mardia Kurtosis 1.29499223711605 0.195322907441935    YES
## 3             MVN             <NA>              <NA>    YES

Prueba de Mardia para versicolor

mvn(versicolor[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], mvnTest = "mardia")$multivariateNormality
##              Test         Statistic           p value Result
## 1 Mardia Skewness  25.1850115362466 0.194444483140265    YES
## 2 Mardia Kurtosis -0.57186635893429 0.567412516528727    YES
## 3             MVN              <NA>              <NA>    YES

Prueba de Mardia para virginica

mvn(virginica[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], mvnTest = "mardia")$multivariateNormality
##              Test         Statistic           p value Result
## 1 Mardia Skewness  26.2705981752915 0.157059707690356    YES
## 2 Mardia Kurtosis 0.152614173978342 0.878702546726567    YES
## 3             MVN              <NA>              <NA>    YES

Los resultados de las pruebas de Mardia indican que los datos de cada grupo de especies (setosa, versicolor y virginica) cumplen con los supuestos de normalidad multivariada, ya que los valores de asimetría y curtosis se encuentran dentro de los rangos esperados y los p-valores son mayores a 0.05.

library(caret)

División de los datos: 80% entrenamiento y 20% prueba

set.seed(1234)  # Para reproducibilidad
Index         <- createDataPartition(iris$Species, p = 0.80,list = F)
entrenamiento <- iris[Index, ]
prueba        <- iris[-Index, ]

Paso 2: Seleccion del metodo

La prueba de Box’s M:

library(biotools)

Aplicar la prueba de Box’s M

boxM <- boxM(entrenamiento[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")], entrenamiento$Species)
boxM
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  entrenamiento[, c("Sepal.Length", "Sepal.Width", "Petal.Length",     "Petal.Width")]
## Chi-Sq (approx.) = 118.87, df = 20, p-value = 4.616e-16

Como el p−value ≈ 0, el método elegido sería QDA.

Paso 3: Creacion de la funcion discriminante

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

library(MASS)

Ajustar el modelo de ADQ utilizando el conjunto de entrenamiento

modelo_qda <- qda(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, 
                  data = entrenamiento)
modelo_qda
## Call:
## qda(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, 
##     data = entrenamiento)
## 
## Prior probabilities of groups:
##     setosa versicolor  virginica 
##  0.3333333  0.3333333  0.3333333 
## 
## Group means:
##            Sepal.Length Sepal.Width Petal.Length Petal.Width
## setosa           5.0050      3.4150       1.4575      0.2525
## versicolor       5.9175      2.7700       4.2400      1.3275
## virginica        6.6950      3.0125       5.6050      2.0225

Observaciones:

El resultado del modelo de Análisis Discriminante Cuadrático (ADQ) muestra que las probabilidades a priori para las tres especies (setosa, versicolor, virginica) son iguales, con un valor de 0.3333 para cada una, lo que sugiere que los datos de entrenamiento están equilibrados entre las especies. Las medias grupales indican que las especies presentan diferencias notables en las características estudiadas. Setosa tiene los valores más bajos en las características de los pétalos, como Petal.Length y Petal.Width, lo que sugiere que sus pétalos son más pequeños en comparación con las otras especies. Versicolor muestra valores intermedios en todas las variables, mientras que virginica tiene los valores más altos, especialmente en las características de los pétalos. Estas diferencias en las medias, especialmente en las variables relacionadas con los pétalos, son fundamentales para la discriminación de las especies, lo que respalda la efectividad del modelo ADQ para la clasificación.

Paso 4: VAlidacion del modelo

library(caret)

Realizar predicciones en el conjunto de prueba

predicciones_qda <- predict(modelo_qda, prueba)
predicciones_qda
## $class
##  [1] setosa     setosa     setosa     setosa     setosa     setosa    
##  [7] setosa     setosa     setosa     setosa     versicolor versicolor
## [13] versicolor versicolor versicolor versicolor versicolor versicolor
## [19] versicolor versicolor virginica  virginica  virginica  virginica 
## [25] virginica  virginica  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica
## 
## $posterior
##            setosa   versicolor    virginica
## 1    1.000000e+00 7.890417e-26 2.176634e-44
## 10   1.000000e+00 8.049382e-21 4.073847e-38
## 11   1.000000e+00 1.243298e-28 6.270240e-48
## 13   1.000000e+00 4.566424e-20 4.331524e-38
## 17   1.000000e+00 4.976863e-29 1.715243e-49
## 18   1.000000e+00 4.608320e-24 7.576201e-43
## 25   1.000000e+00 1.422988e-19 2.118084e-30
## 27   1.000000e+00 3.105296e-19 7.802378e-36
## 33   1.000000e+00 1.819981e-36 3.114049e-50
## 43   1.000000e+00 1.277263e-20 2.916205e-35
## 54   3.090251e-59 9.991362e-01 8.637949e-04
## 64   2.334906e-84 9.883581e-01 1.164193e-02
## 77   2.859469e-92 9.995775e-01 4.225362e-04
## 78  4.519690e-105 8.642073e-01 1.357927e-01
## 80   2.083070e-36 1.000000e+00 7.351912e-09
## 83   1.194078e-51 9.999967e-01 3.291779e-06
## 87   2.007830e-86 9.997054e-01 2.945518e-04
## 91   1.711560e-69 9.797491e-01 2.025086e-02
## 95   1.145311e-63 9.989745e-01 1.025533e-03
## 96   3.536621e-59 9.996584e-01 3.415653e-04
## 101 3.303739e-185 4.178235e-08 1.000000e+00
## 105 6.998807e-163 3.782993e-06 9.999962e-01
## 107  9.410438e-88 1.824014e-02 9.817599e-01
## 112 3.291501e-128 8.167035e-04 9.991833e-01
## 115 5.163713e-143 1.514216e-12 1.000000e+00
## 120 2.899097e-105 7.581863e-02 9.241814e-01
## 125 8.220609e-151 8.498462e-04 9.991502e-01
## 127 2.253855e-100 5.525783e-02 9.447422e-01
## 129 5.336886e-150 6.802470e-06 9.999932e-01
## 133 1.812371e-154 2.210944e-07 9.999998e-01

Crear la matriz de confusión para el conjunto de prueba

MC_prueba <- confusionMatrix(predicciones_qda$class, prueba$Species)
MC_prueba
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   setosa versicolor virginica
##   setosa         10          0         0
##   versicolor      0         10         0
##   virginica       0          0        10
## 
## Overall Statistics
##                                      
##                Accuracy : 1          
##                  95% CI : (0.8843, 1)
##     No Information Rate : 0.3333     
##     P-Value [Acc > NIR] : 4.857e-15  
##                                      
##                   Kappa : 1          
##                                      
##  Mcnemar's Test P-Value : NA         
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            1.0000           1.0000
## Specificity                 1.0000            1.0000           1.0000
## Pos Pred Value              1.0000            1.0000           1.0000
## Neg Pred Value              1.0000            1.0000           1.0000
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3333           0.3333
## Detection Prevalence        0.3333            0.3333           0.3333
## Balanced Accuracy           1.0000            1.0000           1.0000

El modelo ha alcanzado un desempeño perfecto en el conjunto de prueba, con una precisión del 100%, ya que todas las predicciones coinciden con las categorías reales. La matriz de confusión muestra que cada especie (setosa, versicolor, virginica) fue correctamente clasificada sin errores. El valor de Kappa es 1, lo que indica un acuerdo perfecto entre las predicciones y las observaciones reales. Las métricas de sensibilidad, especificidad, valor predictivo positivo y negativo son todas 1, lo que demuestra que el modelo identificó correctamente tanto las clases positivas como las negativas. En resumen, el modelo ha mostrado una clasificación perfecta y confiable en todas las variables.

Configurar la validación cruzada con caret:

El modelo ha alcanzado un desempeño perfecto en el conjunto de prueba de la base de datos Iris, con una precisión del 100%, ya que todas las predicciones coinciden con las especies reales. La matriz de confusión muestra que las tres especies (setosa, versicolor, virginica) fueron correctamente clasificadas sin errores. El valor de Kappa es 1, lo que indica un acuerdo perfecto entre las predicciones y las observaciones reales. Las métricas de sensibilidad, especificidad, valor predictivo positivo y negativo son todas 1, lo que demuestra que el modelo identificó correctamente tanto las observaciones de cada especie como las no pertenecientes a ella. En resumen, el modelo ha mostrado una clasificación perfecta y confiable en todas las especies.

control <- trainControl(method = "cv", number = 10,savePredictions = "all")

# Entrenar el modelo de ADQ con validación cruzada
modelo_qda_cv <- train(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, 
                       data = entrenamiento, 
                       method = "qda", 
                       trControl = control)

Extraer las predicciones de todas las particiones

predicciones_cv <- modelo_qda_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   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         37         1
##   virginica       0          3        39
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9667          
##                  95% CI : (0.9169, 0.9908)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.95            
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9250           0.9750
## Specificity                 1.0000            0.9875           0.9625
## Pos Pred Value              1.0000            0.9737           0.9286
## Neg Pred Value              1.0000            0.9634           0.9872
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3083           0.3250
## Detection Prevalence        0.3333            0.3167           0.3500
## Balanced Accuracy           1.0000            0.9563           0.9688

Mostrar la matriz de confusión combinada y observacion:

El modelo QDA ha logrado un rendimiento excepcional en la clasificación de las especies de Iris, con una precisión global del 96.67%. La matriz de confusión muestra que el modelo clasificó correctamente la mayoría de las instancias de cada especie, con pocos errores, principalmente entre versicolor y virginica. La sensibilidad y especificidad fueron perfectas para setosa (100%), y muy altas para versicolor (92.5% de sensibilidad, 98.75% de especificidad) y virginica (97.5% de sensibilidad, 96.25% de especificidad). El valor de Kappa de 0.95 sugiere un acuerdo casi perfecto entre las predicciones y las clases reales. Además, las métricas como el valor predictivo positivo y el valor predictivo negativo también son altas, reflejando una clasificación precisa en todas las clases. En resumen, el modelo ha mostrado un rendimiento sobresaliente, con una capacidad destacada para distinguir entre las especies, con solo algunos errores menores.

Paso 5: Interpretacion de los resultados

Las probabilidades a priori de los grupos (setosa, versicolor, virginica) están equilibradas, con una probabilidad de aproximadamente 33.33% para cada especie, lo que refleja un buen balance entre las clases en el conjunto de entrenamiento.

Interpretación de los coeficientes:

Análisis global: El modelo de discriminante parece estar utilizando principalmente las características de Sepal.Length y Petal.Width para diferenciar entre las especies. Sin embargo, la relación negativa con algunas variables, como Petal.Length y Sepal.Width, podría ser indicativa de interacciones complejas entre estas características.

Interpretación de la matriz de confusión:

Análisis de las variables clave:

Sepal.Length y Petal.Width son las variables más influyentes en el modelo, con Petal.Width destacando como un buen predictor de algunas especies. Aunque algunas variables tienen efectos negativos, esto podría estar relacionado con cómo interactúan entre sí dentro del modelo, lo que implica que el rendimiento del clasificador es impulsado por una combinación de características.

Visualización de la clasificación:

library(klaR)

Usamos el dataframe iris y la variable dependiente ‘Species’

data2 <- iris[, c(1, 2, 3, 4, 5)] 

Ejecutar el método QDA con la variable dependiente ‘Species’

partimat(Species ~ ., data = data2, main = "Discriminación con QDA",
         method = "qda", image.colors = c("lightgreen", "skyblue2", "pink"),
         col.mean = "red")

En la gráfica, las regiones coloreadas (verde, azul claro y rosa) representan las áreas de clasificación para cada una de las especies (setosa, versicolor y virginica). Se observa que las relaciones entre las variables de los pétalos (Petal.Length y Petal.Width) muestran una clara separación entre las especies, con tasas de error muy bajas, lo que indica que estas variables tienen un alto poder discriminante. Por otro lado, las relaciones que involucran las variables de los sépalos (Sepal.Length y Sepal.Width) presentan áreas de solapamiento entre versicolor y virginica, reflejando errores de clasificación más altos. Esto sugiere que las características de los pétalos son más efectivas para diferenciar entre las especies, mientras que las variables de los sépalos tienen menor capacidad discriminante, especialmente para distinguir entre las especies más similares (versicolor y virginica).