El desempleo es uno de los indicadores económicos más importantes para evaluar la salud laboral y social de un país o región. En el caso de Puerto Rico, la pandemia del COVID-19 provocó un impacto significativo en la economía y en el mercado laboral, afectando a miles de trabajadores y alterando las tendencias históricas del empleo. Esta investigación tiene como objetivo analizar cómo han cambiado las tasas de desempleo en los municipios de Puerto Rico desde el año 2019 (periodo pre-COVID) hasta el 2024 (post-COVID). Para ello, se utilizaron modelos de clasificación supervisada como K-Nearest Neighbors (KNN) y Support Vector Machine (SVM), así como técnicas visuales y comparativas por región. Los datos fueron recopilados del Instituto de Estadísticas de Puerto Rico y abarcan variables clave como fuerza laboral, empleo, desempleo y tasa de desempleo. A través de este análisis buscamos identificar patrones, regiones más afectadas y posibles áreas que requieran atención en términos de política pública y recuperación económica.

datos <- read.csv("C:/Users/angel/Desktop/UNI/ESTA 5504/Base de datos.csv")
head(datos)

Al visualizar nuestra base de datos, confirmamos que no contiene valores faltantes, lo cual facilita su análisis. No obstante, identificamos la necesidad de crear variables adicionales que nos permitan enriquecer la investigación y facilitar la aplicación de modelos de clasificación.

En este sentido, generamos tres variables binarias denominadas Desempleo_Alto_2022, Desempleo_Alto_2023 y Desempleo_Alto_2024, las cuales toman el valor de 1 si la tasa de desempleo en diciembre del año correspondiente supera el 6.5%, y 0 en caso contrario. Estas variables permiten clasificar los municipios según su nivel de desempleo en distintos momentos del tiempo, facilitando un análisis comparativo que nos ayuda a observar posibles mejoras, estancamientos o retrocesos en la situación laboral entre los años 2022 y 2024. En conjunto, ofrecen una base sólida para estudiar la evolución del desempleo post-COVID y evaluar la efectividad de las estrategias de recuperación económica.

Asimismo, construimos una variable categórica llamada Región, con el propósito de clasificar cada municipio dentro de una de las regiones geográficas de Puerto Rico: Este, Norte Central, Noroeste, Suroeste o Sureste. Esta categorización nos permitirá realizar análisis comparativos entre regiones y detectar patrones territoriales en el impacto del desempleo, así como evaluar diferencias en los niveles de recuperación económica tras la pandemia.

#A. Variable binaria: 1 si desempleo 2022 > 6.5%, 0 si no
datos$Desempleo_Alto_2022 <- ifelse(datos$Tasa_Desempleo_Dic2022 > 6.5, 1, 0)
datos$Desempleo_Alto_2022 <- as.factor(datos$Desempleo_Alto_2022)

#B Variable binaria: 1 si desempleo 2023 > 6.5%, 0 si no
datos$Desempleo_Alto_2023 <- ifelse(datos$Tasa_Desempleo_Dic2023 > 6.5, 1, 0)
datos$Desempleo_Alto_2023 <- as.factor(datos$Desempleo_Alto_2023)

#C. Variable binaria: 1 si desempleo 2024 > 6.5%, 0 si no
datos$Desempleo_Alto_2024 <- ifelse(datos$Tasa_Desempleo_Dic2024 > 6.5, 1, 0)
datos$Desempleo_Alto_2024 <- as.factor(datos$Desempleo_Alto_2024)

