El conjunto de datos de Car Evaluation fue creado a partir de un sisitema experto que evalúa la aceptabilidad de un auto bassado en varios criterios técnicos. Este dataset está compuesto por 7 variables categóricas que describen aspectos como el precio de compra, el mantenimiento, la seguridad, el número de puertas, entre otros. Este tipo de evaluación es útil en entornos donde se requiere tomar deicsiones automatizadas o semiautomatizadas, ocmo en sitios web de comparación de autos, sistemas de recomendación o incluso en industrias donde se deben seleccionar lotes de autos para flotas comerciales.
La pregunta que decidimos resolver con base a este dataset es: ¿Qué combinacion de características técnicas en un auto influye más en su clasificación como aceptable, buena o muy buena?
La meta principal es comprender que aspectos tienen mayor peso en la clasificacion final del auto y desarrollar un modelo que permita predecir dicha clasificación en funcion de los valores de entrada.
Ojetivo general:
Objetivos específicos:
Explorar la distribución y el comportamiento de las variables categóricas.
Identificar patrones entre aspectos técnicos y clasificación del auto
Construir un modelo de clasificación que prediga la aceptabilidad del auto.
El conjunto de datos Car Evaluation fue desarrollado usando un modelo jerárquico de decisión diseñado para demostrar el sistema experto DEX. Este modelo evalúa la acepabilidad de un auto basándose en 6 aspectos fundamentales:
El objetivo es poder clasificar los autos en una de las siguientes categorías:
# Cargar librerías necesarias
library(dplyr)
# Seleccionar archivo manualmente (archivo car.data)
car_data <- read.csv(file.choose(), header = FALSE, stringsAsFactors = TRUE)
# Asignar nombres a las columnas
colnames(car_data) <- c("buying", "maint", "doors", "persons", "lug_boot", "safety", "class")
# Ver los primeros registros
head(car_data)
## buying maint doors persons lug_boot safety class
## 1 vhigh vhigh 2 2 small low unacc
## 2 vhigh vhigh 2 2 small med unacc
## 3 vhigh vhigh 2 2 small high unacc
## 4 vhigh vhigh 2 2 med low unacc
## 5 vhigh vhigh 2 2 med med unacc
## 6 vhigh vhigh 2 2 med high unacc
# Ver estructura y dimensiones
str(car_data)
## 'data.frame': 1728 obs. of 7 variables:
## $ buying : Factor w/ 4 levels "high","low","med",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ maint : Factor w/ 4 levels "high","low","med",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ doors : Factor w/ 4 levels "2","3","4","5more": 1 1 1 1 1 1 1 1 1 1 ...
## $ persons : Factor w/ 3 levels "2","4","more": 1 1 1 1 1 1 1 1 1 2 ...
## $ lug_boot: Factor w/ 3 levels "big","med","small": 3 3 3 2 2 2 1 1 1 3 ...
## $ safety : Factor w/ 3 levels "high","low","med": 2 3 1 2 3 1 2 3 1 2 ...
## $ class : Factor w/ 4 levels "acc","good","unacc",..: 3 3 3 3 3 3 3 3 3 3 ...
dim(car_data)
## [1] 1728 7
# Verificar valores faltantes
colSums(is.na(car_data))
## buying maint doors persons lug_boot safety class
## 0 0 0 0 0 0 0
# Revisar niveles de cada variable categórica
sapply(car_data, levels)
## $buying
## [1] "high" "low" "med" "vhigh"
##
## $maint
## [1] "high" "low" "med" "vhigh"
##
## $doors
## [1] "2" "3" "4" "5more"
##
## $persons
## [1] "2" "4" "more"
##
## $lug_boot
## [1] "big" "med" "small"
##
## $safety
## [1] "high" "low" "med"
##
## $class
## [1] "acc" "good" "unacc" "vgood"
Realizamos un análisis exploratiorio visual para entender la distribucion de cada variable categórica y su relación con la aceptabilidad del vehpiculo (class). Como todas las variables son categóricas, usaremos gráficos de barras agrupados y tablas de frecuencia.
# Tabla de frecuencia de la variable class
table(car_data$class)
##
## acc good unacc vgood
## 384 69 1210 65
# Frecuencia relativa
prop.table(table(car_data$class))
##
## acc good unacc vgood
## 0.22222222 0.03993056 0.70023148 0.03761574
# Cargar librería para gráficos
library(ggplot2)
# Gráfico para la variable 'buying'
ggplot(car_data, aes(x = buying, fill = class)) +
geom_bar(position = "fill") +
labs(title = "Proporción de aceptabilidad según 'buying'",
y = "Proporción", x = "Precio de compra") +
scale_fill_brewer(palette = "Set2")
# Gráfico para la variable 'maint'
ggplot(car_data, aes(x = maint, fill = class)) +
geom_bar(position = "fill") +
labs(title = "Proporción de aceptabilidad según 'maint'",
y = "Proporción", x = "Costo de mantenimiento") +
scale_fill_brewer(palette = "Set2")
En las tablas de frecuencia podemos observar los siguientes datos:
Absoluta:
Aceptable: 384
Bueno: 69
Muy bueno: 65
Relativa:
Aceptable: 22.22%
Bueno: 3.99%
Muy bueno: 3.76%
Analizando los datos de la tabla de frecuencia y de los gráficos podemos visualizar un desbalance de la variable objetivo class.
La mayoría de autos están clasificados como inaceptable, representando el 70% del total.
Las clases positivas (good y vgood) son minoritarias, solo un 8% combinado.
Este desequilibrio debe tenerse en cuenta en el modelado predictivo para evitar sesgos en los resultados.
En cuanto a la relación entre buying y aceptabilidad:
A medida que el precio de compra disminuye (especialmente en la categoría low), aumenta la proporcion de autos clasificados como buenos y muy buenos
Por lo contrario, para autos que tienen un precio elevados, presentan una alta proporción de casos inaceptables, lo que sugiere que los compradores no consideran aceptables los autos muy costosos. Sin embargo es necesario tener en cuenta otras variables.
En cuanto a la relación entre mantenimiento y aceptabilidad:
Se observa un patrón similar con el costo de mantenimiento: Los niveles bajos y medios están asociados a casos positivos de aceptabilidad.
Los autos con un costo de mantenimiento muy alto son denominados como inaceptables. Esto indica que los consumidores rechazan los vehículos que tienen un alto costo de mantenimiento.
El objetivo es construir un modelo de clasificación que prediga la variable class en función de las variables explicativas: buying, maint, doors, persons, lug_boot, safety. Usaremos el algoritmo CART (Classification and REgression Trees). Se dividen los datos en 70% para entrenamiento y 30% de prueba:
# Cargar librerías
library(rpart)
library(rpart.plot)
library(caret)
# Fijar semilla para reproducibilidad
set.seed(123)
# Dividir datos
index <- createDataPartition(car_data$class, p = 0.7, list = FALSE)
train_data <- car_data[index, ]
test_data <- car_data[-index, ]
# Entrenar el modelo de árbol
modelo_arbol <- rpart(class ~ ., data = train_data, method = "class")
# Árbol
rpart.plot(modelo_arbol, type = 3, extra = 101, box.palette = "RdYlGn", under = TRUE)
# Predicciones
pred <- predict(modelo_arbol, test_data, type = "class")
# Matriz de confusión
confusionMatrix(pred, test_data$class)
## Confusion Matrix and Statistics
##
## Reference
## Prediction acc good unacc vgood
## acc 110 0 22 2
## good 3 16 1 0
## unacc 2 0 340 0
## vgood 0 4 0 17
##
## Overall Statistics
##
## Accuracy : 0.9342
## 95% CI : (0.9093, 0.954)
## No Information Rate : 0.7021
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8615
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: acc Class: good Class: unacc Class: vgood
## Sensitivity 0.9565 0.80000 0.9366 0.89474
## Specificity 0.9403 0.99195 0.9870 0.99197
## Pos Pred Value 0.8209 0.80000 0.9942 0.80952
## Neg Pred Value 0.9869 0.99195 0.8686 0.99597
## Prevalence 0.2224 0.03868 0.7021 0.03675
## Detection Rate 0.2128 0.03095 0.6576 0.03288
## Detection Prevalence 0.2592 0.03868 0.6615 0.04062
## Balanced Accuracy 0.9484 0.89598 0.9618 0.94335
modelo_arbol$variable.importance
## safety persons maint buying lug_boot doors
## 137.972177 131.764386 84.667916 54.104406 50.461161 2.846079
El modelo del árbol de decisión obtuvo una alta precisión general (93%) y clasificó correctamente la mayoría de los autos, especialmente los inaceptables. La variable más influyente es la seguridad (safety). Y el modelo demostró un buen desempeño incluso en clases menos frecuentes como good y vgood.
Ahora vamos a evaluar el desempeño general del modelo y su capacidad de generalización. En el punto anterior se hizo una validación basica con la matriz de confusión pero aquí reforzaremos esa evaluación, preferiblemente con validación cruzada (10- fold).
Evaluaremos la estabilidad y generalización del modelo usando validación cruzada para verificar si su desempeño se mantiene constante en diferentes particiones de los datos.
# Cargar librería
library(caret)
# Configuración de validación cruzada
control <- trainControl(method = "cv", number = 10)
# Entrenar el modelo con validación cruzada
modelo_cv <- train(class ~ ., data = car_data, method = "rpart", trControl = control)
# Resultados
modelo_cv
## CART
##
## 1728 samples
## 6 predictor
## 4 classes: 'acc', 'good', 'unacc', 'vgood'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 1556, 1555, 1556, 1554, 1556, 1554, ...
## Resampling results across tuning parameters:
##
## cp Accuracy Kappa
## 0.04633205 0.7788604 0.5254315
## 0.05598456 0.7731067 0.5384056
## 0.07528958 0.7407961 0.2875313
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.04633205.
Después de aplicar validación cruzada de 10 pliegues al modelo de árbol de decisión, vemos que la precisión promedio fue de 79.9% y el indice Kappa alcanzó 0.52, indicando un rendimiento razonable, aunque inferior al obtenido en la evaluación con el conjunto de prueba (93%). Esto sugiere que el modelo puede estar ligeramente ajustado a los datos de entrenamiento, pero sigue mostrando una buena capacidad de generalización.
El modelo final se construyó con el valor de complejidad de poda Cp= 0.04633 que fue el que produjo el mejor balance entre simplicidad del árbol y precisión.
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.4.3
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
##
## Adjuntando el paquete: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
## The following object is masked from 'package:dplyr':
##
## combine
# Ajustar modelo de random forest
modelo_rf <- randomForest(class ~ ., data = car_data, importance = TRUE)
# Ver importancia de las variables
importance(modelo_rf)
## acc good unacc vgood MeanDecreaseAccuracy
## buying 89.583798 47.195384 65.653353 50.3631913 102.7622737
## maint 85.414622 45.510747 63.239145 29.8174947 100.3669091
## doors -2.713515 -3.421935 5.249007 -0.4420151 -0.2999626
## persons 117.435919 32.864939 146.869946 36.0067058 163.3266535
## lug_boot 42.157980 29.787160 38.698425 38.0074934 62.0821359
## safety 121.272625 48.599941 151.257933 60.2248902 163.6522659
## MeanDecreaseGini
## buying 94.91896
## maint 94.93493
## doors 28.58411
## persons 173.76233
## lug_boot 49.69858
## safety 221.44288
# Visualización
varImpPlot(modelo_rf)
Usando el modelo de Random Forest, se identificó que las variabels que mas influyen en la aceptabilidad de un auto son:
En este proyecto se desarrolló un análisis completo de un conjunto de datos sobre la aceptabilidad de automóviles, utilizando técnicas estadísticas y modelos de clasificación. Se identificaron las principales variables que influyen en la decisión del consumidor, siendo la seguridad (safety), el número de pasajeros (persons), el precio de compra (buying) y el costo de mantenimiento (maint) los factores más relevantes.
Se construyó un modelo de árbol de decisión (CART), el cual alcanzó una precisión del 93%, y se validó mediante validación cruzada, mostrando buen desempeño general y especialmente alto para la clase unacc. Además, se utilizó un modelo de Random Forest para reforzar la interpretación de la importancia de variables, lo que confirmó los hallazgos previos.
Como parte del despliegue final, se implementó una aplicación ligera en RMarkdown, accesible vía RPubs, que permite ingresar combinaciones de características del vehículo y obtener una predicción de su aceptabilidad. Esta herramienta simula el funcionamiento del modelo de forma intuitiva y práctica.
En resumen, el análisis no solo permitió identificar los factores clave que determinan la aceptabilidad de un auto, sino que también entregó una solución automatizada para evaluarlos, combinando análisis estadístico, modelado predictivo y despliegue funcional.