1 Introducción

La Organización para la Cooperación y el Desarrollo Económicos (OECD) constituye uno de los foros multilaterales más influyentes en materia de política económica global. Fundada en 1961 como sucesora de la Organización Europea de Cooperación Económica (OECE), la OECD ha emprendido en las últimas décadas un proceso de expansión estratégica orientado a universalizar sus denominadas “buenas prácticas”, incorporando progresivamente economías con mayor heterogeneidad en sus características económicas. Hoy agrupa a 38 miembros plenos y mantiene vínculos con socios estratégicos en América Latina, Asia y Europa del Este, lo que convierte su base de datos en una fuente única para el análisis macroeconómico comparado entre economías de muy distinto perfil.

La OECD publica mensualmente sus Main Economic Indicators, una compilación estadística que abarca una amplia gama de indicadores para sus países miembros y una selección de economías no miembros, incluyendo índices de precios al consumidor, tipos de cambio, tasas de interés y datos de producto interno bruto en paridad de poder adquisitivo. Esta estandarización metodológica hace posible comparaciones rigurosas entre economías tan dispares como Alemania, Colombia, India o Türkiye, cada una con estructuras productivas, niveles de inflación y dinámicas comerciales radicalmente distintas.

El contexto macroeconómico reciente ilustra con claridad esta heterogeneidad. La economía global se ha mantenido resiliente, aunque con diferencias marcadas en la intensidad de la actividad y los ingresos entre países y sectores; la inflación ha continuado moderándose, pero la confianza del consumidor aún no recupera los niveles previos a la pandemia en muchas economías. Esta divergencia es especialmente pronunciada entre economías avanzadas y emergentes: se proyecta que la inflación en Argentina y Türkiye permanezca en dobles dígitos, aunque con una marcada tendencia a la baja, mientras que la mayoría de las economías desarrolladas de la OECD han logrado retornar a sus metas de inflación.

Ante esta diversidad estructural, el presente trabajo tiene como objetivo segmentar un conjunto de 42 países miembros y socios de la OECD en grupos homogéneos según su comportamiento en 15 indicadores económicos seleccionados, que cubren dimensiones de tamaño económico, comercio exterior, crecimiento, inflación, empleo y tasas de interés. Para ello se combina el Análisis de Componentes Principales (ACP), que permite reducir la alta dimensionalidad de los datos preservando la mayor varianza posible, con dos técnicas de agrupamiento no supervisado: k-means y el método jerárquico de Ward.

1.1 Contexto

[Escribir aquí el contexto específico del análisis: período de tiempo de los datos, relevancia de los indicadores seleccionados y por qué es pertinente segmentar estos países en el momento actual.]

1.2 Objetivo General

[Escribir aquí el objetivo general del trabajo de manera formal, por ejemplo: “Segmentar los países miembros y socios de la OECD en grupos homogéneos mediante técnicas de aprendizaje no supervisado, a partir de 15 indicadores macroeconómicos, con el fin de identificar patrones estructurales en el desempeño económico global.”]

1.3 Pregunta Problema

[Escribir aquí la pregunta problema articulada al modelo no supervisado, por ejemplo: “¿Es posible identificar grupos de países con perfiles macroeconómicos similares a partir de indicadores de la OECD, y qué variables son las que mejor explican las diferencias entre dichos grupos?”]


2 Metodología

2.1 Fuentes, Procesamiento y Preparación de Datos

La base de datos utilizada proviene de la OECD (Organisation for Economic Co-operation and Development) y contiene información macroeconómica de 42 países — miembros plenos y socios estratégicos — para un período de referencia reciente. La base original cuenta con 29 variables económicas (x1 a x29), de las cuales se seleccionaron 15 variables que cubren de manera representativa las principales dimensiones del desempeño económico: comercio exterior, tamaño del PIB, crecimiento, inflación, consumo, inversión, desempleo y tasas de interés.

El procesamiento incluyó:

  • Verificación de datos faltantes (ninguno encontrado en las variables seleccionadas).
  • Renombre de variables para facilitar su interpretación.
  • Estandarización de todas las variables (media 0, desviación estándar 1) antes de aplicar el ACP y los algoritmos de clustering, dado que las variables tienen escalas muy distintas (porcentajes, miles de millones de USD, índices).
datos <- read_excel("C:/Users/david/Downloads/DatosEcon.xlsx", sheet = "Data")
diccionario <- read_excel("C:/Users/david/Downloads/DatosEcon.xlsx", sheet = "Descripción")

variables_seleccionadas <- c("x1","x2","x3","x5","x9","x10","x11",
                             "x12","x17","x18","x19","x21","x22",
                             "x26","x29")

datos_sel <- datos %>%
  select(Pais, all_of(variables_seleccionadas))

nombres <- c(
  "Pais", "CtaCte_PIB", "TipoCambio", "Importaciones", "Exportaciones",
  "PIB_nominal", "PIB_volumen", "PIB_PPP", "FormCapital",
  "Crec_PIB_vol", "Crec_PIB_nom", "Crec_Deflactor",
  "Crec_ConsPriv", "Crec_ConsGob", "Desempleo", "TasaInteres_CP"
)
colnames(datos_sel) <- nombres