#C. Asignar regiones a cada municipio
datos <- datos %>%
  mutate(Region = case_when(
    Municipio %in% c("Canovanas", "Carolina", "Ceiba", "Culebra", "Fajardo",
                     "Loiza", "Luquillo", "Naguabo", "Rio Grande", "Vieques") ~ "Este",
    Municipio %in% c("Barceloneta", "Barranquitas", "Bayamon", "Catano", "Ciales",
                     "Cidra", "Comerio", "Corozal", "Dorado", "Florida", "Guaynabo",
                     "Manati", "Morovis", "Naranjito", "Orocovis", "San Juan", "Toa Alta",
                     "Toa Baja", "Vega Alta", "Vega Baja") ~ "Norte Central",
    Municipio %in% c("Adjuntas", "Aguada", "Aguadilla", "Anasco", "Arecibo", "Camuy",
                     "Hatillo", "Isabela", "Jayuya", "Lares", "Las Marias", "Mayaguez",
                     "Moca", "Quebradillas", "Rincon", "San Sebastian", "Utuado") ~ "Noroeste",
    Municipio %in% c("Cabo Rojo", "Guanica", "Guayanilla", "Hormigueros", "Lajas", "Maricao",
                     "Penuelas", "Ponce", "Sabana Grande", "San German", "Yauco") ~ "Suroeste",
    Municipio %in% c("Aguas Buenas", "Aibonito", "Arroyo", "Caguas", "Cayey", "Coamo", "Guayama",
                     "Gurabo", "Humacao", "Juana Diaz", "Juncos", "Las Piedras", "Maunabo",
                     "Patillas", "Salinas", "San Lorenzo", "Santa Isabel", "Trujillo Alto",
                     "Villalba", "Yabucoa") ~ "Sureste",
    TRUE ~ "Otra"
  ))

Un vistazo en la distribución de nuestra base de datos por región revela cómo ha evolucionado la tasa de desempleo promedio entre los años 2019 y 2024, permitiéndonos identificar tendencias diferenciadas en la recuperación económica tras el impacto del COVID-19.

# Seleccionar columnas relevantes y agrupar por región
resumen <- datos %>%
  group_by(Region) %>%
  summarise(
    Tasa_2019 = mean(Tasa_Desempleo_Dic2019, na.rm = TRUE),
    Tasa_2020 = mean(Tasa_Desempleo_Dic2020, na.rm = TRUE),
    Tasa_2021 = mean(Tasa_Desempleo_Dic2021, na.rm = TRUE),
    Tasa_2022 = mean(Tasa_Desempleo_Dic2022, na.rm = TRUE),
    Tasa_2023 = mean(Tasa_Desempleo_Dic2023, na.rm = TRUE),
    Tasa_2024 = mean(Tasa_Desempleo_Dic2024, na.rm = TRUE)
  )

# Paso: Convertir a formato largo para graficar
resumen_largo <- resumen %>%
  pivot_longer(cols = starts_with("Tasa"),
               names_to = "Año",
               names_prefix = "Tasa_",
               values_to = "Tasa_Desempleo") %>%
  mutate(Año = as.numeric(Año)) 
# Paso: Graficar líneas por región
ggplot(resumen_largo, aes(x = Año, y = Tasa_Desempleo, color = Region, group = Region)) +
  geom_line(size = 1.2) +
  geom_point(size = 3) +
  scale_color_manual(values = c(
    "Este" = "#6BCB00",        # verde brillante
    "Suroeste" = "#3E8C43",    # verde oscuro
    "Norte Central" = "#73B9E0", # azul celeste
    "Sureste" = "#B2A4D4",     # gris lavanda
    "Noroeste" = "#F18CAB"     # rosa claro
  )) +
  labs(
    title = "Evolución de la Tasa de Desempleo por Región (2019–2024)",
    x = "Año",
    y = "Tasa de Desempleo Promedio (%)",
    color = "Región"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    legend.position="right"
)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

A partir del análisis gráfico, se observa que todas las regiones experimentaron un aumento significativo en la tasa de desempleo en el año 2020, atribuible al impacto de la pandemia. Sin embargo, entre 2021 y 2022, se registró una recuperación económica generalizada, con descensos notables en todas las regiones.

No obstante, la evolución posterior revela desigualdades regionales persistentes:

El Suroeste (verde oscuro) se mantiene como la región con mayores niveles de desempleo a lo largo del período, y presenta un aumento entre 2023 y 2024, lo que sugiere estancamiento o rezago en su recuperación.

El Este y el Norte Central logran tasas consistentemente bajas desde 2022, lo que podría reflejar mejores condiciones de empleabilidad o políticas económicas más efectivas.

El Sureste y el Noroeste muestran trayectorias estables o en descenso, pero se mantienen en niveles intermedios.

En resumen, aunque la tasa de desempleo en Puerto Rico ha mejorado desde el 2020, persisten brechas regionales importantes que requieren atención diferenciada en la formulación de políticas públicas y estrategias de desarrollo económico.

# Calcular el cambio de desempleo
datos$Cambio_Desempleo_2020 <- datos$Tasa_Desempleo_Dic2020 - datos$Tasa_Desempleo_Dic2019

