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.
[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.]
[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.”]
[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?”]
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ó:
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
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")
| N° | 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 |
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")
| 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 (%) | % |
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.
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.
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")
| 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.]
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.]
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.]
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)
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")
| 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.]
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í.]
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.]
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.]
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))
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é.]
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")
| 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.]
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)
| N° | 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 |
[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.]
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)
| 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")
| 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.]
[Escribir aquí las conclusiones del trabajo respondiendo directamente la pregunta problema. Incluir:]
[Incluir aquí las referencias bibliográficas en formato APA o el que indique el profesor. Sugeridas:]