Ejercicio de clase

Clasificación del rendimiento académico de estudiantes de matemáticas

Paso 1. Preparación inicial y limpieza de los datos:

library(dplyr)
library(caret)
library(e1071)
library(naivebayes)
estudiantes <- read.csv("Estudiantes.csv")
head(estudiantes)
##   Estudiante Matematicas Ciencias Espanol Historia Deportes
## 1      Lucia         7.0      6.5     9.2      8.6      8.0
## 2      Pedro         7.5      9.4     7.3      7.0      7.0
## 3       Ines         7.6      9.2     8.0      8.0      7.5
## 4       Luis         5.0      6.5     6.5      7.0      9.0
## 5     Andres         6.0      6.0     7.8      8.9      7.3
## 6        Ana         7.8      9.6     7.7      8.0      6.5
dim(estudiantes)
## [1] 10  6
summary(estudiantes)
##   Estudiante         Matematicas       Ciencias        Espanol    
##  Length:10          Min.   :5.000   Min.   :6.000   Min.   :6.50  
##  Class :character   1st Qu.:6.075   1st Qu.:6.425   1st Qu.:7.35  
##  Mode  :character   Median :6.900   Median :6.850   Median :7.75  
##                     Mean   :6.790   Mean   :7.650   Mean   :7.74  
##                     3rd Qu.:7.575   3rd Qu.:9.350   3rd Qu.:8.15  
##                     Max.   :7.900   Max.   :9.700   Max.   :9.20  
##     Historia        Deportes    
##  Min.   :5.500   Min.   :6.000  
##  1st Qu.:7.250   1st Qu.:7.000  
##  Median :8.000   Median :7.250  
##  Mean   :7.900   Mean   :7.420  
##  3rd Qu.:8.825   3rd Qu.:7.875  
##  Max.   :9.000   Max.   :9.000
colSums(is.na(estudiantes))
##  Estudiante Matematicas    Ciencias     Espanol    Historia    Deportes 
##           0           0           0           0           0           0

Paso 2: Dividir los datos en conjunto de entrenamiento y prueba:

set.seed(123)
estudiantes <- estudiantes %>%
  mutate(Aprueba = factor(ifelse(Matematicas >= 7, "Aprueba", "No aprueba")))

data2_long <- estudiantes %>%
  select(Ciencias, Espanol, Historia, Deportes, Aprueba)

folds <- createFolds(data2_long$Aprueba, k = 4)

entrenamiento <- data2_long[-folds[[4]], ]
prueba <- data2_long[folds[[4]], ]

entrenamiento_labels <- data2_long$Aprueba[-folds[[4]]]
prueba_labels <- data2_long$Aprueba[folds[[4]]]

dim(entrenamiento)
## [1] 8 5
dim(prueba)
## [1] 2 5

Se dividió la base de datos en 5 grupos, utilizando 4 grupos para entrenamiento y 1 grupo para prueba. Como resultado, el conjunto de entrenamiento quedó con 8 observaciones y el conjunto de prueba con 2 observaciones.

Paso 3: Aplicar el Clasificador Bayesiano (NBC):

modelo_nb <- naiveBayes(Aprueba ~ ., data = entrenamiento)
modelo_nb
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##    Aprueba No aprueba 
##        0.5        0.5 
## 
## Conditional probabilities:
##             Ciencias
## Y             [,1]      [,2]
##   Aprueba    8.700 1.4809907
##   No aprueba 6.225 0.2629956
## 
##             Espanol
## Y            [,1]      [,2]
##   Aprueba    8.00 0.8524475
##   No aprueba 7.25 0.8812869
## 
##             Historia
## Y            [,1]     [,2]
##   Aprueba     7.9 0.663325
##   No aprueba  7.6 1.675311
## 
##             Deportes
## Y             [,1]      [,2]
##   Aprueba    7.125 0.8539126
##   No aprueba 8.050 0.9327379
pred_nb <- predict(modelo_nb, prueba)

tt <- table(pred_nb, prueba_labels)
tt
##             prueba_labels
## pred_nb      Aprueba No aprueba
##   Aprueba          1          1
##   No aprueba       0          0
TA <- (sum(diag(tt))) / sum(tt)
paste("Tasa de aciertos: ", round(TA,4)*100, "%", sep = "")
## [1] "Tasa de aciertos: 50%"

Paso 4: Validar la estabilidad del modelo

set.seed(123)

train_control <- trainControl(method = "cv", number = 4, savePredictions = TRUE)

modelo_cv <- train(Aprueba ~ ., data = data2_long, method = "naive_bayes", trControl = train_control)
modelo_cv
## Naive Bayes 
## 
## 10 samples
##  4 predictor
##  2 classes: 'Aprueba', 'No aprueba' 
## 
## No pre-processing
## Resampling: Cross-Validated (4 fold) 
## Summary of sample sizes: 8, 8, 7, 7 
## Resampling results across tuning parameters:
## 
##   usekernel  Accuracy   Kappa
##   FALSE      0.9166667  0.85 
##    TRUE      0.7916667  0.60 
## 
## Tuning parameter 'laplace' was held constant at a value of 0
## Tuning
##  parameter 'adjust' was held constant at a value of 1
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were laplace = 0, usekernel = FALSE
##  and adjust = 1.
confusionMatrix(modelo_cv$pred$pred, modelo_cv$pred$obs)
## Confusion Matrix and Statistics
## 
##             Reference
## Prediction   Aprueba No aprueba
##   Aprueba          8          1
##   No aprueba       2          9
##                                           
##                Accuracy : 0.85            
##                  95% CI : (0.6211, 0.9679)
##     No Information Rate : 0.5             
##     P-Value [Acc > NIR] : 0.001288        
##                                           
##                   Kappa : 0.7             
##                                           
##  Mcnemar's Test P-Value : 1.000000        
##                                           
##             Sensitivity : 0.8000          
##             Specificity : 0.9000          
##          Pos Pred Value : 0.8889          
##          Neg Pred Value : 0.8182          
##              Prevalence : 0.5000          
##          Detection Rate : 0.4000          
##    Detection Prevalence : 0.4500          
##       Balanced Accuracy : 0.8500          
##                                           
##        'Positive' Class : Aprueba         
## 

Paso 5: Interpretación de los resultados finales:

El modelo Naive Bayes obtuvo una tasa de aciertos del 50% en el conjunto de prueba, lo cual refleja un desempeño limitado. Sin embargo, este resultado se debe principalmente al tamaño reducido del conjunto de prueba, ya que solo contiene 2 observaciones.

Al aplicar validación cruzada, la exactitud aumentó a aproximadamente 85%, lo que indica que el modelo presenta un mejor desempeño cuando se evalúa de manera más completa.

El modelo logra identificar cierta relación entre las calificaciones en otras materias y el resultado en matemáticas. Sin embargo, los resultados deben interpretarse con cautela debido al tamaño pequeño de la base de datos.