Introducción

El aprendizaje no supervisado permite encontrar estructura en datos sin una variable respuesta predefinida. En este taller se aplica al análisis de países a partir de indicadores cuantitativos de desarrollo del Banco Mundial. El objetivo es reducir la dimensionalidad mediante un Análisis de Componentes Principales (ACP) y, posteriormente, segmentar los países con el método de Ward utilizando los factores estimados por el ACP.

La pregunta central es: ¿qué patrones de desarrollo, estructura productiva y desempeño macroeconómico diferencian a los países de la muestra? La respuesta se construye a partir de 15 variables cuantitativas observadas para 50 países, complementadas con la región geográfica como variable descriptiva.

Metodología

Datos y selección de variables

La base de trabajo corresponde a la hoja datos del archivo base_paises_50_lista_R.xlsx. El año de referencia corresponde al año seleccionado del Banco Mundial para el ejercicio. Se conservaron únicamente observaciones de países, verificando que el código ISO3 tuviera tres letras mayúsculas, y se mantuvieron las 15 variables cuantitativas disponibles.

library(readxl)
library(dplyr)
library(tidyr)
library(ggplot2)
library(psych)
library(corrplot)
library(factoextra)
library(knitr)

theme_set(theme_minimal(base_size = 11))

ruta <- "base_paises_50_lista_R.xlsx"
base_original <- read_excel(ruta, sheet = "datos")
diccionario <- read_excel(ruta, sheet = "diccionario")

base <- base_original %>%
  filter(
    !is.na(pais),
    !is.na(codigo),
    grepl("^[A-Z]{3}$", codigo)
  )

variables_identificacion <- c("pais", "codigo", "region")
variables_numericas <- base %>%
  select(where(is.numeric)) %>%
  names()

cat("Países en la muestra:", nrow(base), "\n")
## Países en la muestra: 50
cat("Variables cuantitativas:", length(variables_numericas), "\n")
## Variables cuantitativas: 15
cat("Regiones:", paste(names(table(base$region)), collapse = ", "), "\n")
## Regiones: America, Asia, Europa

La Tabla 1 resume el diccionario de variables. Las variables monetarias están expresadas en dólares corrientes y las restantes en porcentajes, años o índices, por lo que la estandarización es necesaria antes del ACP.

kable(
  diccionario,
  caption = "Diccionario de variables de la base de datos"
)
Diccionario de variables de la base de datos
variable tipo_en_R descripcion unidad nota
pais texto Nombre del país (inglés, nomenclatura Banco Mundial) — NA
codigo texto Código ISO3 — NA
region factor America / Asia / Europa — NA
gasto_pib numérica Gasto público total (supuesto, ver nota) % del PIB Definición inferida del rango de valores; confirmar contra su fuente original.
ied_neta_usd numérica Inversión extranjera directa, neta (BoP) USD corrientes Definición inferida; confirmar signo/convención con su fuente.
import_merc_usd numérica Importaciones de mercancías USD corrientes NA
desempleo numérica Tasa de desempleo % fuerza laboral NA
pib_pc_ppa numérica PIB per cápita, PPA USD internacionales NA
crec_pib numérica Crecimiento anual del PIB % NA
inflacion numérica Inflación (precios al consumidor) % anual NA
agricultura numérica Valor agregado agricultura % del PIB NA
industria numérica Valor agregado industria % del PIB NA
exportaciones numérica Exportaciones de bienes y servicios % del PIB NA
cuenta_corriente numérica Saldo de cuenta corriente % del PIB NA
ied_entradas numérica Entradas netas de IED % del PIB NA
consumo_gob numérica Consumo final del gobierno general % del PIB NA
manuf_exp numérica Exportaciones manufactureras % exportaciones de mercancías NA
esp_vida numérica Esperanza de vida al nacer años NA

