## Warning: package 'readxl' was built under R version 4.4.3
En cuanto a las importaciones observamos lo que ya habiamos comentado anteriormente, que todos estaban al alza al unirse y que una vez se unieron sus importaciones incrementaron. Pero aqui es donde notamos que no todos tienen el mismo comportamiento, algunos tienen comportamientos similares mientas que un comportamiento como el de Grecia no se asemeja a primera vista a los otros.
library(dplyr)
library(tidyr)
library(reshape2)
library(ggplot2)
graficar_correlacion_valores <- function(data) {
# Asegurar que OBS_VALUE es numérico
data$OBS_VALUE <- as.numeric(data$OBS_VALUE)
# Paso 1: agrupar por año y país y calcular la media
summary_data <- data %>%
group_by(TIME_PERIOD, geo) %>%
summarise(OBS_VALUE = mean(OBS_VALUE, na.rm = TRUE), .groups = "drop")
# Paso 2: pivot_wider (años como filas, países como columnas)
data_wide <- summary_data %>%
pivot_wider(names_from = geo, values_from = OBS_VALUE)
# Paso 3: convertir columnas (excepto la de tiempo) a numérico
data_wide[ , -1] <- lapply(data_wide[ , -1], as.numeric)
# Paso 4: matriz de correlación
cor_matrix <- cor(data_wide[ , -1], use = "pairwise.complete.obs")
# Paso 5: derretir para graficar
melted_cor <- melt(cor_matrix)
# Paso 6: gráfico de correlación
ggplot(melted_cor, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0.5, limit = c(0, 1), space = "Lab",
name = "Correlación") +
labs(title = "Correlación de exportaciones entre países",
x = "País", y = "País") +
coord_fixed() +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 60, hjust = 1, size = 9),
axis.text.y = element_text(size = 9),
plot.title = element_text(size = 14, face = "bold"),
legend.title = element_text(size = 10),
legend.text = element_text(size = 9),
plot.margin = margin(10, 10, 10, 10)
)
}
IE3_exp <- IE3 %>% filter(na_item == "Exports of goods and services")
IE3_imp <- IE3 %>% filter(na_item == "Imports of goods and services")
graficar_correlacion_valores(IE3_exp)
graficar_correlacion_valores(IE3_imp)
Obtenemos la primer matriz de correlación que nos indica que todos los paises tienen correlación positiva, a primera vista podemos decir que todos los países han tenido una tendencia al alza. Pero ahora mismo no es lo que buscamos, ya que queremos un análisis temporal, nos interesa estudiar la variación porcentual para ver que países han tenido un crecimiento similar en los años.
¿Por qué usamos la variación porcentual?
Usamos la variación porcentual porque:
-Elimina el efecto del tamaño del país (no comparamos España con Alemania por su PIB, sino por su ritmo de cambio). -Reduce la influencia de la tendencia global (casi todos los países exportan más con el tiempo). -Nos permite detectar patrones similares de comportamiento: países que crecen, bajan o se recuperan al mismo tiempo
k=4
# Paso 1: calcular delta (variación porcentual)
IEimp_deltas <- IE3_imp %>%
group_by(geo) %>%
arrange(TIME_PERIOD) %>%
mutate(delta_export = (OBS_VALUE - lag(OBS_VALUE)) / lag(OBS_VALUE)) %>%
ungroup() %>%
filter(!is.na(delta_export))
# Paso 2: resolver duplicados
IEimp_deltas_summary <- IEimp_deltas %>%
group_by(TIME_PERIOD, geo) %>%
summarise(delta_export = mean(delta_export, na.rm = TRUE), .groups = "drop")
# Paso 3: convertir a formato ancho
IEimp_deltas_wide <- IEimp_deltas_summary %>%
pivot_wider(names_from = geo, values_from = delta_export)
# Paso 4: columnas numéricas
IEimp_deltas_wide[ , -1] <- lapply(IEimp_deltas_wide[ , -1], as.numeric)
# Paso 5: matriz de correlación
cor_matrixIMP <- cor(IEimp_deltas_wide[ , -1], use = "pairwise.complete.obs")
# Paso 6: heatmap
melted_corIMP <- melt(cor_matrixIMP)
p_heatmapIMP <- ggplot(melted_corIMP, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1, 1), space = "Lab",
name = "Correlación Δ%") +
labs(title = "Correlación de variaciones de importaciones entre países",
x = "País", y = "País") +
coord_fixed() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p_heatmapIMP)
# Paso 1: calcular delta (variación porcentual)
IEexp_deltas <- IE3_exp %>%
group_by(geo) %>%
arrange(TIME_PERIOD) %>%
mutate(delta_export = (OBS_VALUE - lag(OBS_VALUE)) / lag(OBS_VALUE)) %>%
ungroup() %>%
filter(!is.na(delta_export))
# Paso 2: resolver duplicados
IEexp_deltas_summary <- IEexp_deltas %>%
group_by(TIME_PERIOD, geo) %>%
summarise(delta_export = mean(delta_export, na.rm = TRUE), .groups = "drop")
# Paso 3: convertir a formato ancho
IEexp_deltas_wide <- IEexp_deltas_summary %>%
pivot_wider(names_from = geo, values_from = delta_export)
# Paso 4: columnas numéricas
IEexp_deltas_wide[ , -1] <- lapply(IEexp_deltas_wide[ , -1], as.numeric)
# Paso 5: matriz de correlación
cor_matrixEXP <- cor(IEexp_deltas_wide[ , -1], use = "pairwise.complete.obs")
# Paso 6: heatmap
melted_corEXP <- melt(cor_matrixEXP)
p_heatmapEXP <- ggplot(melted_corEXP, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1, 1), space = "Lab",
name = "Correlación Δ%") +
labs(title = "Correlación de variaciones de exportaciones entre países",
x = "País", y = "País") +
coord_fixed() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p_heatmapEXP)
Ahora si comparamos las matrices esta nos aporta mas información ya que detectamos que países tienen un comportamiento diferente al resto. Para una mejor identificacion nos interesa hacer tecnicas de clustering en donde se van agrupando los países que tienen menos diferencias entre ellos.
library(cluster) # para silhouette y pam
library(factoextra) # para fviz_nbclust
library(ggsci) # para pal_npg()
# Asegúrate de tener delta_matrix limpio (como en pasos anteriores)
# 1. Eliminar años con demasiados NAs y países incompletos
IEexp_deltas_wide <- IEexp_deltas_wide[, colMeans(is.na(IEexp_deltas_wide)) <= 0.5]
IEexp_deltas_wide <- IEexp_deltas_wide[complete.cases(IEexp_deltas_wide), ]
# 2. Escalar
delta_scaled <- scale(IEexp_deltas_wide)
# 3. Distancia euclidiana para silhouette
midist <- dist(delta_scaled, method = "euclidean")
# 4. Clustering WARD
hc <- hclust(midist, method = "ward.D2")
grupos1 <- cutree(hc, k = 4)
# 5. Clustering K-means
set.seed(123)
clust3 <- kmeans(delta_scaled, centers = 4, nstart = 25)
# 6. Clustering K-medoides (PAM)
clust4 <- pam(delta_scaled, k = 4)
# 7. Colores
colores <- pal_npg("nrc")(6)
colores2 <- pal_npg("nrc")(7)
# 8. Graficar siluetas
par(mfrow = c(1, 3))
plot(silhouette(grupos1, midist), col = colores, border = NA, main = "WARD")
plot(silhouette(clust3$cluster, midist), col = colores, border = NA, main = "K-MEANS")
plot(silhouette(clust4$clustering, midist), col = colores2, border = NA, main = "K-MEDOIDS")
Con las tecnicas validadas, utilizaremos en este caso el metodo de k-medias con k=4.
# Paso 7: clustering jerárquico con 1 - correlación como distancia
dist_matrixIMP <- as.dist(1 - cor_matrixIMP)
hcIMP <- hclust(dist_matrixIMP, method = "ward.D2")
# Paso 8: dendrograma
plot(hcIMP, main = paste("Dendrograma de países por Δ% Importacion", "(k =", k, ")"), cex = 0.8)
rect.hclust(hcIMP, k = k, border = 2:(k + 1))
# Paso 9: asignar países a clústeres
clustersIMP <- cutree(hcIMP, k = k)
cluster_dfIMP <- data.frame(Pais = names(clustersIMP), Cluster = clustersIMP)
# El resultado queda en la variable cluster_df
#cluster_dfIMP
# Paso 7: clustering jerárquico con 1 - correlación como distancia
dist_matrixEXP <- as.dist(1 - cor_matrixEXP)
hcEXP <- hclust(dist_matrixEXP, method = "ward.D2")
# Paso 8: dendrograma
plot(hcEXP, main = paste("Dendrograma de países por Δ% Exportacion", "(k =", k, ")"), cex = 0.8)
rect.hclust(hcEXP, k = k, border = 2:(k + 1))
# Paso 9: asignar países a clústeres
clustersEXP <- cutree(hcEXP, k = k)
cluster_dfEXP <- data.frame(Pais = names(clustersEXP), Cluster = clustersEXP)
# El resultado queda en la variable cluster_df
#cluster_dfEXP