I. Ejercicio: Aplica el clasificador SVM a la base de datos Propietarios.

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

# Cargar la base
library("readr")
data <- read_csv("Propietarios.csv")
str(data)
## spc_tbl_ [24 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Hogar  : num [1:24] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Ingreso: num [1:24] 60 85.5 64.8 61.5 87 ...
##  $ Tamaño : num [1:24] 18.4 16.8 21.6 20.8 23.6 19.2 17.6 22.4 20 20.8 ...
##  $ Clase  : chr [1:24] "Propietario" "Propietario" "Propietario" "Propietario" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Hogar = col_double(),
##   ..   Ingreso = col_double(),
##   ..   Tamaño = col_double(),
##   ..   Clase = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>

Observamos la base de datos y convertimos la variable dependiente (Clase) en factor.

# Transformamos a factor
data$Clase <- as.factor(data$Clase)

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

Con un muestreo aleatorio, separamos el conjunto de entrenamiento y el de prueba. Elegimos 5 grupos, 4 de entrenamiento y 1 de prueba.

set.seed(2025)
library(caret)

# Crear los folds para validación cruzada 
folds         <- createFolds(data$Clase, k = 5)

# Dividir en conjunto de entrenamiento y prueba 
entrenamiento <- data[-folds[[5]], ]  
prueba        <- data[folds[[5]], ]  

Separamos las etiquetas de nuestro conjunto de entrenamiento y prueba.

entrenamiento_labels <- data$Clase[-folds[[5]]]
prueba_labels        <- data$Clase[folds[[5]]]

Paso 3: Aplicar el método de Clasificador de vector soporte

Para este ejemplo, no es necesario estandarizar los datos, por lo cual aplicamos directamente el método de clasificación SVM con kernel radial. Este tipo de kernel es ideal tanto para datos lineales como no lineales, ya que permite al modelo encontrar límites de decisión más flexibles. Tras ajustar los parámetros, se identificaron las combinaciones de cost y gamma que ofrecen el mejor rendimiento.

library(e1071)

set.seed(1234)
svm_vc <- tune("svm", Clase ~ Ingreso + Tamaño, data = data, kernel = "radial",
               ranges = list(cost = c(0.001, 0.01, 0.1, 1, 5, 10, 20),
                             gamma = c(0.5, 1, 2, 3, 4, 5, 10)))
svm_vc$best.parameters
##   cost gamma
## 4    1   0.5
# Guardar los parámetros óptimos
best_cost <- svm_vc$best.parameters$cost
best_gamma <- svm_vc$best.parameters$gamma

Luego de aplicar el método de clasificación SVM con kernel radial, se identificaron como parámetros óptimos un cost de 1 y un gamma de 0.5.

Paso 4: Validar la estabilidad del modelo

Para evaluar la estabilidad y el desempeño general del modelo, se aplicará una validación cruzada de 5 folds. Además, la exactitud del modelo se calculará para cada fold y se obtendrá un promedio para medir su rendimiento global

# Guardar la exactitud de cada fold
exactitud <- numeric(length = 5)

for(i in 1:5){
  # Definir conjuntos entrenamiento y prueba según el fold actual
  prueba        <- data[folds[[i]],]
  entrenamiento <- data[-folds[[i]],]
  
  # Etiquetas
  entrenamiento_labels <- data$Clase[-folds[[i]]]
  prueba_labels        <- data$Clase[folds[[i]]]
  
  # Ajustar el modelo SVM con los parámetros óptimos
  svm_model <- svm(Clase ~ Ingreso + Tamaño, data = entrenamiento, kernel = "radial", cost = best_cost, gamma = best_gamma)
  
  # Realizar predicciones en el conjunto de prueba
  pred_svm <- predict(svm_model, prueba)
  
  # Evaluar exactitud del modelo en cada fold
  cm <- confusionMatrix(pred_svm, prueba_labels)
  exactitud[i] <- cm$overall["Accuracy"]
  
  # Mostrar resultado del fold
  cat("Fold", i, "- Exactitud:", exactitud[i], "\n")
}
## Fold 1 - Exactitud: 0.75 
## Fold 2 - Exactitud: 1 
## Fold 3 - Exactitud: 0.8 
## Fold 4 - Exactitud: 0.8 
## Fold 5 - Exactitud: 0.6666667
# Resultado final: Promedio de la exactitud
cat("Exactitud promedio del modelo:", mean(exactitud), "\n")
## Exactitud promedio del modelo: 0.8033333

Tras aplicar la validación cruzada de 5 folds, el modelo SVM fue evaluado en cinco particiones diferentes de los datos. La exactitud obtenida en cada fold varió entre 0.66 y 1.00.

El promedio de exactitud alcanzado fue de 0.80, lo cual indica que, en general, el clasificador logra predecir correctamente alrededor del 80% de los casos. Este resultado sugiere que el modelo tiene un buen desempeño, aunque también muestra cierta variabilidad dependiendo de la muestra utilizada en cada fold.

Paso 5: Interpretación de los resultados

# Ajustar el modelo final con los parámetros óptimos
mejor_modelo <- svm(Clase ~ Ingreso + Tamaño, data = data, kernel = "radial", cost = best_cost, gamma = best_gamma)

# Predicciones sobre el conjunto de prueba con el modelo final
pred2 <- predict(object = mejor_modelo, data)

# Matriz de confusión para los datos de prueba
MC2 <- table(pred2, data$Clase)
print(MC2)
##                 
## pred2            No propietario Propietario
##   No propietario              9           1
##   Propietario                 3          11

El modelo SVM presentó una tasa de aciertos del 83% en el conjunto de prueba, lo que indica que acertó el 83% de las predicciones realizadas. Este resultado es ligeramente superior al promedio de 80% obtenido durante la validación cruzada de 5 folds. La matriz de confusión muestra que el modelo fue bastante preciso en la clasificación, con 9 verdaderos negativos y 11 verdaderos positivos, lo que significa que identificó correctamente tanto a los ‘No propietarios’ como a los ‘Propietarios’ en la mayoría de los casos. Sin embargo, también cometió 3 falsos negativos y 1 falso positivo, lo que sugiere que hubo algunos errores al clasificar a los ‘Propietarios’ como ‘No propietarios’ y viceversa. En general, el desempeño del modelo es bastante bueno y muestra un comportamiento consistente.