Procedimiento

  1. Preparación: verificación de países, valores faltantes y estandarización de las 15 variables cuantitativas con scale().
  2. Análisis descriptivo: medidas de tendencia central y dispersión, histogramas, boxplots estandarizados y matriz de correlaciones.
  3. ACP: estandarización, extracción de componentes, varianza explicada, cargas, contribuciones y representación de países y variables.
  4. Clusterización: distancias euclidianas sobre los primeros cuatro componentes del ACP, agrupamiento jerárquico con ward.D2, dendrograma y selección de k mediante silueta media.
  5. Caracterización: tamaño de los clusters, composición regional, medias por variable y perfil estandarizado.

Resultados descriptivos

Estadísticas descriptivas

desc <- psych::describe(base[variables_numericas]) %>%
  as.data.frame() %>%
  tibble::rownames_to_column("variable") %>%
  select(variable, n, mean, sd, median, min, max, skew, kurtosis) %>%
  mutate(across(where(is.numeric), ~ round(.x, 2)))

kable(
  desc,
  caption = "Estadísticas descriptivas de las variables cuantitativas"
)
Estadísticas descriptivas de las variables cuantitativas
variable n mean sd median min max skew kurtosis
gasto_pib 50 3.053000e+01 1.185000e+01 3.273000e+01 3.770000e+00 5.330000e+01 -0.04 -1.02
ied_neta_usd 50 1.923629e+09 3.544230e+10 -2.361477e+09 -7.462205e+10 1.770139e+11 3.03 12.36
import_merc_usd 50 2.645639e+11 3.098106e+11 1.066060e+11 1.091600e+10 1.467598e+12 1.59 2.63
desempleo 50 5.120000e+00 2.530000e+00 4.610000e+00 2.600000e-01 1.218000e+01 0.67 0.14
pib_pc_ppa 50 4.737253e+04 3.231817e+04 4.478627e+04 7.184260e+03 1.525961e+05 1.18 1.68
crec_pib 50 2.010000e+00 2.210000e+00 1.630000e+00 -2.030000e+00 7.210000e+00 0.29 -0.72
inflacion 50 9.530000e+00 1.945000e+01 5.580000e+00 5.300000e-01 1.334900e+02 5.40 30.53
agricultura 50 4.910000e+00 4.840000e+00 2.850000e+00 3.000000e-02 1.966000e+01 1.43 1.31
industria 50 2.637000e+01 7.430000e+00 2.561000e+01 9.290000e+00 4.761000e+01 0.62 0.68
exportaciones 50 5.064000e+01 3.766000e+01 3.971000e+01 1.282000e+01 2.173800e+02 2.55 7.78
cuenta_corriente 50 1.400000e+00 5.200000e+00 5.400000e-01 -7.250000e+00 1.717000e+01 1.23 1.54
ied_entradas 50 1.020000e+00 8.280000e+00 2.020000e+00 -3.328000e+01 2.461000e+01 -2.13 8.53
consumo_gob 50 1.671000e+01 4.670000e+00 1.735000e+01 6.080000e+00 2.569000e+01 -0.18 -0.72
manuf_exp 50 5.720000e+01 2.569000e+01 6.585000e+01 8.180000e+00 9.370000e+01 -0.65 -1.07
esp_vida 50 7.862000e+01 4.110000e+00 7.837000e+01 6.983000e+01 8.416000e+01 -0.37 -1.13

Se observa una alta heterogeneidad entre países. Variables como import_merc_usd, ied_neta_usd, inflacion y exportaciones presentan distribuciones asimétricas y valores extremos, mientras que esp_vida, desempleo y consumo_gob tienen rangos más acotados. Esta diferencia de escalas justifica el uso de variables estandarizadas en el ACP.

Distribuciones

base %>%
  select(all_of(variables_numericas)) %>%
  pivot_longer(cols = everything(), names_to = "variable", values_to = "valor") %>%
  ggplot(aes(x = valor)) +
  geom_histogram(bins = 20, fill = "#2C7BB6", color = "white") +
  facet_wrap(~ variable, scales = "free", ncol = 3) +
  labs(
    x = "Valor",
    y = "Frecuencia",
    title = "Distribución de las variables cuantitativas"
  ) +
  theme(strip.text = element_text(size = 8))

