Introducción

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.

Carga de Datos y Preparación

# 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)

Partición de Datos

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, ]

Entrenamiento del Modelo de Árbol de Decisión

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)

Predicción y Evaluación del Modelo

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

Análisis de Resultados

Los resultados del modelo se interpretan como sigue:

  1. 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.

  2. 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%.

  3. 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.

  4. Estadísticas por Clase:

    • Clase 1 (Vino tipo 1):
      • Sensibilidad: 1.00 (100%)
      • Especificidad: 1.00 (100%)
      • Valor Predictivo Positivo: 1.00 (100%)
      • Excelente rendimiento para esta clase.
    • Clase 2 (Vino tipo 2):
      • Sensibilidad: 0.9231 (92.31%)
      • Especificidad: 0.8947 (89.47%)
      • Buen rendimiento, con margen para mejorar la especificidad.
    • Clase 3 (Vino tipo 3):
      • Sensibilidad: 0.8182 (81.82%)
      • Especificidad: 0.9524 (95.24%)
      • Buen desempeño, pero la sensibilidad podría mejorar.
  5. Balance del Rendimiento:

    • Clase 1: 100%
    • Clase 2: 90.89%
    • Clase 3: 88.53%

Conclusión General

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.

Áreas de Mejora:

  1. Incrementar la sensibilidad para la Clase 3.
  2. Mejorar la especificidad para la Clase 2.