# Seleccionar los municipios con mayor aumento
top_municipios <- datos %>%
  arrange(desc(Cambio_Desempleo_2020)) %>%
  select(Municipio, Cambio_Desempleo_2020) %>%
  slice(1:10) 
# Gráfico
ggplot(top_municipios, aes(x = reorder(Municipio, Cambio_Desempleo_2020), y = Cambio_Desempleo_2020)) +
  geom_col(fill = "#B2A4D4") +
  coord_flip() +
  labs(
    title = "Municipios con mayor aumento en la Tasa de Desempleo (2019 a 2020)",
    x = "Municipio",
    y = "Cambio en Tasa de Desempleo (%)"
  ) +
  theme_minimal()

En esta gráfica identificamos que los municipios más afectados por el impacto del COVID-19 lo fueron Vieques y Culebra, ambos con un aumento del 5.2% en la tasa de desempleo. En el caso de Vieques, la tasa pasó de 6.9% en 2019 a 12.1% en 2020, mientras que en Culebra aumentó de 3.9% en 2019 a 9.1% en 2020. Le sigue el municipio de Naranjito, con un incremento del 5%, pasando de 9.6% en 2019 a 14.6% en 2020.

# Matriz de confusión para ilustrar el impacto en 2020 
pred <- factor(rep(1, nrow(datos)), levels = c(0, 1))
real <- factor(rep(1, nrow(datos)), levels = c(0, 1))

# Matriz de confusión forzada con dos niveles
confusionMatrix(pred, real)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0  0  0
##          1  0 78
##                                      
##                Accuracy : 1          
##                  95% CI : (0.9538, 1)
##     No Information Rate : 1          
##     P-Value [Acc > NIR] : 1          
##                                      
##                   Kappa : NaN        
##                                      
##  Mcnemar's Test P-Value : NA         
##                                      
##             Sensitivity : NA         
##             Specificity :  1         
##          Pos Pred Value : NA         
##          Neg Pred Value : NA         
##              Prevalence :  0         
##          Detection Rate :  0         
##    Detection Prevalence :  0         
##       Balanced Accuracy : NA         
##                                      
##        'Positive' Class : 0          
## 

Se construyó una matriz de confusión artificial con el propósito de observar cómo el modelo clasifica a cada municipio en función de si presenta una tasa de desempleo alta o baja en el año 2020. Para esta clasificación, se utilizó una variable binaria donde una tasa superior al 6.5% se considera “desempleo alto” (valor 1), y una tasa igual o menor a ese umbral se clasifica como “desempleo bajo” (valor 0). Los resultados de la matriz indicaron que los 78 municipios fueron clasificados como municipios con desempleo alto. Esto sugiere que el impacto de la pandemia fue generalizado en toda la isla, aunque algunos municipios se vieron más afectados que otros.

Con el propósito de identificar patrones y reconocer niveles elevados de desempleo, aplicaremos diferentes métodos de clasificación supervisada y clasificación no supervisada, con el fin de analizar las trayectorias laborales de los municipios y detectar similitudes relevantes en su comportamiento durante el periodo 2019–2024.

I. Clasificación supervisada

A. Método KNN

  1. Aplicamos el método KNN para el 2022
# Paso 1: Seleccionar columnas relevantes
datos_modelo <- datos[, c("Municipio", "Region", "Tasa_Desempleo_Dic2019", "Tasa_Desempleo_Dic2022", "Desempleo_Alto_2022")]

# Paso 2: Normalizar las variables predictoras
predictoras_norm <- as.data.frame(scale(datos_modelo[, c("Tasa_Desempleo_Dic2019", "Tasa_Desempleo_Dic2022")]))
predictoras_norm$Desempleo_Alto_2022 <- datos_modelo$Desempleo_Alto_2022
predictoras_norm$Municipio <- datos_modelo$Municipio
predictoras_norm$Region <- datos_modelo$Region  

# Paso 3: Dividir en entrenamiento y prueba
set.seed(123)
indices <- createDataPartition(predictoras_norm$Desempleo_Alto_2022, p = 0.7, list = FALSE)
train <- predictoras_norm[indices, ]
test <- predictoras_norm[-indices, ]