base_z <- base %>%
  mutate(across(all_of(variables_numericas), ~ as.numeric(scale(.x))))

base_z %>%
  select(all_of(variables_numericas)) %>%
  pivot_longer(cols = everything(), names_to = "variable", values_to = "z") %>%
  ggplot(aes(x = reorder(variable, z, median), y = z)) +
  geom_boxplot(fill = "#FDAE61", outlier.color = "#D7191C") +
  coord_flip() +
  labs(
    x = NULL,
    y = "Valor estandarizado (z)",
    title = "Boxplots de las variables estandarizadas"
  ) +
  theme(axis.text.y = element_text(size = 8))

Los boxplots estandarizados evidencian valores atípicos en inflacion, exportaciones, import_merc_usd e ied_neta_usd. Estos valores se conservan porque corresponden a diferencias reales entre economías y no a errores de registro; su efecto se mitiga parcialmente con la estandarización.

Matriz de correlaciones

cor_mat <- cor(base[variables_numericas], use = "complete.obs")

corrplot(
  cor_mat,
  method = "ellipse",
  type = "upper",
  tl.cex = 0.65,
  tl.col = "black",
  mar = c(0, 0, 1, 0)
)

idx <- which(upper.tri(cor_mat) & abs(cor_mat) >= 0.6, arr.ind = TRUE)

cor_altas <- data.frame(
  variable_1 = rownames(cor_mat)[idx[, 1]],
  variable_2 = colnames(cor_mat)[idx[, 2]],
  r = cor_mat[idx]
) %>%
  arrange(desc(abs(r)))

kable(
  cor_altas,
  digits = 3,
  caption = "Pares de variables con correlación absoluta mayor o igual a 0.6"
)
Pares de variables con correlación absoluta mayor o igual a 0.6
variable_1 variable_2 r
gasto_pib consumo_gob 0.796
agricultura esp_vida -0.780
pib_pc_ppa esp_vida 0.753
pib_pc_ppa exportaciones 0.743
pib_pc_ppa agricultura -0.712
pib_pc_ppa cuenta_corriente 0.657

Las correlaciones más fuertes aparecen entre pib_pc_ppa y esp_vida (0.753), pib_pc_ppa y exportaciones (0.743), agricultura y esp_vida (-0.780) y gasto_pib con consumo_gob (0.796). Esto sugiere que el primer componente del ACP capturará principalmente un eje de desarrollo económico y bienestar, asociado negativamente con el peso de la agricultura.

Reducción de dimensionalidad: ACP

Varianza explicada

pca_res <- prcomp(
  base[variables_numericas],
  center = TRUE,
  scale. = TRUE
)

eig <- get_eigenvalue(pca_res)

eig_tab <- eig %>%
  tibble::rownames_to_column("componente") %>%
  mutate(across(where(is.numeric), ~ round(.x, 3)))

kable(
  eig_tab,
  caption = "Autovalores y proporción de varianza explicada por componente"
)
Autovalores y proporción de varianza explicada por componente
componente eigenvalue variance.percent cumulative.variance.percent
Dim.1 4.783 31.887 31.887
Dim.2 2.438 16.253 48.140
Dim.3 1.597 10.645 58.786
Dim.4 1.254 8.362 67.148
Dim.5 1.018 6.788 73.935
Dim.6 0.915 6.100 80.035
Dim.7 0.817 5.446 85.481
Dim.8 0.592 3.948 89.429
Dim.9 0.416 2.771 92.201
Dim.10 0.358 2.386 94.587
Dim.11 0.274 1.827 96.413
Dim.12 0.257 1.714 98.127
Dim.13 0.113 0.756 98.883
Dim.14 0.091 0.609 99.491
Dim.15 0.076 0.509 100.000
fviz_eig(
  pca_res,
  addlabels = TRUE,
  ylim = c(0, 100),
  barfill = "#2C7BB6",
  barcolor = "#2C7BB6",
  linecolor = "#D7191C"
) +
  labs(
    title = "Varianza explicada por componente",
    x = "Componente principal",
    y = "% de varianza explicada"
  )

