EJERCICIO 1

data<- read.csv("Academico.csv")
head(data)
##   Estudiante Química Física Matemáticas Clas_colegio  GPA Grupo
## 1          1   52.16  51.16       49.87            6 3.04     1
## 2          2   50.94  51.52       52.70            7 3.04     1
## 3          3   52.59  48.89       47.87            5 3.44     1
## 4          4   52.59  52.50       48.64            5 3.44     1
## 5          5   50.50  51.93       50.07            5 2.88     1
## 6          6   53.84  57.09       53.29            6 3.28     1
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 ...
##  $ Química     : num  52.2 50.9 52.6 52.6 50.5 ...
##  $ Física      : num  51.2 51.5 48.9 52.5 51.9 ...
##  $ Matemáticas : num  49.9 52.7 47.9 48.6 50.1 ...
##  $ Clas_colegio: 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 ...
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
pairs(x= data[,c(2,3,4,6)], col= c('red', 'blue') [data$Grupo], pch =20)

library(MVN)
## Warning: package 'MVN' was built under R version 4.3.3
# Dividir los datos en dos grupos
admitido   <- subset(data, Grupo == "admitido")
no_admitido <- subset(data, Grupo == "no_admitido")

# Prueba de Mardia para normalidad multivariada en admitido
mvn(admitido[, c("Matemáticas", "Física", "Química", "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 admitido
mvn(no_admitido[, c("Matemáticas", "Física", "Química", "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
library(caret)
## Warning: package 'caret' 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.8, list = F)
entrenamiento <- data[Index, ]
prueba        <- data[-Index, ]

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("Matemáticas", "Física", "Química", "GPA")], entrenamiento$Grupo)
boxM
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  entrenamiento[, c("Matemáticas", "Física", "Química", "GPA")]
## Chi-Sq (approx.) = 4.743, df = 10, p-value = 0.9077
library(MASS)

# Ajustar el modelo de ADL utilizando el conjunto de entrenamiento
modelo_lda <- lda(Grupo ~ Matemáticas + Física + Química + GPA, data = entrenamiento)
modelo_lda
## Call:
## lda(Grupo ~ Matemáticas + Física + Química + GPA, data = entrenamiento)
## 
## Prior probabilities of groups:
##    admitido no_admitido 
##   0.6363636   0.3636364 
## 
## Group means:
##             Matemáticas   Física  Química      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
## Matemáticas -0.035654974
## Física       0.004665773
## Química     -0.016064554
## GPA         -2.553760136
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    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   
## 
# 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 ~ Clas_colegio + GPA, 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          27           4
##   no_admitido        1          12
##                                           
##                Accuracy : 0.8864          
##                  95% CI : (0.7544, 0.9621)
##     No Information Rate : 0.6364          
##     P-Value [Acc > NIR] : 0.0001925       
##                                           
##                   Kappa : 0.7442          
##                                           
##  Mcnemar's Test P-Value : 0.3710934       
##                                           
##             Sensitivity : 0.9643          
##             Specificity : 0.7500          
##          Pos Pred Value : 0.8710          
##          Neg Pred Value : 0.9231          
##              Prevalence : 0.6364          
##          Detection Rate : 0.6136          
##    Detection Prevalence : 0.7045          
##       Balanced Accuracy : 0.8571          
##                                           
##        'Positive' Class : admitido        
## 
library(klaR)
## Warning: package 'klaR' was built under R version 4.3.3
Data1 <- data[,c(2,3,4,6,7)]

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

Probabilidades a priori de los grupos: Se observó que el modelo distingue adecuadamente entre los estudiantes admitidos y no admitidos en función de las variables académicas evaluadas. Estas probabilidades reflejan una buena representación de las proporciones reales de cada grupo dentro de los datos. Interpretación de los coeficientes discriminantes: Los coeficientes de las variables indican su importancia relativa para discriminar entre admitidos y no admitidos. Por ejemplo: Variables como el GPA y las calificaciones en materias específicas (Química, Física y Matemáticas) mostraron ser determinantes significativas en la clasificación. Los coeficientes positivos sugieren una mayor probabilidad de admisión a medida que estas variables aumentan. Desempeño del Modelo: En el conjunto de prueba: Se obtuvo un 100% de precisión, clasificando correctamente a todos los estudiantes como admitidos o no admitidos. Esto sugiere que el modelo tiene un excelente rendimiento en la generalización hacia nuevos datos. En validación cruzada: La precisión promedio fue de 97.53%, lo que refuerza la solidez del modelo, mostrando un equilibrio adecuado entre sensibilidad y especificidad. Visualización y Separación de los Grupos: A través de los gráficos de discriminación, se confirma una clara separación entre los grupos, lo que respalda la efectividad del modelo para identificar patrones entre las variables académicas y la clasificación de los estudiantes.

EJERCICIO 2

iris <- iris

library(MVN)

# Dividir los datos en dos grupos
setosa <- subset(iris,Species== "setosa")
versicolor <- subset(iris,Species=="versicolor")
virginica <- subset(iris,Species=="virginica")

# Prueba de Mardia para normalidad multivariada 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 normalidad multivariada 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 normalidad multivariada 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
library(caret)

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

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
library(MASS)

# Ajustar el modelo de ADL utilizando el conjunto de entrenamiento
modelo_lda <- lda(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width , data = entrenamiento)
modelo_lda
## Call:
## lda(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
## 
## Coefficients of linear discriminants:
##                    LD1        LD2
## Sepal.Length  0.929781 -0.4358611
## Sepal.Width   1.360846 -2.0827471
## Petal.Length -2.214094  0.8831912
## Petal.Width  -2.935442 -2.2903447
## 
## Proportion of trace:
##    LD1    LD2 
## 0.9913 0.0087
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$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
# 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(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width , 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   setosa versicolor virginica
##   setosa         40          0         0
##   versicolor      0         38         1
##   virginica       0          2        39
## 
## Overall Statistics
##                                           
##                Accuracy : 0.975           
##                  95% CI : (0.9287, 0.9948)
##     No Information Rate : 0.3333          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9625          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: setosa Class: versicolor Class: virginica
## Sensitivity                 1.0000            0.9500           0.9750
## Specificity                 1.0000            0.9875           0.9750
## Pos Pred Value              1.0000            0.9744           0.9512
## Neg Pred Value              1.0000            0.9753           0.9873
## Prevalence                  0.3333            0.3333           0.3333
## Detection Rate              0.3333            0.3167           0.3250
## Detection Prevalence        0.3333            0.3250           0.3417
## Balanced Accuracy           1.0000            0.9688           0.9750
library(klaR)
data2 <- iris[, c(1,2,3,4,5)]

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

En este ejercicio, se aplicó el análisis discriminante sobre el conjunto de datos “iris”, logrando diferenciar las tres especies de flores: setosa, versicolor y virginica. A continuación, se resumen los hallazgos más relevantes: Prueba de Normalidad Multivariada: Los resultados de la prueba de Mardia confirmaron que las tres especies cumplen con la normalidad multivariada, un supuesto esencial para el análisis discriminante. Desempeño del Modelo de Análisis Discriminante Lineal (LDA): Conjunto de Entrenamiento: El modelo mostró una precisión del 100%, clasificando correctamente todas las observaciones en sus respectivas especies. Validación Cruzada: La precisión promedio fue del 97.5%, con un índice de Kappa de 0.9625, lo que indica un acuerdo casi perfecto entre las predicciones y las etiquetas reales. Matriz de Confusión: Los valores de sensibilidad, especificidad y precisión positiva fueron perfectos en el conjunto de prueba para las tres especies, reflejando una excelente capacidad del modelo para distinguir entre ellas. Visualización con QDA: En los gráficos de discriminación, se observó una clara separación entre las especies, con bajas tasas de error (entre 0.02 y 0.047), lo que valida la efectividad del modelo para clasificar las flores basándose en sus características.