# Paso 4: Aplicar KNN (K = 3)
pred <- knn(train[, 1:2], test[, 1:2], cl = train$Desempleo_Alto_2022, k = 3)

# Paso 5: Añadir predicciones
test$Prediccion <- pred

# Paso 6: Validación cruzada (10 folds)
set.seed(2025)
train_control <- trainControl(method = "cv", number = 10, savePredictions = TRUE)

knn_cv <- train(
  Desempleo_Alto_2022 ~ .,
  data = predictoras_norm[, c("Tasa_Desempleo_Dic2019", "Tasa_Desempleo_Dic2022", "Desempleo_Alto_2022")],
  method = "knn",
  trControl = train_control,
  tuneGrid = data.frame(k = 3)
)

# Paso 7: Mostrar la matriz de confusión
confusionMatrix(knn_cv$pred$pred, knn_cv$pred$obs)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 30  1
##          1  1 46
##                                           
##                Accuracy : 0.9744          
##                  95% CI : (0.9104, 0.9969)
##     No Information Rate : 0.6026          
##     P-Value [Acc > NIR] : 9.407e-15       
##                                           
##                   Kappa : 0.9465          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9677          
##             Specificity : 0.9787          
##          Pos Pred Value : 0.9677          
##          Neg Pred Value : 0.9787          
##              Prevalence : 0.3974          
##          Detection Rate : 0.3846          
##    Detection Prevalence : 0.3974          
##       Balanced Accuracy : 0.9732          
##                                           
##        'Positive' Class : 0               
## 
# Paso 8: Graficar con color por región y forma por predicción
ggplot(test, aes(x = Tasa_Desempleo_Dic2019, y = Tasa_Desempleo_Dic2022, 
                 color = Region, shape = Prediccion)) +
  geom_point(size = 3) +
  geom_text_repel(aes(label = Municipio), size = 3, max.overlaps = 100) +
  labs(
    title = "Dispersión de municipios: Región y Clasificación de Desempleo Alto en 2022",
    x = "Tasa de Desempleo 2019 (normalizada)",
    y = "Tasa de Desempleo 2022 (normalizada)",
    color = "Región",
    shape = "Predicción\n(Alta=1, Baja=0)"
  ) +
  theme_minimal()

En el gráfico correspondiente a 2022, se observa una distribución de municipios con una clara separación entre los que el modelo predice como desempleo alto (triángulos) y los de desempleo bajo (círculos). Municipios como Las Marías, Rincón y Guayanilla fueron clasificados como zonas de desempleo alto, destacando en su ubicación superior dentro del plano. Esta etapa revela que, aunque algunas regiones comenzaron a estabilizarse, aún existían focos con tasas elevadas de desempleo. El modelo para este año alcanzó un accuracy de 97.4% y una sensibilidad de 96.8%.

  1. Aplicamos el método KNN para el 2023
# Paso 1: Seleccionar columnas relevantes
datos_modelo <- datos[, c("Municipio", "Region", "Tasa_Desempleo_Dic2019", "Tasa_Desempleo_Dic2023", "Desempleo_Alto_2023")]

# Paso 2: Normalizar las variables predictoras
predictoras_norm <- as.data.frame(scale(datos_modelo[, c("Tasa_Desempleo_Dic2019", "Tasa_Desempleo_Dic2023")]))
predictoras_norm$Desempleo_Alto_2023 <- datos_modelo$Desempleo_Alto_2023
predictoras_norm$Municipio <- datos_modelo$Municipio
predictoras_norm$Region <- datos_modelo$Region 

# Paso 3: Dividir en entrenamiento y prueba
set.seed(123)
indices <- createDataPartition(predictoras_norm$Desempleo_Alto_2023, p = 0.7, list = FALSE)
train <- predictoras_norm[indices, ]
test <- predictoras_norm[-indices, ]

# Paso 4: Aplicar KNN (K = 3)
pred <- knn(train[, 1:2], test[, 1:2], cl = train$Desempleo_Alto_2023, k = 3)

# Paso 5: Añadir predicciones
test$Prediccion <- pred

# Paso 6: Validación cruzada (10 folds)
set.seed(2025)
train_control <- trainControl(method = "cv", number = 10, savePredictions = TRUE)