Los dos primeros componentes explican el 48.1% de la varianza; los tres primeros, el 58.8%; y los cuatro primeros, el 67.1%. Se retienen cuatro componentes para la clusterización porque acumulan una proporción razonable de información, tienen autovalores mayores que 1 y permiten una interpretación sustantiva de los perfiles de países.

Cargas y contribuciones

cargas <- as.data.frame(pca_res$rotation[, 1:4]) %>%
  tibble::rownames_to_column("variable") %>%
  mutate(across(where(is.numeric), ~ round(.x, 3)))

kable(
  cargas,
  caption = "Cargas factoriales de las variables en los primeros cuatro componentes"
)
Cargas factoriales de las variables en los primeros cuatro componentes
variable PC1 PC2 PC3 PC4
gasto_pib 0.324 0.345 -0.112 -0.161
ied_neta_usd 0.132 -0.003 -0.413 0.307
import_merc_usd 0.214 -0.060 -0.363 0.172
desempleo 0.045 0.438 0.378 -0.162
pib_pc_ppa 0.374 -0.258 0.209 -0.058
crec_pib -0.295 -0.086 -0.163 -0.404
inflacion -0.066 0.189 0.287 0.394
agricultura -0.383 0.028 -0.142 -0.114
industria -0.208 -0.337 -0.028 0.437
exportaciones 0.221 -0.361 0.170 -0.359
cuenta_corriente 0.195 -0.490 0.140 0.055
ied_entradas -0.155 -0.160 0.281 -0.194
consumo_gob 0.328 0.248 -0.043 0.069
manuf_exp 0.190 -0.049 -0.461 -0.339
esp_vida 0.392 -0.040 0.163 0.097
res_var <- get_pca_var(pca_res)

contrib <- as.data.frame(res_var$contrib[, 1:4]) %>%
  tibble::rownames_to_column("variable") %>%
  mutate(across(where(is.numeric), ~ round(.x, 2)))

kable(
  contrib,
  caption = "Contribución de cada variable a los primeros cuatro componentes (%)"
)
Contribución de cada variable a los primeros cuatro componentes (%)
variable Dim.1 Dim.2 Dim.3 Dim.4
gasto_pib 10.53 11.88 1.26 2.58
ied_neta_usd 1.74 0.00 17.03 9.41
import_merc_usd 4.59 0.35 13.18 2.94
desempleo 0.20 19.20 14.31 2.62
pib_pc_ppa 14.01 6.67 4.37 0.34
crec_pib 8.73 0.74 2.67 16.33
inflacion 0.43 3.57 8.24 15.51
agricultura 14.66 0.08 2.01 1.30
industria 4.32 11.36 0.08 19.14
exportaciones 4.86 13.07 2.89 12.90
cuenta_corriente 3.80 23.96 1.96 0.30
ied_entradas 2.39 2.57 7.90 3.76
consumo_gob 10.77 6.15 0.18 0.48
manuf_exp 3.61 0.24 21.25 11.47
esp_vida 15.36 0.16 2.67 0.93

