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.