La clasificación tradicional entre países desarrollados y economías emergentes ha sido durante mucho tiempo el marco de referencia para comparar el desempeño económico a nivel global. Sin embargo, esta distinción, aunque útil, resulta insuficiente cuando se examinan detalladamente los indicadores que realmente determinan el funcionamiento de una economía. Países agrupados en una misma categoría pueden presentar grandes diferencias estructurales, mientras que economías pertenecientes a categorías distintas pueden presentar características similares.
Este trabajo parte precisamente de esa inquietud: ¿qué características económicas son las que realmente separan a los países y los agrupan de una manera distinta a la clasificación tradicional? El objetivo central es identificar, a partir de datos de los perfiles económicos de 42 países, qué variables explican las diferencias estructurales entre economías y si los agrupamientos que resultan de los datos coinciden o contradicen la división convencional entre desarrollados y emergentes. Es decir, se busca dejar que los datos hablen, y no partir de la clasificación tradicional.
Para lograrlo, se emplean dos técnicas de análisis multivariado, el Análisis de Componentes Principales (ACP), que permite reducir la complejidad de 15 variables económicas como el crecimiento, empleo, comercio exterior, inversión, consumo y estabilidad de precios, conservando la mayor parte de la información relevante; y la clusterización jerárquica con el método de Ward, que agrupa a los países según la similitud real de sus perfiles económicos.
De esta manera, el objetivo de este análisis es ofrecer una visión más objetiva y profunda de las similitudes y diferencias entre economías, y contribuir a una comprensión más precisa del desarrollo económico comparado que supere las etiquetas convencionales.
Para el estudio se utilizó una base de datos compuesta por 42 países, incluyendo economías pertenecientes a la Organización para la Cooperación y el Desarrollo Económico (OCDE) y economías emergentes. La información recopilada contiene indicadores relacionados con el crecimiento económico, el mercado laboral, el comercio exterior y la estabilidad macroeconómica, permitiendo comparar economías con diferentes niveles de desarrollo y estructuras productivas.
library(readxl)
library(corrplot)
library(ggcorrplot)
library(ggplot2)
library(tidyverse)
library(factoextra)
library(ggdendro)
library(cluster)
library(dplyr)
library(FactoClass)
library(dendextend)
library(tidyverse)
library(reshape2)
library(kableExtra)
library(DT)
library(ade4)
library(plotly)
library(heatmaply)
library(scales)
library(knitr)
library(patchwork)
datos_raw <- read_excel("DatosEcon.xlsx")
datos_raw <- as.data.frame(datos_raw)
rownames(datos_raw) <- datos_raw$Pais
datos_raw <- datos_raw[ , -1]
variables_seleccionadas <- c(
"x3","x18","x19","x27","x5",
"x2","x20","x21","x16","x17",
"x29","x26","x25","x8","x11"
)
etiquetas <- c(
"Importaciones B y S", # x3
"Crec. PIB Nominal", # x18
"Inflación", # x19
"Empleo Total", # x27
"Expotación B y S.", # x5
"Tipo de Cambio", # x2
"Crec. Inversion", # x20
"Crec. Consumo Priv.", # x21
"Crec. Importaciones", # x16
"Crec. PIB Real", # x17
"Tasa Interes", # x29
"Tasa de Desempleo ", # x26
"Deflactor del PIB", # x25
"Expo Netas", # x8
"PIB PPA" # x11
)
datos_15 <- datos_raw %>%
select(all_of(variables_seleccionadas)) %>%
mutate(across(everything(), as.numeric))
colnames(datos_15) <- etiquetas
datos_std <- as.data.frame(scale(datos_15))
datatable(
datos_15,
class = "display compact stripe hover",
options = list(
pageLength = 10,
scrollX = TRUE,
autoWidth = TRUE
)
)Para facilitar el análisis y la interpretación de los resultados, se seleccionaron 15 variables económicas que reflejan diferentes aspectos del funcionamiento de las economías estudiadas. En primer lugar, se incluyeron variables relacionadas con el tamaño y la capacidad productiva, ya que permiten medir la escala de la actividad económica y el potencial de producción de cada país. Asimismo, se incorporaron variables de crecimiento con el propósito de analizar el dinamismo económico y la evolución de la demanda interna. También se consideraron variables del sector externo para evaluar el grado de participación de los países en los mercados internacionales y la influencia que el comercio exterior tiene sobre su desempeño económico. Finalmente, se incluyeron indicadores de estabilidad macroeconómica, los cuales permiten analizar las condiciones monetarias, financieras y laborales presentes en cada economía.
Estas variables nos dan una visión amplia de los principales factores del desempeño económico de los países y nos permiten observar el problema estudiado desde distintos enfoques. Además, todas ellas son variables cuantitativas continuas, lo que facilita la comparación entre economías y hace posible el uso de técnicas multivariadas como el Análisis de Componentes Principales (ACP) y la clusterización.
tabla_variables <- data.frame(
N = 1:15,
Variable = c(
"Importaciones de B y S",
"Crec. PIB nominal",
"Inflación",
"Empleo total",
"Exportación B y S",
"Tipo de cambio",
"Crec. Inversión",
"Crec. Consumo Priv.",
"Crec. Importaciones",
"Crec. PIB real",
"Tasa de interés",
"Tasa de desempleo",
"Deflactor del PIB",
"Exportaciones netas",
"PIB PPA"
),
Grupo = c(
"Sector externo",
"Crecimiento",
"Estabilidad macroeconómica",
"Tamaño y capacidad productiva",
"Sector externo",
"Sector externo",
"Crecimiento",
"Crecimiento",
"Crecimiento",
"Crecimiento",
"Estabilidad macroeconómica",
"Estabilidad macroeconómica",
"Estabilidad macroeconómica",
"Sector externo",
"Tamaño y capacidad productiva"
),
Descripcion = c(
"Representa el valor total de las importaciones realizadas por cada país al año.",
"Muestra cuánto aumenta el valor de la producción de un país a precios actuales, sin descontar la inflación.",
"Representa la variación porcentual anual del nivel general de los precios de la economía.",
"Número total de personas ocupadas dentro de la economía.",
"El valor total de los bienes y servicios vendidos al exterior por cada país.",
"Es el valor de la moneda nacional de un país con respecto al dólar estadounidense.",
"Mide la variación de la inversión destinada a capital físico y productivo. Un mayor crecimiento de esta variable suele asociarse con expectativas favorables sobre el desempeño futuro de la economía.",
"Variación porcentual anual del gasto de consumo de los hogares.",
"Porcentaje anual del volumen de bienes y servicios adquiridos del exterior.",
"Variación porcentual anual del PIB real, indicador del crecimiento económico sin contar los efectos de la inflación.",
"Representa el costo del dinero determinado por las condiciones del mercado o la política monetaria. Influye sobre la inversión, el consumo y la inflación.",
"La proporción de las personas que se encuentran desempleadas y buscando trabajo.",
"Es el índice que ajusta el PIB nominal para convertirlo en PIB real. Permite medir la variación general de precios de los bienes y servicios producidos en la economía.",
"Representa la diferencia entre exportaciones e importaciones. Indica si una economía es más dependiente de la demanda externa o interna.",
"Representa el tamaño de la economía ajustado por diferencias en los niveles de precios entre países."
),
Unidad = c(
"Miles de millones USD",
"%",
"%",
"Millones de personas",
"Miles de millones USD",
"Moneda local/USD",
"%",
"%",
"%",
"%",
"%",
"%",
"%",
"Puntos porcentuales",
"Miles de millones USD"
)
)
datatable(
tabla_variables,
colnames = c(
"N°",
"Variable",
"Grupo",
"Descripción",
"Unidad de medida"
),
options = list(
pageLength = 15,
scrollX = TRUE,
autoWidth = TRUE
),
rownames = FALSE,
caption = htmltools::tags$caption(
style = "caption-side: top; text-align: center; font-size: 16px; font-weight: bold;",
"Descripción de las variables utilizadas en el estudio"
)
)Posteriormente, los datos fueron estandarizados para eliminar las diferencias en unidades de medida y escalas. Se utilizó el Análisis de Componentes Principales (ACP) para reducir la cantidad de variables y resumir la información en menos componentes. Este método se eligió porque las variables estudiadas están relacionadas entre sí, lo que hace conveniente resumir la información sin perder mucha variabilidad. El ACP ayuda a encontrar patrones económicos no evidentes y a identificar las principales dimensiones que explican las diferencias entre países.
Luego, se aplicó la clusterización por factores y se identificaron siete grupos de países mediante el análisis del dendrograma. La clusterización se usó para agrupar países con características económicas similares y distinguir aquellos con comportamientos particulares. Este método complementa al ACP al utilizar la información resumida en los componentes principales para formar grupos más homogéneos. De esta forma, ambas técnicas juntas permitieron encontrar patrones económicos comunes y diferencias estructurales entre las economías estudiadas. Esto ayudó a responder a la pregunta sobre los factores que diferencian a los países de la OCDE de las economías emergentes.
Tabla Descriptiva
La siguiente tabla presenta las principales medidas de tendencia central y dispersión para las variables cuantitativas del estudio. Estas estadísticas permiten identificar la distribución general de los datos, detectar posibles asimetrías y comprender el rango de variabilidad presente en las variables analizadas.
Tabla_descriptiva <- data.frame(
Variable = names(datos_15),
Media = sapply(datos_15, mean, na.rm = TRUE),
Mediana = sapply(datos_15, median, na.rm = TRUE),
Desv_Estandar = sapply(datos_15, sd, na.rm = TRUE),
Minimo = sapply(datos_15, min, na.rm = TRUE),
Maximo = sapply(datos_15, max, na.rm = TRUE)
)
Tabla_descriptiva$CV <- round(
(Tabla_descriptiva$Desv_Estandar /
abs(Tabla_descriptiva$Media)) * 100, 2
)
Tabla_descriptiva <- Tabla_descriptiva %>%
mutate(across(where(is.numeric),
~ label_number(scale_cut = cut_short_scale(), accuracy = 0.01)(.x)))
datatable(
Tabla_descriptiva,
rownames = FALSE,
caption = "Tabla 1. Estadísticas descriptivas de las variables económicas",
colnames = c("Variable", "Media", "Mediana", "Desv. Estándar", "Mínimo", "Máximo", "CV (%)"),
options = list(pageLength = 15, scrollX = TRUE)
)En la Tabla 1 se presenta el comportamiento de las variables seleccionadas. Para facilitar su lectura e interpretación, se utilizaron las siguientes abreviaturas: mil (K), millón (M), billón (B) y trillón (T).
Se observa que la mayoría de las variables tienen un rango amplio entre los valores máximos y mínimos, las que más destacan son las relacionadas con el tamaño de la economía como el PIB PPA que esta entre (18.85B-20.53T), las exportaciones de bienes y servicios (8.08B-2.26T), las importaciones de bienes y servicios (8.64B-3.25T) y el empleo total (195.93K-152.58M). Al combinar estos rangos con sus elevados valores de desviación estándar, se evidencia una alta dispersión de los datos entre los países estudiados.
Por otro lado, las variables que muestran un comportamiento relativamente más estable son Crec. PIB Real, Crec. Consumo Privado. Esto se observa en el comportamiento del CV (Coeficiente de Variación) siendo sus valores respectivamente de 44.74% y 59.44% que son relativamente bajos en comparación con los demás valores observados por parte de las otras variables, mostrando un comportamiento más constante.
Al contrario, las variables con mayor heterogeneidad son el deflactor del PIB (352,78%), la tasa de interés (318,52%), el tipo de cambio (228,13%), el PIB PPA (209,07%) y Expo Netas (4.03K). Estos valores altos indican unas diferencias importantes entre las economías estudiadas.
Histogramas
Con el fin de identificar el comportamiento individual de las variables seleccionadas, se presentan a continuación los histogramas de cada indicador económico. Estos permiten identificar la forma de la distribución de los datos y los diferentes valores atípicos que puedan influir en el análisis posterior.
datos_long <- datos_15 %>%
pivot_longer(
cols = everything(),
names_to = "Variable",
values_to = "Valor"
)
medias <- datos_long %>%
group_by(Variable) %>%
summarise(Media = mean(Valor, na.rm = TRUE))
medianas <- datos_long %>%
group_by(Variable) %>%
summarise(Mediana = median(Valor, na.rm = TRUE))
hs <- ggplot(datos_long, aes(x = Valor)) +
geom_histogram(bins = 10, fill = "lightblue", color = "black") +
facet_wrap(~Variable, scales = "free", ncol = 3) +
geom_vline(data = medias, aes(xintercept = Media),
color = "darkblue", linetype = "dashed", linewidth = 1) +
geom_vline(data = medianas, aes(xintercept = Mediana),
color = "red", linetype = "dotted", linewidth = 1) +
scale_x_continuous(labels = label_number(scale_cut = cut_short_scale())) +
theme_minimal() +
labs(title = "Distribución de Variables Económicas", x = "", y = "Frecuencia") +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
strip.text = element_text(size = 9, face = "bold"),
panel.spacing = unit(1, "lines")
)
ggplotly(hs)Los histogramas agrupados muestran la distribución de las variables la línea azul representa la media y la línea roza la mediana. En la mayoría de los gráficos se observan distribuciones asimétricas hacia la derecha, especialmente en las variables crecimiento de PIB real, exportaciones de bienes y servicios y empleo total, donde es evidente que la mediana es menor que la media, estas variables se pueden relacionar con el tamaño de la economía este comportamiento se puede relacionar con el tamaño de las economías y la heterogeneidad de los datos.
También están las variables crecimiento del PIB real, el crecimiento del consumo privado y el crecimiento de las importaciones que tienen una distribución más concentrada alrededor de la media y mediana lo que sugiere una menor variabilidad entre países.
Boxplots
A continuación, se presenta un diagrama de cajas que muestra la distribución de cada una de las 15 variables utilizadas en el análisis, se dividieron según sus unidades de medida y escalas para poder evidenciar mejor su comportamiento.
v.porcentaje <- datos_15 %>%
select(
`Inflación`,
`Tasa de Desempleo `,
`Tipo de Cambio`,
`Tasa Interes`,
`Crec. PIB Real`,
`Crec. PIB Nominal`,
`Crec. Inversion`,
`Crec. Consumo Priv.`,
`Crec. Importaciones`,
`Deflactor del PIB`
)
v.volumen <- datos_15 %>%
select(
`PIB PPA`,
`Importaciones B y S`,
`Expotación B y S.`
)
boxplot_grupo <- function(datos, titulo){
datos_long <- datos %>%
pivot_longer(
everything(),
names_to = "Variable",
values_to = "Valor"
)
p <- ggplot(datos_long,
aes(x = Variable,y = Valor,text = paste("Variable:", Variable, "<br>Valor:", round(Valor, 2)))
) +
geom_boxplot(fill = "lightblue",outlier.color = "darkblue") +
coord_flip() +
scale_y_continuous(labels = label_number(scale_cut = cut_short_scale())
) +
theme_minimal() +
labs(
title = titulo,
x = "",
y = "Valor"
) +
theme(plot.title = element_text(face = "bold", hjust = 0.5)
)
ggplotly(
p,
tooltip = c("text")
)
}
boxplot_grupo(v.porcentaje, "Variables expresadas en tasas y porcentajes")En el gráfico se observan varios valores atípicos, especialmente en las variables Tipo de Cambio, Tasa de Interés, Tasa de Desempleo e Inflación, lo que refleja que algunos países presentan condiciones económicas muy distintas al resto; mientras tanto, las variables ligadas al crecimiento económico como el PIB real y nominal, la inversión, el consumo privado y las importaciones muestran distribuciones más concentradas y menos valores extremos, sugiriendo un comportamiento relativamente más homogéneo, aunque destaca el caso de la variable crecimiento de la inversión donde hay un valor atípico negativo considerablemente alejado del resto, lo que indica la existencia de al menos un país un país experimentó una caída fuerte en la inversión, convirtiéndose en un caso excepcional.
En este caso se observa que el PIB PPA muestra los valores más altos y una mayor dispersión, lo cual indica diferencias significativas en el tamaño y capacidad de producción. al contrario, las importaciones y exportaciones tienen rangos más reducidos, aunque también presentan algunos valores atípicos que indican que existen países con niveles de comercio exterior superior a la mayoría. estas variables ayudan a comprender la escala económica de los países.
crear_boxplot <- function(variable, titulo = variable){
ggplot(datos_15, aes(y = .data[[variable]])) +
geom_boxplot(fill = "lightblue", outlier.color = "darkblue") +
scale_y_continuous(
labels = scales::label_number(scale_cut = cut_short_scale())
) +
labs(title = titulo, x = NULL, y = NULL) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5)
)
}
p1 <- crear_boxplot("Expo Netas", "Exportaciones Netas")
p2 <- crear_boxplot("Empleo Total", "Empleo Total")
(p1 | p2) +
plot_annotation(
title = "Dinámica de Demanda",
theme = theme(plot.title = element_text(face = "bold", hjust = 0.5))
)Tanto las variables Exportaciones Netas y Empleo Total, ambas se relacionan con la dinámica de la demanda. Las exportaciones netas tienen su mediana en cero y muestran que la mayoría de los valores se concentran alrededor de este punto, aunque se observan algunos valores atípicos que muestran las diferencias en el desempeño comercial entre países. En cuanto a la variable Empleo Total tiene una mayor dispersión ya que tiene múltiples valores atípicos que muestran diferencias notables en el tamaño de la fuerza laboral. Estas variables permiten apreciar cómo la demanda externa y el nivel de empleo varían ampliamente entre las economías analizadas.
Valores atípicos
En la siguiente tabla se presenta la cantidad de valores atípicos identificados en cada variable; como se observó en los boxplots, también se presentan los nombres de los países que registran dichos valores extremos.
Atipicos_detalle <- lapply(datos_15, function(x){
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR_val <- IQR(x, na.rm = TRUE)
limite_inf <- Q1 - 1.5 * IQR_val
limite_sup <- Q3 + 1.5 * IQR_val
which(x < limite_inf | x > limite_sup)
})
Tabla_atipicos_completa <- data.frame(
Variable = names(Atipicos_detalle),
Cantidad = sapply(Atipicos_detalle, length),
Paises = sapply(Atipicos_detalle, function(idx) {
if(length(idx) == 0) {
return("Ninguno")
} else {
return(paste(rownames(datos_15)[idx], collapse = ", "))
}
})
)
datatable(
Tabla_atipicos_completa,
rownames = FALSE,
caption = "Economías singulares por variable y países correspondientes",
options = list(pageLength = 15, scrollX = TRUE)
)Con esta información se puede confirmar que los datos son variados, ya que las economías estudiadas no siguen un comportamiento homogéneo. La presencia de valores atípicos en variables como el tipo de cambio, el empleo total o la tasa de interés evidencia diferencias importantes entre los países, asociadas a su tamaño económico y sus distintos niveles de desarrollo.
Antes de aplicar el Análisis de Componentes Principales, es fundamental examinar la estructura de correlaciones entre las 15 variables para identificar redundancias potenciales y validar la pertinencia de la reducción de dimensionalidad. La matriz de correlación revela las asociaciones lineales entre pares de variables, proporcionando una visión exploratoria de cómo las dimensiones del desarrollo se interrelacionan.
cor_matrix <- cor(datos_15, use = "complete.obs")
nombres_variables <- c(
"Importaciones B y S", "Crec. PIB Nominal", "Inflación",
"Empleo Total", "Expot. Bienes y Serv.", "Tipo de Cambio",
"Crec. Inversion", "Crec. Consumo Priv.", "Crec. Importaciones",
"Crec. PIB Real", "Tasa Interes", "Tasa de Desempleo",
"Deflactor del PIB", "Expo Netas", "PIB PPA"
)
colnames(cor_matrix) <- nombres_variables
rownames(cor_matrix) <- nombres_variables
plot_ly(
z = cor_matrix,
type = "heatmap",
colorscale = list(
list(0, "#B2182B"),
list(0.2, "#EF8A62"),
list(0.4, "#FDDBC7"),
list(0.5, "#F7F7F7"),
list(0.6, "#D1E5F0"),
list(0.8, "#67A9CF"),
list(1, "#2166AC")
),
zmin = -1,
zmax = 1,
x = colnames(cor_matrix),
y = rownames(cor_matrix),
width = 800,
height = 700,
colorbar = list(
title = list(text = "Correlación", font = list(size = 12)),
tickvals = c(-1, -0.5, 0, 0.5, 1),
ticktext = c("-1 (Negativa fuerte)", "-0.5", "0 (Sin relación)", "+0.5", "+1 (Positiva fuerte)"),
len = 0.8,
thickness = 20,
titlefont = list(size = 12)
),
hovertemplate = "<b>%{x}</b> vs <b>%{y}</b><br><b>Correlación: %{z:.3f}</b><extra></extra>"
) %>%
layout(
title = list(
text = "Matriz de Correlación de Pearson<br>15 Variables Económicas",
font = list(size = 14, family = "Arial", color = "#1a3a5c")
),
xaxis = list(
title = "",
tickangle = 45,
tickfont = list(size = 9, color = "#1a3a5c"),
side = "bottom"
),
yaxis = list(
title = "",
tickfont = list(size = 9, color = "#1a3a5c"),
side = "left"
),
margin = list(b = 120, l = 160, t = 60, r = 40),
plot_bgcolor = "white",
paper_bgcolor = "white"
)Tabla de correlaciones significativas entre variables
cor_matrix <- cor(datos_15, use = "complete.obs")
cor_long <- as.data.frame(as.table(cor_matrix))
colnames(cor_long) <- c("Variable1", "Variable2", "Correlacion")
cor_filtradas <- cor_long %>%
filter(as.character(Variable1) != as.character(Variable2),
abs(Correlacion) > 0.60) %>%
mutate(par = paste(pmin(as.character(Variable1), as.character(Variable2)),
pmax(as.character(Variable1), as.character(Variable2)))) %>%
distinct(par, .keep_all = TRUE) %>%
select(-par) %>%
mutate(Correlacion = round(Correlacion, 3)) %>%
arrange(desc(abs(Correlacion)))
datatable(
cor_filtradas,
colnames = c("Variable 1", "Variable 2", "Correlación (R)"),
options = list(
dom = 't',
paging = FALSE,
searching = FALSE,
ordering = TRUE
),
rownames = FALSE
) %>%
formatStyle(
"Correlacion",
backgroundColor = styleInterval(c(0), c("#FDDBC7", "#D1E5F0")),
color = styleInterval(c(0), c("#B2182B", "#2166AC")),
fontWeight = 'bold'
) %>%
formatStyle(
columns = c("Variable1", "Variable2", "Correlacion"),
fontFamily = "Arial"
) %>%
formatStyle(
columns = 1:3,
fontSize = "12px"
)Como se puede observar en la matriz de correlación de las 15 relaciones obtenidas, tres presentan correlaciones positivas elevadas. Estas variables se conservaron en el análisis, pues la reducción de dimensionalidad propia del ACP permite disminuir la redundancia entre ellas sin sacrificar una porción significativa de la variabilidad original. Si bien su correlación es alta, la información que cada una aporta es diferente y enriquecedora; eliminarlas habría implicado una pérdida de información relevante.
PIB PPA e Importaciones de Bienes y Servicios (0.92): Esta relación sugiere que las economías de mayor tamaño, medidas por paridad de poder adquisitivo, tienden a importar más en términos absolutos. A pesar de su asociación, una variable refleja el tamaño de la economía, mientras que la otra captura la magnitud de la demanda de comercio internacional.
Exportaciones e Importaciones de Bienes y Servicios (0.96): Este hallazgo indica que los países con altos volúmenes de exportación también presentan elevadas importaciones, ya que la producción orientada al mercado externo frecuentemente requiere materias primas y maquinarias que deben adquirirse en otros países. El análisis conjunto de ambas variables permite caracterizar escenarios de apertura comercial general, algo que no sería posible si alguna de ellas se excluyera.
Crecimiento del PIB Nominal e Inflación (0.96): Esta correlación evidencia cómo el PIB nominal influye sobre los precios: cuando la inflación se incrementa, el crecimiento nominal se eleva artificialmente, como ocurre en Argentina y Turquía. Mantener ambas variables en el análisis posibilita que el ACP distinga entre crecimiento real y presión inflacionaria, fenómenos con implicaciones económicas sustancialmente distintas.
El Análisis de Componentes Principales (ACP) se aplicó al conjunto de 15 variables económicas estandarizadas con el objetivo de identificar las dimensiones latentes que explican la variabilidad entre los países. El procedimiento transforma las variables originales en un nuevo conjunto de componentes no correlacionados, ordenados de mayor a menor según la cantidad de varianza que retienen. De esta forma, los primeros componentes concentran la mayor parte de la información original, permitiendo reducir la dimensionalidad de los datos sin perder información relevante.
La aplicación del ACP se justifica por tres razones fundamentales:
Reducción de redundancia: La matriz de correlación reveló múltiples pares de variables con correlaciones superiores a 0.70 (Crec. PIB Nominal e Inflación con 0.97, PIB PPA e Importaciones con 0.93), lo que indica información redundante que puede ser sintetizada.
Eliminación de ruido: Al transformar las 15 variables originales en componentes no correlacionados, el ACP permite eliminar la variabilidad aleatoria (ruido) presente en los datos.
Facilidad en la clusterización: Los componentes principales sirven como insumo para el análisis de clústeres jerárquico, permitiendo identificar grupos de países con perfiles económicos similares sin los problemas de multicolinealidad.
A continuación, se presenta el gráfico y la tabla que muestra el porcentaje de varianza explicada por cada componente, lo cual permite determinar cuántas dimensiones son relevantes para el análisis posterior.
Tabla: Varianza explicada por componentes principales
res.pca <- prcomp(datos_std, scale = TRUE)
eig.val <- get_eigenvalue(res.pca)
tabla_varianza <- data.frame(
Componente = paste0("PC", 1:nrow(eig.val)),
Eigenvalue = round(eig.val$eigenvalue, 3),
Varianza = round(eig.val$variance.percent, 2),
Varianza_Acumulada = round(eig.val$cumulative.variance.percent, 2)
)
datatable(
tabla_varianza[1:15, ],
colnames = c("Componente", "Eigenvalue", "Varianza (%)", "Varianza Acumulada (%)"),
options = list(
dom = 't',
paging = FALSE,
searching = FALSE,
ordering = FALSE
),
rownames = FALSE
) %>%
formatStyle(
columns = c("Componente", "Eigenvalue", "Varianza", "Varianza_Acumulada"),
fontFamily = "Arial",
fontSize = "12px"
) %>%
formatStyle(
"Componente",
fontWeight = "bold"
) %>%
formatStyle(
"Varianza_Acumulada",
backgroundColor = styleEqual(
c(32.63, 55.81, 69.69, 80.35, 87.37),
c("#E8F5E9", "#E8F5E9", "#E8F5E9", "white", "white")
)
)La tabla anterior muestra algunos datos relevantes que ayudan a determinar con cuantos componentes principales se trabajará. Para entenderla mejor, a continuación se presenta una breve definición de cada concepto que compone la tabla:
Componente: Son combinaciones lineales de las variables originales y estan ordenadas según el porcentaje de varianza. En este caso, se tiene 15 componentes porque el conjunto de datos cuenta con 15 variables.
Eigenvalue: Es un número que dice cuanta varianza (o información) del conjunto de datos original esta explicando cada componente principal. Según el criterio de Kaiser, se debe usar solo aquellas dimensiones que cuenten con un Eigenvalue mayor o igual a 1, ya que estas representan más información que una variable original promedio.
Varianza: Es el porcentaje de varianza que explica la dimensión, es decir, que tanta información del conjunto de datos se explica con ese eje nuevo.
Varianza acumulada: Es la suma acumulada de los porcentajes de varianza por cada componente. Sirve principalmente para visualizar hasta que dimensión tomaremos.
El gráfico de sedimentación (Scree Plot) permite visualizar visualmente la importancia de cada componente principal mediante el concepto del codo (elbow), propuesto por Kaiser (1960). En este gráfico, las barras representan la varianza que explica cada componente, ordenadas de mayor a menor.
eig.val <- get_eigenvalue(res.pca)
eig_df <- data.frame(
dimension = 1:10,
variance.percent = eig.val$variance.percent[1:10],
cumulative.variance.percent = eig.val$cumulative.variance.percent[1:10]
)
ggplot(eig_df, aes(x = factor(dimension), y = variance.percent, fill= variance.percent)) +
geom_col(width = 0.7, color = "white") +
geom_line(aes(group = 1), color = "#0B1F3A", linewidth = 0.8) +
geom_point(color = "#0B1F3A", size = 2.5) +
geom_text(aes(label = paste0(round(variance.percent, 1), "%")),
vjust = -0.6, size = 3.5, color = "#0B1F3A", fontface = "bold") +
scale_fill_gradient(low = "#a8c8e8", high = "#0B1F3A") +
scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
theme_minimal(base_size = 12) +
theme(
legend.position = "none",
axis.title = element_text(color = "#0B1F3A", face = "bold"),
plot.title = element_text(color = "#0B1F3A", face = "bold", size = 14),
plot.subtitle = element_text(color = "gray40", size = 10),
panel.grid.major.x = element_blank()
) +
labs(
title = "Varianza explicada por componente principal",
subtitle = "Grafico de sedimentación",
x = "Componente Principal",
y = "Varianza explicada (%)"
) Se observa un descenso pronunciado en los primeros componentes: PC1, PC2 y PC3 son significativamente más altos que el resto, lo que indica que estos tres componentes capturan la mayor parte de la varianza total de los datos (69,7). A partir del cuarto componente, la pendiente se aplana notablemente, entrando en una región donde los componentes posteriores explican proporciones cada vez más pequeñas de varianza residual.
Este comportamiento confirma que retener los primeros 3 componentes es suficiente para representar adecuadamente la estructura subyacente de los datos, sin necesidad de incluir componentes adicionales que aportan poca información.
PC1 Inestabilidad Monetaria (32.63% de varianza):
PC1 mide qué tan problemática es la situación de precios y moneda en cada país. Este componente separa a los países donde los precios suben mucho y la moneda pierde valor (alta inflación y depreciación), de aquellos donde los precios se mantienen estables y la moneda es confiable. En el extremo negativo se ubican Argentina y Turquía, mientras que Alemania y Japón lideran el extremo positivo.
Gráfico de variables PC1
res.var <- get_pca_var(res.pca)
loadings_df <- data.frame(
Variable = rownames(res.var$coord),
PC1 = res.var$coord[, 1]
)
variables_pc1 <- c("Crec. PIB Nominal", "Inflación", "Deflactor del PIB",
"Tipo de Cambio", "Crec. Inversion", "Crec. Consumo Priv.",
"Crec. PIB Real")
pc1_data <- loadings_df %>%
filter(Variable %in% variables_pc1) %>%
arrange(PC1)
ggplot(pc1_data, aes(x = reorder(Variable, PC1), y = PC1, fill = PC1 > 0)) +
geom_bar(stat = "identity", width = 0.6) +
coord_flip() +
scale_fill_manual(values = c("TRUE" = "#2166AC", "FALSE" = "#B2182B"), guide = "none") +
labs(title = "PC1: Inestabilidad Monetaria (32.63%)",
subtitle = "Variables que definen el componente",
x = "",
y = "Carga factorial (correlación con PC1)") +
geom_hline(yintercept = 0, linetype = "solid", color = "black", linewidth = 0.5) +
geom_text(aes(label = round(PC1, 2),
hjust = ifelse(PC1 > 0, -0.2, 1.2)),
size = 3.5) +
scale_y_continuous(expand = expansion(mult = c(0.1, 0.15))) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1a3a5c", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 9, color = "#555555", hjust = 0.5),
axis.text.y = element_text(size = 9),
axis.text.x = element_text(size = 8),
panel.grid.major.y = element_blank()
)Gráfico de países PC1
res.ind <- get_pca_ind(res.pca)
coordenadas <- as.data.frame(res.ind$coord[, 1:3])
coordenadas$Pais <- rownames(coordenadas)
colnames(coordenadas) <- c("PC1", "PC2", "PC3", "Pais")
paises_pc1 <- c("Argentina", "Türkiye", "Chile", "India", "Perú",
"United States", "Switzerland", "Japan", "Germany", "Ireland")
pc1_paises <- coordenadas %>%
filter(Pais %in% paises_pc1) %>%
arrange(PC1) %>%
mutate(
Estabilidad = ifelse(PC1 < 0,
"Alta inestabilidad monetaria",
"Estabilidad monetaria"),
Etiqueta = paste0(Pais, " (", round(PC1, 2), ")")
)
ggplot(pc1_paises, aes(x = reorder(Etiqueta, PC1), y = PC1, color = Estabilidad)) +
geom_point(size = 3.5) +
geom_segment(aes(x = reorder(Etiqueta, PC1), xend = reorder(Etiqueta, PC1),
y = 0, yend = PC1), alpha = 0.5, linewidth = 0.5) +
coord_flip() +
geom_hline(yintercept = 0, linetype = "solid", color = "black", linewidth = 0.5) +
scale_color_manual(values = c("Alta inestabilidad monetaria" = "#B2182B",
"Estabilidad monetaria" = "#2166AC")) +
labs(title = "PC1: Inestabilidad Monetaria (32.63%)",
subtitle = "Países con alta inestabilidad (rojo) vs estabilidad monetaria (azul)",
x = "",
y = "Coordenada en PC1",
color = "") +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1a3a5c", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 10, color = "#555555", hjust = 0.5),
axis.text.y = element_text(size = 10),
axis.text.x = element_text(size = 9),
legend.position = "bottom"
)PC2: Tamaño económico (23.18% de varianza)
PC2 mide el tamaño de la economía de un país. Los países con valores altos en este componente tienen mayor producción de bienes y servicios (PIB), más personas empleadas, y un mayor volumen de comercio internacional (exportaciones e importaciones). En contraste, los países con valores bajos son economías más pequeñas, con menor capacidad productiva y menos inserción en los mercados globales. En el extremo positivo se ubican Estados Unidos, Alemania y Argentina, mientras que Chile, Estonia y Croacia lideran el extremo negativo.
Gráfico de variables PC2
res.var <- get_pca_var(res.pca)
loadings_df <- data.frame(
Variable = rownames(res.var$coord),
PC2 = res.var$coord[, 2]
)
variables_pc2 <- c("PIB PPA", "Importaciones B y S", "Expot. Bienes y Serv.",
"Empleo Total", "Crec. Importaciones")
pc2_data <- loadings_df %>%
filter(Variable %in% variables_pc2) %>%
arrange(desc(PC2))
ggplot(pc2_data, aes(x = reorder(Variable, PC2), y = PC2, fill = PC2 > 0)) +
geom_bar(stat = "identity", width = 0.6) +
coord_flip() +
scale_fill_manual(values = c("TRUE" = "#2166AC", "FALSE" = "#B2182B"), guide = "none") +
labs(title = "PC2: Tamaño Económico (23.18%)",
subtitle = "Variables que definen al componente",
x = "",
y = "Carga factorial (correlación con PC2)") +
geom_hline(yintercept = 0, linetype = "solid", color = "black", linewidth = 0.5) +
geom_text(aes(label = round(PC2, 2),
hjust = ifelse(PC2 > 0, -0.2, 1.2)),
size = 3.5) +
scale_y_continuous(expand = expansion(mult = c(0.1, 0.15))) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1a3a5c", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 9, color = "#555555", hjust = 0.5),
axis.text.y = element_text(size = 9),
axis.text.x = element_text(size = 8),
panel.grid.major.y = element_blank()
)Gráfico de países PC2
res.ind <- get_pca_ind(res.pca)
coordenadas <- as.data.frame(res.ind$coord[, 1:3])
coordenadas$Pais <- rownames(coordenadas)
colnames(coordenadas) <- c("PC1", "PC2", "PC3", "Pais")
paises_pc2 <- c("United States", "Germany", "Argentina", "Japan", "Brazil",
"Chile", "Estonia", "Croatia", "Slovenia", "Greece")
pc2_paises <- coordenadas %>%
filter(Pais %in% paises_pc2) %>%
arrange(desc(PC2)) %>%
mutate(
Tamano = ifelse(PC2 < 0,
"Menor tamaño económico",
"Mayor tamaño económico"),
Etiqueta = paste0(Pais, " (", round(PC2, 2), ")")
)
ggplot(pc2_paises, aes(x = reorder(Etiqueta, PC2), y = PC2, color = Tamano)) +
geom_point(size = 3.5) +
geom_segment(aes(x = reorder(Etiqueta, PC2), xend = reorder(Etiqueta, PC2),
y = 0, yend = PC2), alpha = 0.5, linewidth = 0.5) +
coord_flip() +
geom_hline(yintercept = 0, linetype = "solid", color = "black", linewidth = 0.5) +
scale_color_manual(values = c("Menor tamaño económico" = "#B2182B",
"Mayor tamaño económico" = "#2166AC")) +
labs(title = "PC2: Tamaño Económico (23.18%)",
subtitle = "Países con menor tamaño (rojo) vs mayor tamaño económico (azul)",
x = "",
y = "Coordenada en PC2",
color = "") +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1a3a5c", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 10, color = "#555555", hjust = 0.5),
axis.text.y = element_text(size = 10),
axis.text.x = element_text(size = 9),
legend.position = "bottom"
)PC3: Posición Externa (13.88% de varianza)
PC3 refleja la situación comercial de un país frente al resto del mundo. Los países con valores altos en este componente tienen superávit comercial, es decir, venden más al exterior de lo que compran, lo que generalmente viene acompañado de un mayor dinamismo en las importaciones y la inversión. Los países con valores bajos, por el contrario, tienen déficit comercial: compran más de lo que venden, lo que puede reflejar una mayor dependencia de productos del exterior. En el extremo positivo destacan Chile, Perú y Colombia, mientras que Irlanda, Türkiye y Argentina se ubican en el extremo negativo.
Gráfico de variables PC3
res.var <- get_pca_var(res.pca)
loadings_df <- data.frame(
Variable = rownames(res.var$coord),
PC3 = res.var$coord[, 3]
)
variables_pc3 <- c("Expo Netas", "Crec. Importaciones", "Crec. Inversion",
"Tasa Interes", "Crec. PIB Nominal")
pc3_data <- loadings_df %>%
filter(Variable %in% variables_pc3) %>%
arrange(desc(PC3))
ggplot(pc3_data, aes(x = reorder(Variable, PC3), y = PC3, fill = PC3 > 0)) +
geom_bar(stat = "identity", width = 0.6) +
coord_flip() +
scale_fill_manual(values = c("TRUE" = "#2166AC", "FALSE" = "#B2182B"), guide = "none") +
labs(title = "PC3: Posición Externa (13.88%)",
subtitle = "Variables que definen al componente",
x = "",
y = "Carga factorial (correlación con PC3)") +
geom_hline(yintercept = 0, linetype = "solid", color = "black", linewidth = 0.5) +
geom_text(aes(label = round(PC3, 2),
hjust = ifelse(PC3 > 0, -0.2, 1.2)),
size = 3.5) +
scale_y_continuous(expand = expansion(mult = c(0.1, 0.15))) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1a3a5c", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 9, color = "#555555", hjust = 0.5),
axis.text.y = element_text(size = 9),
axis.text.x = element_text(size = 8),
panel.grid.major.y = element_blank()
)Gráfico de países PC3
paises_pc3 <- c("Chile", "Peru", "Colombia", "India", "United States",
"Ireland", "Turkiye", "Argentina", "Norway", "SouthAfrica")
pc3_paises <- coordenadas %>%
filter(Pais %in% paises_pc3) %>%
arrange(desc(PC3)) %>%
mutate(
Posicion = ifelse(PC3 < 0,
"Déficit comercial",
"Superávit comercial"),
Etiqueta = paste0(Pais, " (", round(PC3, 2), ")")
)
ggplot(pc3_paises, aes(x = reorder(Etiqueta, PC3), y = PC3, color = Posicion)) +
geom_point(size = 3.5) +
geom_segment(aes(x = reorder(Etiqueta, PC3), xend = reorder(Etiqueta, PC3),
y = 0, yend = PC3), alpha = 0.5, linewidth = 0.5) +
coord_flip() +
geom_hline(yintercept = 0, linetype = "solid", color = "black", linewidth = 0.5) +
scale_color_manual(values = c("Déficit comercial" = "#B2182B",
"Superávit comercial" = "#2166AC")) +
labs(title = "PC3: Posición Externa (13.88%)",
subtitle = "Países con déficit (rojo) vs superávit comercial (azul)",
x = "",
y = "Coordenada en PC3",
color = "") +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1a3a5c", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 10, color = "#555555", hjust = 0.5),
axis.text.y = element_text(size = 10),
axis.text.x = element_text(size = 9),
legend.position = "bottom"
)Tabla de Caracterización de Factores
La Tabla 1 resume de manera integrada lo que se ha observado en los gráficos anteriores. Para cada componente, se presenta el nombre asignado, su interpretación práctica, las variables clave que lo definen y los países más representativos en cada extremo. Esta síntesis permite visualizar de forma rápida y clara cómo se estructuran las dimensiones subyacentes de los datos.
tabla_factores <- data.frame(
Componente = c("PC1", "PC2", "PC3"),
Varianza_Explicada = c("32.63%", "23.18%", "13.88%"),
Nombre = c("Inestabilidad Monetaria", "Tamaño Económico", "Posición Externa"),
Interpretacion = c(
"Mide qué tan problemática es la situación de precios y moneda. Separa países con alta inflación y depreciación de aquellos con precios estables.",
"Mide el tamaño de la economía. Separa países con mayor producción, empleo y comercio internacional de aquellos con economías más pequeñas.",
"Refleja la situación comercial frente al exterior. Separa países con superávit comercial (venden más de lo que compran) de aquellos con déficit."
),
Variables_Clave = c(
"Crec. PIB Nominal (-), Inflación (-), Deflactor (-), Tipo de Cambio (-)",
"PIB PPA (+), Importaciones (+), Exportaciones (+), Empleo Total (+)",
"Expo Netas (-), Crec. Importaciones (+), Crec. Inversión (+)"
),
Paises_Altos = c(
"Alemania (2.70), Japón (2.45), Suiza (1.96) → Estabilidad monetaria",
"EE.UU. (9.09), Alemania (3.20), Argentina (3.28) → Mayor tamaño económico",
"Chile (2.39), Perú (1.62), Colombia (1.22) → Superávit comercial"
),
Paises_Bajos = c(
"Argentina (-10.26), Türkiye (-4.21), Chile (-2.96) → Alta inestabilidad",
"Chile (-1.52), Estonia (-1.40), Croacia (-1.39) → Menor tamaño económico",
"Irlanda (-6.57), Türkiye (-3.67), Argentina (-1.78) → Déficit comercial"
)
)
datatable(
tabla_factores,
colnames = c("Componente", "Varianza", "Nombre del Factor",
"Interpretación", "Variables Clave",
"Países con valores altos", "Países con valores bajos"),
options = list(
dom = 't',
pageLength = 10,
scrollX = TRUE,
autoWidth = TRUE,
columnDefs = list(
list(width = '200px', targets = c(3)),
list(width = '180px', targets = c(4)),
list(width = '200px', targets = c(5, 6))
)
),
rownames = FALSE,
caption = htmltools::tags$caption(
style = "caption-side: top; text-align: center; font-size: 16px; font-weight: bold; margin-bottom: 10px;",
"Tabla 1. Caracterización de los Componentes Principales"
)
) %>%
formatStyle(
"Componente",
backgroundColor = "#1a3a5c",
color = "white",
fontWeight = "bold",
textAlign = "center"
) %>%
formatStyle(
"Nombre",
backgroundColor = "#E8F5E9",
fontWeight = "bold"
) %>%
formatStyle(
columns = c("Varianza_Explicada", "Interpretacion", "Variables_Clave",
"Paises_Altos", "Paises_Bajos"),
fontSize = "12px",
lineHeight = "1.4"
) %>%
formatStyle(
"Varianza_Explicada",
textAlign = "center"
)Dimensión 1 vs Dimensión 2
Gráfico de Individuos
El siguiente gráfico nos permite visualizar cómo se agrupan o separan los países según sus valores en las dos primeras dimensiones.
res.ind <- get_pca_ind(res.pca)
coordenadas <- as.data.frame(res.ind$coord[, 1:3])
colnames(coordenadas) <- c("PC1", "PC2", "PC3")
coordenadas$Pais <- rownames(coordenadas)
coordenadas$cos2 <- res.ind$cos2[, 1]
coordenadas$hover_text <- paste0(
"<b>", coordenadas$Pais, "</b><br>",
"────────────────<br>",
"PC1: ", round(coordenadas$PC1, 2), "<br>",
"PC2: ", round(coordenadas$PC2, 2), "<br>",
"────────────────<br>",
"Calidad (cos²): ", round(coordenadas$cos2, 3)
)
plot_ly(
data = coordenadas,
x = ~PC1,
y = ~PC2,
type = "scatter",
mode = "markers+text",
text = ~Pais,
textposition = "top center",
textfont = list(size = 10, color = "#1a3a5c"),
marker = list(
size = ~(cos2 * 18) + 10,
color = ~cos2,
colorscale = list(
c(0, "#B2182B"),
c(0.5, "#FDDBC7"),
c(0.8, "#D1E5F0"),
c(1, "#2166AC")
),
colorbar = list(
title = list(text = "cos² (calidad)", font = list(size = 11, color = "#1a3a5c")),
tickfont = list(color = "#1a3a5c", size = 9),
len = 0.6,
x = 1.02
),
line = list(color = "white", width = 1.5),
opacity = 0.85,
showscale = TRUE
),
hoverinfo = "text",
hovertext = ~hover_text,
width = 900,
height = 700
) %>%
layout(
title = list(
text = "Países - Calidad de representación (cos²)",
font = list(size = 16, family = "Arial", color = "#1a3a5c"),
x = 0.5
),
xaxis = list(
title = list(text = paste0("Dimension 1 (", round(eig.val$variance.percent[1], 1), "%)"),
font = list(size = 14, color = "#1a3a5c"),
standoff = 25
),
gridcolor = "#e0e0e0",
zerolinecolor = "#999999",
zerolinewidth = 1,
showline = TRUE,
linecolor = "#cccccc",
tickfont = list(size = 10, color = "#1a3a5c")
),
yaxis = list(
title = list(text = paste0("Dimensión 2 (", round(eig.val$variance.percent[2], 1), "%)"),
font = list(size = 14, color = "#1a3a5c")),
gridcolor = "#e0e0e0",
zerolinecolor = "#999999",
zerolinewidth = 1,
showline = TRUE,
linecolor = "#cccccc",
tickfont = list(size = 10, color = "#1a3a5c")
),
plot_bgcolor = "white",
paper_bgcolor = "white",
margin = list(l = 60, r = 80, b = 50, t = 70),
hoverlabel = list(
bgcolor = "white",
bordercolor = "#2166AC",
font = list(color = "#1a3a5c", size = 11)
)
) %>%
config(
displayModeBar = TRUE,
modeBarButtonsToRemove = c("zoomIn2d", "zoomOut2d", "autoScale2d", "resetScale2d", "lasso2d", "select2d"),
displaylogo = FALSE,
toImageButtonOptions = list(
format = "png",
filename = "pca_paises_cos2",
width = 1200,
height = 800
)
)Extremo izquierdo (alta inestabilidad monetaria):
Argentina y Turquía se ubican muy alejados hacia la izquierda del gráfico, con valores muy negativos en la dimensión 1. Esto refleja su alta inflación y depreciación cambiaria, consistente con la caracterización de Argentina como el país de mayor inestabilidad monetaria de la muestra.
Extremo superior (gran tamaño económico):
Estados Unidos aparece en el extremo superior del eje vertical (Dimensión 2), muy por encima del resto, confirmando su posición como la economía más grande en términos de PIB PPA, comercio y empleo.
Zona central derecha (economías estables y de tamaño medio):
La mayoría de los países de la OCDE (Alemania, Francia, Reino Unido, Japón, Corea del Sur, Países Bajos, Suiza, etc.) se concentran en la parte derecha del plano, con valores positivos en la Dimensión 1 y valores moderados o altos en la Dimensión 2. Esto indica economías con baja inflación y tamaño económico relevante.
Gráfico de Variables
El gráfico de variables en las dimensiones 1 y 2 muestra cómo se relacionan las variables económicas con los dos primeros componentes principales, que en conjunto explican el 55.81% de la varianza total
var_data <- get_pca_var(res.pca)
var_df <- data.frame(
Variable = rownames(var_data$coord),
Dim1 = var_data$coord[, 1],
Dim2 = var_data$coord[, 2],
Contrib1 = var_data$contrib[, 1],
Contrib2 = var_data$contrib[, 2],
Contrib_total = rowSums(var_data$contrib[, 1:2]),
Cos2_1 = var_data$cos2[, 1],
Cos2_2 = var_data$cos2[, 2],
stringsAsFactors = FALSE
)
var_df$color_norm <- var_df$Contrib1 / max(var_df$Contrib1)
paleta_colores <- list(
c(0, "#B2182B"),
c(0.33, "#FDDBC7"),
c(0.66, "#D1E5F0"),
c(1, "#2166AC")
)
max_abs <- max(abs(c(var_df$Dim1, var_df$Dim2))) * 1.15
circle_radius <- 1
var_df$hover_text <- paste0(
var_df$Variable, "\n",
"────────────────\n",
"PC1: ", round(var_df$Dim1, 3), "\n",
"PC2: ", round(var_df$Dim2, 3), "\n",
"────────────────\n",
"Contribución a PC1: ", round(var_df$Contrib1, 1), "%\n",
"Calidad (cos²) PC1: ", round(var_df$Cos2_1, 3)
)
plot_ly(
width = 900,
height = 700
) %>%
add_trace(
type = "scatter",
mode = "lines",
x = ~circle_radius * cos(seq(0, 2 * pi, length.out = 100)),
y = ~circle_radius * sin(seq(0, 2 * pi, length.out = 100)),
line = list(color = "#999999", width = 1.5, dash = "dot"),
showlegend = FALSE,
hoverinfo = "skip",
name = "Círculo de correlaciones"
) %>%
add_segments(
data = var_df,
x = 0, xend = ~Dim1,
y = 0, yend = ~Dim2,
line = list(color = "rgba(100, 100, 100, 0.4)", width = 1.2),
showlegend = FALSE,
hoverinfo = "skip"
) %>%
add_markers(
data = var_df,
x = ~Dim1,
y = ~Dim2,
marker = list(
size = ~(color_norm * 18) + 10,
color = ~color_norm,
colorscale = paleta_colores,
showscale = TRUE,
colorbar = list(
title = list(text = "Contribución<br>a PC1 (%)", font = list(size = 11, color = "#1a3a5c")),
tickfont = list(color = "#1a3a5c", size = 10),
len = 0.5,
x = 1.02,
tickvals = c(0, 0.33, 0.66, 1),
ticktext = c("0%", "33%", "66%", "100%")
),
line = list(color = "white", width = 1.5),
opacity = 0.85
),
hoverinfo = "text",
hovertext = ~hover_text,
showlegend = FALSE
) %>%
add_text(
data = var_df,
x = ~Dim1,
y = ~Dim2,
text = ~Variable,
textfont = list(
size = 12,
color = "#1a3a5c",
family = "Arial"
),
textposition = ~ifelse(Dim1 > 0, "middle right", "middle left"),
textangle = 0,
hoverinfo = "skip",
showlegend = FALSE
) %>%
layout(
title = list(
text = "Variables dimensión 1 vs dimensión 2",
font = list(size = 18, family = "Arial", color = "#1a3a5c"),
x = 0.5,
xanchor = "center"
),
xaxis = list(
title = list(text = paste0("Dimensión 1 (", round(eig.val$variance.percent[1], 1), "%)"),
font = list(size = 14, color = "#1a3a5c"),
standoff = 25
),
zeroline = TRUE,
zerolinecolor = "#999999",
zerolinewidth = 1.5,
gridcolor = "#e0e0e0",
showgrid = TRUE,
range = c(-max_abs, max_abs),
tickfont = list(color = "#1a3a5c", size = 12)
),
yaxis = list(
title = list(text = paste0("Dimensión 2 (", round(eig.val$variance.percent[2], 1), "%)"),
font = list(size = 14, color = "#1a3a5c")),
zeroline = TRUE,
zerolinecolor = "#999999",
zerolinewidth = 1.5,
gridcolor = "#e0e0e0",
showgrid = TRUE,
range = c(-max_abs, max_abs),
tickfont = list(color = "#1a3a5c", size = 12)
),
hovermode = "closest",
plot_bgcolor = "white",
paper_bgcolor = "white",
margin = list(l = 80, r = 120, b = 60, t = 80),
hoverlabel = list(
bgcolor = "white",
bordercolor = "#2166AC",
font = list(color = "#1a3a5c", size = 12, family = "Arial")
),
shapes = list(
list(type = "line", x0 = 0, x1 = 0, y0 = -max_abs, y1 = max_abs,
line = list(color = "#999999", width = 1, dash = "dot")),
list(type = "line", x0 = -max_abs, x1 = max_abs, y0 = 0, y1 = 0,
line = list(color = "#999999", width = 1, dash = "dot"))
)
) %>%
config(
responsive = TRUE,
displayModeBar = TRUE,
displaylogo = FALSE,
modeBarButtonsToRemove = list('lasso2d', 'select2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d'),
toImageButtonOptions = list(
format = "png",
filename = "pca_variables_pc1_pc2",
width = 1200,
height = 800
)
)En el gráfico se puede observar la Dimensión 1 separa a los países según la estabilidad de sus precios y su moneda. Las variables con mayor carga negativa en este eje son:
Crecimiento del PIB Nominal (-0.917)
Inflación (-0.873)
Deflactor del PIB (-0.754)
Tipo de Cambio (-0.713)
Esto significa que los países ubicados hacia la izquierda del gráfico presentan alta inflación, depreciación cambiaria y crecimiento nominal elevado, es decir, alta inestabilidad monetaria. Por el contrario, los países ubicados hacia la derecha se caracterizan por precios estables y una moneda confiable.
Por otra parte la Dimensión 2 captura el tamaño de las economías. Las variables con mayor carga en este eje (en valor absoluto) son:
Importaciones de bienes y servicios (0.904)
PIB PPA (0.902)
Empleo Total (0.889)
Exportaciones de bienes y servicios (0.863)
Todas estas variables presentan carga positiva en PC2. Esto implica que los países con mayor tamaño económico (mayor PIB, más empleo y mayor comercio internacional) se ubican en la parte superior del gráfico, mientras que las economías más pequeñas se ubican en la parte inferior.
Dimensión 1 vs Dimensión 3
Gráfico de Individuos
El siguiente gráfico nos permite visualizar cómo se agrupan o separan los países según sus valores en la Dimensión 1 y 3.
res.ind <- get_pca_ind(res.pca)
coordenadas <- as.data.frame(res.ind$coord[, c(1, 3)])
colnames(coordenadas) <- c("PC1", "PC3")
coordenadas$Pais <- rownames(coordenadas)
coordenadas$cos2 <- res.ind$cos2[, 1]
coordenadas$hover_text <- paste0(
"<b>", coordenadas$Pais, "</b><br>",
"────────────────<br>",
"PC1: ", round(coordenadas$PC1, 2), "<br>",
"PC3: ", round(coordenadas$PC3, 2), "<br>",
"────────────────<br>",
"Calidad (cos²): ", round(coordenadas$cos2, 3)
)
plot_ly(
data = coordenadas,
x = ~PC1,
y = ~PC3,
type = "scatter",
mode = "markers+text",
text = ~Pais,
textposition = "top center",
textfont = list(size = 10, color = "#1a3a5c"),
marker = list(
size = ~(cos2 * 18) + 10,
color = ~cos2,
colorscale = list(
c(0, "#B2182B"),
c(0.5, "#FDDBC7"),
c(0.8, "#D1E5F0"),
c(1, "#2166AC")
),
colorbar = list(
title = list(text = "cos² (calidad)", font = list(size = 11, color = "#1a3a5c")),
tickfont = list(color = "#1a3a5c", size = 9),
len = 0.6,
x = 1.02
),
line = list(color = "white", width = 1.5),
opacity = 0.85,
showscale = TRUE
),
hoverinfo = "text",
hovertext = ~hover_text,
width = 900,
height = 700
) %>%
layout(
title = list(
text = "Países - Calidad de representación (cos²)",
font = list(size = 16, family = "Arial", color = "#1a3a5c"),
x = 0.5
),
xaxis = list(
title = list(text = paste0("Dimension 1 (", round(eig.val$variance.percent[1], 1), "%)"),
font = list(size = 14, color = "#1a3a5c"),
standoff = 25),
gridcolor = "#e0e0e0",
zerolinecolor = "#999999",
zerolinewidth = 1,
showline = TRUE,
linecolor = "#cccccc",
tickfont = list(size = 10, color = "#1a3a5c")
),
yaxis = list(
title = list(text = paste0("Dimensión 3 (", round(eig.val$variance.percent[3], 1), "%)"),
font = list(size = 14, color = "#1a3a5c")),
gridcolor = "#e0e0e0",
zerolinecolor = "#999999",
zerolinewidth = 1,
showline = TRUE,
linecolor = "#cccccc",
tickfont = list(size = 10, color = "#1a3a5c")
),
plot_bgcolor = "white",
paper_bgcolor = "white",
margin = list(l = 60, r = 80, b = 50, t = 70),
hoverlabel = list(
bgcolor = "white",
bordercolor = "#2166AC",
font = list(color = "#1a3a5c", size = 11)
)
) %>%
config(
displayModeBar = TRUE,
modeBarButtonsToRemove = c("zoomIn2d", "zoomOut2d", "autoScale2d", "resetScale2d", "lasso2d", "select2d"),
displaylogo = FALSE,
toImageButtonOptions = list(
format = "png",
filename = "pca_paises_pc1_pc3",
width = 1200,
height = 800
)
)Extremo izquierdo (alta inestabilidad monetaria):
Argentina y Turquía se ubican muy alejados hacia la izquierda del gráfico, con valores muy negativos en la Dimensión 1. Esto refleja su alta inflación y depreciación cambiaria, consistente con la caracterización de Argentina como el país de mayor inestabilidad monetaria de la muestra. Ambos países se combinan, además, con valores negativos en la Dimensión 3, lo que indica que también presentan déficit comercial.
Extremo inferior (fuerte déficit comercial):
Irlanda aparece en el extremo inferior del eje vertical (Dimensión 3), con un valor muy negativo, reflejando su profundo déficit comercial. Este resultado está asociado a la conocida distorsión contable por la presencia de grandes empresas multinacionales (efecto “leprechaun”), que infla el PIB nominal pero no se traduce en un superávit comercial real. A diferencia de Argentina y Turquía, Irlanda se ubica en el centro-derecha de la Dimensión 1, lo que indica estabilidad monetaria.
Extremo superior (superávit comercial):
Chile, Perú y Colombia se ubican en la parte superior del eje vertical (Dimensión 3), con valores positivos que indican superávit comercial. Estos países sudamericanos se caracterizan por vender más al exterior de lo que compran, lo que generalmente viene acompañado de un mayor dinamismo en las importaciones y la inversión. En la Dimensión 1, estos tres países se concentran en el centro-derecha del plano, con niveles de inflación moderados o bajos en comparación con Argentina.
Zona central (economías estables con posición externa neutral):
La mayoría de los países desarrollados como Estados Unidos, Alemania, Suiza, Noruega, así como economías emergentes como Brasil y México, se concentran cerca del origen de la Dimensión 3, con valores cercanos a cero. Esto indica que su comercio exterior está relativamente equilibrado: no tienen superávits ni déficits destacados en comparación con el resto de los países, o bien que esa característica se explica mejor por otras dimensiones del análisis (como el tamaño económico en PC2).
Gráfico de Variables
El gráfico de variables en las dimensiones 1 y 3 muestra cómo se relacionan las variables económicas con el primer y tercer componente principal, que en conjunto explican el 46.51% de la varianza total.
var_data <- get_pca_var(res.pca)
var_df <- data.frame(
Variable = rownames(var_data$coord),
Dim1 = var_data$coord[, 1],
Dim3 = var_data$coord[, 3],
Contrib1 = var_data$contrib[, 1],
Contrib3 = var_data$contrib[, 3],
Contrib_total = var_data$contrib[, 1] + var_data$contrib[, 3],
Cos2_1 = var_data$cos2[, 1],
Cos2_3 = var_data$cos2[, 3],
stringsAsFactors = FALSE
)
var_df$color_norm <- var_df$Contrib1 / max(var_df$Contrib1)
paleta_colores <- list(
c(0, "#B2182B"),
c(0.33, "#FDDBC7"),
c(0.66, "#D1E5F0"),
c(1, "#2166AC")
)
max_abs <- max(abs(c(var_df$Dim1, var_df$Dim3))) * 1.15
circle_radius <- 1
var_df$hover_text <- paste0(
var_df$Variable, "\n",
"────────────────\n",
"PC1: ", round(var_df$Dim1, 3), "\n",
"PC3: ", round(var_df$Dim3, 3), "\n",
"────────────────\n",
"Contribución a PC1: ", round(var_df$Contrib1, 1), "%\n",
"Calidad (cos²) PC1: ", round(var_df$Cos2_1, 3)
)
plot_ly(
width = 900,
height = 700
) %>%
add_trace(
type = "scatter",
mode = "lines",
x = ~circle_radius * cos(seq(0, 2 * pi, length.out = 100)),
y = ~circle_radius * sin(seq(0, 2 * pi, length.out = 100)),
line = list(color = "#999999", width = 1.5, dash = "dot"),
showlegend = FALSE,
hoverinfo = "skip",
name = "Círculo de correlaciones"
) %>%
add_segments(
data = var_df,
x = 0, xend = ~Dim1,
y = 0, yend = ~Dim3,
line = list(color = "rgba(100, 100, 100, 0.4)", width = 1.2),
showlegend = FALSE,
hoverinfo = "skip"
) %>%
add_markers(
data = var_df,
x = ~Dim1,
y = ~Dim3,
marker = list(
size = ~(color_norm * 18) + 10,
color = ~color_norm,
colorscale = paleta_colores,
showscale = TRUE,
colorbar = list(
title = list(text = "Contribución<br>a PC1 (%)", font = list(size = 11, color = "#1a3a5c")),
tickfont = list(color = "#1a3a5c", size = 10),
len = 0.5,
x = 1.02,
tickvals = c(0, 0.33, 0.66, 1),
ticktext = c("0%", "33%", "66%", "100%")
),
line = list(color = "white", width = 1.5),
opacity = 0.85
),
hoverinfo = "text",
hovertext = ~hover_text,
showlegend = FALSE
) %>%
add_text(
data = var_df,
x = ~Dim1,
y = ~Dim3,
text = ~Variable,
textfont = list(
size = 12,
color = "#1a3a5c",
family = "Arial"
),
textposition = ~ifelse(Dim1 > 0, "middle right", "middle left"),
textangle = 0,
hoverinfo = "skip",
showlegend = FALSE
) %>%
layout(
title = list(
text = "Variables dimensión 1 vs dimensión 3",
font = list(size = 18, family = "Arial", color = "#1a3a5c"),
x = 0.5,
xanchor = "center"
),
xaxis = list(
title = list(text = paste0("Dimension 1 (", round(eig.val$variance.percent[1], 1), "%)"),
font = list(size = 14, color = "#1a3a5c"),
standoff = 25),
zeroline = TRUE,
zerolinecolor = "#999999",
zerolinewidth = 1.5,
gridcolor = "#e0e0e0",
showgrid = TRUE,
range = c(-max_abs, max_abs),
tickfont = list(color = "#1a3a5c", size = 12)
),
yaxis = list(
title = list(text = paste0("Dimensión 3 (", round(eig.val$variance.percent[3], 1), "%)"),
font = list(size = 14, color = "#1a3a5c")),
zeroline = TRUE,
zerolinecolor = "#999999",
zerolinewidth = 1.5,
gridcolor = "#e0e0e0",
showgrid = TRUE,
range = c(-max_abs, max_abs),
tickfont = list(color = "#1a3a5c", size = 12)
),
hovermode = "closest",
plot_bgcolor = "white",
paper_bgcolor = "white",
margin = list(l = 80, r = 120, b = 60, t = 80),
hoverlabel = list(
bgcolor = "white",
bordercolor = "#2166AC",
font = list(color = "#1a3a5c", size = 12, family = "Arial")
),
shapes = list(
list(type = "line", x0 = 0, x1 = 0, y0 = -max_abs, y1 = max_abs,
line = list(color = "#999999", width = 1, dash = "dot")),
list(type = "line", x0 = -max_abs, x1 = max_abs, y0 = 0, y1 = 0,
line = list(color = "#999999", width = 1, dash = "dot"))
)
) %>%
config(
responsive = TRUE,
displayModeBar = TRUE,
displaylogo = FALSE,
modeBarButtonsToRemove = list('lasso2d', 'select2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d'),
toImageButtonOptions = list(
format = "png",
filename = "pca_variables_pc1_pc3",
width = 1200,
height = 800
)
)En el gráfico se puede observar la Dimensión 1 separa a los países según la estabilidad de sus precios y su moneda. Las variables con mayor carga negativa en este eje son:
Crecimiento del PIB Nominal (-0.917)
Inflación (-0.873)
Deflactor del PIB (-0.754)
Tipo de Cambio (-0.713)
Esto significa que los países ubicados hacia la izquierda del gráfico presentan alta inflación, depreciación cambiaria y crecimiento nominal elevado, es decir, alta inestabilidad monetaria. Por el contrario, los países ubicados hacia la derecha se caracterizan por precios estables y una moneda confiable.
Por otra parte, la Dimensión 3 captura la posición externa de los países. Las variables con mayor carga en este eje son:
Expo Netas (-0.873)
Crecimiento de Importaciones (0.685)
Crecimiento de Inversión (0.618)
Tasa de Interés (-0.313)
Esto implica que los países con superávit comercial se ubican en la parte superior del gráfico, mientras que los países con déficit comercial se ubican en la parte inferior. Además, los países con superávit también tienden a mostrar mayor dinamismo en sus importaciones e inversión.
El biplot combina en un mismo gráfico la proyección de las variables (flechas) y la de los individuos (puntos), permitiendo interpretar simultáneamente la estructura de los datos y la posición relativa de cada país.
var_data <- get_pca_var(res.pca)
ind_data <- get_pca_ind(res.pca)
var_df <- data.frame(
Variable = rownames(var_data$coord),
Dim1 = var_data$coord[, 1] * 9,
Dim2 = var_data$coord[, 2] * 9,
Contrib1 = var_data$contrib[, 1],
Contrib2 = var_data$contrib[, 2],
stringsAsFactors = FALSE
)
ind_df <- data.frame(
Pais = rownames(ind_data$coord),
Dim1 = ind_data$coord[, 1] ,
Dim2 = ind_data$coord[, 2] ,
Contrib1 = ind_data$contrib[, 1],
Contrib2 = ind_data$contrib[, 2],
stringsAsFactors = FALSE
)
max_abs_vars <- max(abs(c(var_df$Dim1, var_df$Dim2))) * 1.1
max_abs_inds <- max(abs(c(ind_df$Dim1, ind_df$Dim2))) * 1.1
max_abs <- max(max_abs_vars, max_abs_inds)
var_df$hover_text <- paste0(
"<b style='color:#2166AC;'>", var_df$Variable, "</b><br>",
"<span style='color:#666666;'>────────────────</span><br>",
"<span style='color:#666666;'>COORDENADAS REALES:</span><br>",
"├─ PC1: <b style='color:#B2182B;'>", round(var_df$Dim1/9, 3), "</b><br>",
"├─ PC2: <b style='color:#2166AC;'>", round(var_df$Dim2/9, 3), "</b><br>",
"<span style='color:#666666;'>────────────────</span><br>",
"<span style='color:#666666;'>CONTRIBUCIÓN:</span><br>",
"├─ PC1: <b>", round(var_df$Contrib1, 1), "%</b><br>",
"└─ PC2: <b>", round(var_df$Contrib2, 1), "%</b>"
)
ind_df$hover_text <- paste0(
"<b style='color:#B2182B;'>", ind_df$Pais, "</b><br>",
"<span style='color:#666666;'>────────────────</span><br>",
"<span style='color:#666666;'>COORDENADAS:</span><br>",
"├─ PC1: <b style='color:#B2182B;'>", round(ind_df$Dim1, 2), "</b><br>",
"├─ PC2: <b style='color:#2166AC;'>", round(ind_df$Dim2, 2), "</b><br>",
"<span style='color:#666666;'>────────────────</span><br>",
"<span style='color:#666666;'>CONTRIBUCIÓN:</span><br>",
"├─ PC1: <b>", round(ind_df$Contrib1, 1), "%</b><br>",
"└─ PC2: <b>", round(ind_df$Contrib2, 1), "%</b>"
)
plot_ly(
width = 900,
height = 700
) %>%
add_segments(
data = var_df,
x = 0, xend = ~Dim1,
y = 0, yend = ~Dim2,
line = list(color = "#2166AC", width = 2),
showlegend = FALSE,
hoverinfo = "skip"
) %>%
add_trace(
data = var_df,
x = ~Dim1,
y = ~Dim2,
text = ~hover_text,
type = "scatter",
mode = "markers",
marker = list(
size = 12,
color = "#2166AC",
opacity = 0.9,
line = list(width = 1.5, color = "#ffffff")
),
hovertemplate = '%{text}<extra></extra>',
name = "Variables",
showlegend = TRUE
) %>%
add_text(
data = var_df,
x = ~case_when(
Dim1 > 0 & Dim2 > 0 ~ Dim1 + 0.15,
Dim1 > 0 & Dim2 < 0 ~ Dim1 + 0.15,
Dim1 < 0 & Dim2 > 0 ~ Dim1 - 0.15,
Dim1 < 0 & Dim2 < 0 ~ Dim1 - 0.15,
TRUE ~ Dim1 + 0.08
),
y = ~case_when(
Dim1 > 0 & Dim2 > 0 ~ Dim2 + 0.10,
Dim1 > 0 & Dim2 < 0 ~ Dim2 - 0.10,
Dim1 < 0 & Dim2 > 0 ~ Dim2 + 0.10,
Dim1 < 0 & Dim2 < 0 ~ Dim2 - 0.10,
TRUE ~ Dim2 + 0.08
),
text = ~Variable,
textfont = list(
size = 12,
color = "#2166AC",
family = "Arial"
),
textposition = ~case_when(
Dim1 > 0 & Dim2 > 0 ~ "top right",
Dim1 > 0 & Dim2 < 0 ~ "bottom right",
Dim1 < 0 & Dim2 > 0 ~ "top left",
Dim1 < 0 & Dim2 < 0 ~ "bottom left",
TRUE ~ "top center"
),
hoverinfo = "skip",
showlegend = FALSE
) %>%
add_trace(
data = ind_df,
x = ~Dim1,
y = ~Dim2,
text = ~hover_text,
type = "scatter",
mode = "markers",
marker = list(
size = 8,
color = "#B2182B",
opacity = 0.7,
line = list(width = 0.8, color = "#ffffff")
),
hovertemplate = '%{text}<extra></extra>',
name = "Países",
showlegend = TRUE
) %>%
add_text(
data = ind_df,
x = ~Dim1,
y = ~Dim2,
text = ~Pais,
textfont = list(
size = 12,
color = "#B2182B",
family = "Arial"
),
textposition = "top center",
hoverinfo = "skip",
showlegend = FALSE
) %>%
layout(
title = list(
text = "<b style='color:#1a3a5c; font-size:18px;'>Biplot - Dimensión 1 vs Dimensión 2</b><br>
<span style='color:#666666; font-size:11px;'>Países y variables en el plano factorial</span>",
x = 0.5,
xanchor = 'center',
y = 0.96
),
xaxis = list(
title = list(text = paste0("<b>Dimensión 1 (", round(eig.val$variance.percent[1], 1), "%)"),
font = list(size = 14, color = "#1a3a5c")),
zeroline = TRUE,
zerolinecolor = "#999999",
zerolinewidth = 1.5,
gridcolor = "#e0e0e0",
showgrid = TRUE,
range = c(-max_abs, max_abs),
tickfont = list(color = "#1a3a5c", size = 10)
),
yaxis = list(
title = list(text = paste0("<b>Dimensión 2 (", round(eig.val$variance.percent[2], 1), "%)"),
font = list(size = 14, color = "#1a3a5c")),
zeroline = TRUE,
zerolinecolor = "#999999",
zerolinewidth = 1.5,
gridcolor = "#e0e0e0",
showgrid = TRUE,
range = c(-max_abs, max_abs),
tickfont = list(color = "#1a3a5c", size = 10)
),
hovermode = "closest",
plot_bgcolor = "white",
paper_bgcolor = "white",
font = list(family = "Arial, sans-serif", color = "#1a3a5c", size = 11),
margin = list(l = 65, r = 75, b = 50, t = 80),
hoverlabel = list(
bgcolor = "white",
bordercolor = "#1a3a5c",
font = list(color = "#1a3a5c", size = 10, family = "Arial")
),
legend = list(
bgcolor = "rgba(255,255,255,0.9)",
bordercolor = "#cccccc",
borderwidth = 0.5,
font = list(size = 10, color = "#1a3a5c"),
x = 0.02,
y = 0.98,
xanchor = "left",
yanchor = "top"
),
shapes = list(
list(type = "line", x0 = 0, x1 = 0, y0 = -max_abs, y1 = max_abs,
line = list(color = "#999999", width = 1, dash = "dot")),
list(type = "line", x0 = -max_abs, x1 = max_abs, y0 = 0, y1 = 0,
line = list(color = "#999999", width = 1, dash = "dot"))
),
annotations = list(
list(
x = 0.5,
y = -0.12,
xref = "paper",
yref = "paper",
text = "<span style='color:#666666; font-size:10px;'>Pasa el mouse sobre los puntos para ver coordenadas y contribuciones</span>",
showarrow = FALSE,
xanchor = "center",
align = "center"
)
)
) %>%
config(
responsive = TRUE,
displayModeBar = TRUE,
displaylogo = FALSE,
modeBarButtonsToRemove = list('lasso2d', 'select2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d'),
toImageButtonOptions = list(
format = "png",
filename = "biplot_pca_pc1_pc2",
width = 1200,
height = 800
)
)Argentina y Turquía se alinean con las flechas de Inflación, Tipo de Cambio, Deflactor del PIB y Crecimiento del PIB Nominal, confirmando valores elevados en todas estas variables. Esto refleja su alta inestabilidad monetaria y depreciación cambiaria.
Estados Unidos se alinea con PIB PPA, Empleo Total e Importaciones y Exportaciones de bienes y servicios, indicando el mayor tamaño económico de toda la muestra. Alemania, Japón, Reino Unido y Francia también se alinean con estas mismas variables, confirmando economías de gran escala productiva y alto volumen de comercio exterior.
Brasil, México e India se ubican en la zona intermedia entre grandes economías e inestabilidad, alineándose parcialmente con variables de crecimiento nominal (Crecimiento del PIB Nominal, Crecimiento del Consumo Privado, Crecimiento de la Inversión) sin alcanzar los niveles extremos de Argentina y Turquía.
Chile, Perú y Colombia se alinean con la flecha de Tasa de Desempleo (aunque con baja intensidad) y se ubican en la zona de economías más pequeñas, con cierta inestabilidad moderada.
Irlanda se ubica en la zona de economías pequeñas y estables, sin alinearse fuertemente con ninguna variable en este plano. Su perfil particular (déficit comercial extremo) se explica mejor en otras dimensiones.
En dirección opuesta: Los países del Cuadrante 1 (Alemania, Japón, Reino Unido, Francia, Canadá, Australia, etc.) se oponen a las flechas de Inflación, Tipo de Cambio y Deflactor del PIB, reflejando valores bajos en estos indicadores de inestabilidad. Asimismo, las economías pequeñas del Cuadrante 3 (Chile, Perú, Colombia, Croacia, Estonia) se oponen a las flechas de PIB PPA, Empleo Total y Comercio Exterior, confirmando su menor escala productiva y comercial.
var_data <- get_pca_var(res.pca)
ind_data <- get_pca_ind(res.pca)
var_df <- data.frame(
Variable = rownames(var_data$coord),
Dim1 = var_data$coord[, 1] * 9,
Dim3 = var_data$coord[, 3] * 9,
Contrib1 = var_data$contrib[, 1],
Contrib3 = var_data$contrib[, 3],
stringsAsFactors = FALSE
)
ind_df <- data.frame(
Pais = rownames(ind_data$coord),
Dim1 = ind_data$coord[, 1],
Dim3 = ind_data$coord[, 3],
Contrib1 = ind_data$contrib[, 1],
Contrib3 = ind_data$contrib[, 3],
stringsAsFactors = FALSE
)
max_abs_vars <- max(abs(c(var_df$Dim1, var_df$Dim3))) * 1.1
max_abs_inds <- max(abs(c(ind_df$Dim1, ind_df$Dim3))) * 1.1
max_abs <- max(max_abs_vars, max_abs_inds)
var_df$hover_text <- paste0(
"<b style='color:#2166AC;'>", var_df$Variable, "</b><br>",
"<span style='color:#666666;'>────────────────</span><br>",
"<span style='color:#666666;'>COORDENADAS REALES:</span><br>",
"├─ PC1: <b style='color:#B2182B;'>", round(var_df$Dim1/9, 3), "</b><br>",
"├─ PC3: <b style='color:#2166AC;'>", round(var_df$Dim3/9, 3), "</b><br>",
"<span style='color:#666666;'>────────────────</span><br>",
"<span style='color:#666666;'>CONTRIBUCIÓN:</span><br>",
"├─ PC1: <b>", round(var_df$Contrib1, 1), "%</b><br>",
"└─ PC3: <b>", round(var_df$Contrib3, 1), "%</b>"
)
ind_df$hover_text <- paste0(
"<b style='color:#B2182B;'>", ind_df$Pais, "</b><br>",
"<span style='color:#666666;'>────────────────</span><br>",
"<span style='color:#666666;'>COORDENADAS:</span><br>",
"├─ PC1: <b style='color:#B2182B;'>", round(ind_df$Dim1, 2), "</b><br>",
"├─ PC3: <b style='color:#2166AC;'>", round(ind_df$Dim3, 2), "</b><br>",
"<span style='color:#666666;'>────────────────</span><br>",
"<span style='color:#666666;'>CONTRIBUCIÓN:</span><br>",
"├─ PC1: <b>", round(ind_df$Contrib1, 1), "%</b><br>",
"└─ PC3: <b>", round(ind_df$Contrib3, 1), "%</b>"
)
plot_ly(
width = 900,
height = 700
) %>%
add_segments(
data = var_df,
x = 0, xend = ~Dim1,
y = 0, yend = ~Dim3,
line = list(color = "#2166AC", width = 2),
showlegend = FALSE,
hoverinfo = "skip"
) %>%
add_trace(
data = var_df,
x = ~Dim1,
y = ~Dim3,
text = ~hover_text,
type = "scatter",
mode = "markers",
marker = list(
size = 12,
color = "#2166AC",
opacity = 0.9,
line = list(width = 1.5, color = "#ffffff")
),
hovertemplate = '%{text}<extra></extra>',
name = "Variables",
showlegend = TRUE
) %>%
add_text(
data = var_df,
x = ~case_when(
Dim1 > 0 & Dim3 > 0 ~ Dim1 + 0.15,
Dim1 > 0 & Dim3 < 0 ~ Dim1 + 0.15,
Dim1 < 0 & Dim3 > 0 ~ Dim1 - 0.15,
Dim1 < 0 & Dim3 < 0 ~ Dim1 - 0.15,
TRUE ~ Dim1 + 0.08
),
y = ~case_when(
Dim1 > 0 & Dim3 > 0 ~ Dim3 + 0.10,
Dim1 > 0 & Dim3 < 0 ~ Dim3 - 0.10,
Dim1 < 0 & Dim3 > 0 ~ Dim3 + 0.10,
Dim1 < 0 & Dim3 < 0 ~ Dim3 - 0.10,
TRUE ~ Dim3 + 0.08
),
text = ~Variable,
textfont = list(
size = 12,
color = "#2166AC",
family = "Arial"
),
textposition = ~case_when(
Dim1 > 0 & Dim3 > 0 ~ "top right",
Dim1 > 0 & Dim3 < 0 ~ "bottom right",
Dim1 < 0 & Dim3 > 0 ~ "top left",
Dim1 < 0 & Dim3 < 0 ~ "bottom left",
TRUE ~ "top center"
),
hoverinfo = "skip",
showlegend = FALSE
) %>%
add_trace(
data = ind_df,
x = ~Dim1,
y = ~Dim3,
text = ~hover_text,
type = "scatter",
mode = "markers",
marker = list(
size = 8,
color = "#B2182B",
opacity = 0.7,
line = list(width = 0.8, color = "#ffffff")
),
hovertemplate = '%{text}<extra></extra>',
name = "Países",
showlegend = TRUE
) %>%
add_text(
data = ind_df,
x = ~Dim1,
y = ~Dim3,
text = ~Pais,
textfont = list(
size = 12,
color = "#B2182B",
family = "Arial"
),
textposition = "top center",
hoverinfo = "skip",
showlegend = FALSE
) %>%
layout(
title = list(
text = "<b style='color:#1a3a5c; font-size:18px;'>Biplot - Dimensión 1 vs Dimensión 3</b><br>
<span style='color:#666666; font-size:11px;'>Países y variables en el plano factorial</span>",
x = 0.5,
xanchor = 'center',
y = 0.96
),
xaxis = list(
title = list(text = paste0("<b>Dimensión 1 (", round(eig.val$variance.percent[1], 1), "%)"),
font = list(size = 14, color = "#1a3a5c")),
zeroline = TRUE,
zerolinecolor = "#999999",
zerolinewidth = 1.5,
gridcolor = "#e0e0e0",
showgrid = TRUE,
range = c(-max_abs, max_abs),
tickfont = list(color = "#1a3a5c", size = 10)
),
yaxis = list(
title = list(text = paste0("<b>Dimensión 3 (", round(eig.val$variance.percent[3], 1), "%)"),
font = list(size = 14, color = "#1a3a5c")),
zeroline = TRUE,
zerolinecolor = "#999999",
zerolinewidth = 1.5,
gridcolor = "#e0e0e0",
showgrid = TRUE,
range = c(-max_abs, max_abs),
tickfont = list(color = "#1a3a5c", size = 10)
),
hovermode = "closest",
plot_bgcolor = "white",
paper_bgcolor = "white",
font = list(family = "Arial, sans-serif", color = "#1a3a5c", size = 11),
margin = list(l = 65, r = 75, b = 50, t = 80),
hoverlabel = list(
bgcolor = "white",
bordercolor = "#1a3a5c",
font = list(color = "#1a3a5c", size = 10, family = "Arial")
),
legend = list(
bgcolor = "rgba(255,255,255,0.9)",
bordercolor = "#cccccc",
borderwidth = 0.5,
font = list(size = 10, color = "#1a3a5c"),
x = 0.02,
y = 0.98,
xanchor = "left",
yanchor = "top"
),
shapes = list(
list(type = "line", x0 = 0, x1 = 0, y0 = -max_abs, y1 = max_abs,
line = list(color = "#999999", width = 1, dash = "dot")),
list(type = "line", x0 = -max_abs, x1 = max_abs, y0 = 0, y1 = 0,
line = list(color = "#999999", width = 1, dash = "dot"))
),
annotations = list(
list(
x = 0.5,
y = -0.12,
xref = "paper",
yref = "paper",
text = "<span style='color:#666666; font-size:10px;'>Pasa el mouse sobre los puntos para ver coordenadas y contribuciones</span>",
showarrow = FALSE,
xanchor = "center",
align = "center"
)
)
) %>%
config(
responsive = TRUE,
displayModeBar = TRUE,
displaylogo = FALSE,
modeBarButtonsToRemove = list('lasso2d', 'select2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d'),
toImageButtonOptions = list(
format = "png",
filename = "biplot_pca_pc1_pc3",
width = 1200,
height = 800
)
)Argentina y Turquía se alinean con las flechas de Inflación, Tipo de Cambio, Deflactor del PIB y Crecimiento del PIB Nominal, lo que confirma su condición de países con alta inestabilidad monetaria. Aunque Argentina lidera este grupo con los valores más extremos en todas estas variables, mientras que Turquía presenta el mismo patrón, pero con menor intensidad. Ambos países se ubican en la parte inferior izquierda del gráfico, lo que indica que también comparten déficit comercial.
Chile, Perú y Colombia se ubican en la parte superior del gráfico, lo que indica que tienen superávit comercial. Además, se asocian con Crecimiento de Inversión, Crecimiento de Importaciones y Crecimiento del Consumo Privado, lo que refleja mayor inversión y un comercio exterior activo. Todo esto ocurre a pesar de que estos países mantienen ciertos niveles de inestabilidad monetaria, aunque moderados.
Estados Unidos, Alemania, Japón, Francia, Reino Unido y Corea tienden a alinearse más con PIB PPA, Importaciones de bienes y servicios y Exportaciones de bienes y servicios. Esto refleja su gran tamaño económico y su alto volumen de comercio exterior, aunque en la Dimensión 3 su posición externa es equilibrada (ni superávit ni déficit extremo).
Irlanda se ubica en la parte inferior derecha del gráfico porque tiene un fuerte déficit comercial. Sin embargo, a diferencia de Argentina y Turquía, Irlanda se encuentra en la zona de estabilidad monetaria. Esta combinación la hace atípica. Su déficit no se debe a problemas económicos reales. Este déficit no responde a problemas económicos estructurales, sino a una distorsión contable generada por la presencia de grandes multinacionales que registran en Irlanda operaciones que no corresponden a su actividad económica real (efecto “leprechaun”).
El gráfico de contribuciones permite identificar qué variables son más influyentes en la definición de cada dimensión principal. La línea vertical discontinua representa la contribución promedio esperada (6.67%), calculada como 100% dividido entre el número de variables (15). Aquellas variables que superan este umbral son las que realmente definen cada dimensión y, por tanto, las más relevantes para su interpretación.
library(plotly)
library(dplyr)
library(tidyr)
contrib_df <- data.frame(
Variable = rownames(res.var$contrib),
Dim1 = res.var$contrib[, 1],
Dim2 = res.var$contrib[, 2],
Dim3 = res.var$contrib[, 3],
stringsAsFactors = FALSE
)
contrib_promedio <- 100 / nrow(contrib_df)
contrib_long <- contrib_df %>%
pivot_longer(cols = c(Dim1, Dim2, Dim3),
names_to = "Dimension",
values_to = "Contribucion") %>%
mutate(
Dimension = factor(Dimension, levels = c("Dim1", "Dim2", "Dim3")),
Dimension_Label = case_when(
Dimension == "Dim1" ~ "Dim 1",
Dimension == "Dim2" ~ "Dim 2",
Dimension == "Dim3" ~ "Dim 3"
),
Dimension_Label = factor(Dimension_Label, levels = c("Dim 1", "Dim 2", "Dim 3")),
Variable = factor(Variable, levels = rev(contrib_df$Variable[order(contrib_df$Dim1, decreasing = TRUE)])),
Color = case_when(
Dimension == "Dim1" ~ "#B2182B",
Dimension == "Dim2" ~ "#2166AC",
Dimension == "Dim3" ~ "#66BB6A"
),
hover_text = paste0(
"<b>", Variable, "</b><br>",
"────────────────<br>",
"Dimensión: <b>", Dimension_Label, "</b><br>",
"Contribución: <b>", round(Contribucion, 1), "%</b><br>",
"────────────────<br>",
ifelse(Contribucion > contrib_promedio,
paste0("🔺 <span style='color:#2E7D32;'>Supera el promedio esperado (", round(contrib_promedio, 1), "%)</span>"),
paste0("🔻 <span style='color:#666666;'>Por debajo del promedio esperado (", round(contrib_promedio, 1), "%)</span>")
)
)
)
plot_ly(
data = contrib_long,
x = ~Contribucion,
y = ~Variable,
type = "bar",
orientation = "h",
color = ~Dimension_Label,
colors = c("Dim 1" = "#B2182B", "Dim 2" = "#2166AC", "Dim 3" = "#66BB6A"),
text = ~paste0(round(Contribucion, 1), "%"),
textposition = "outside",
textfont = list(size = 9),
hovertemplate = ~hover_text,
hoverinfo = "text",
width = 900,
height = 700
) %>%
layout(
title = list(
text = "<b>Contribución de las variables a las dimensiones</b><br>",
font = list(size = 16, color = "#1a3a5c"),
x = 0.55,
xanchor = "center"
),
xaxis = list(
title = list(text = "<b>Contribución (%)</b>", font = list(size = 13, color = "#1a3a5c")),
range = c(0, max(contrib_long$Contribucion) * 1.2),
zeroline = TRUE,
zerolinecolor = "#cccccc",
gridcolor = "#e8e8e8",
tickfont = list(size = 10, color = "#1a3a5c"),
showgrid = TRUE
),
yaxis = list(
title = "",
categoryorder = "array",
categoryarray = rev(levels(contrib_long$Variable)),
tickfont = list(size = 10, color = "#1a3a5c"),
gridcolor = "#f0f0f0"
),
barmode = "group",
bargap = 0.15,
bargroupgap = 0.1,
legend = list(
title = list(text = "<b>Dimensión</b>", font = list(size = 12)),
orientation = "h",
x = 0.5,
y = 1.02,
xanchor = "center",
yanchor = "bottom",
bgcolor = "rgba(255,255,255,0.9)",
bordercolor = "#cccccc",
borderwidth = 0.5,
font = list(size = 11, color = "#1a3a5c")
),
plot_bgcolor = "white",
paper_bgcolor = "white",
margin = list(l = 180, r = 100, b = 50, t = 90),
hoverlabel = list(
bgcolor = "white",
bordercolor = "#1a3a5c",
font = list(size = 11, family = "Arial")
),
shapes = list(
list(
type = "line",
x0 = contrib_promedio,
x1 = contrib_promedio,
y0 = -0.5,
y1 = length(unique(contrib_long$Variable)) - 0.5,
line = list(color = "black", width = 1.5, dash = "dash"),
opacity = 0.7
)
),
annotations = list(
list(
x = contrib_promedio + 1,
y = length(unique(contrib_long$Variable)) - 0.5,
text = paste0("Promedio esperado<br>", round(contrib_promedio, 1), "%"),
showarrow = FALSE,
font = list(size = 9, color = "black", face = "italic"),
xanchor = "left",
yanchor = "top"
)
)
) %>%
config(
responsive = TRUE,
displayModeBar = TRUE,
displaylogo = FALSE,
modeBarButtonsToRemove = list(
'lasso2d', 'select2d', 'zoomIn2d', 'zoomOut2d',
'autoScale2d', 'resetScale2d', 'toggleSpikelines'
),
toImageButtonOptions = list(
format = "png",
filename = "contribuciones_variables_pca",
width = 1200,
height = 800
)
)Luego de analizar las componentes obtenidas del ACP, se procedió a visualizar la clusterización por factores mediante el método Ward o jerárquico, de esta manera, para seleccionar el número óptimo de clústeres K se realizó el gráfico de la silueta.
coord_factores <- as.data.frame(get_pca_ind(res.pca)$coord[, 1:3])
colnames(coord_factores) <- c("PC1", "PC2", "PC3")
acp <- dudi.pca(datos_std, scannf = FALSE, nf = 3)
dist_matrix <- dist(acp$li)
hclust_result <- hclust(dist_matrix, method = "ward.D2")
p_sil_factores <- fviz_nbclust(
acp$li,
FUN = hcut,
method = "silhouette"
) +
labs(
title = "Número óptimo de clústeres — Factores ACP",
subtitle = "El k con mayor valor es el óptimo",
x = "Número de clústeres (k)",
y = "Ancho promedio de Silhouette"
) +
theme_minimal()
ggplotly(p_sil_factores)El gráfico, muestra que el mayor ancho promedio de silueta es de 0,657 aproximadamente, el cual se obtiene con un k = 3, lo que sugiere que los países analizados tienden a agruparse naturalmente en dos grandes grupos con características claramente diferenciadas, para visualiza el siguiente dendograma.
k_factores <- 3
plot(hclust_result,
main = "",
xlab = "",
sub = "",
ylab = "Índice de Ward",
cex = 0.75,
hang = -1)
title(
main = "Dendrograma con clústeres — Factores ACP",
cex.main = 2,
font.main = 2,
col.main = "#1a3a5c"
)
rect.hclust(hclust_result, k = k_factores, border = "#2471A3")Sin embargo, al realizar el dendograma con el K óptimo, se identifica una limitación importante ya que, de los 42 países de la muestra, un total de 39 se conformarían en un solo grupo, dejando a Argentina y a Turquía en un solo grupo y Estados Unidos como país con valores atípicos; lo cual, impide un buen análisis ya que no permite llegar a diferencias estructurales relevantes con respecto a las características entre económicas.
Con la finalidad de mejorar la calidad del análisis obtenido, se plantea expandir el número de clústeres a utilizar para poder obtener grupos más segmentados y con diferencias más significativas que concuerden, además, con los resultados obtenidos en el ACP. De esta manera se determinó un número óptimo de 7 clústeres ya que este segmenta de una mejor manera el grupo de 39 países que se obtuvo anteriormente facilitando una mejor interpretación de las características estructurales en los países.
k_factores <- 7
plot(hclust_result,
main = "",
xlab = "",
sub = "",
ylab = "Índice de Ward",
cex = 0.75,
hang = -1)
title(
main = "Dendrograma con clústeres — Factores ACP",
cex.main = 2,
font.main = 2,
col.main = "#1a3a5c"
)
rect.hclust(hclust_result, k = k_factores, border = "#2471A3")Como se visualiza, con el valor de clúteres elegidos de k=7, se evidencia una segmentación más pronunciada y notoria entre los países respecto a las 15 variables macroeconómicas seleccionadas. Se obtiene que el primer grupo cuenta con la presencia de 27 países; por su parte, un segundo grupo está conformado por 4 países, mientras que el tercer grupo incluyó un total de 7 economías. Por otro lado, cuatro países con características económicas únicas fueron clasificados de manera unitaria, estos casos corresponden a Irlanda, Turquía, Estados Unidos y Argentina, siendo estos cuatro países atípicos en el análisis.
Para una identificación idónea del perfil económico de cada grupo obtenido, se hizo el cálculo de las medias para cada una de las 15 variables económicas en los respectivos clústeres encontrados.
grupos_factores <- cutree(hclust_result, k = 7)
NuevaBase_factores <- data.frame(
Pais = rownames(datos_15),
Cluster = as.factor(grupos_factores),
datos_15
)
medias_factores <- NuevaBase_factores %>%
select(-Pais) %>%
group_by(Cluster) %>%
summarise(
`N° Países` = n(),
across(everything(), ~round(mean(.x, na.rm = TRUE), 3))
)
tabla_paises_cluster <- data.frame(
Pais = rownames(datos_15),
Cluster = as.factor(grupos_factores)
) %>% arrange(Cluster, Pais)
paises_por_cluster <- tabla_paises_cluster %>%
group_by(Cluster) %>%
summarise(Paises = paste(Pais, collapse = ", "))
medias_con_paises <- medias_factores %>%
left_join(paises_por_cluster, by = "Cluster") %>%
relocate(Paises, .after = `N° Países`)
datatable(
medias_con_paises,
caption = "Medias por clúster con países — Clusterización sobre factores ACP",
options = list(
pageLength = 10,
scrollX = TRUE,
autoWidth = TRUE,
columnDefs = list(
list(width = "300px", targets = 2), # columna Paises
list(className = "dt-nowrap", targets = "_all")
)
)
)Considerando la información de las medias, se le asignó a cada clúster las siguientes caracterizaciones:
Clúster 1 (25 Países) : Economías OECD Estables
Incluye: España, Italia, Grecia, Sudáfrica, Canadá, Australia, Dinamarca, Suecia, Finlandia, Polonia, Hungría, Croacia, Eslovenia, entre otros.
Este clúster está conformado por gran parte de los países con economías desarrolladas de la muestra, donde no hay presencia de valores extremos. La combinación de una inflación moderada y tasas de interés muy bajas muestra que las economías se encuentran estables, ya que los precios no están aumentando de forma preocupante y no se requieren políticas monetarias fuertes para controlarlos. Además, son países que presentan un crecimiento del PIB real moderado sin ser explosivo. Por su parte, las exportaciones netas casi en cero sugieren que no existe una fuerte dependencia de superávits comerciales para sostener su crecimiento económico, el cual se apoya en gran medida en la demanda interna.
Clúster 2 (4 países): Economías Emergentes Dinámicas
Incluye:India, Perú, Chile y Colombia
Este grupo, está integrado por cuatro economías emergentes de la muestra, el cual se caracteriza por tener los valores más altos en variables de crecimiento con respecto a los demás grupos, como lo son el PIB real, la inversión y el consumo privado lo que evidencia un dinamismo de la actividad económica en estos países. No obstante, este crecimiento está acompañado de una alta inflación, casi el doble de la observada en el clúster 1, así como valores más altos en el tipo de cambio.
Lo anterior, señala que el crecimiento económico está acompañado por un aumento considerable en los precios y un debilitamiento de la moneda con respecto a las economías estables.
Por su parte, la tasa de interés alta señala que los bancos de reserva están actuando de manera proactiva a la inflación, a diferencia del clúster 1 donde esto no hacía falta. Por lo tanto, los países que conforman el grupo 2 están experimentando una etapa de crecimiento acelerado y así mismo, desafíos en el control de la inflación y a las amenazas para las economías emergentes.
Clúster 3 (9 países): Economías exportadoras de alto desarrollo
Incluye: Reino Unido, Corea del Sur, Países Bajos, Suiza, Alemania, Japón, Francia, Brasil y México.
Los países de este grupo muestran economías más desarrolladas que dominan el comercio exterior entre toda la muestra, presentando los valores de exportaciones e importaciones promedio más altos entre los 7 clústeres, así mismo, los datos sugieren que los países que lo componen presentan presentan estabilidad monetaria, con inflación y tasas de interés bajas que no generan presión sobre los precios, lo que sugiere que una parte importante de su dinamismo económico está vinculada al comercio exterior. En relación con el desempleo, presenta el valor más bajo con respecto a los demás grupos, lo que sugiere que son países que presentan organizaciones laborales eficientes.
En contraste, los datos obtenidos en las medias no sugieren un alto crecimiento en este grupo, lo que pone de manifiesto que, aunque son economías grandes y estables no están presentando una expansión acelerada.
Un resultado relevante en este grupo es la inclusión de México y Brasil, dos economías clasificadas tradicionalmente como emergentes. Su presencia en este clúster evidencia que, en términos de escala comercial y productiva, estas economías latinoamericanas comparten características estructurales con las grandes potencias industriales, superando la distinción convencional entre países desarrollados y emergentes.
Grupos Atípicos
De los 42 países analizados 4 de ellos, Irlanda, Turquía, Estados Unidos y Argentina fueron identificados como casos atípicos dada la presencia de valores extremos en variables importantes, sugiriendo situaciones económicas particulares que los distingue del conjunto de países de la muestra.
Argentina, presenta la inflación más alta de la muestra con una media del 54.15% y un deflactor del PIB de 67.15%, lo que evidencia una profunda crisis económica en el país. Por su parte Turquía, presenta una combinación entre una alta inflación de 28.9% y tasas de interés de corto plazo de 18.71%, lo que la aleja del comportamiento típico de las economías emergentes.
Por otro lado, Irlanda presenta el mayor crecimiento del PIB real de la muestra de 13.43 y al mismo tiempo un bajo nivel de inversiones del 7.38 lo que pone en evidencia la paradoja económica que presenta este país desde hace algunos años. Por último, Estados Unidos presenta la media en la variable PIB PPA más alta de la muestra con un valor de 20.5, valor que no presenta ninguna de las economías desarrolladas de la muestra, lo que impide su clasificación dentro de cualquier clúster.
Clúster 4 (Irlanda): Economía con distorsión contable de por las multinacionales
Este país presenta un alto crecimiento del PIB real, pero al mismo tiempo una notoria caída en inversiones, estas situaciones en cualquier otra economía serían contradictorias, pero en Irlanda responden a flujos contables tributarios más que a actividad económica real, esto es explicado por el fenómeno conocido como Leprechaun Economics el cual se refiere a una “distorsión contable generada por la contabilización de activos intangibles de multinacionales tecnológicas con sede en su territorio” (CSO Ireland, 2016). En respuesta a lo anterior, el país cuenta con un valor alto en exportaciones de bienes y servicios para ser una economía pequeña.
Clúster 5 (Turquía): Economía en Inestabilidad Monetaria
Los datos correspondientes a este país, sugieren una alta tasa de interés, ocasionado por las medidas implementadas para contener la inflación, que a su vez ha generado una fuerte depreciación de la lira turca, así mismo, presenta una alta inflación y un alto crecimiento nominal esto debido más al aumento de los precios que a un incremento en la actividad productiva. Sin embargo, a pesar de este contexto de inestabilidad, el crecimiento del PIB real del 11.35% sugiere que la economía turca mantiene una capacidad productiva real considerable, lo que demuestra que la crisis es principalmente monetaria y no de capacidad productiva.
Clúster 6(Estados Unidos): Economía madura y estable
Estados Unidos es reconocida por poseer una economía fuerte, caracterizada por valores bajos de inflación, un crecimiento del PIB real moderado pero sostenido y una baja tasa de desempleo que reflejan una economía madura y estable. Aunque presenta un déficit comercial importante, este se explica principalmente por una demanda interna muy fuerte, al ser el país con un mayor PIB PPA, este déficit refleja precisamente sus fortalezas como país ya que, los consumidores cuentan con mayores ingresos para comprar más productos en el extranjero generando una alta demanda de importaciones. Esto es sostenible gracias a su condición de emisor de la moneda de reserva mundial, lo que le permite financiar esta situación sin sufrir los impactos que esta tendría en otra economía de la muestra. Demostrando sus fortalezas y su posición como una de las principales economías y motores del comercio mundial.
Clúster 7(Argentina):Economía emergente de alta inflación
Este país se caracteriza por tener los niveles más altos de inflación y de crecimiento nominal del PIB, adicionalmente, cuenta con una fuerte variación en el tipo de cambio y un elevado deflactor del PIB. Si bien esto muestra un importante crecimiento de la inversión y de las importaciones, estos resultados se desarrollan en un contexto de fuerte inestabilidad. Según los economistas ortodoxos la razón de fondo es sencilla “el país sistemáticamente gasta más de lo que debería” (Smink, 2021)
A diferencia de las economías OECD, que suelen presentar estabilidad en precios, tasas de interés moderadas y crecimiento sostenido, Argentina refleja una economía inestable, donde el crecimiento nominal está fuertemente influenciado por las presiones de la inflación. Adicionalmente, su nivel de desempleo sigue siendo relativamente alto si se compara con los países más avanzados.
Tal comportamiento es propio de una economía emergente que mantiene actividad económica y capacidad de crecimiento, pero que enfrenta importantes retos en materia de estabilidad de precios, de valor de la moneda, y de sostenibilidad de su crecimiento en el largo plazo.
Por último, se presenta el plano ACP conformado por PC1 y PC2 por ser las dimensiones con mayor capacidad explicativa, que corresponden a la inestabilidad monetaria y al tamaño económico respectivamente, dimensiones que determinan principalmente la separación entre los clústeres identificados.
coordenadas_plot <- as.data.frame(acp$li[, 1:2])
colnames(coordenadas_plot) <- c("PC1", "PC2")
coordenadas_plot$Pais <- rownames(coordenadas_plot)
coordenadas_plot$Cluster <- as.factor(grupos_factores)
etiquetas_cluster <- c(
"1" = "Economías OECD Estables",
"2" = "Economías Emergentes Dinámicas",
"3" = "Economías Exportadoras de Alto Desarrollo",
"4" = "Distorsión Contable (Irlanda)",
"5" = "Inestabilidad Monetaria (Turquía)",
"6" = "Economía Madura (EE.UU.)",
"7" = "Alta Inflación (Argentina)"
)
coordenadas_plot$Grupo <- etiquetas_cluster[as.character(coordenadas_plot$Cluster)]
p <- ggplot(coordenadas_plot, aes(x = PC1, y = PC2, color = Grupo, label = Pais)) +
geom_point(size = 3) +
geom_text(size = 2.8, vjust = -0.8, hjust = 0.5) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray60") +
geom_vline(xintercept = 0, linetype = "dashed", color = "gray60") +
scale_color_manual(values = c(
"Economías OECD Estables" = "#FF69B4",
"Economías Emergentes Dinámicas" = "#2ecc71",
"Economías Exportadoras de Alto Desarrollo" = "#1a3a5c",
"Distorsión Contable (Irlanda)" = "#e67e22",
"Inestabilidad Monetaria (Turquía)" = "#9b59b6",
"Economía Madura (EE.UU.)" = "#e74c3c",
"Alta Inflación (Argentina)" = "#f0a500"
)) +
labs(
title = "Países en el plano ACP coloreados por clúster",
subtitle = paste0("PC1 (32.6%) vs PC2 (23.2%)"),
x = "PC1 — Inestabilidad Monetaria (32.6%)",
y = "PC2 — Tamaño Económico (23.2%)",
color = ""
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", color = "#1a3a5c", size = 12, hjust = 0.5),
plot.subtitle = element_text(size = 9, color = "#555555", hjust = 0.5),
legend.position = "bottom",
legend.text = element_text(size = 8)
) +
guides(color = guide_legend(nrow = 3))
ggplotly(p)El plano ACP sustenta los resultados obtenidos en la clusterización. En el eje horizontal (PC1 — Inestabilidad Monetaria) se observa a Argentina en el extremo izquierdo, alejada completamente de todos los países, reflejando su crisis inflacionaria sin comparación en la muestra. Turquía e Irlanda se posicionan en el centro del plano al mismo tiempo que se distancian notablemente del grupo principal por sus situaciones económicas particulares
En el eje vertical (PC2 — Tamaño Económico), Estados Unidos se ubica en el extremo superior, mostrando que su tamaño económico no se acerca ni mínimamente a las demás economías. Por su parte, México y Brasil se ubican visualmente cercanos al grupo de economías exportadoras de alto desarrollo como Alemania, Japón, Francia lo que respalda gráficamente su clasificación en el Clúster 3. Finalmente, el grupo grande de economías OCDE sustenta su homogeneidad económica al concentrarse en la parte derecha del plano.
El análisis de aprendizaje no supervisado permitió evidenciar que las características que separan los países no coinciden simplemente con la clasificación tradicional entre economías desarrolladas y emergentes. Los datos sugieren que la inestabilidad monetaria y el tamaño económico son las dimensiones que más determinan las diferencias estructurales entre las 42 economías analizadas, por encima de cualquier etiqueta convencional.
Por su parte, es importante destacar la clasificación mediante los clústeres de México y Brasil dentro del grupo de grandes economías exportadoras como Alemania, Japón y Francia. Esto demuestra que el comportamiento de los datos contradice los estereotipos entre economías desarrollados y emergentes, ya que en este caso, dos economías latinoamericanas comparten más características estructurales con las potencias industriales del mundo que con el resto de economías emergentes de la muestra.
Del mismo modo, los cuatro países identificados como países atípicos, muestran que realmente existen situaciones económicas tan particulares que no se logran adherir a ninguna clasificación, esto debido a que cada uno representa una situación estructural única: crisis inflacionaria, inestabilidad monetaria, distorsión contable y supremacía económica, respectivamente. En conclusión, la aplicación conjunta del ACP y la clusterización jerárquica demostró ser una herramienta más precisa y objetiva para comparar economías que las clasificaciones tradicionales. Los grupos que resultan de los datos reflejan similitudes y diferencias reales que de otro modo permanecerían ocultas, ofreciendo una visión más precisa y detallada del desarrollo económico comparado.
Como recomendación, se plantea incorporar variables institucionales y ampliar el período de análisis, con el fin de evaluar si los patrones identificados responden a condiciones estructurales permanentes o a situaciones coyunturales especiales.
Burke-Kennedy, E. (2017, febrero 3). CSO to remove ‘leprechaun’ from economic statistics. Irish Times. https://www.irishtimes.com/business/economy/cso-to-remove-leprechaun-from-economic-statistics-1.2962243
Por qué Estados Unidos sigue siendo más rico que cualquier otro gran país. (2017, abril 20). Harvard Business Review. https://hbr.org/2017/04/why-the-u-s-is-still-richer-than-every-other-large-country
Smink, V. (2021, noviembre 12). Por qué Argentina tiene una inflación anual que supera el 50% (casi cinco veces la de Brasil y más de ocho veces la de México). BBC. https://www.bbc.com/mundo/noticias-america-latina-59239933
Yilmazkuday, H. (2022). Drivers of Turkish inflation. The Quarterly Review of Economics and Finance: Journal of the Midwest Economics Association, 84, 315–323. https://doi.org/10.1016/j.qref.2022.03.005
(S/f). Oup.com. Recuperado el 13 de junio de 2026, de https://academic.oup.com/economicpolicy/article/38/115/519/7238216#438992729