La interpretación de los componentes es la siguiente:

  • PC1 (31.9%): desarrollo económico y bienestar frente al peso agrícola. Las cargas positivas más altas corresponden a esp_vida (0.392), pib_pc_ppa (0.374), consumo_gob (0.328) y gasto_pib (0.324); las negativas, a agricultura (-0.383) y crec_pib (-0.295). Valores altos de PC1 identifican países de mayores ingresos, mayor esperanza de vida y mayor gasto público, con menor participación agrícola.
  • PC2 (16.3%): tensión laboral y externa frente a fortaleza exportadora e industrial. Se asocia positivamente con desempleo (0.438) y gasto_pib (0.345), y negativamente con cuenta_corriente (-0.490), exportaciones (-0.361) e industria (-0.337).
  • PC3 (10.6%): orientación manufacturera y comercial frente a presión macroeconómica. Presenta cargas negativas en manuf_exp (-0.461), ied_neta_usd (-0.413) e import_merc_usd (-0.363), y positivas en desempleo (0.378) e inflacion (0.287).
  • PC4 (8.4%): estructura industrial con presión de precios y bajo crecimiento exportador. Se asocia positivamente con industria (0.437) e inflacion (0.394), y negativamente con crec_pib (-0.404), exportaciones (-0.359) y manuf_exp (-0.339).

Representación de variables y países

fviz_pca_var(
  pca_res,
  col.var = "contrib",
  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
  repel = TRUE,
  title = "Variables en el plano principal (PC1-PC2)"
)

fviz_pca_ind(
  pca_res,
  col.ind = base$region,
  palette = c("#D7191C", "#2C7BB6", "#1A9641"),
  addEllipses = TRUE,
  ellipse.type = "convex",
  repel = TRUE,
  title = "Países en el plano principal según región"
)

fviz_pca_biplot(
  pca_res,
  repel = TRUE,
  col.var = "#2C7BB6",
  col.ind = "#999999",
  title = "Biplot del ACP"
)

En el plano PC1-PC2 se aprecia una separación entre economías avanzadas, ubicadas hacia valores altos de PC1, y economías emergentes con mayor peso agrícola, hacia valores bajos de PC1. La región geográfica acompaña parcialmente esta separación, pero no la determina por completo: existen países europeos con perfiles macroeconómicos más cercanos a América Latina y países asiáticos con perfiles de alto ingreso.

Segmentación con el método de Ward

Distancias y dendrograma

factores <- as.data.frame(pca_res$x[, 1:4])
names(factores) <- paste0("PC", 1:4)

dist_fact <- dist(factores, method = "euclidean")
hc <- hclust(dist_fact, method = "ward.D2")

fviz_dend(
  hc,
  k = 4,
  cex = 0.5,
  rect = TRUE,
  k_colors = c("#D7191C", "#2C7BB6", "#1A9641", "#FDAE61"),
  main = "Dendrograma del agrupamiento jerárquico (Ward) sobre los factores del ACP"
)

Selección del número de clusters

sil_vals <- sapply(2:6, function(k) {
  cl <- cutree(hc, k = k)
  mean(cluster::silhouette(cl, dist_fact)[, 3])
})

sil_df <- data.frame(k = 2:6, silueta = as.numeric(sil_vals))

kable(
  sil_df,
  digits = 3,
  caption = "Silueta media para distintos números de clusters"
)
Silueta media para distintos números de clusters
k silueta
2 0.316
3 0.263
4 0.305
5 0.292
6 0.295
ggplot(sil_df, aes(x = factor(k), y = silueta)) +
  geom_col(fill = "#2C7BB6") +
  geom_text(aes(label = round(silueta, 3)), vjust = -0.3, size = 3.5) +
  ylim(0, max(sil_df$silueta) * 1.15) +
  labs(
    x = "Número de clusters (k)",
    y = "Silueta media",
    title = "Selección del número de clusters"
  )

La silueta media más alta se obtiene con k = 2 (0.316), pero una división en dos grupos resulta demasiado gruesa para caracterizar el desarrollo de los países. Con k = 4 la silueta es 0.305, muy cercana a la máxima, y el dendrograma muestra cuatro ramas principales con perfiles diferenciados. Por ello se adopta k = 4 como solución de compromiso entre calidad del agrupamiento e interpretabilidad.

Clusters obtenidos

set.seed(123)

clusters <- cutree(hc, k = 4)

