install.packages(“dplyr”)
Instalar Librerías
library(haven)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(imputeTS)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(e1071)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(ggplot2)
1_Crear datos imitando los del dataset de encuesta un techo para Chile 2018:
set.seed(123)
# Generar un dataframe aleatorio
n <- 500 # Número de observaciones
# Generar las variables
eap_2017 <- data.frame(
B30 = sample(1:3, n, replace = TRUE), # Calidad de vida
B8_nucleosantes = sample(1:5, n, replace = TRUE),
B8_nucleosahora = sample(1:5, n, replace = TRUE),
B7_antestotal = sample(1:10, n, replace = TRUE),
B7_ahoratotal = sample(1:10, n, replace = TRUE),
B9_dormitoriosantes = sample(1:5, n, replace = TRUE),
B9_dormitoriosahora = sample(1:5, n, replace = TRUE),
B10_arriendoantes = sample(0:100000, n, replace = TRUE),
B10_arriendoahora = sample(0:100000, n, replace = TRUE),
B20_ing_jefe_antes = sample(0:500000, n, replace = TRUE),
B20_ing_jefe_ahora = sample(0:500000, n, replace = TRUE),
B20_ing_hogar_antes = sample(0:500000, n, replace = TRUE),
B20_ing_hogar_ahora = sample(0:500000, n, replace = TRUE),
B20_subs_antes = sample(0:100000, n, replace = TRUE),
B20_subs_ahora = sample(0:100000, n, replace = TRUE),
B21_deudas_antes = sample(0:50000, n, replace = TRUE),
B21_deudas_ahora = sample(0:50000, n, replace = TRUE),
B21_gastos_antes = sample(0:50000, n, replace = TRUE),
B21_gastos_ahora = sample(0:50000, n, replace = TRUE),
B21_remesas_antes = sample(0:50000, n, replace = TRUE),
B21_remesas_ahora = sample(0:50000, n, replace = TRUE),
B21_ahorro_antes = sample(0:50000, n, replace = TRUE),
B21_ahorro_ahora = sample(0:50000, n, replace = TRUE),
B7_antes65 = sample(0:5, n, replace = TRUE),
B7_ahora65 = sample(0:5, n, replace = TRUE),
B7_antes18 = sample(0:5, n, replace = TRUE),
B7_ahora18 = sample(0:5, n, replace = TRUE)
)
2_Selección de Variables y Normalización
Seleccionamos las variables relevantes y normalizamos los datos.
# Selección de variables
select_camp <- eap_2017 %>%
select(B30, B8_nucleosantes, B8_nucleosahora, B7_antestotal, B7_ahoratotal,
B9_dormitoriosantes, B9_dormitoriosahora, B10_arriendoantes, B10_arriendoahora,
B20_ing_jefe_antes, B20_ing_jefe_ahora, B20_ing_hogar_antes, B20_ing_hogar_ahora,
B20_subs_antes, B20_subs_ahora, B21_deudas_antes, B21_deudas_ahora,
B21_gastos_antes, B21_gastos_ahora, B21_remesas_antes, B21_remesas_ahora,
B21_ahorro_antes, B21_ahorro_ahora, B7_antes65, B7_ahora65, B7_antes18, B7_ahora18)
# Función normalización
normalize <- function(x) {
(x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
}
# Calcular ingresos disponibles antes y después
select_camp <- select_camp %>%
mutate(IngDispAntes = coalesce(B20_ing_hogar_antes, 0) + coalesce(B20_subs_antes, 0) -
coalesce(B21_deudas_antes, 0) - coalesce(B21_gastos_antes, 0) -
coalesce(B21_remesas_antes, 0),
IngDispDespues = coalesce(B20_ing_hogar_ahora, 0) + coalesce(B20_subs_ahora, 0) -
coalesce(B21_deudas_ahora, 0) - coalesce(B21_gastos_ahora, 0) -
coalesce(B21_remesas_ahora, 0),
ArriendoAntes = coalesce(B10_arriendoantes, 0),
ArriendoAhora = coalesce(B10_arriendoahora, 0),
Dormitorios_antes = coalesce(B9_dormitoriosantes, 0),
Dormitorios_ahora = coalesce(B9_dormitoriosahora, 0),
Calidad_Vida = coalesce(B30, 0))
# Crear variables de cambio
select_camp <- select_camp %>%
mutate(cam_nucleos = B8_nucleosahora - B8_nucleosantes,
cam_integrantes = B7_ahoratotal - B7_antestotal,
cam_arriendo = ArriendoAhora - ArriendoAntes,
cam_ingreso = IngDispDespues - IngDispAntes,
cam_dormitorios = Dormitorios_ahora - Dormitorios_antes,
cam_may65 = B7_ahora65 - B7_antes65,
cam_min18 = B7_ahora18 - B7_antes18)
# Dataset con variables diferenciales
dt_camp <- select(select_camp, Calidad_Vida, cam_dormitorios, cam_integrantes, cam_arriendo, cam_ingreso, cam_nucleos)
# Filtrar valores no válidos
dt_camp <- dt_camp %>%
filter(Calidad_Vida > 0 & Calidad_Vida < 4, Calidad_Vida != 2) %>%
mutate(Calidad_Vida = as.factor(Calidad_Vida))
# Aplicar normalización
scamp_n <- dt_camp %>%
mutate(across(cam_dormitorios:cam_nucleos, normalize))
3_Balanceo de Muestra
Balanceamos la muestra usando upSample de la librería caret.
# Balancear muestra
datos_balanceados <- upSample(x = scamp_n %>% select(-Calidad_Vida), y = scamp_n$Calidad_Vida)
datos_balanceados$Calidad_Vida <- datos_balanceados$Class
# Seleccionar variables para análisis
scamp_n <- datos_balanceados %>% select(Calidad_Vida, cam_dormitorios, cam_nucleos, cam_integrantes)
4_Ejecutar Modelo SVM
Probaré 3 diferentes kernels.
# Establecer semilla
set.seed(123)
# Dividir datos en entrenamiento y prueba
ind <- createDataPartition(scamp_n$Calidad_Vida, p = 0.70, list = FALSE)
train_data <- scamp_n[ind, ]
test_data <- scamp_n[-ind, ]
# Modelo SVM con kernel lineal
svm_cv <- tune(svm, Calidad_Vida ~ ., data = train_data, kernel = 'linear', ranges = list(cost = c(0.001, 0.01, 0.1, 1, 5, 10, 20, 50)))
svm_model_s <- svm(Calidad_Vida ~ ., data = train_data, type = 'C-classification', kernel = "linear", cost = svm_cv$best.parameters$cost)
predictions <- predict(svm_model_s, newdata = test_data)
table(predictions, test_data$Calidad_Vida)
##
## predictions 1 3
## 1 30 24
## 3 20 26
# Modelo SVM con kernel radial
svm_cvr <- tune(svm, Calidad_Vida ~ ., data = train_data, kernel = 'radial', ranges = list(cost = c(0.001, 0.01, 0.1, 1, 5, 10), gamma = c(0.5, 1, 2, 3)))
svm_model_r <- svm(Calidad_Vida ~ ., data = train_data, type = 'C-classification', kernel = "radial", cost = svm_cvr$best.parameters$cost, gamma = svm_cvr$best.parameters$gamma)
predictions_r <- predict(svm_model_r, newdata = test_data)
table(predictions_r, test_data$Calidad_Vida)
##
## predictions_r 1 3
## 1 17 27
## 3 33 23
# Modelo SVM con kernel polinomial
svm_cvP <- tune(svm, Calidad_Vida ~ ., data = train_data, kernel = 'polynomial', degree = 2, ranges = list(cost = 10))
svm_model_p <- svm(Calidad_Vida ~ ., data = train_data, type = 'C-classification', kernel = "polynomial", cost = svm_cvP$best.parameters$cost)
predictions_p <- predict(svm_model_p, newdata = test_data)
table(predictions_p, test_data$Calidad_Vida)
##
## predictions_p 1 3
## 1 23 21
## 3 27 29
5_gráficar resultados según sensibilidad y presición
Se realizará un gráfico en dos dimensiones con el parámetro kernel representado en color.
# Para el modelo SVM lineal
conf_matrix_s <- table(predictions, test_data$Calidad_Vida)
accuracy_s <- sum(diag(conf_matrix_s)) / sum(conf_matrix_s)
sensitivity_s <- conf_matrix_s[2,2] / sum(conf_matrix_s[2,])
# Para el modelo SVM radial
conf_matrix_r <- table(predictions_r, test_data$Calidad_Vida)
accuracy_r <- sum(diag(conf_matrix_r)) / sum(conf_matrix_r)
sensitivity_r <- conf_matrix_r[2,2] / sum(conf_matrix_r[2,])
# Para el modelo SVM polinomial
conf_matrix_p <- table(predictions_p, test_data$Calidad_Vida)
accuracy_p <- sum(diag(conf_matrix_p)) / sum(conf_matrix_p)
sensitivity_p <- conf_matrix_p[2,2] / sum(conf_matrix_p[2,])
library(ggplot2)
# Crear un dataframe con los resultados y colores asignados a cada kernel
results_2d <- data.frame(
Kernel = c("Linear", "Radial", "Polynomial"),
Accuracy = c(accuracy_s, accuracy_r, accuracy_p),
Sensitivity = c(sensitivity_s, sensitivity_r, sensitivity_p),
Color = c("red", "blue", "green")
)
# Crear un gráfico 2D usando ggplot2
ggplot(results_2d, aes(x = Sensitivity, y = Accuracy, color = Kernel)) +
geom_point(size = 4) +
scale_color_manual(values = c("Linear" = "red", "Radial" = "blue", "Polynomial" = "green")) +
labs(
title = "Comparación de Modelos SVM",
x = "Sensibilidad",
y = "Precisión",
color = "Kernel"
) +
theme_minimal() +
theme(legend.position = "right")
En este ejemplo con datos aleatorios, el modelo con el kernel lineal demostró un mejor rendimiento, destacándose tanto en términos de sensibilidad como de precisión. Esto sugiere que, para este conjunto de datos en particular, el kernel lineal proporciona una clasificación más confiable, con una mayor capacidad para identificar correctamente tanto los casos positivos como negativos. Sin embargo, es importante señalar que la elección del kernel puede variar según las características de los datos, por lo que siempre se debe evaluar cada opción en función del contexto y los resultados obtenidos.