knn_cv <- train(
  Desempleo_Alto_2023 ~ .,
  data = predictoras_norm[, c("Tasa_Desempleo_Dic2019", "Tasa_Desempleo_Dic2023", "Desempleo_Alto_2023")],
  method = "knn",
  trControl = train_control,
  tuneGrid = data.frame(k = 3)
)

# Paso 7: Mostrar la matriz de confusión
confusionMatrix(knn_cv$pred$pred, knn_cv$pred$obs)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 29  2
##          1  1 46
##                                          
##                Accuracy : 0.9615         
##                  95% CI : (0.8917, 0.992)
##     No Information Rate : 0.6154         
##     P-Value [Acc > NIR] : 7.08e-13       
##                                          
##                   Kappa : 0.9193         
##                                          
##  Mcnemar's Test P-Value : 1              
##                                          
##             Sensitivity : 0.9667         
##             Specificity : 0.9583         
##          Pos Pred Value : 0.9355         
##          Neg Pred Value : 0.9787         
##              Prevalence : 0.3846         
##          Detection Rate : 0.3718         
##    Detection Prevalence : 0.3974         
##       Balanced Accuracy : 0.9625         
##                                          
##        'Positive' Class : 0              
## 
# Paso 8: Graficar con color por región y forma por predicción
ggplot(test, aes(x = Tasa_Desempleo_Dic2019, y = Tasa_Desempleo_Dic2023, 
                 color = Region, shape = Prediccion)) +
  geom_point(size = 3) +
  geom_text_repel(aes(label = Municipio), size = 3, max.overlaps = 100) +
  labs(
    title = "Dispersión de municipios: Región y Clasificación de Desempleo Alto en 2023",
    x = "Tasa de Desempleo 2019 (normalizada)",
    y = "Tasa de Desempleo 2023 (normalizada)",
    color = "Región",
    shape = "Predicción\n(Alta=1, Baja=0)"
  ) +
  theme_minimal()

Al avanzar a 2023, el modelo identifica un nuevo conjunto de municipios con tasas elevadas, especialmente en la región Suroeste. Municipios como Guánica, Guayanilla y Patillas sobresalen como clasificados con desempleo alto. Se observa también una mayor dispersión en los datos, lo que puede indicar una variabilidad en la recuperación económica entre regiones. Algunos municipios que en 2022 eran desempleo alto, como Rincón, ya no aparecen en este conjunto, lo cual sugiere una posible mejora. En este año, el modelo alcanzó un accuracy de 96.2% y una sensibilidad de 96.7%.

  1. Aplicamos el método KNN para el 2024
# Paso 1: Seleccionar columnas relevantes
datos_modelo <- datos[, c("Municipio", "Region", "Tasa_Desempleo_Dic2019", "Tasa_Desempleo_Dic2024", "Desempleo_Alto_2024")]

# Paso 2: Normalizar las variables predictoras
predictoras_norm <- as.data.frame(scale(datos_modelo[, c("Tasa_Desempleo_Dic2019", "Tasa_Desempleo_Dic2024")]))
predictoras_norm$Desempleo_Alto_2024 <- datos_modelo$Desempleo_Alto_2024
predictoras_norm$Municipio <- datos_modelo$Municipio
predictoras_norm$Region <- datos_modelo$Region 

# Paso 3: Dividir en entrenamiento y prueba
set.seed(123)
indices <- createDataPartition(predictoras_norm$Desempleo_Alto_2024, p = 0.7, list = FALSE)
train <- predictoras_norm[indices, ]
test <- predictoras_norm[-indices, ]

# Paso 4: Aplicar KNN (K = 3)
pred <- knn(train[, 1:2], test[, 1:2], cl = train$Desempleo_Alto_2024, k = 3)

# Paso 5: Añadir predicciones
test$Prediccion <- pred

# Paso 9: Matriz de confusión con validación cruzada (10 folds)
set.seed(2025)
train_control <- trainControl(method = "cv", number = 10, savePredictions = TRUE)

# Usamos las columnas normalizadas y la variable de salida
knn_cv <- train(
  Desempleo_Alto_2024 ~ .,
  data = predictoras_norm,
  method = "knn",
  trControl = train_control,
  tuneGrid = data.frame(k = 3)
)