base_cl <- base %>%
  mutate(cluster = factor(clusters, labels = paste0("C", 1:4)))

base_cl %>%
  count(cluster, name = "paises") %>%
  kable(caption = "Tamaño de cada cluster")
Tamaño de cada cluster
cluster paises
C1 12
C2 17
C3 17
C4 4
tab_region <- as.data.frame.matrix(table(base$region, base_cl$cluster)) %>%
  tibble::rownames_to_column("region")

kable(
  tab_region,
  caption = "Número de países por región y cluster"
)
Número de países por región y cluster
region C1 C2 C3 C4
America 6 8 0 0
Asia 0 9 3 2
Europa 6 0 14 2
tab_region_pct <- as.data.frame.matrix(
  round(100 * prop.table(table(base$region, base_cl$cluster), margin = 2), 1)
) %>%
  tibble::rownames_to_column("region")

kable(
  tab_region_pct,
  caption = "Porcentaje de países por región dentro de cada cluster"
)
Porcentaje de países por región dentro de cada cluster
region C1 C2 C3 C4
America 50 47.1 0.0 0
Asia 0 52.9 17.6 50
Europa 50 0.0 82.4 50

Caracterización de los clusters

perfil <- base_cl %>%
  group_by(cluster) %>%
  summarise(across(all_of(variables_numericas), mean), .groups = "drop")

perfil_long <- perfil %>%
  pivot_longer(-cluster, names_to = "variable", values_to = "media") %>%
  pivot_wider(names_from = cluster, values_from = media)

kable(
  perfil_long,
  digits = 2,
  caption = "Media de cada variable cuantitativa por cluster"
)
Media de cada variable cuantitativa por cluster
variable C1 C2 C3 C4
gasto_pib 3.346000e+01 2.003000e+01 4.040000e+01 2.44100e+01
ied_neta_usd -9.421950e+09 -4.384573e+09 1.942147e+10 -1.15956e+10
import_merc_usd 1.018477e+11 1.474280e+11 4.988199e+11 2.54952e+11
desempleo 7.800000e+00 3.770000e+00 4.940000e+00 3.59000e+00
pib_pc_ppa 3.705064e+04 2.072635e+04 6.403287e+04 1.20778e+05
crec_pib 2.080000e+00 3.450000e+00 6.300000e-01 1.55000e+00
inflacion 2.099000e+01 6.330000e+00 5.960000e+00 3.92000e+00
agricultura 4.480000e+00 9.590000e+00 1.540000e+00 6.60000e-01
industria 2.238000e+01 3.115000e+01 2.386000e+01 2.86800e+01
exportaciones 3.824000e+01 3.617000e+01 5.336000e+01 1.37770e+02
cuenta_corriente -1.970000e+00 -2.600000e-01 2.570000e+00 1.35900e+01
ied_entradas 3.100000e+00 2.660000e+00 -3.230000e+00 5.89000e+00
consumo_gob 1.693000e+01 1.286000e+01 2.072000e+01 1.54100e+01
manuf_exp 4.398000e+01 5.058000e+01 7.619000e+01 4.43200e+01
esp_vida 7.865000e+01 7.420000e+01 8.196000e+01 8.30800e+01
perfil_z <- base_z %>%
  mutate(cluster = base_cl$cluster) %>%
  group_by(cluster) %>%
  summarise(across(all_of(variables_numericas), mean), .groups = "drop") %>%
  pivot_longer(-cluster, names_to = "variable", values_to = "z")

ggplot(perfil_z, aes(x = cluster, y = reorder(variable, z, mean), fill = z)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(z, 1)), size = 2.8) +
  scale_fill_gradient2(
    low = "#2C7BB6",
    mid = "white",
    high = "#D7191C",
    midpoint = 0,
    name = "z"
  ) +
  labs(
    x = "Cluster",
    y = NULL,
    title = "Perfil estandarizado de los clusters"
  ) +
  theme(axis.text.y = element_text(size = 8))

