En este análisis, implementaremos un modelo de árbol de decisión para clasificar datos de tipos de vinos. El conjunto de datos utilizado proviene del repositorio UCI Machine Learning. Posteriormente, evaluaremos el rendimiento del modelo utilizando métricas estándar como precisión, sensibilidad y especificidad.
# Descargar el conjunto de datos de vinos
download.file("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", "wine.data")
# Leer los datos
vino <- read.table("wine.data", sep = ",", header = FALSE)
# Asignar nombres a las columnas
names <- c("tipo", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "C11", "C12", "C13")
colnames(vino) <- names
# Convertir la variable objetivo a factor
vino$tipo <- as.factor(vino$tipo)
Dividimos el conjunto de datos en entrenamiento (82%) y prueba (18%) para evaluar el rendimiento del modelo.
set.seed(2024) # Semilla para reproducibilidad
N <- nrow(vino)
n <- round(N * 0.82) # 82% de los datos
indices <- sample(1:N, n)
entrenamiento <- vino[indices, ]
prueba <- vino[-indices, ]
Entrenamos un modelo de árbol de decisión utilizando la librería
rpart y visualizamos el árbol generado.
# Cargar librerías necesarias
if (!require("rpart")) install.packages("rpart", dependencies = TRUE)
## Cargando paquete requerido: rpart
## Warning: package 'rpart' was built under R version 4.4.2
if (!require("rpart.plot")) install.packages("rpart.plot", dependencies = TRUE)
## Cargando paquete requerido: rpart.plot
## Warning: package 'rpart.plot' was built under R version 4.4.2
library(rpart)
library(rpart.plot)
# Entrenar el modelo
arbol <- rpart(tipo ~ ., data = entrenamiento)
# Visualizar el árbol
rpart.plot(arbol)
Evaluamos el modelo en el conjunto de prueba utilizando una matriz de confusión.
# Predicción en el conjunto de prueba
if (!require("caret")) install.packages("caret", dependencies = TRUE)
## Cargando paquete requerido: caret
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: lattice
library(caret)
pred <- predict(arbol, prueba, type = "class")
matriz_confusion <- confusionMatrix(pred, prueba$tipo)
# Mostrar resultados
print(matriz_confusion)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3
## 1 8 0 0
## 2 0 12 2
## 3 0 1 9
##
## Overall Statistics
##
## Accuracy : 0.9062
## 95% CI : (0.7498, 0.9802)
## No Information Rate : 0.4062
## P-Value [Acc > NIR] : 5.027e-09
##
## Kappa : 0.8563
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3
## Sensitivity 1.00 0.9231 0.8182
## Specificity 1.00 0.8947 0.9524
## Pos Pred Value 1.00 0.8571 0.9000
## Neg Pred Value 1.00 0.9444 0.9091
## Prevalence 0.25 0.4062 0.3438
## Detection Rate 0.25 0.3750 0.2812
## Detection Prevalence 0.25 0.4375 0.3125
## Balanced Accuracy 1.00 0.9089 0.8853
Los resultados del modelo se interpretan como sigue:
Precisión General (Accuracy):
La precisión del modelo es del 90.62%, lo que indica
que aproximadamente el 91% de las predicciones fueron correctas. Este es
un rendimiento muy sólido.
Intervalo de Confianza (95% CI):
El intervalo de confianza para la precisión es de [0.7498,
0.9802], lo que asegura que, con un 95% de confianza, el
rendimiento del modelo se encuentra entre el 75% y el 98%.
Coeficiente Kappa:
El coeficiente Kappa = 0.8563 indica un acuerdo
casi perfecto entre las predicciones del modelo y los valores
reales, ajustando por el azar.
Estadísticas por Clase:
Balance del Rendimiento:
El modelo demuestra ser muy efectivo, con una precisión del 90.62% y un coeficiente Kappa de 0.8563, lo que refleja un excelente nivel de concordancia entre las predicciones realizadas y los valores reales. Sin embargo, siempre hay margen para optimizar:
Equilibrio entre las clases: Sería ideal trabajar en mejorar la clasificación de la Clase 3, que mostró un rendimiento un poco inferior en comparación con las otras.
Comprender las características clave: Analizar más a fondo las propiedades químicas podría ayudarnos a identificar cuáles son las más determinantes para diferenciar entre los tipos de vino.
Explorar técnicas avanzadas: Implementar métodos más complejos, como Random Forest, podría ayudar a crear un modelo más robusto que aproveche la combinación de múltiples árboles para lograr resultados aún mejores.