cat("Datos faltantes:", sum(is.na(datos_sel)), "\n")
## Datos faltantes: 0
cat("Países:", nrow(datos_sel), "| Variables:", ncol(datos_sel) - 1)
## Países: 42 | Variables: 15

2.1.1 Países incluidos en el análisis

datos_sel %>%
  select(Pais) %>%
  mutate(N = row_number()) %>%
  select(N, Pais) %>%
  kbl(
    caption = "Países incluidos en el análisis (42 países OECD y socios)",
    col.names = c("N°", "País"), align = "cl"
  ) %>%
  kable_styling(bootstrap_options = c("hover", "condensed", "responsive"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#1a6e9e", color = "white") %>%
  row_spec(seq(1, nrow(datos_sel), 2), background = "#f0f7ff") %>%
  row_spec(seq(2, nrow(datos_sel), 2), background = "#ffffff")
Países incluidos en el análisis (42 países OECD y socios)
País
1 Australia
2 Austria
3 Belgium
4 Canada
5 Chile
6 Colombia
7 Czech Republic
8 Denmark
9 Estonia
10 Finland
11 France
12 Germany
13 Greece
14 Hungary
15 Iceland
16 Ireland
17 Israel
18 Italy
19 Japan
20 Korea
21 Luxembourg
22 Mexico
23 Netherlands
24 New Zealand
25 Norway
26 Poland
27 Portugal
28 Slovak Republic
29 Slovenia
30 Spain
31 Sweden
32 Switzerland
33 Türkiye
34 United Kingdom
35 United States
36 Argentina
37 Brazil
38 Croatia
39 India
40 Peru
41 Romania
42 SouthAfrica

2.2 Descripción de Variables

Las 15 variables seleccionadas cubren cinco dimensiones del desempeño macroeconómico: sector externo (cuenta corriente, tipo de cambio, importaciones y exportaciones), tamaño económico (PIB nominal, en volumen y PPP, formación de capital), crecimiento (PIB volumen y nominal), precios y consumo (deflactor del PIB, consumo privado y del gobierno) y condiciones financieras y laborales (desempleo y tasa de interés de corto plazo).

tabla_variables <- data.frame(
  Variable = c("CtaCte_PIB", "TipoCambio", "Importaciones", "Exportaciones",
               "PIB_nominal", "PIB_volumen", "PIB_PPP", "FormCapital",
               "Crec_PIB_vol", "Crec_PIB_nom", "Crec_Deflactor",
               "Crec_ConsPriv", "Crec_ConsGob", "Desempleo", "TasaInteres_CP"),
  Cod_Original = c("x1","x2","x3","x5","x9","x10","x11",
                   "x12","x17","x18","x19","x21","x22","x26","x29"),
  Descripcion = c(
    "Balance de cuenta corriente (% del PIB)",
    "Tipo de cambio (moneda nacional por USD)",
    "Importaciones de bienes y servicios (volumen, USD)",
    "Exportaciones de bienes y servicios (volumen, USD)",
    "PIB nominal a precios de mercado",
    "PIB en volumen a precios de mercado",
    "PIB en volumen, USD a PPA constantes",
    "Formación bruta de capital fijo (volumen)",
    "Crecimiento del PIB en volumen (%)",
    "Crecimiento del PIB nominal (%)",
    "Crecimiento del deflactor del PIB - inflación (%)",
    "Crecimiento del consumo privado (volumen, %)",
    "Crecimiento del consumo del gobierno (volumen, %)",
    "Tasa de desempleo (%)",
    "Tasa de interés de corto plazo (%)"
  ),
  Unidad = c(
    "% del PIB", "Moneda/USD", "USD (volumen)", "USD (volumen)",
    "USD corrientes", "USD constantes", "USD PPA constantes", "USD constantes",
    "%", "%", "%", "%", "%", "%", "%"
  )
)

tabla_variables %>%
  kbl(caption = "Variables seleccionadas para el análisis",
      col.names = c("Variable", "Código original", "Descripción", "Unidad"),
      align = "llll") %>%
  kable_styling(bootstrap_options = c("hover", "condensed", "responsive"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#1a6e9e", color = "white") %>%
  column_spec(1, bold = TRUE, color = "#1a6e9e") %>%
  column_spec(3, width = "10cm") %>%
  row_spec(seq(1, 15, 2), background = "#f0f7ff") %>%
  row_spec(seq(2, 14, 2), background = "#ffffff")
Variables seleccionadas para el análisis
Variable Código original Descripción Unidad
CtaCte_PIB x1 Balance de cuenta corriente (% del PIB) % del PIB
TipoCambio x2 Tipo de cambio (moneda nacional por USD) Moneda/USD
Importaciones x3 Importaciones de bienes y servicios (volumen, USD) USD (volumen)
Exportaciones x5 Exportaciones de bienes y servicios (volumen, USD) USD (volumen)
PIB_nominal x9 PIB nominal a precios de mercado USD corrientes
PIB_volumen x10 PIB en volumen a precios de mercado USD constantes
PIB_PPP x11 PIB en volumen, USD a PPA constantes USD PPA constantes
FormCapital x12 Formación bruta de capital fijo (volumen) USD constantes
Crec_PIB_vol x17 Crecimiento del PIB en volumen (%) %
Crec_PIB_nom x18 Crecimiento del PIB nominal (%) %
Crec_Deflactor x19 Crecimiento del deflactor del PIB - inflación (%) %
Crec_ConsPriv x21 Crecimiento del consumo privado (volumen, %) %
Crec_ConsGob x22 Crecimiento del consumo del gobierno (volumen, %) %
Desempleo x26 Tasa de desempleo (%) %
TasaInteres_CP x29 Tasa de interés de corto plazo (%) %

2.3 Técnicas de Análisis Multivariado

2.3.1 Análisis de Componentes Principales (ACP)

El ACP es una técnica de reducción de dimensionalidad que transforma un conjunto de variables numéricas correlacionadas en un nuevo conjunto de variables no correlacionadas llamadas componentes principales (CP). Cada componente es una combinación lineal de las variables originales, construida de manera que el CP1 captura la mayor cantidad posible de varianza, el CP2 la mayor varianza restante siendo ortogonal al CP1, y así sucesivamente.

El ACP permite: (1) visualizar países y variables en un espacio de baja dimensión; (2) identificar qué variables están más correlacionadas entre sí; y (3) reducir el ruido y la redundancia antes de aplicar clustering. La estandarización previa es indispensable dado que la técnica es sensible a la escala de medición.

2.3.2 Clusterización: K-means y Método de Ward

K-means es un algoritmo de agrupamiento que particiona las observaciones en k grupos, asignando cada observación al cluster cuyo centroide está más cerca y recalculando iterativamente los centroides hasta la convergencia. El número óptimo de k se determina mediante los métodos del codo (WSS) y la silueta.

El método de Ward (clustering jerárquico aglomerativo) construye un dendrograma fusionando iterativamente las observaciones o clusters más similares, minimizando en cada paso el incremento de la varianza intra-cluster. Ambas técnicas se aplican sobre las variables estandarizadas y sus resultados se comparan para verificar la robustez de la segmentación.


3 Análisis Descriptivo

3.1 Estadísticas Descriptivas

estadisticas <- datos_sel %>%
  select(-Pais) %>%
  summarise(across(everything(),
                   list(Media = mean, Mediana = median,
                        Min = min, Max = max, SD = sd),
                   .names = "{.col}_{.fn}")) %>%
  pivot_longer(everything(),
               names_to = c("Variable", "Estadistico"),
               names_sep = "_(?=[A-Za-z]+$)") %>%
  pivot_wider(names_from = Estadistico, values_from = value)

estadisticas %>%
  kbl(caption = "Estadísticas descriptivas de los indicadores económicos OECD",
      digits = 2, align = "lccccc",
      col.names = c("Variable", "Media", "Mediana", "Mínimo", "Máximo", "Desv. Est.")) %>%
  kable_styling(bootstrap_options = c("hover", "condensed", "responsive"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#1a6e9e", color = "white") %>%
  column_spec(1, bold = TRUE, color = "#1a6e9e") %>%
  row_spec(seq(1, 15, 2), background = "#f0f7ff") %>%
  row_spec(seq(2, 14, 2), background = "#ffffff") %>%
  add_header_above(c(" " = 1, "Medidas descriptivas" = 5),
                   bold = TRUE, background = "#d0e8f7")
Estadísticas descriptivas de los indicadores económicos OECD
Medidas descriptivas
Variable Media Mediana Mínimo Máximo Desv. Est.
CtaCte_PIB 1.010000e+00 3.600000e-01 -7.280000e+00 1.491000e+01 5.080000e+00
TipoCambio 7.990000e+00 1.300000e+00 7.300000e-01 9.508000e+01 1.822000e+01
Importaciones 3.819741e+11 2.038763e+11 8.644998e+09 3.245332e+12 5.493589e+11
Exportaciones 3.704357e+11 2.173976e+11 8.082994e+09 2.257271e+12 4.488404e+11
PIB_nominal 1.068741e+14 2.384922e+12 3.135620e+10 2.071658e+15 3.699529e+14
PIB_volumen 9.137015e+13 1.930567e+12 2.601447e+10 1.915777e+15 3.310409e+14
PIB_PPP 1.545227e+12 5.341115e+11 1.884749e+10 2.052937e+13 3.230601e+12
FormCapital 2.366899e+13 3.753493e+11 8.332420e+09 5.731436e+14 9.288766e+13
Crec_PIB_vol 6.410000e+00 5.290000e+00 1.640000e+00 1.343000e+01 2.870000e+00
Crec_PIB_nom 1.297000e+01 1.068000e+01 7.600000e-01 7.018000e+01 1.137000e+01
Crec_Deflactor 6.080000e+00 3.070000e+00 -8.700000e-01 5.415000e+01 9.120000e+00
Crec_ConsPriv 6.610000e+00 5.730000e+00 4.000000e-01 2.051000e+01 3.930000e+00
Crec_ConsGob 4.460000e+00 4.030000e+00 4.100000e-01 1.263000e+01 2.780000e+00
Desempleo 7.370000e+00 6.080000e+00 2.820000e+00 3.427000e+01 5.270000e+00
TasaInteres_CP 1.000000e+00 2.000000e-02 -7.400000e-01 1.871000e+01 3.170000e+00

[Escribir aquí la interpretación de las estadísticas descriptivas: qué variables tienen mayor dispersión, cuáles tienen valores atípicos importantes, qué nos dicen las medias sobre el comportamiento promedio de los países.]

3.2 Boxplots

datos_sel %>%
  select(-Pais) %>%
  scale() %>%
  as.data.frame() %>%
  pivot_longer(everything(), names_to = "Variable", values_to = "Valor") %>%
  ggplot(aes(x = Variable, y = Valor)) +
  geom_boxplot(fill = "#00AFBB") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Variables estandarizadas", y = "Valor (z-score)")

[Escribir aquí la interpretación de los boxplots: qué variables presentan mayor variabilidad, cuáles tienen más valores atípicos y qué países podrían estar detrás de esos outliers.]

3.3 Matriz de Correlación

datos_num <- datos_sel %>% select(-Pais)
datos_z   <- scale(datos_num)
rownames(datos_z) <- datos_sel$Pais

matriz_cor <- cor(datos_sel %>% select(-Pais))

corrplot(matriz_cor,
         method = "color", type = "upper",
         addCoef.col = "black", number.cex = 0.55,
         tl.col = "black", tl.cex = 0.75,
         col = colorRampPalette(c("#1a6e9e", "white", "#FC4E07"))(200),
         title = "Matriz de correlación - Indicadores económicos OECD",
         mar = c(0, 0, 2, 0))

[Escribir aquí la interpretación de la matriz de correlación: qué pares de variables están altamente correlacionados positiva o negativamente, y qué implicaciones tiene eso para el ACP.]


4 Análisis de Componentes Principales (ACP)

res.pca <- prcomp(datos_z, scale = TRUE)
eig.val <- get_eigenvalue(res.pca)
res.var <- get_pca_var(res.pca)
res.ind <- get_pca_ind(res.pca)

pct1 <- round(eig.val$variance.percent[1], 1)
pct2 <- round(eig.val$variance.percent[2], 1)

4.1 Varianza Explicada

eig.val %>%
  as.data.frame() %>%
  rownames_to_column("Componente") %>%
  mutate(across(where(is.numeric), round, 3)) %>%
  kbl(caption = "Eigenvalores y varianza explicada por componente",
      col.names = c("Componente", "Eigenvalor", "% Varianza", "% Varianza acumulada"),
      align = "lccc") %>%
  kable_styling(bootstrap_options = c("hover", "condensed"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#1a6e9e", color = "white") %>%
  row_spec(1:5, background = "#f0f7ff") %>%
  column_spec(1, bold = TRUE, color = "#1a6e9e")
Eigenvalores y varianza explicada por componente
Componente Eigenvalor % Varianza % Varianza acumulada
Dim.1 3.979 26.529 26.529
Dim.2 3.061 20.409 46.938
Dim.3 2.553 17.021 63.959
Dim.4 1.625 10.835 74.794
Dim.5 1.295 8.633 83.427
Dim.6 0.811 5.404 88.831
Dim.7 0.656 4.371 93.202
Dim.8 0.460 3.068 96.270
Dim.9 0.271 1.803 98.073
Dim.10 0.190 1.268 99.341
Dim.11 0.071 0.476 99.817
Dim.12 0.022 0.150 99.967
Dim.13 0.005 0.031 99.998
Dim.14 0.000 0.001 99.999
Dim.15 0.000 0.001 100.000
fviz_eig(res.pca,
         addlabels = TRUE,
         barfill   = "#1a6e9e",
         barcolor  = "white",
         linecolor = "#FC4E07",
         ylim = c(0, 35),
         main = "Varianza explicada por componente principal")

[Escribir aquí cuántos componentes se retienen y por qué — usar el criterio del codo o el criterio de Kaiser (eigenvalor > 1). Indicar qué porcentaje acumulado explican los componentes retenidos.]

4.2 Análisis de Variables

fviz_contrib(res.pca, choice = "var", axes = 1, top = 15,
             fill = "#1a6e9e", color = "white",
             title = "Contribución de variables — Componente 1")

fviz_contrib(res.pca, choice = "var", axes = 2, top = 15,
             fill = "#1a6e9e", color = "white",
             title = "Contribución de variables — Componente 2")

var_coord <- as.data.frame(res.var$coord[, 1:2])
var_coord$contrib <- rowSums(res.var$contrib[, 1:2])
var_coord$Variable <- rownames(var_coord)

ggplot(var_coord, aes(x = Dim.1, y = Dim.2, color = contrib)) +
  geom_path(
    data = data.frame(x = cos(seq(0, 2*pi, length.out = 300)),
                      y = sin(seq(0, 2*pi, length.out = 300))),
    aes(x = x, y = y), color = "grey60", linewidth = 0.5, inherit.aes = FALSE
  ) +
  geom_segment(aes(xend = 0, yend = 0),
               arrow = arrow(length = unit(0.22, "cm")),
               alpha = 0.85, linewidth = 0.7) +
  geom_point(size = 2.5) +
  geom_text_repel(aes(label = Variable), size = 3.5, color = "black",
                  segment.color = "grey70", max.overlaps = 20) +
  scale_color_gradient(low = "#00AFBB", high = "#FC4E07") +
  coord_fixed() +
  theme_minimal(base_size = 12) +
  labs(title = "Círculo de correlación de variables",
       subtitle = "Color = contribución acumulada CP1 + CP2",
       x = paste0("CP1 (", pct1, "%)"),
       y = paste0("CP2 (", pct2, "%)"),
       color = "Contrib (%)")

[Escribir aquí la interpretación del círculo de correlación y las contribuciones: qué variables definen el CP1, qué variables definen el CP2, qué grupos de variables están correlacionadas entre sí.]

4.3 Análisis de Individuos (Países)

fviz_pca_ind(res.pca,
             col.ind = "cos2",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE,
             title = "Países en el plano factorial (CP1 vs CP2)")

coord_ind <- as.data.frame(res.pca$x[, 1:2])
coord_ind$Pais <- rownames(coord_ind)
coord_ind$N <- seq_len(nrow(coord_ind))
coord_ind$cos2 <- rowSums(res.ind$cos2[, 1:2])

plot_ly(coord_ind,
        x = ~PC1, y = ~PC2,
        text = ~paste0(N, ". ", Pais),
        color = ~cos2,
        colors = c("#00AFBB", "#E7B800", "#FC4E07"),
        type = "scatter", mode = "markers+text",
        textposition = "top center",
        marker = list(size = 7)) %>%
  layout(
    title = paste0("Países en el plano factorial interactivo (",
                   round(pct1 + pct2, 1), "% varianza explicada)"),
    xaxis = list(title = paste0("CP1 (", pct1, "%)")),
    yaxis = list(title = paste0("CP2 (", pct2, "%)"))
  )
coord_var_bi <- as.data.frame(res.pca$rotation[, 1:2])
coord_var_bi$Variable <- rownames(coord_var_bi)

max_ind <- max(abs(coord_ind[, 1:2]))
max_var <- max(abs(coord_var_bi[, 1:2]))
escala  <- max_ind / max_var * 0.75
coord_var_bi[, 1:2] <- coord_var_bi[, 1:2] * escala

fig_biplot <- plot_ly(type = "scatter", mode = "markers+text")

fig_biplot <- fig_biplot %>%
  add_trace(data = coord_ind,
            x = ~PC1, y = ~PC2,
            text = ~paste0(N, ". ", Pais),
            color = ~cos2,
            colors = c("#00AFBB", "#E7B800", "#FC4E07"),
            mode = "markers+text",
            textposition = "top center",
            marker = list(size = 6, opacity = 0.8),
            name = "Países")

for (i in seq_len(nrow(coord_var_bi))) {
  fig_biplot <- fig_biplot %>%
    add_trace(x = c(0, coord_var_bi$PC1[i]),
              y = c(0, coord_var_bi$PC2[i]),
              mode = "lines+text",
              text = c("", coord_var_bi$Variable[i]),
              textposition = "top center",
              line = list(color = "#FC4E07", width = 1.5),
              showlegend = FALSE,
              name = coord_var_bi$Variable[i])
}

fig_biplot %>%
  layout(
    title = paste0("Biplot interactivo — Países y variables económicas OECD (",
                   round(pct1 + pct2, 1), "% varianza)"),
    xaxis = list(title = paste0("CP1 (", pct1, "%)")),
    yaxis = list(title = paste0("CP2 (", pct2, "%)")),
    showlegend = TRUE
  )

[Escribir aquí la interpretación del biplot y el gráfico de individuos: qué países están bien representados, cuáles son outliers, cómo se agrupan visualmente antes del clustering formal.]


5 Determinación del Número Óptimo de Clusters y Clusterización

5.1 Número Óptimo de Clusters

fviz_nbclust(datos_z, kmeans, method = "wss") +
  labs(title = "Método del codo — Número óptimo de clusters")

fviz_nbclust(datos_z, kmeans, method = "silhouette") +
  labs(title = "Método de la silueta — K-means")

fviz_nbclust(datos_z, hcut, method = "silhouette") +
  labs(title = "Método de la silueta — Clustering jerárquico")

[Escribir aquí por qué se eligió k=3: qué indica el codo y qué indica la silueta, y cómo ambos métodos coinciden o difieren.]

5.2 K-means

set.seed(123)
k <- 3
modelo_kmeans <- kmeans(datos_z, centers = k, nstart = 25)

fviz_cluster(modelo_kmeans, data = datos_z,
             repel = TRUE,
             ellipse.type = "convex",
             palette = c("#1a6e9e", "#E7B800", "#FC4E07"),
             ggtheme = theme_minimal(),
             main = "Clusters de países (k-means) en plano PCA")

datos_kmeans <- datos_sel %>%
  mutate(cluster_kmeans = factor(modelo_kmeans$cluster))

5.3 Ward y Dendrograma

distancias  <- dist(datos_z, method = "euclidean")
modelo_ward <- hclust(distancias, method = "ward.D2")

fviz_dend(modelo_ward,
          k = k,
          cex = 0.6,
          k_colors = c("#1a6e9e", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE,
          rect = TRUE,
          rect_border = c("#1a6e9e", "#E7B800", "#FC4E07"),
          rect_fill = TRUE,
          main = "Dendrograma — Método de Ward",
          xlab = "Países",
          ylab = "Distancia (Ward.D2)")

clusters_ward <- cutree(modelo_ward, k = k)
datos_final   <- datos_kmeans %>%
  mutate(cluster_ward = factor(clusters_ward))

[Escribir aquí la interpretación del dendrograma: cómo se van fusionando los grupos, a qué altura se hace el corte y por qué.]

5.4 Comparación K-means vs Ward

table(KMeans = datos_final$cluster_kmeans,
      Ward   = datos_final$cluster_ward) %>%
  kbl(caption = "Tabla de contingencia: K-means vs Ward") %>%
  kable_styling(bootstrap_options = c("hover", "condensed"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#1a6e9e", color = "white")
Tabla de contingencia: K-means vs Ward
1 2 3
3 0 1
32 0 0
1 5 0

[Escribir aquí qué tan consistentes son los dos métodos: cuántos países coinciden en su asignación y cuáles difieren, y qué implica eso sobre la robustez de la segmentación.]

5.5 Gráfico de Clusters con Elipses de Confianza

dudi_obj   <- dudi.pca(as.data.frame(datos_z), scannf = FALSE, nf = 2)
xy         <- dudi_obj$li[, 1:2]
colnames(xy) <- c("Dim1", "Dim2")
col_clusters <- c("#1a6e9e", "#E7B800", "#FC4E07")

s.class(xy,
        fac = factor(modelo_kmeans$cluster),
        xax = 1, yax = 2,
        col = col_clusters,
        grid = FALSE, cell = 0, clabel = 0,
        cstar = 1, cpoint = 1.8,
        addaxes = TRUE, axesell = FALSE,
        sub = paste0("CP1 (", pct1, "%) y CP2 (", pct2, "%)"),
        possub = "bottomright")

text(xy[,1], xy[,2],
     labels = seq_len(nrow(xy)),
     cex = 0.6,
     col = col_clusters[modelo_kmeans$cluster])

for (i in 1:k) {
  inds <- which(modelo_kmeans$cluster == i)
  if (length(inds) >= 3) {
    dataEllipse(xy[inds, 1], xy[inds, 2],
                add = TRUE, levels = 0.95,
                plot.points = FALSE, lwd = 2, lty = 1,
                col = adjustcolor(col_clusters[i], alpha.f = 0.9),
                fill = TRUE, fill.alpha = 0.08)
  }
}

centroides <- aggregate(xy, by = list(Cluster = modelo_kmeans$cluster), FUN = mean)
points(centroides[,2], centroides[,3], pch = 16, cex = 1.8, col = "black")
text(centroides[,2], centroides[,3],
     labels = centroides[,1], col = "white", cex = 1.2, font = 2)

tabla_paises_num <- datos_sel %>%
  select(Pais) %>%
  mutate(N = row_number(),
         Cluster = factor(modelo_kmeans$cluster),
         Grupo = case_when(
           Cluster == 1 ~ "Grandes economías desarrolladas",
           Cluster == 2 ~ "Economías medianas y avanzadas",
           Cluster == 3 ~ "Economías emergentes con alta inflación")) %>%
  select(N, Pais, Cluster, Grupo) %>%
  arrange(Cluster, N)

tabla_paises_num %>%
  kbl(caption = "Referencia: número asignado a cada país en el gráfico",
      col.names = c("N°", "País", "Cluster", "Grupo"), align = "clcc") %>%
  kable_styling(bootstrap_options = c("hover", "condensed", "responsive"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#1a6e9e", color = "white") %>%
  row_spec(which(tabla_paises_num$Cluster == 1), background = "#dceefb") %>%
  row_spec(which(tabla_paises_num$Cluster == 2), background = "#fff8e1") %>%
  row_spec(which(tabla_paises_num$Cluster == 3), background = "#fde8d8") %>%
  column_spec(1, bold = TRUE, color = "#1a6e9e") %>%
  column_spec(2, bold = TRUE)
Referencia: número asignado a cada país en el gráfico
País Cluster Grupo
12 Germany 1 Grandes economías desarrolladas
19 Japan 1 Grandes economías desarrolladas
20 Korea 1 Grandes economías desarrolladas
35 United States 1 Grandes economías desarrolladas
1 Australia 2 Economías medianas y avanzadas
2 Austria 2 Economías medianas y avanzadas
3 Belgium 2 Economías medianas y avanzadas
4 Canada 2 Economías medianas y avanzadas
7 Czech Republic 2 Economías medianas y avanzadas
8 Denmark 2 Economías medianas y avanzadas
9 Estonia 2 Economías medianas y avanzadas
10 Finland 2 Economías medianas y avanzadas
11 France 2 Economías medianas y avanzadas
13 Greece 2 Economías medianas y avanzadas
14 Hungary 2 Economías medianas y avanzadas
15 Iceland 2 Economías medianas y avanzadas
16 Ireland 2 Economías medianas y avanzadas
17 Israel 2 Economías medianas y avanzadas
18 Italy 2 Economías medianas y avanzadas
21 Luxembourg 2 Economías medianas y avanzadas
22 Mexico 2 Economías medianas y avanzadas
23 Netherlands 2 Economías medianas y avanzadas
24 New Zealand 2 Economías medianas y avanzadas
25 Norway 2 Economías medianas y avanzadas
26 Poland 2 Economías medianas y avanzadas
27 Portugal 2 Economías medianas y avanzadas
28 Slovak Republic 2 Economías medianas y avanzadas
29 Slovenia 2 Economías medianas y avanzadas
30 Spain 2 Economías medianas y avanzadas
31 Sweden 2 Economías medianas y avanzadas
32 Switzerland 2 Economías medianas y avanzadas
34 United Kingdom 2 Economías medianas y avanzadas
37 Brazil 2 Economías medianas y avanzadas
38 Croatia 2 Economías medianas y avanzadas
41 Romania 2 Economías medianas y avanzadas
42 SouthAfrica 2 Economías medianas y avanzadas
5 Chile 3 Economías emergentes con alta inflación
6 Colombia 3 Economías emergentes con alta inflación
33 Türkiye 3 Economías emergentes con alta inflación
36 Argentina 3 Economías emergentes con alta inflación
39 India 3 Economías emergentes con alta inflación
40 Peru 3 Economías emergentes con alta inflación

6 Interpretación de los Factores y Descripción de los Clusters

6.1 Interpretación de los Factores (Componentes Principales)

[Escribir aquí la interpretación económica de cada componente principal retenido:]

Componente 1 (26.5% de varianza): [Qué variables lo definen con mayor contribución — según los resultados: Crec_PIB_nom, Crec_Deflactor, Crec_ConsPriv, Crec_PIB_vol. Qué dimensión económica representa — en este caso el dinamismo inflacionario y de crecimiento nominal.]

Componente 2 (20.4% de varianza): [Qué variables lo definen — PIB_nominal, PIB_volumen, FormCapital. Qué dimensión representa — el tamaño absoluto de la economía.]

[Continuar con los demás componentes retenidos si aplica.]

6.2 Interpretación de los Clusters

perfil_clusters <- datos_final %>%
  select(-Pais, -cluster_ward) %>%
  group_by(cluster_kmeans) %>%
  summarise(across(everything(), mean), n_paises = n())

perfil_clusters %>%
  kbl(caption = "Perfil de clusters — Medias de indicadores económicos por grupo",
      digits = 2, align = "c") %>%
  kable_styling(bootstrap_options = c("hover", "condensed", "responsive"),
                full_width = FALSE, font_size = 12) %>%
  row_spec(0, bold = TRUE, background = "#1a6e9e", color = "white") %>%
  row_spec(1, background = "#dceefb") %>%
  row_spec(2, background = "#fff8e1") %>%
  row_spec(3, background = "#fde8d8") %>%
  column_spec(1, bold = TRUE)
Perfil de clusters — Medias de indicadores económicos por grupo
cluster_kmeans CtaCte_PIB TipoCambio Importaciones Exportaciones PIB_nominal PIB_volumen PIB_PPP FormCapital Crec_PIB_vol Crec_PIB_nom Crec_Deflactor Crec_ConsPriv Crec_ConsGob Desempleo TasaInteres_CP n_paises
1 3.17 6.07 1.567789e+12 1.397740e+12 6.599727e+14 6.186213e+14 8.012326e+12 1.772324e+14 3.58 5.98 2.29 3.42 3.21 3.84 0.08 4
2 1.43 3.90 2.662391e+11 2.780983e+11 4.379192e+12 3.297780e+12 8.610170e+11 7.483222e+11 5.90 10.21 4.09 5.74 4.22 7.43 0.38 32
3 -2.67 31.04 2.086839e+11 1.780325e+11 2.847812e+14 2.095886e+14 8.829461e+11 4.353693e+13 11.03 32.38 19.27 13.39 6.58 9.42 4.91 6
datos_z_df <- as.data.frame(datos_z) %>%
  mutate(Pais = datos_sel$Pais,
         cluster_kmeans = datos_final$cluster_kmeans)

datos_long <- datos_z_df %>%
  pivot_longer(cols = -c(Pais, cluster_kmeans),
               names_to = "Variable", values_to = "Valor")

ggplot(datos_long, aes(x = Variable, y = Valor, fill = cluster_kmeans)) +
  geom_boxplot(alpha = 0.8, outlier.shape = 16, outlier.size = 1.5) +
  scale_fill_manual(
    values = c("1" = "#1a6e9e", "2" = "#E7B800", "3" = "#FC4E07"),
    labels = c("Cluster 1\n(Grandes economías)",
               "Cluster 2\n(Economías medianas)",
               "Cluster 3\n(Economías emergentes)")
  ) +
  theme_minimal(base_size = 11) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 9),
        legend.position = "top") +
  labs(title = "Distribución de indicadores económicos por cluster",
       subtitle = "Variables estandarizadas (z-score) | k-means k=3",
       x = NULL, y = "Valor (z-score)", fill = NULL)

vars_num <- datos_final %>% select(-Pais, -cluster_ward, -cluster_kmeans)

resultado_anova <- vars_num %>%
  names() %>%
  map_dfr(function(var) {
    formula <- as.formula(paste(var, "~ cluster_kmeans"))
    aov_res <- aov(formula, data = datos_final)
    p_val   <- summary(aov_res)[[1]]$`Pr(>F)`[1]
    f_val   <- summary(aov_res)[[1]]$`F value`[1]
    tibble(Variable = var,
           F_estadistico = round(f_val, 3),
           p_valor = round(p_val, 4))
  }) %>%
  arrange(p_valor)

resultado_anova %>%
  mutate(Significativa = ifelse(p_valor < 0.05, "✔ Sí", "✘ No")) %>%
  kbl(caption = "Variables que mejor discriminan los clusters (ANOVA)",
      col.names = c("Variable", "F estadístico", "p-valor", "¿Discrimina?"),
      align = "lccc") %>%
  kable_styling(bootstrap_options = c("hover", "condensed"),
                full_width = FALSE, font_size = 13) %>%
  row_spec(0, bold = TRUE, background = "#1a6e9e", color = "white") %>%
  column_spec(1, bold = TRUE, color = "#1a6e9e") %>%
  row_spec(which(resultado_anova$p_valor < 0.05), background = "#f0f7ff")
Variables que mejor discriminan los clusters (ANOVA)
Variable F estadístico p-valor ¿Discrimina?
Importaciones 19.796 0.0000 ✔ Sí
Exportaciones 25.955 0.0000 ✔ Sí
PIB_PPP 14.838 0.0000 ✔ Sí
Crec_PIB_vol 19.450 0.0000 ✔ Sí
Crec_PIB_nom 20.233 0.0000 ✔ Sí
Crec_ConsPriv 22.800 0.0000 ✔ Sí
Crec_Deflactor 10.962 0.0002 ✔ Sí
PIB_volumen 9.235 0.0005 ✔ Sí
FormCapital 9.213 0.0005 ✔ Sí
PIB_nominal 8.835 0.0007 ✔ Sí
TipoCambio 7.381 0.0019 ✔ Sí
TasaInteres_CP 6.859 0.0028 ✔ Sí
Crec_ConsGob 2.428 0.1014 ✘ No
CtaCte_PIB 2.168 0.1280 ✘ No
Desempleo 1.380 0.2637 ✘ No

[Escribir aquí la descripción de cada cluster:]

Cluster 1 — Grandes economías desarrolladas (Alemania, Japón, Corea, EE.UU.): [Describir su perfil: alto volumen de comercio exterior, bajo crecimiento nominal, tasas de interés bajas o negativas. Son las economías de mayor tamaño absoluto del grupo.]

Cluster 2 — Economías medianas y avanzadas (32 países, mayoría europea): [Describir su perfil: comportamiento “típico” del grupo, crecimiento moderado, inflación controlada, desempleo medio.]

Cluster 3 — Economías emergentes con alta inflación (Chile, Colombia, Türkiye, Argentina, India, Perú): [Describir su perfil: alto crecimiento nominal, alta inflación (Crec_Deflactor elevado), tipos de cambio altos respecto al USD, tasas de interés elevadas.]


7 Conclusiones

[Escribir aquí las conclusiones del trabajo respondiendo directamente la pregunta problema. Incluir:]

  • ¿Se lograron identificar grupos con perfiles macroeconómicos diferenciados? ¿Cuáles son esos grupos?
  • ¿Qué variables resultaron ser las más discriminantes entre clusters según el ANOVA?
  • ¿Qué tan consistentes fueron los resultados entre k-means y Ward?
  • ¿Qué implicaciones tiene esta segmentación para el análisis de política económica comparada?
  • ¿Qué limitaciones tiene el análisis y qué se podría mejorar?

8 Bibliografía

[Incluir aquí las referencias bibliográficas en formato APA o el que indique el profesor. Sugeridas:]

  • OECD (2024). Main Economic Indicators. Organisation for Economic Co-operation and Development. https://www.oecd.org
  • Kassambara, A. & Mundt, F. (2020). factoextra: Extract and Visualize the Results of Multivariate Data Analyses. R package version 1.0.7.
  • R Core Team (2024). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/
  • Wickham, H. et al. (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686.