fviz_cluster(
  list(data = factores, cluster = clusters),
  geom = "point",
  ellipse.type = "convex",
  palette = c("#D7191C", "#2C7BB6", "#1A9641", "#FDAE61"),
  ggtheme = theme_minimal(),
  main = "Clusters de países en el plano PC1-PC2"
)

base_cl %>%
  arrange(cluster, region, pais) %>%
  select(cluster, region, pais) %>%
  kable(caption = "Países incluidos en cada cluster")
Países incluidos en cada cluster
cluster region pais
C1 America Argentina
C1 America Brazil
C1 America Chile
C1 America Colombia
C1 America Costa Rica
C1 America Uruguay
C1 Europa Bulgaria
C1 Europa Croatia
C1 Europa Greece
C1 Europa Lithuania
C1 Europa Portugal
C1 Europa Turkiye
C2 America Dominican Republic
C2 America El Salvador
C2 America Guatemala
C2 America Honduras
C2 America Mexico
C2 America Nicaragua
C2 America Paraguay
C2 America Peru
C2 Asia Cambodia
C2 Asia India
C2 Asia Kazakhstan
C2 Asia Malaysia
C2 Asia Philippines
C2 Asia Saudi Arabia
C2 Asia Sri Lanka
C2 Asia Thailand
C2 Asia Uzbekistan
C3 Asia Israel
C3 Asia Japan
C3 Asia Korea, Rep.
C3 Europa Austria
C3 Europa Belgium
C3 Europa Denmark
C3 Europa Finland
C3 Europa France
C3 Europa Germany
C3 Europa Hungary
C3 Europa Italy
C3 Europa Netherlands
C3 Europa Poland
C3 Europa Slovenia
C3 Europa Spain
C3 Europa Switzerland
C3 Europa United Kingdom
C4 Asia Singapore
C4 Asia United Arab Emirates
C4 Europa Luxembourg
C4 Europa Norway

Resultados e interpretación

¿Qué componentes explican mayor variabilidad y qué representan?

El PC1 es el componente de mayor peso (31.9%) y representa un eje de desarrollo económico y bienestar: mayores ingresos por habitante, mayor esperanza de vida y mayor gasto público se oponen a una mayor participación de la agricultura y a un crecimiento más volátil. El PC2 (16.3%) representa una dimensión de tensión laboral y externa, con mayor desempleo y gasto público frente a mejores saldos de cuenta corriente, exportaciones e industria. El PC3 (10.6%) captura la orientación manufacturera y comercial frente a economías con mayor presión inflacionaria y menor capacidad de importación. En conjunto, los cuatro primeros componentes explican el 67.1% de la variabilidad total.

¿Cuántos clusters se formaron y qué características definen cada grupo?

Se formaron cuatro clusters:

  • C1 — Ingreso medio con tensiones macroeconómicas (12 países). Reúne a Argentina, Brasil, Chile, Colombia, Costa Rica, Uruguay, Bulgaria, Croacia, Grecia, Lituania, Portugal y Turquía. Presenta la inflación media más alta (21.0%), el mayor desempleo (7.8%) y el saldo de cuenta corriente más negativo (-1.97% del PIB). Su PIB per cápita promedio es intermedio (37,051 USD PPA) y su esperanza de vida ronda los 78.7 años.
  • C2 — Emergentes de menor ingreso y base agrícola (17 países). Incluye economías de América Latina y Asia como República Dominicana, El Salvador, Guatemala, México, Nicaragua, Paraguay, Perú, Honduras, Camboya, India, Kazajistán, Malasia, Filipinas, Arabia Saudita, Sri Lanka, Tailandia y Uzbekistán. Tiene el menor PIB per cápita (20,726 USD PPA), la mayor participación agrícola (9.6%), la menor esperanza de vida (74.2 años) y el menor consumo público (12.9% del PIB), pero el mayor crecimiento económico (3.45%).
  • C3 — Economías avanzadas industrializadas y exportadoras (17 países). Agrupa a Israel, Japón, Corea del Sur, Austria, Bélgica, Dinamarca, Finlandia, Francia, Alemania, Hungría, Italia, Países Bajos, Polonia, Eslovenia, España, Suiza y Reino Unido. Se caracteriza por un alto PIB per cápita (64,033 USD PPA), la mayor orientación hacia exportaciones manufactureras (76.2%), alto consumo público (20.7% del PIB), baja agricultura (1.5%) y esperanza de vida de 82 años.
  • C4 — Pequeñas economías de altos ingresos y alta apertura (4 países). Integrado por Singapur, Emiratos Árabes Unidos, Luxemburgo y Noruega. Presenta el mayor PIB per cápita (120,778 USD PPA), la mayor apertura exportadora (138% del PIB), el mayor superávit de cuenta corriente (13.6% del PIB) y la mayor esperanza de vida (83.1 años). Es un grupo pequeño, por lo que su interpretación debe tomarse con cautela.

