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.
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
## Variables cuantitativas: 15
## 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.
| 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 |
scale().ward.D2, dendrograma y selección de k mediante
silueta media.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"
)| 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.
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.
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"
)| 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.
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"
)| 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 <- 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"
)| 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 (%)"
)| 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:
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.desempleo (0.438) y gasto_pib (0.345), y
negativamente con cuenta_corriente (-0.490),
exportaciones (-0.361) e industria
(-0.337).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).industria (0.437) e inflacion (0.394), y
negativamente con crec_pib (-0.404),
exportaciones (-0.359) y manuf_exp
(-0.339).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.
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"
)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"
)| 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.
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")| 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"
)| 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"
)| 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 |
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"
)| 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")| 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 |
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.
Se formaron cuatro clusters:
Sí. El análisis muestra tres patrones principales:
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.