# Mostrar la matriz de confusión
confusionMatrix(knn_cv$pred$pred, knn_cv$pred$obs)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  0  1
##          0 30  3
##          1  6 39
##                                           
##                Accuracy : 0.8846          
##                  95% CI : (0.7922, 0.9459)
##     No Information Rate : 0.5385          
##     P-Value [Acc > NIR] : 5.721e-11       
##                                           
##                   Kappa : 0.7665          
##                                           
##  Mcnemar's Test P-Value : 0.505           
##                                           
##             Sensitivity : 0.8333          
##             Specificity : 0.9286          
##          Pos Pred Value : 0.9091          
##          Neg Pred Value : 0.8667          
##              Prevalence : 0.4615          
##          Detection Rate : 0.3846          
##    Detection Prevalence : 0.4231          
##       Balanced Accuracy : 0.8810          
##                                           
##        'Positive' Class : 0               
## 
# Paso 10: Graficar con color por región y forma por predicción
ggplot(test, aes(x = Tasa_Desempleo_Dic2019, y = Tasa_Desempleo_Dic2024, 
                 color = Region, shape = Prediccion)) +
  geom_point(size = 3) +
  geom_text_repel(aes(label = Municipio), size = 3, max.overlaps = 100) +
  labs(
    title = "Dispersión de municipios: Región y Clasificación de Desempleo Alto en 2024 ",
    x = "Tasa de Desempleo 2019 (normalizada)",
    y = "Tasa de Desempleo 2024 (normalizada)",
    color = "Región",
    shape = "Predicción\n(Alta=1, Baja=0)"
  ) +
  theme_minimal()

Finalmente, en 2024, se mantiene la presencia de varios municipios del Suroeste como zonas de desempleo alto, incluyendo nuevamente a Guayanilla y Guánica, lo cual refuerza el patrón observado en 2023. Sin embargo, también se suman otros municipios como Adjuntas, Yauco y Coamo. En contraste, municipios como Trujillo Alto, Gurabo y Bayamón aparecen clasificados con desempleo bajo, lo que muestra una recuperación más sostenida en esas regiones. Para este año, el modelo obtuvo un accuracy de 88.5% y una sensibilidad de 83.3%, ligeramente menor en comparación con años anteriores.

Esta serie de comparaciones año por año permite visualizar de forma clara qué municipios y regiones han mostrado mejoras sostenidas en el tiempo, y cuáles mantienen niveles preocupantes de desempleo. El uso de KNN con base en la tasa de desempleo de 2019 proporciona un punto de referencia útil para identificar tendencias, posibles retrocesos y áreas donde podrían enfocarse futuras políticas públicas.

B. Máquina de Vector de Soporte

datos$Region_Num <- as.numeric(as.factor(datos$Region))

# Paso 1: Preparar los datos
datos_svm_3d <- datos %>%
  select(Municipio, Region, Tasa_Desempleo_Dic2019, Tasa_Desempleo_Dic2024, Desempleo_Alto_2024) %>%
  mutate(
    Region_Num = as.numeric(as.factor(Region)),
    Desempleo_Alto_2024 = as.factor(Desempleo_Alto_2024)
  ) %>%
  na.omit()

# Paso 2: Entrenar el modelo SVM
modelo_svm_3d <- svm(
  Desempleo_Alto_2024 ~ Tasa_Desempleo_Dic2019 + Tasa_Desempleo_Dic2024 + Region_Num,
  data = datos_svm_3d,
  kernel = "radial"
)

# Paso 3: Predecir con los datos reales (para graficar)
datos_svm_3d$Prediccion <- predict(modelo_svm_3d, datos_svm_3d)

# Paso 4: Graficar 3D con colores por región
plot_ly(
  data = datos_svm_3d,
  x = ~Tasa_Desempleo_Dic2019,
  y = ~Tasa_Desempleo_Dic2024,
  z = ~Region_Num,
  color = ~Region,
  colors = c(
    "Este" = "#F48C91",
    "Noroeste" = "#949B2F",
    "Norte Central" = "#00C8B0",
    "Sureste" = "#2BC3FF",
    "Suroeste" = "#E38BE1"
  ),
  symbol = ~Desempleo_Alto_2024,
  symbols = c("0" = "circle", "1" = "x"),
  text = ~paste(
    "Municipio:", Municipio,
    "<br>Región:", Region,
    "<br>Desempleo 2019:", Tasa_Desempleo_Dic2019,
    "<br>Desempleo 2024:", Tasa_Desempleo_Dic2024
  ),
  type = "scatter3d",
  mode = "markers",
  marker = list(size = 5)
) %>%
  layout(
    title = "SVM en 3D: Predicción de Desempleo Alto en 2024 con Colores por Región",
    scene = list(
      xaxis = list(title = "Tasa de Desempleo 2019"),
      yaxis = list(title = "Tasa de Desempleo 2024"),
      zaxis = list(title = "Región ")
    )
  )

