Juntamos todos los clusters en uno unico
# ---------- DATOS Y CLUSTERIZACIÓN ----------
# Variables a considerar
vars <- c("trade_usd", "2_property_rights", "4_trade", "3_sound_money", "5c_business_reg")
# Tabla resumida por país
tabla_cluster <- tabla_filtrada %>%
group_by(Pais) %>%
summarise(trade_usd = mean(trade_usd, na.rm = TRUE), .groups = "drop")
# Normalización
tabla_cluster$trade_usd_z <- scale(tabla_cluster$trade_usd)
# Clustering jerárquico
dist_matrix <- dist(tabla_cluster$trade_usd_z)
hc <- hclust(dist_matrix, method = "ward.D2")
tabla_cluster$cluster <- cutree(hc, k = 6)
# Agregar clúster a los datos
tabla_filtrada_cluster <- left_join(tabla_filtrada, tabla_cluster %>% select(Pais, cluster), by = "Pais")
tabla_filtrada_cluster <- tabla_filtrada_cluster %>%
mutate(trade_usd = trade_usd / 1000)
# ---------- CORRELACIONES POR PAÍS ----------
otras_vars <- setdiff(vars, "trade_usd")
correlaciones <- tabla_filtrada_cluster %>%
group_by(Pais, cluster) %>%
filter(n() >= 3) %>%
summarise(
across(all_of(otras_vars), ~{
valid <- complete.cases(.x, trade_usd)
if (sum(valid) >= 2) cor(.x[valid], trade_usd[valid], method = "spearman") else NA_real_
}, .names = "cor_{.col}"),
mean_correlation = mean(c_across(starts_with("cor_")), na.rm = TRUE),
base_mean = mean(trade_usd, na.rm = TRUE),
.groups = "drop"
) %>%
rename(name = Pais)
# ---------- MAPA INTERACTIVO ÚNICO ----------
# Obtener geometría mundial
world <- ne_countries(scale = "medium", returnclass = "sf")
# Unir mapa con datos
mapa_sf <- left_join(world, correlaciones, by = "name")
# Etiquetas del popup
mapa_sf$popup <- apply(mapa_sf, 1, function(row) {
cors <- paste0("<strong>Correlación con ", otras_vars, ": </strong>",
format(round(as.numeric(row[paste0("cor_", otras_vars)]), 2)), collapse = "<br/>")
paste0(
"<strong>País: </strong>", row["name"], "<br/>",
"<strong>Clúster: </strong>", row["cluster"], "<br/>",
"<strong>Promedio trade_usd: </strong>$", format(round(as.numeric(row["base_mean"]), 2), big.mark = ","), "<br/>",
cors, "<br/>",
"<strong><u>Correlación promedio: </u></strong>", round(as.numeric(row["mean_correlation"]), 2)
)
})
# Colores por clúster (opcional: puedes usar colores distintos por clúster si prefieres)
paleta_color <- colorNumeric("RdYlBu", domain = mapa_sf$mean_correlation)
# Crear mapa interactivo
leaflet(data = mapa_sf) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(
fillColor = ~paleta_color(mean_correlation),
fillOpacity = 0.7,
color = "#BDBDC3",
weight = 1,
popup = ~popup
) %>%
addLegend(
pal = paleta_color,
values = ~mean_correlation,
position = "bottomright",
title = "Correlación media con trade_usd"
)