¿Se observan patrones interesantes entre los países?

Sí. El análisis muestra tres patrones principales:

  1. Un gradiente de desarrollo: los países se ordenan desde economías emergentes con mayor peso agrícola y menor esperanza de vida (C2) hasta economías avanzadas con altos ingresos y mayor esperanza de vida (C3 y C4).
  2. Una brecha regional parcial: Europa concentra la mayor parte del cluster de economías avanzadas, mientras que América Latina se reparte entre el cluster de ingreso medio con tensiones macroeconómicas (C1) y el de emergentes con base agrícola (C2). Asia presenta una alta heterogeneidad: incluye economías emergentes, avanzadas y hubs de altos ingresos.
  3. Perfiles macroeconómicos diferenciados: el cluster C1 se distingue por inflación y desempleo relativamente altos; el C2, por crecimiento y agricultura; el C3, por manufactura y exportaciones; y el C4, por apertura comercial y superávit externo.

Conclusiones

El ACP permitió resumir 15 indicadores cuantitativos en cuatro componentes que explican el 67.1% de la varianza. El primer componente sintetiza el nivel de desarrollo y bienestar; el segundo, las tensiones laborales y externas; el tercero, la orientación manufacturera y comercial; y el cuarto, la estructura industrial con presión inflacionaria.

El método de Ward aplicado sobre los factores del ACP identificó cuatro segmentos de países con perfiles diferenciados. La segmentación no solo reproduce en parte la geografía, sino que también revela diferencias de ingreso, estructura productiva, desempeño macroeconómico y apertura comercial. Esto confirma que el aprendizaje no supervisado es útil para explorar patrones de desarrollo y para construir tipologías de países.

Este tipo de análisis tiene usos reales en economía y políticas públicas: permite comparar países pares, diseñar políticas diferenciadas, priorizar cooperación técnica, identificar grupos vulnerables a choques macroeconómicos y evaluar el desempeño relativo de una economía frente a sus similares. Entre las limitaciones del ejercicio están el tamaño reducido de la muestra (50 países), el uso de un solo año, la presencia de valores extremos y la necesidad de interpretar con cautela variables como la IED neta, cuya convención de signo depende de la fuente.

Bibliografía

  • Banco Mundial. World Development Indicators. https://databank.worldbank.org/source/world-development-indicators
  • James, G., Witten, D., Hastie, T. y Tibshirani, R. (2021). An Introduction to Statistical Learning. Springer.
  • Kassambara, A. y Mundt, F. factoextra: Extract and Visualize the Results of Multivariate Data Analyses. Paquete de R.
  • R Core Team. R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing.
  • Rousseeuw, P. J. (1987). Silhouettes: A graphical aid to the interpretation and validation of cluster analysis. Journal of Computational and Applied Mathematics, 20, 53-65.
  • Ward, J. H. (1963). Hierarchical grouping to optimize an objective function. Journal of the American Statistical Association, 58(301), 236-244.