A través del modelo de Máquina de Vectores de Soporte (SVM) en 3D, pudimos observar el comportamiento individual de los municipios entre los años 2019 y 2024, teniendo en cuenta su región geográfica y la clasificación de desempleo alto o bajo. Un caso notable es el municipio de Naranjito, el cual en 2019 tenía una tasa de desempleo de 9.6%, pero logró reducirla a 5.9% en 2024, por lo que fue clasificado como desempleo bajo. Esto refleja una recuperación económica significativa a lo largo del tiempo. En contraste, municipios como Vieques y Culebra, ambos de la región Este, no han logrado bajar su tasa de desempleo. Vieques pasó de 6.9% en 2019 a 10.4% en 2024, mientras que Culebra aumentó de 3.9% a 7.2% en el mismo periodo, siendo ambos clasificados con desempleo alto. Estos casos resaltan cómo, a pesar de una recuperación general en muchas regiones, persisten zonas con rezagos importantes en términos de empleo, especialmente en islas municipio o regiones más aisladas.

  1. Clasificación no supervisada

Para el análisis jerárquico, seleccionamos las tasas de desempleo de los años 2019 a 2024 como variables principales. Estas variables permiten observar la evolución del desempleo en cada municipio antes, durante y después del impacto del COVID-19. Al tratarse de porcentajes, son comparables entre municipios independientemente del tamaño de su población. Además, capturan el comportamiento laboral a lo largo del tiempo, lo que facilita identificar patrones comunes y diferencias significativas entre municipios, elementos esenciales para formar agrupaciones coherentes en el análisis de clústeres.

A. Clúster Jerárquico

# Paso 1: Guardar los nombres de municipios
nombres <- datos$Municipio
datos <- datos[, -1]
rownames(datos) <- nombres

# Paso 2: Seleccionar variables para clustering
data <- datos[, c("Tasa_Desempleo_Dic2019", 
                                  "Tasa_Desempleo_Dic2020", 
                                  "Tasa_Desempleo_Dic2021",
                                  "Tasa_Desempleo_Dic2022", 
                                  "Tasa_Desempleo_Dic2023", 
                                  "Tasa_Desempleo_Dic2024")]

# Paso 3: Verificar que los nombres están asignados
head(rownames(data))
## [1] "Aguas Buenas" "Aibonito"     "Barceloneta"  "Barranquitas" "Bayamon"     
## [6] "Caguas"

Suponemos los grupos unitarios:

data.scaled <- scale(x = data,
                     center = TRUE,
                     scale = TRUE)

Calculamos la distancia entre los conjuntos de la partición

dist <- dist(data.scaled,method = "euclidean")

# Matriz de distancias
dist_mat  <- as.matrix(round(dist,3))

Calculamos el número óptimo de clústers jerárquicos con diferentes métodos:

  1. Método silueta
fviz_nbclust(data.scaled, FUN = hcut, method = "silhouette")

El método silueta nos muestra que el valor óptimo de clusters es k= 2.

  1. Método de codo
fviz_nbclust(data.scaled, FUN = hcut, method = "wss")

Con el método de codo podemos interpretar que el valor óptimo de clusters es k= 4.

  1. Método de brecha
fviz_nbclust(data.scaled, FUN = hcut, method = "gap_stat")

El método de brecha sugiere que el número óptimo de clústeres es k = 1. Sin embargo, este resultado debe interpretarse con cautela: aunque el valor más alto ocurre en k = 1, a partir de k = 2 en adelante, la estadística de brecha aumenta, indicando una posible mejora en la separación entre grupos si se elige un número mayor de clústeres. Es importante destacar que, aunque la barra más alta se observa en k = 10, hemos optado por utilizar k = 4, ya que en ese punto se produce un cambio significativo en la pendiente del crecimiento de la brecha, lo cual sugiere una mejor segmentación sin caer en una división excesiva del conjunto.

Calcular el modelo

modelo2 <- hclust(dist, method = "complete")

Visualizar el dendograma con cluster jerárquico

  1. Visualizamos en dendograma con k=2 como nos sugiere el método de silueta:
fviz_dend(modelo2, cex = 0.35, k=2, 
          rect = TRUE,  
          k_colors = "jco",
          rect_border = "jco", 
          rect_fill = TRUE,
          horiz = TRUE,
          ggtheme = theme_bw())
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
##   Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Esta agrupación general muestra una segmentación entre dos patrones principales de desempleo en Puerto Rico. Es útil para una visión macro, diferenciando, por ejemplo, municipios más afectados por el desempleo prolongado frente a los que han logrado una mejor recuperación.

  1. Visualizamos en dendograma con k=4 como podemos infererir del método de codo y el método de brecha:
fviz_dend(modelo2, cex = 0.35, k=4, 
          rect = TRUE,  
          k_colors = "jco",
          rect_border = "jco", 
          rect_fill = TRUE,
          horiz = TRUE,
          ggtheme = theme_bw())

grupos <- cutree(modelo2, k = 4)
table(grupos)
## grupos
##  1  2  3  4 
## 26 33 15  4

El análisis jerárquico con k = 4 permitió segmentar los municipios en cuatro grupos con patrones distintos de desempleo. El grupo más común (33 municipios) representa trayectorias de recuperación moderada, mientras que otros grupos reflejan dinámicas más inestables, especialmente el grupo 4, conformado por solo 4 municipios con características divergentes. Esta clasificación evidencia la existencia de desigualdades regionales en la recuperación post-pandemia.

# Agrupar municipios por clúster
split(rownames(data), grupos)
## $`1`
##  [1] "Aguas Buenas" "Aibonito"     "Barranquitas" "Ceiba"        "Humacao"     
##  [6] "Juncos"       "Las Piedras"  "Loiza"        "Luquillo"     "Manati"      
## [11] "Naguabo"      "Rio Grande"   "San Lorenzo"  "Vega Alta"    "Cabo Rojo"   
## [16] "Aguada"       "Anasco"       "Isabela"      "Arecibo"      "Camuy"       
## [21] "Guayama"      "Juana Diaz"   "Ponce"        "Hormigueros"  "Mayaguez"    
## [26] "Vieques"     
## 
## $`2`
##  [1] "Barceloneta"   "Ciales"        "Comerio"       "Corozal"      
##  [5] "Fajardo"       "Florida"       "Morovis"       "Naranjito"    
##  [9] "Orocovis"      "Vega Baja"     "Yabucoa"       "Lajas"        
## [13] "Sabana Grande" "San German"    "Aguadilla"     "Lares"        
## [17] "Moca"          "San Sebastian" "Utuado"        "Hatillo"      
## [21] "Quebradillas"  "Arroyo"        "Patillas"      "Penuelas"     
## [25] "Villalba"      "Yauco"         "Adjuntas"      "Coamo"        
## [29] "Jayuya"        "Salinas"       "Santa Isabel"  "Las Marias"   
## [33] "Maricao"      
## 
## $`3`
##  [1] "Bayamon"       "Caguas"        "Canovanas"     "Carolina"     
##  [5] "Catano"        "Cayey"         "Cidra"         "Dorado"       
##  [9] "Guaynabo"      "Gurabo"        "San Juan"      "Toa Alta"     
## [13] "Toa Baja"      "Trujillo Alto" "Culebra"      
## 
## $`4`
## [1] "Maunabo"    "Rincon"     "Guanica"    "Guayanilla"

Tras aplicar el análisis de clúster jerárquico, decidimos quedarnos con una división de cuatro grupos basados en la similitud en las tasas de desempleo entre 2019 y 2024. - Grupo 1: Municipios semiurbanos y costeros con trayectoria intermedia. No presentan mejoras significativas, pero tampoco casos extremos. - Grupo 2: Municipios rurales con desempleo consistentemente alto. Mantienen estabilidad sin fluctuaciones marcadas. - Grupo 3: Municipios del área metropolitana con desempleo bajo y estable. - Grupo 4: Municipios atípicos y vulnerables. Requieren atención especial debido a condiciones estructurales particulares.