Las relaciones comerciales que México mantiene con Estados Unidos y China tienen un impacto directo en el comportamiento de sus exportaciones e importaciones de cobre, posicionando a este metal como un recurso estratégico para la economía nacional.
Analizar la relación entre las exportaciones e importaciones de cobre en México y sus principales socios comerciales, para entender su relevancia en el desarrollo económico y comercial del país.
¿En qué medida la sensibilidad al precio del cobre, estimada a través de elasticidades por país, puede utilizarse como criterio para priorizar destinos estratégicos en la política comercial de exportaciones mexicanas?
cargar_paquete <- function(paquete) {
if (!require(paquete, character.only = TRUE)) {
install.packages(paquete)
library(paquete, character.only = TRUE)
}
}
paquetes <- c(
"RColorBrewer", "broom", "countrycode", "dplyr", "geosphere",
"ggplot2", "ggraph", "ggrepel", "htmlwidgets", "janitor",
"networkD3", "plm", "purrr", "readr", "scales", "sf",
"stringi", "stringr", "tidygraph", "tidyverse", "viridis"
)
invisible(lapply(paquetes, cargar_paquete))
Se muestran los flujos acumulados de comercio internacional de cobre entre los estados mexicanos y sus socios globales durante el periodo 2007–2024.
Fuente: Data México. Producto: Minerales de Cobre y sus Concentrados (Código 2603, Sistema Armonizado 2012, 4 dígitos).
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/map.csv") %>%
clean_names() %>%
filter(hs4_4_digit_id == 52603)
traducciones_paises <- c(
"Argentina" = "Argentina", "Australia" = "Australia", "Austria" = "Austria",
"Belgium" = "Bélgica", "Bulgaria" = "Bulgaria", "Bolivia" = "Bolivia",
"Brazil" = "Brasil", "Canada" = "Canadá", "Switzerland" = "Suiza",
"Chile" = "Chile", "China" = "China", "Republic of the Congo" = "República del Congo",
"Colombia" = "Colombia", "Germany" = "Alemania", "Ecuador" = "Ecuador",
"Spain" = "España", "France" = "Francia", "United Kingdom" = "Reino Unido",
"Hong Kong" = "Hong Kong", "Indonesia" = "Indonesia", "India" = "India",
"Italy" = "Italia", "Japan" = "Japón", "Kazakhstan" = "Kazajistán",
"Cambodia" = "Camboya", "South Korea" = "Corea del Sur", "Luxembourg" = "Luxemburgo",
"Morocco" = "Marruecos", "Macedonia" = "Macedonia", "Malaysia" = "Malasia",
"Netherlands" = "Países Bajos", "Panama" = "Panamá", "Peru" = "Perú",
"Philippines" = "Filipinas", "Poland" = "Polonia", "Russia" = "Rusia",
"Saudi Arabia" = "Arabia Saudita", "Singapore" = "Singapur", "Sweden" = "Suecia",
"Eswatini" = "Esuatini", "Thailand" = "Tailandia", "Tunisia" = "Túnez",
"Taiwan (Republic of China)" = "Taiwán", "Tanzania" = "Tanzania",
"Uruguay" = "Uruguay", "United States" = "Estados Unidos",
"Vietnam" = "Vietnam", "South Africa" = "Sudáfrica", "Zambia" = "Zambia"
)
traducciones_flujo <- c("Exports" = "Exportaciones", "Imports" = "Importaciones")
edges <- data %>%
group_by(state, country, flow) %>%
summarise(peso = sum(trade_value), .groups = "drop") %>%
rename(from = state, to = country) %>%
mutate(
to = recode(to, !!!traducciones_paises),
flujo = recode(flow, !!!traducciones_flujo)
) %>%
select(from, to, peso, flujo)
nodos <- tibble(nombre = unique(c(edges$from, edges$to))) %>%
mutate(
tipo = if_else(nombre %in% unique(data$state), "Estado", "País"),
color = case_when(tipo == "Estado" ~ "#2C3E50", tipo == "País" ~ "#E67E22")
)
grafo <- tbl_graph(nodes = nodos, edges = edges, directed = TRUE) %>%
mutate(grado = centrality_degree(mode = "all"))
ggraph(grafo, layout = "circle") +
geom_edge_arc(aes(width = peso, color = flujo),
arrow = arrow(length = unit(3, "mm")),
end_cap = circle(3, "mm"), alpha = 0.6) +
geom_node_point(aes(size = grado, color = tipo), show.legend = FALSE) +
geom_node_text(aes(label = nombre), repel = TRUE, size = 3) +
scale_edge_width(range = c(0.2, 1.5), name = "Valor del comercio") +
scale_edge_color_manual(
values = c("Exportaciones" = "#E74C3C", "Importaciones" = "#3498DB"),
name = "Flujo"
) +
scale_size(range = c(2, 7), name = "Grado del nodo") +
scale_color_manual(
values = c("Estado" = "#2C3E50", "País" = "#E67E22"),
name = "Tipo de nodo"
) +
theme_void() +
labs(
title = "Red circular del comercio de cobre entre Estados y Países",
subtitle = "Nodos por grado, flechas por flujo, colores por tipo"
)
El mapa muestra cómo se distribuyeron las exportaciones mexicanas de cobre entre los estados durante 2024. Los datos reflejan una concentración territorial muy marcada:
Fuente: Data México. Producto: Minerales de Cobre y sus Concentrados (Código 2603, Sistema Armonizado 2012, 4 dígitos).
mexico <- st_read("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/entidades", quiet = TRUE) %>%
st_simplify(dTolerance = 5000) %>%
st_make_valid()
Mex <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/mex.csv") %>%
clean_names()
mexico_export <- mexico %>%
left_join(Mex, by = c("NOMGEO" = "state"))
ggplot(mexico_export) +
geom_sf(aes(fill = !is.na(trade_value)), color = "white", size = 0.3) +
geom_sf_text(
data = subset(mexico_export, !is.na(trade_value)),
aes(label = paste0(NOMGEO, "\nUSD ", format(round(trade_value / 1e6, 1), nsmall = 1), " M")),
size = 3.2, color = "black", lineheight = 1
) +
scale_fill_manual(
values = c("TRUE" = "#238b45", "FALSE" = "#e0e0e0"),
labels = c("TRUE" = "Exportó", "FALSE" = "No exportó")
) +
labs(
title = "Exportaciones estatales de México en 2024",
subtitle = "Estados que reportaron exportaciones de cobre (valores en millones USD)",
fill = "",
caption = "Fuente: Data México. Producto: Minerales de Cobre y sus Concentrados"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 13, margin = margin(b = 10), hjust = 0.5),
legend.position = "bottom",
legend.text = element_text(size = 11),
plot.caption = element_text(size = 9, hjust = 1),
panel.grid = element_blank()
)
total_export <- sum(mexico_export$trade_value, na.rm = TRUE)
export_porcentajes <- mexico_export %>%
st_drop_geometry() %>%
filter(!is.na(trade_value)) %>%
mutate(
export_millones = round(trade_value / 1e6, 1),
porcentaje = round(100 * trade_value / total_export, 2)
) %>%
select(NOMGEO, export_millones, porcentaje) %>%
arrange(desc(porcentaje))
print(export_porcentajes)
## NOMGEO export_millones porcentaje
## 1 Sonora 3146.9 96.07
## 2 Coahuila de Zaragoza 121.0 3.70
## 3 San Luis Potosí 7.8 0.24
En 2024, China fue el principal destino de las exportaciones mexicanas de cobre, mientras que una parte significativa de las importaciones provino de Estados Unidos. Este patrón refleja una dinámica triangular: México compra cobre a EE.UU. y lo exporta principalmente a China.
Fuente: UN Comtrade (United Nations Commodity Trade Statistics Database). Producto: Minerales de Cobre y sus Concentrados (Código 2603, Sistema Armonizado 2012, 4 dígitos).
traducciones_paises <- c(
"Argentina" = "Argentina", "Australia" = "Australia", "Austria" = "Austria",
"Belgium" = "Bélgica", "Bulgaria" = "Bulgaria", "Bolivia" = "Bolivia",
"Brazil" = "Brasil", "Canada" = "Canadá", "Switzerland" = "Suiza",
"Chile" = "Chile", "China" = "China", "Republic of the Congo" = "República del Congo",
"Colombia" = "Colombia", "Germany" = "Alemania", "Ecuador" = "Ecuador",
"Spain" = "España", "France" = "Francia", "United Kingdom" = "Reino Unido",
"Hong Kong" = "Hong Kong", "Indonesia" = "Indonesia", "India" = "India",
"Italy" = "Italia", "Japan" = "Japón", "Kazakhstan" = "Kazajistán",
"Cambodia" = "Camboya", "South Korea" = "Corea del Sur", "Luxembourg" = "Luxemburgo",
"Morocco" = "Marruecos", "Macedonia" = "Macedonia", "Malaysia" = "Malasia",
"Netherlands" = "Países Bajos", "Panama" = "Panamá", "Peru" = "Perú",
"Philippines" = "Filipinas", "Poland" = "Polonia", "Russia" = "Rusia",
"Saudi Arabia" = "Arabia Saudita", "Singapore" = "Singapur", "Sweden" = "Suecia",
"Eswatini" = "Esuatini", "Thailand" = "Tailandia", "Tunisia" = "Túnez",
"Taiwan (Republic of China)" = "Taiwán", "Tanzania" = "Tanzania",
"Uruguay" = "Uruguay", "United States" = "Estados Unidos",
"Vietnam" = "Vietnam", "South Africa" = "Sudáfrica", "Zambia" = "Zambia",
"T\xfcrkiye" = "Turquía", "Turkiye" = "Turquía"
)
traducciones_flujo <- c("Export" = "Exportaciones", "Import" = "Importaciones")
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv", show_col_types = FALSE) %>%
clean_names()
edges <- data %>%
filter(
ref_year == 2024,
(reporter_desc == "Mexico" | partner_desc == "Mexico"),
reporter_desc != "World",
partner_desc != "World",
primary_value > 0
) %>%
group_by(reporter_desc, partner_desc, flow_desc) %>%
summarise(peso = sum(primary_value, na.rm = TRUE), .groups = "drop") %>%
rename(from = reporter_desc, to = partner_desc, flujo_orig = flow_desc) %>%
mutate(
from = recode(from, "Mexico" = "México", !!!traducciones_paises),
to = recode(to, "Mexico" = "México", !!!traducciones_paises),
flujo = recode(flujo_orig, !!!traducciones_flujo)
) %>%
select(from, to, peso, flujo)
nodos <- tibble(nombre = unique(c(edges$from, edges$to))) %>%
mutate(color = if_else(nombre == "Turquía", "#000000", "#2C3E50"))
grafo <- tbl_graph(nodes = nodos, edges = edges, directed = TRUE) %>%
mutate(grado = centrality_degree(mode = "all"))
ggraph(grafo, layout = "circle") +
geom_edge_arc(aes(width = peso, color = flujo),
arrow = arrow(length = unit(3, "mm")),
end_cap = circle(3, "mm"), alpha = 0.6) +
geom_node_point(aes(size = grado, colour = color), show.legend = FALSE) +
geom_node_text(aes(label = nombre), repel = TRUE, size = 2.8) +
scale_edge_width(range = c(0.2, 1.5), name = "Valor del comercio") +
scale_edge_color_manual(
values = c("Exportaciones" = "#00796B", "Importaciones" = "#E64A19"),
name = "Flujo"
) +
scale_size(range = c(2, 7), name = "Grado del nodo") +
scale_colour_identity() +
theme_void() +
labs(
title = "Red de comercio de cobre de México (2024)",
subtitle = "Exportaciones e importaciones entre México y sus socios"
)
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
exportaciones_mex <- data %>%
filter(ref_year == 2024, flow_desc == "Export", reporter_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(partner_desc), partner_desc != "World") %>%
select(destino = partner_desc, valor_total = primary_value)
importaciones_desde_mex <- data %>%
filter(ref_year == 2024, flow_desc == "Import", partner_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(reporter_desc), reporter_desc != "World") %>%
select(destino = reporter_desc, valor_total = primary_value)
paises_ya_reportados <- unique(exportaciones_mex$destino)
importaciones_filtradas <- importaciones_desde_mex %>%
filter(!(destino %in% paises_ya_reportados))
exportaciones_corregidas <- bind_rows(exportaciones_mex, importaciones_filtradas) %>%
group_by(destino) %>%
summarise(valor_total = sum(valor_total, na.rm = TRUE), .groups = "drop")
total_exportado <- sum(exportaciones_corregidas$valor_total, na.rm = TRUE)
exportaciones_corregidas <- exportaciones_corregidas %>%
mutate(
destino = case_when(
destino == "Germany" ~ "Alemania", destino == "Spain" ~ "España",
destino == "Canada" ~ "Canadá", destino == "Philippines" ~ "Filipinas",
destino == "Rep. of Korea" ~ "Corea del Sur", destino == "Japan" ~ "Japón",
destino == "Malaysia" ~ "Malasia", destino == "Netherlands" ~ "Países Bajos",
destino == "T\xfcrkiye" ~ "Turquía", TRUE ~ destino
),
porcentaje = valor_total / total_exportado * 100,
destino_etiqueta = paste0(destino, " (", ifelse(porcentaje < 0.1, "<0.1", sprintf("%.1f", porcentaje)), "%)"),
destino_match = recode(destino,
"Alemania" = "Germany", "España" = "Spain", "Canadá" = "Canada",
"Filipinas" = "Philippines", "Corea del Sur" = "South Korea",
"Japón" = "Japan", "Malasia" = "Malaysia", "Países Bajos" = "Netherlands",
"Turquía" = "Turkey", "China" = "China", "Chile" = "Chile"
)
)
world <- st_read("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/world", quiet = TRUE)
world_export <- world %>%
left_join(exportaciones_corregidas, by = c("name" = "destino_match"))
ggplot(world_export) +
geom_sf(aes(fill = !is.na(valor_total)), color = "white", size = 0.1) +
geom_text_repel(
data = subset(world_export, !is.na(valor_total)),
aes(geometry = geometry, label = destino_etiqueta),
stat = "sf_coordinates", size = 4.5, color = "black",
min.segment.length = 0, segment.size = 0.3, max.overlaps = 100
) +
scale_fill_manual(
name = "Exportaciones reportadas por México",
values = c("TRUE" = "#007849", "FALSE" = "#f0f0f0"),
labels = c("TRUE" = "Exportó (venta)", "FALSE" = "No exportó")
) +
labs(
title = "Exportaciones de Cobre desde México (2024)",
subtitle = "Países de destino y porcentaje del total exportado",
caption = "Fuente: UN Comtrade"
) +
coord_sf(crs = "+proj=robin") +
theme_void() +
theme(
plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 14, hjust = 0.5),
legend.position = "bottom",
legend.title = element_text(size = 12, face = "bold"),
legend.text = element_text(size = 11),
plot.caption = element_text(size = 9, hjust = 1)
)
Durante el periodo 2018–2024, México mantuvo consistentemente una balanza comercial superavitaria en el comercio exterior de cobre.
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
corregir_anio <- function(anio) {
exp_mx <- data %>%
filter(ref_year == anio, flow_desc == "Export", reporter_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(partner_desc), partner_desc != "World") %>%
select(destino = partner_desc, valor_total = primary_value)
imp_desde_mx <- data %>%
filter(ref_year == anio, flow_desc == "Import", partner_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(reporter_desc), reporter_desc != "World") %>%
select(destino = reporter_desc, valor_total = primary_value)
ya_reportados <- unique(exp_mx$destino)
imp_desde_mx_filt <- imp_desde_mx %>% filter(!(destino %in% ya_reportados))
export_total <- bind_rows(exp_mx, imp_desde_mx_filt) %>%
summarise(valor = sum(valor_total, na.rm = TRUE)) %>% pull(valor)
imp_mx <- data %>%
filter(ref_year == anio, flow_desc == "Import", reporter_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(partner_desc), partner_desc != "World") %>%
select(origen = partner_desc, valor_total = primary_value)
exp_hacia_mx <- data %>%
filter(ref_year == anio, flow_desc == "Export", partner_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(reporter_desc), reporter_desc != "World") %>%
select(origen = reporter_desc, valor_total = primary_value)
ya_reportados_imp <- unique(imp_mx$origen)
exp_hacia_mx_filt <- exp_hacia_mx %>% filter(!(origen %in% ya_reportados_imp))
import_total <- bind_rows(imp_mx, exp_hacia_mx_filt) %>%
summarise(valor = sum(valor_total, na.rm = TRUE)) %>% pull(valor)
tibble(Año = anio, Exportaciones = export_total, Importaciones = import_total,
Balanza = export_total - import_total)
}
balanza_total <- bind_rows(
corregir_anio(2018), corregir_anio(2019), corregir_anio(2020),
corregir_anio(2021), corregir_anio(2022), corregir_anio(2023), corregir_anio(2024)
)
print(balanza_total)
## # A tibble: 7 × 4
## Año Exportaciones Importaciones Balanza
## <dbl> <dbl> <dbl> <dbl>
## 1 2018 2622552841. 1184908868. 1437643973.
## 2 2019 4781940680. 1666376908 3115563772.
## 3 2020 2973031273. 1149019624. 1824011649.
## 4 2021 3577591509. 501244857. 3076346653.
## 5 2022 3460567690. 765161266. 2695406424.
## 6 2023 4252235974. 672547172. 3579688803.
## 7 2024 4315432489. 1138457428. 3176975061.
balanza_long <- balanza_total %>%
pivot_longer(cols = c(Exportaciones, Importaciones, Balanza),
names_to = "Tipo", values_to = "Valor") %>%
mutate(Tipo = case_when(
Tipo == "Exportaciones" ~ "Exportaciones",
Tipo == "Importaciones" ~ "Importaciones",
Tipo == "Balanza" ~ "Balanza Comercial"
))
ggplot(balanza_long, aes(x = Año, y = Valor, color = Tipo)) +
geom_line(size = 1.2) +
geom_point(size = 2.8) +
geom_text(aes(label = paste0(round(Valor / 1e6), "M")),
vjust = -0.6, size = 3.8, show.legend = FALSE) +
scale_y_continuous(labels = label_number(scale = 1e-6, suffix = "M")) +
scale_color_manual(values = c(
"Exportaciones" = "forestgreen",
"Importaciones" = "firebrick",
"Balanza Comercial" = "#1f78b4"
)) +
labs(
title = "Balanza comercial del cobre mexicano",
subtitle = "Exportaciones, importaciones y balanza corregidas año por año",
x = "Año", y = "USD (Millones)", color = "Indicador"
) +
theme_minimal(base_size = 14)
Se muestra la red comercial de cobre en 2024, destacando los principales países exportadores y los destinos hacia donde se dirige la mayor parte de su producción.
data_exports <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
exportaciones_mundiales <- data_exports %>%
filter(ref_year == 2024, flow_desc == "Export", cmd_code == 2603,
primary_value > 0, net_wgt > 0, !is.na(partner_desc), partner_desc != "World") %>%
select(pais = reporter_desc, destino = partner_desc, valor_total = primary_value)
importaciones_reportadas <- data_exports %>%
filter(ref_year == 2024, flow_desc == "Import", cmd_code == 2603,
primary_value > 0, net_wgt > 0, partner_desc != "World",
!is.na(reporter_desc), !is.na(partner_desc)) %>%
select(pais = partner_desc, destino = reporter_desc, valor_total = primary_value)
ya_reportados <- exportaciones_mundiales %>%
mutate(pais_dest = paste(pais, destino)) %>% pull(pais_dest)
importaciones_sin_repetir <- importaciones_reportadas %>%
mutate(pais_dest = paste(pais, destino)) %>%
filter(!(pais_dest %in% ya_reportados)) %>%
select(-pais_dest)
exportaciones_corregidas <- bind_rows(exportaciones_mundiales, importaciones_sin_repetir) %>%
group_by(pais) %>%
summarise(valor_exportado_total = sum(valor_total, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(valor_exportado_total))
top_10_exportadores <- exportaciones_corregidas %>% slice_head(n = 10)
total_exportado_mundial <- sum(exportaciones_corregidas$valor_exportado_total, na.rm = TRUE)
print(top_10_exportadores)
## # A tibble: 10 × 2
## pais valor_exportado_total
## <chr> <dbl>
## 1 Chile 31293683035.
## 2 Indonesia 8091137319.
## 3 Canada 7544682678.
## 4 Peru 6283865609.
## 5 Australia 4722630240.
## 6 Mexico 4315432489.
## 7 Brazil 4160172027.
## 8 USA 3532340664.
## 9 Ecuador 2213611252.
## 10 Spain 2107710956.
cat("\nExportaciones mundiales totales de cobre en 2024 (USD):",
scales::comma(total_exportado_mundial), "\n")
##
## Exportaciones mundiales totales de cobre en 2024 (USD): 85,090,633,747
data_imports <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
importaciones_mundiales <- data_imports %>%
filter(ref_year == 2024, flow_desc == "Import", cmd_code == 2603,
primary_value > 0, net_wgt > 0, !is.na(partner_desc),
partner_desc != "World", partner_desc != "Areas, nes") %>%
select(pais = reporter_desc, origen = partner_desc, valor_total = primary_value)
exportaciones_reportadas <- data_imports %>%
filter(ref_year == 2024, flow_desc == "Export", cmd_code == 2603,
primary_value > 0, net_wgt > 0, !is.na(reporter_desc), !is.na(partner_desc),
partner_desc != "World", partner_desc != "Areas, nes") %>%
select(pais = partner_desc, origen = reporter_desc, valor_total = primary_value)
ya_reportados <- importaciones_mundiales %>%
mutate(pais_origen = paste(pais, origen)) %>% pull(pais_origen)
exportaciones_sin_repetir <- exportaciones_reportadas %>%
mutate(pais_origen = paste(pais, origen)) %>%
filter(!(pais_origen %in% ya_reportados)) %>%
select(-pais_origen)
importaciones_corregidas <- bind_rows(importaciones_mundiales, exportaciones_sin_repetir) %>%
group_by(pais) %>%
summarise(valor_importado_total = sum(valor_total, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(valor_importado_total))
top_10_importadores <- importaciones_corregidas %>% slice_head(n = 10)
total_importado_mundial <- sum(importaciones_corregidas$valor_importado_total, na.rm = TRUE)
print(top_10_importadores)
## # A tibble: 10 × 2
## pais valor_importado_total
## <chr> <dbl>
## 1 China 37125499528.
## 2 Japan 13599261599.
## 3 India 7459814515.
## 4 Spain 5163225179.
## 5 Rep. of Korea 5150202935.
## 6 Germany 4975668587.
## 7 Bulgaria 2604290058.
## 8 Philippines 2318092931
## 9 Finland 2159023513.
## 10 Canada 1569891301.
cat("\nImportaciones mundiales totales de cobre en 2024 (USD):",
scales::comma(total_importado_mundial), "\n")
##
## Importaciones mundiales totales de cobre en 2024 (USD): 87,887,410,908
traducciones_paises <- c(
"Ecuador" = "Ecuador", "Chile" = "Chile", "Canada" = "Canadá",
"Brazil" = "Brasil", "Australia" = "Australia", "Bulgaria" = "Bulgaria",
"Rep. of Korea" = "Corea del Sur", "Philippines" = "Filipinas",
"Japan" = "Japón", "India" = "India", "Germany" = "Alemania",
"Finland" = "Finlandia", "USA" = "Estados Unidos", "United States" = "Estados Unidos",
"Spain" = "España", "Peru" = "Perú", "Indonesia" = "Indonesia",
"Mexico" = "México", "China" = "China"
)
exportaciones_top <- bind_rows(exportaciones_mundiales, importaciones_sin_repetir) %>%
filter(pais %in% top_10_exportadores$pais, destino %in% top_10_importadores$pais) %>%
group_by(from = pais, to = destino) %>%
summarise(peso = sum(valor_total, na.rm = TRUE), .groups = "drop") %>%
mutate(from = recode(from, !!!traducciones_paises), to = recode(to, !!!traducciones_paises))
exportadores <- unique(exportaciones_top$from)
paleta_exp <- brewer.pal(n = max(length(exportadores), 3), name = "Set3")[seq_along(exportadores)]
colores_exportadores <- setNames(paleta_exp, exportadores)
nombres_nodos <- unique(c(exportaciones_top$from, exportaciones_top$to))
nodos <- tibble(nombre = nombres_nodos) %>%
mutate(
tipo = case_when(
nombre %in% exportadores ~ "Exportador",
nombre %in% recode(top_10_importadores$pais, !!!traducciones_paises) ~ "Importador",
TRUE ~ "Otro"
),
color = if_else(tipo == "Exportador", colores_exportadores[nombre], "#CCCCCC")
)
exportaciones_top <- exportaciones_top %>%
mutate(color = colores_exportadores[from])
grafo <- tbl_graph(nodes = nodos, edges = exportaciones_top, directed = TRUE) %>%
mutate(grado = centrality_degree(mode = "all"))
ggraph(grafo, layout = "circle") +
geom_edge_arc(aes(width = peso, colour = color),
arrow = arrow(length = unit(3, "mm")),
end_cap = circle(3, "mm"), alpha = 0.7) +
geom_node_point(aes(size = grado, colour = color), show.legend = FALSE) +
geom_node_text(aes(label = nombre), repel = TRUE, size = 3) +
scale_edge_width(range = c(0.2, 2.8), name = "Peso total") +
scale_edge_colour_identity(
name = "País exportador",
breaks = colores_exportadores,
labels = names(colores_exportadores)
) +
scale_size(range = c(2, 6), name = "Grado del nodo") +
theme_void() +
labs(title = "Red de exportaciones de cobre (2024)")
traducciones_paises <- c(
"Chile" = "Chile", "Indonesia" = "Indonesia", "Peru" = "Perú",
"Australia" = "Australia", "Canada" = "Canadá", "Mexico" = "México",
"Brazil" = "Brasil", "Spain" = "España", "USA" = "Estados Unidos",
"China" = "China", "Japan" = "Japón", "India" = "India",
"Rep. of Korea" = "Corea del Sur", "Germany" = "Alemania",
"Bulgaria" = "Bulgaria", "Philippines" = "Filipinas", "Finland" = "Finlandia"
)
df_combinado <- bind_rows(
top_10_exportadores %>% rename(valor = valor_exportado_total) %>% mutate(tipo = "Exportador"),
top_10_importadores %>% rename(valor = valor_importado_total) %>% mutate(tipo = "Importador")
) %>%
mutate(pais = recode(pais, !!!traducciones_paises))
ggplot(df_combinado, aes(x = reorder(pais, valor), y = valor, fill = tipo)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = comma) +
facet_wrap(~ tipo, scales = "free") +
scale_fill_manual(values = c("Exportador" = "#9F2241", "Importador" = "#235B4E")) +
labs(
title = "Comparativo: Top 10 Exportadores vs Importadores de Cobre (2024)",
x = "País", y = "Valor (USD)"
) +
theme_minimal() +
theme(legend.position = "none")
| País | Exportaciones 2023 (USD) | Exportaciones 2024 (USD) | Variación (%) |
|---|---|---|---|
| Alemania | 82,701,205 | 187,510,909 | +127% |
| Corea del Sur | 25,483,007 | 65,486,600 | +157% |
| China | 3,529,760,559 | 3,718,890,000 | +5.4% |
| País | Exportaciones 2023 (USD) | Exportaciones 2024 (USD) | Variación (%) |
|---|---|---|---|
| Japón | 158,682,341 | 20,648,420 | −87% |
| Canadá | 140,310,004 | 98,845,570 | −30% |
| España | 132,938,069 | 115,918,100 | −12.8% |
| Filipinas | 120,989,642 | 104,777,700 | −13.4% |
| Malasia | 25,976,163 | 3,349,645 | −87% |
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
exportaciones_mex <- data %>%
filter(ref_year == 2024, flow_desc == "Export", reporter_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(partner_desc), partner_desc != "World") %>%
select(destino = partner_desc, valor_total = primary_value)
importaciones_desde_mex <- data %>%
filter(ref_year == 2024, flow_desc == "Import", partner_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(reporter_desc), reporter_desc != "World") %>%
select(destino = reporter_desc, valor_total = primary_value)
paises_ya_reportados <- unique(exportaciones_mex$destino)
importaciones_filtradas <- importaciones_desde_mex %>%
filter(!(destino %in% paises_ya_reportados))
exportaciones_corregidas <- bind_rows(exportaciones_mex, importaciones_filtradas) %>%
group_by(destino) %>%
summarise(valor_total = sum(valor_total, na.rm = TRUE), .groups = "drop")
exportaciones_corregidas <- exportaciones_corregidas %>%
mutate(destino = case_when(
destino == "China" ~ "China", destino == "Germany" ~ "Alemania",
destino == "Spain" ~ "España", destino == "Canada" ~ "Canadá",
destino == "Philippines" ~ "Filipinas", destino == "Rep. of Korea" ~ "Corea del Sur",
destino == "Japan" ~ "Japón", destino == "Malaysia" ~ "Malasia",
destino == "Netherlands" ~ "Países Bajos", destino == "T\xfcrkiye" ~ "Turquía",
destino == "Chile" ~ "Chile", TRUE ~ destino
))
total_exportado <- sum(exportaciones_corregidas$valor_total, na.rm = TRUE)
sankey_data <- exportaciones_corregidas %>%
mutate(
origen = "México",
porcentaje = valor_total / total_exportado * 100,
destino_etiqueta = paste0(destino, " (", ifelse(porcentaje < 0.1, "<0.1", sprintf("%.1f", porcentaje)), "%)")
)
limpiar_utf8 <- function(x) {
x %>% iconv(from = "", to = "UTF-8", sub = "") %>%
str_replace_all("[^[:print:]]", "") %>% str_squish()
}
sankey_data <- sankey_data %>%
mutate(
origen = limpiar_utf8(origen),
destino_etiqueta = limpiar_utf8(destino_etiqueta),
valor_total = as.numeric(valor_total)
)
nombres_nodos <- unique(c(sankey_data$origen, sankey_data$destino_etiqueta))
nodes <- data.frame(name = nombres_nodos) %>% mutate(name = limpiar_utf8(name))
sankey_data <- sankey_data %>%
mutate(
IDsource = match(origen, nodes$name) - 1,
IDtarget = match(destino_etiqueta, nodes$name) - 1
)
ColourScal <- 'd3.scaleOrdinal().range(["#9F2241", "#BC955C", "#6F7271", "#235B4E", "#DDC9A3", "#414141", "#7A6F5F", "#98989A", "#003E51"])'
sankeyNetwork(
Links = sankey_data, Nodes = nodes,
Source = "IDsource", Target = "IDtarget", Value = "valor_total",
NodeID = "name", sinksRight = TRUE, colourScale = ColourScal,
nodeWidth = 30, nodePadding = 16, fontSize = 13, iterations = 0
)
top10_compradores <- exportaciones_corregidas %>%
arrange(desc(valor_total)) %>% slice(1:10)
top10_compradores
## # A tibble: 10 × 2
## destino valor_total
## <chr> <dbl>
## 1 China 3718889902
## 2 Alemania 187510935.
## 3 España 115918076.
## 4 Filipinas 104777691
## 5 Canadá 98845571.
## 6 Corea del Sur 65486602
## 7 Japón 20648419.
## 8 Malasia 3349645.
## 9 Chile 3825.
## 10 Países Bajos 1724.
limpiar_utf8 <- function(x) {
x %>% iconv(from = "", to = "UTF-8", sub = "") %>%
str_replace_all("[^[:print:]]", "") %>% str_squish()
}
traducir_pais <- function(nombre) {
case_when(
nombre == "Germany" ~ "Alemania", nombre == "Spain" ~ "España",
nombre == "Canada" ~ "Canadá", nombre == "Philippines" ~ "Filipinas",
nombre == "Rep. of Korea" ~ "Corea del Sur", nombre == "Japan" ~ "Japón",
nombre == "Malaysia" ~ "Malasia", nombre == "Netherlands" ~ "Países Bajos",
nombre %in% c("Türkiye", "T\xfcrkiye") ~ "Turquía",
nombre == "USA" ~ "Estados Unidos", nombre == "India" ~ "India",
nombre == "Thailand" ~ "Tailandia", nombre == "Bulgaria" ~ "Bulgaria",
nombre == "Peru" ~ "Perú", nombre == "Chile" ~ "Chile",
nombre == "Other Asia, nes" ~ "Otros Asia (no especificado)",
TRUE ~ nombre
)
}
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
exportaciones_mex <- data %>%
filter(ref_year == 2023, flow_desc == "Export", reporter_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(partner_desc), partner_desc != "World") %>%
select(destino = partner_desc, valor_total = primary_value)
importaciones_desde_mex <- data %>%
filter(ref_year == 2023, flow_desc == "Import", partner_desc == "Mexico",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(reporter_desc), reporter_desc != "World") %>%
select(destino = reporter_desc, valor_total = primary_value)
paises_ya_reportados <- unique(exportaciones_mex$destino)
importaciones_filtradas <- importaciones_desde_mex %>%
filter(!(destino %in% paises_ya_reportados))
exportaciones_corregidas <- bind_rows(exportaciones_mex, importaciones_filtradas) %>%
group_by(destino) %>%
summarise(valor_total = sum(valor_total, na.rm = TRUE), .groups = "drop") %>%
mutate(destino = traducir_pais(destino))
total_exportado <- sum(exportaciones_corregidas$valor_total, na.rm = TRUE)
sankey_data <- exportaciones_corregidas %>%
mutate(
origen = "México",
porcentaje = valor_total / total_exportado * 100,
destino_etiqueta = paste0(destino, " (", ifelse(porcentaje < 0.1, "<0.1", sprintf("%.1f", porcentaje)), "%)")
) %>%
mutate(
origen = limpiar_utf8(origen),
destino_etiqueta = limpiar_utf8(destino_etiqueta),
valor_total = as.numeric(valor_total)
)
nombres_nodos <- unique(c(sankey_data$origen, sankey_data$destino_etiqueta))
nodes <- data.frame(name = nombres_nodos) %>% mutate(name = limpiar_utf8(name))
sankey_data <- sankey_data %>%
mutate(
IDsource = match(origen, nodes$name) - 1,
IDtarget = match(destino_etiqueta, nodes$name) - 1
)
ColourScal <- 'd3.scaleOrdinal().range(["#9F2241", "#BC955C", "#6F7271", "#235B4E", "#DDC9A3", "#414141", "#7A6F5F", "#98989A", "#003E51"])'
sankeyNetwork(
Links = sankey_data, Nodes = nodes,
Source = "IDsource", Target = "IDtarget", Value = "valor_total",
NodeID = "name", sinksRight = TRUE, colourScale = ColourScal,
nodeWidth = 30, nodePadding = 16, fontSize = 13, iterations = 0
)
top10_compradores <- exportaciones_corregidas %>%
arrange(desc(valor_total)) %>% slice(1:10)
top10_compradores
## # A tibble: 10 × 2
## destino valor_total
## <chr> <dbl>
## 1 China 3529760559
## 2 Japón 158682341
## 3 Canadá 140310004.
## 4 España 132938069.
## 5 Filipinas 120989642
## 6 Alemania 82701205.
## 7 Malasia 25976163.
## 8 Corea del Sur 25483007
## 9 Otros Asia (no especificado) 21409922.
## 10 Perú 11943092.
China se consolida como el principal destino de las exportaciones globales de cobre. China absorbió el 86.2% de las exportaciones mexicanas de cobre en 2024.
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
importaciones_china <- data %>%
filter(ref_year == 2024, flow_desc == "Import", reporter_desc == "China",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(partner_desc), partner_desc != "World") %>%
select(origen = partner_desc, valor_total = primary_value)
exportaciones_hacia_china <- data %>%
filter(ref_year == 2024, flow_desc == "Export", partner_desc == "China",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(reporter_desc), reporter_desc != "World") %>%
select(origen = reporter_desc, valor_total = primary_value)
paises_reportados <- unique(importaciones_china$origen)
exportaciones_no_reportadas <- exportaciones_hacia_china %>%
filter(!(origen %in% paises_reportados))
importaciones_completas <- bind_rows(importaciones_china, exportaciones_no_reportadas) %>%
group_by(origen) %>%
summarise(valor_total = sum(valor_total, na.rm = TRUE), .groups = "drop")
importaciones_completas <- importaciones_completas %>%
mutate(origen = case_when(
origen == "Albania" ~ "Albania", origen == "Armenia" ~ "Armenia",
origen == "Australia" ~ "Australia", origen == "Belgium" ~ "Bélgica",
origen == "Bolivia (Plurinational State of)" ~ "Bolivia",
origen == "Brazil" ~ "Brasil", origen == "Bulgaria" ~ "Bulgaria",
origen == "Canada" ~ "Canadá", origen == "Chile" ~ "Chile",
origen == "China, Hong Kong SAR" ~ "Hong Kong",
origen == "Dominican Rep." ~ "Rep. Dominicana",
origen == "Ecuador" ~ "Ecuador", origen == "Georgia" ~ "Georgia",
origen == "Germany" ~ "Alemania", origen == "India" ~ "India",
origen == "Japan" ~ "Japón", origen == "Kyrgyzstan" ~ "Kirguistán",
origen == "Malaysia" ~ "Malasia", origen == "Mexico" ~ "México",
origen == "Namibia" ~ "Namibia", origen == "Pakistan" ~ "Pakistán",
origen == "Peru" ~ "Perú", origen == "Philippines" ~ "Filipinas",
origen == "Rep. of Korea" ~ "Corea del Sur", origen == "Romania" ~ "Rumania",
origen == "South Africa" ~ "Sudáfrica", origen == "Spain" ~ "España",
origen == "Sweden" ~ "Suecia", origen == "Switzerland" ~ "Suiza",
origen == "Türkiye" ~ "Turquía", origen == "USA" ~ "Estados Unidos",
origen == "United Kingdom" ~ "Reino Unido",
origen == "Uzbekistan" ~ "Uzbekistán", origen == "Zimbabwe" ~ "Zimbabue",
TRUE ~ origen
))
total_importado <- sum(importaciones_completas$valor_total, na.rm = TRUE)
sankey_data <- importaciones_completas %>%
mutate(
destino = "China",
porcentaje = valor_total / total_importado * 100,
origen_etiqueta = paste0(origen, " (", ifelse(porcentaje < 0.1, "<0.1", sprintf("%.1f", porcentaje)), "%)")
)
limpiar_utf8 <- function(x) {
x %>% iconv(from = "", to = "UTF-8", sub = "") %>%
str_replace_all("[^[:print:]]", "") %>% str_squish()
}
sankey_data <- sankey_data %>%
mutate(
origen_etiqueta = limpiar_utf8(origen_etiqueta),
destino = limpiar_utf8(destino),
valor_total = as.numeric(valor_total)
)
nombres_nodos <- unique(c(sankey_data$origen_etiqueta, sankey_data$destino))
nodes <- data.frame(name = nombres_nodos) %>% mutate(name = limpiar_utf8(name))
sankey_data <- sankey_data %>%
mutate(
IDsource = match(origen_etiqueta, nodes$name) - 1,
IDtarget = match(destino, nodes$name) - 1
)
ColourScal <- 'd3.scaleOrdinal().range(["#9F2241", "#BC955C", "#6F7271", "#235B4E", "#DDC9A3", "#414141", "#7A6F5F", "#98989A", "#003E51"])'
sankeyNetwork(
Links = sankey_data, Nodes = nodes,
Source = "IDsource", Target = "IDtarget", Value = "valor_total",
NodeID = "name", sinksRight = TRUE, colourScale = ColourScal,
nodeWidth = 30, nodePadding = 16, fontSize = 13, iterations = 0
)
top10_proveedores <- importaciones_completas %>%
arrange(desc(valor_total)) %>% slice(1:10)
top10_proveedores
## # A tibble: 10 × 2
## origen valor_total
## <chr> <dbl>
## 1 "Chile" 21012301030.
## 2 "México" 3718889902
## 3 "Canadá" 2925518772.
## 4 "Ecuador" 2102153539.
## 5 "España" 1865059010.
## 6 "Filipinas" 1038822263
## 7 "Brasil" 827481658
## 8 "Corea del Sur" 684855122
## 9 "T\xfcrkiye" 502890354
## 10 "Estados Unidos" 465469510
Japón ha sido históricamente un comprador relevante de cobre. Sin embargo, en 2024, su participación como destino de las exportaciones mexicanas mostró una caída del 87%.
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
importaciones_japon <- data %>%
filter(ref_year == 2024, flow_desc == "Import", reporter_desc == "Japan",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(partner_desc), partner_desc != "World") %>%
select(origen = partner_desc, valor_total = primary_value)
exportaciones_hacia_japon <- data %>%
filter(ref_year == 2024, flow_desc == "Export", partner_desc == "Japan",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(reporter_desc), reporter_desc != "World") %>%
select(origen = reporter_desc, valor_total = primary_value)
paises_reportados <- unique(importaciones_japon$origen)
exportaciones_no_reportadas <- exportaciones_hacia_japon %>%
filter(!(origen %in% paises_reportados))
importaciones_completas <- bind_rows(importaciones_japon, exportaciones_no_reportadas) %>%
group_by(origen) %>%
summarise(valor_total = sum(valor_total, na.rm = TRUE), .groups = "drop")
importaciones_completas <- importaciones_completas %>%
mutate(origen = case_when(
origen == "Australia" ~ "Australia", origen == "Belgium" ~ "Bélgica",
origen == "Canada" ~ "Canadá", origen == "Chile" ~ "Chile",
origen == "Congo" ~ "Congo", origen == "Finland" ~ "Finlandia",
origen == "Indonesia" ~ "Indonesia", origen == "Mexico" ~ "México",
origen == "Netherlands" ~ "Países Bajos", origen == "Other Asia, nes" ~ "Otro Asia",
origen == "Papua New Guinea" ~ "Papúa Nueva Guinea", origen == "Peru" ~ "Perú",
origen == "Philippines" ~ "Filipinas", origen == "USA" ~ "Estados Unidos",
TRUE ~ origen
))
total_importado <- sum(importaciones_completas$valor_total, na.rm = TRUE)
sankey_data <- importaciones_completas %>%
mutate(
destino = "Japón",
porcentaje = valor_total / total_importado * 100,
origen_etiqueta = paste0(origen, " (", ifelse(porcentaje < 0.1, "<0.1", sprintf("%.1f", porcentaje)), "%)")
)
limpiar_utf8 <- function(x) {
x %>% iconv(from = "", to = "UTF-8", sub = "") %>%
str_replace_all("[^[:print:]]", "") %>% str_squish()
}
sankey_data <- sankey_data %>%
mutate(
origen_etiqueta = limpiar_utf8(origen_etiqueta),
destino = limpiar_utf8(destino),
valor_total = as.numeric(valor_total)
)
nombres_nodos <- unique(c(sankey_data$origen_etiqueta, sankey_data$destino))
nodes <- data.frame(name = nombres_nodos) %>% mutate(name = limpiar_utf8(name))
sankey_data <- sankey_data %>%
mutate(
IDsource = match(origen_etiqueta, nodes$name) - 1,
IDtarget = match(destino, nodes$name) - 1
)
ColourScal <- 'd3.scaleOrdinal().range(["#9F2241", "#BC955C", "#6F7271", "#235B4E", "#DDC9A3", "#414141", "#7A6F5F", "#98989A", "#003E51"])'
sankeyNetwork(
Links = sankey_data, Nodes = nodes,
Source = "IDsource", Target = "IDtarget", Value = "valor_total",
NodeID = "name", sinksRight = TRUE, colourScale = ColourScal,
nodeWidth = 30, nodePadding = 16, fontSize = 13, iterations = 0
)
top10_proveedores <- importaciones_completas %>%
arrange(desc(valor_total)) %>% slice(1:10)
top10_proveedores
## # A tibble: 10 × 2
## origen valor_total
## <chr> <dbl>
## 1 Chile 4991429183.
## 2 Indonesia 2319099169.
## 3 Australia 1996585819.
## 4 Perú 1711364110.
## 5 Canadá 875107716.
## 6 Estados Unidos 720835108.
## 7 Papúa Nueva Guinea 568959950.
## 8 Otro Asia 262182057.
## 9 Filipinas 132672867.
## 10 México 20648419.
En 2024, Alemania mostró un notable incremento como destino de las exportaciones mexicanas de cobre (+127%).
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv",
locale = locale(encoding = "UTF-8")) %>%
clean_names()
importaciones_alemania <- data %>%
filter(ref_year == 2024, flow_desc == "Import", reporter_desc == "Germany",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(partner_desc), partner_desc != "World") %>%
select(origen = partner_desc, valor_total = primary_value)
exportaciones_hacia_alemania <- data %>%
filter(ref_year == 2024, flow_desc == "Export", partner_desc == "Germany",
cmd_code == 2603, primary_value > 0, net_wgt > 0,
!is.na(reporter_desc), reporter_desc != "World") %>%
select(origen = reporter_desc, valor_total = primary_value)
paises_reportados <- unique(importaciones_alemania$origen)
exportaciones_no_reportadas <- exportaciones_hacia_alemania %>%
filter(!(origen %in% paises_reportados))
importaciones_completas <- bind_rows(importaciones_alemania, exportaciones_no_reportadas) %>%
group_by(origen) %>%
summarise(valor_total = sum(valor_total, na.rm = TRUE), .groups = "drop")
importaciones_completas <- importaciones_completas %>%
mutate(origen = case_when(
origen == "Australia" ~ "Australia", origen == "Belgium" ~ "Bélgica",
origen == "Bosnia Herzegovina" ~ "Bosnia", origen == "Brazil" ~ "Brasil",
origen == "Canada" ~ "Canadá", origen == "Chile" ~ "Chile",
origen == "Finland" ~ "Finlandia", origen == "Indonesia" ~ "Indonesia",
origen == "Italy" ~ "Italia", origen == "Kazakhstan" ~ "Kazajistán",
origen == "Mexico" ~ "México", origen == "Mongolia" ~ "Mongolia",
origen == "Morocco" ~ "Marruecos", origen == "Namibia" ~ "Namibia",
origen == "Netherlands" ~ "Países Bajos", origen == "Norway" ~ "Noruega",
origen == "Peru" ~ "Perú", origen == "Singapore" ~ "Singapur",
origen == "Spain" ~ "España", origen == "Sweden" ~ "Suecia",
origen == "Switzerland" ~ "Suiza", origen == "Türkiye" ~ "Turquía",
origen == "USA" ~ "Estados Unidos", origen == "United Kingdom" ~ "Reino Unido",
origen == "United Rep. of Tanzania" ~ "Tanzania",
TRUE ~ origen
))
total_importado <- sum(importaciones_completas$valor_total, na.rm = TRUE)
sankey_data <- importaciones_completas %>%
mutate(
destino = "Alemania",
porcentaje = valor_total / total_importado * 100,
origen_etiqueta = paste0(origen, " (", ifelse(porcentaje < 0.1, "<0.1", sprintf("%.1f", porcentaje)), "%)")
)
limpiar_utf8 <- function(x) {
x %>% iconv(from = "", to = "UTF-8", sub = "") %>%
str_replace_all("[^[:print:]]", "") %>% str_squish()
}
sankey_data <- sankey_data %>%
mutate(
origen_etiqueta = limpiar_utf8(origen_etiqueta),
destino = limpiar_utf8(destino),
valor_total = as.numeric(valor_total)
)
nombres_nodos <- unique(c(sankey_data$origen_etiqueta, sankey_data$destino))
nodes <- data.frame(name = nombres_nodos) %>% mutate(name = limpiar_utf8(name))
sankey_data <- sankey_data %>%
mutate(
IDsource = match(origen_etiqueta, nodes$name) - 1,
IDtarget = match(destino, nodes$name) - 1
)
ColourScal <- 'd3.scaleOrdinal().range(["#9F2241", "#BC955C", "#6F7271", "#235B4E", "#DDC9A3", "#414141", "#7A6F5F", "#98989A", "#003E51"])'
sankeyNetwork(
Links = sankey_data, Nodes = nodes,
Source = "IDsource", Target = "IDtarget", Value = "valor_total",
NodeID = "name", sinksRight = TRUE, colourScale = ColourScal,
nodeWidth = 30, nodePadding = 16, fontSize = 13, iterations = 0
)
top10_proveedores <- importaciones_completas %>%
arrange(desc(valor_total)) %>% slice(1:10)
top10_proveedores
## # A tibble: 10 × 2
## origen valor_total
## <chr> <dbl>
## 1 Brasil 1387664940.
## 2 Chile 1329915778.
## 3 Perú 583104123.
## 4 Australia 554891734.
## 5 Canadá 353786522.
## 6 Indonesia 340761067.
## 7 México 187510935.
## 8 Singapur 48008875.
## 9 Finlandia 43368669.
## 10 Suecia 40771120.
Se estimó una regresión log–log con efectos fijos por país:
log(cantidad exportada) ~ log(precio unitario FOB)
Resultado principal: Elasticidad estimada: −0.64 Un aumento del 1% en el precio reduce 0.64% el volumen exportado, en promedio.
df <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv") %>%
clean_names()
df2 <- df %>%
filter(cmd_code == 2603, flow_desc == "Export", !is.na(net_wgt), net_wgt > 0) %>%
mutate(precio_unitario_fob = primary_value / net_wgt) %>%
filter(!is.na(precio_unitario_fob), precio_unitario_fob > 0)
df_agregado <- df2 %>%
group_by(reporter_iso, ref_year) %>%
summarise(
net_wgt_total = sum(net_wgt, na.rm = TRUE),
precio_unitario_prom = sum(net_wgt * precio_unitario_fob, na.rm = TRUE) /
sum(net_wgt, na.rm = TRUE),
.groups = "drop"
)
model_within_agregado <- plm(
log(net_wgt_total) ~ log(precio_unitario_prom),
data = df_agregado,
index = c("reporter_iso", "ref_year"),
model = "within"
)
summary(model_within_agregado)
## Oneway (individual) effect Within Model
##
## Call:
## plm(formula = log(net_wgt_total) ~ log(precio_unitario_prom),
## data = df_agregado, model = "within", index = c("reporter_iso",
## "ref_year"))
##
## Unbalanced Panel: n = 101, T = 1-7, N = 510
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -11.546063 -0.358012 0.044294 0.605670 6.443883
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## log(precio_unitario_prom) -0.643806 0.096979 -6.6386 1.012e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 1955.9
## Residual Sum of Squares: 1765.2
## R-Squared: 0.097487
## Adj. R-Squared: -0.12593
## F-statistic: 44.0712 on 1 and 408 DF, p-value: 1.0117e-10
df_etiquetas <- df_agregado %>%
group_by(reporter_iso) %>%
slice_max(order_by = net_wgt_total, n = 1) %>%
ungroup()
ggplot(df_agregado, aes(x = log(precio_unitario_prom),
y = log(net_wgt_total),
color = as.factor(ref_year))) +
geom_point(alpha = 0.6, size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
geom_text_repel(data = df_etiquetas,
aes(label = reporter_iso),
size = 3, max.overlaps = 15, show.legend = FALSE) +
scale_color_viridis_d(option = "C") +
labs(
title = "Relación log–log entre precio unitario y cantidad exportada",
subtitle = "Exportaciones de cobre (mayor volumen por país)",
x = "Log(Precio unitario FOB promedio)",
y = "Log(Peso neto total exportado)",
color = "Año"
) +
theme_minimal(base_size = 14) +
theme(legend.position = "bottom")
Se estimaron modelos log–log por país exportador. México: −1.4 (alta elasticidad). Chile: −0.92 (también sensible, pero menos que México).
data <- read_csv("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/UN TRADE/FINAL.csv") %>%
clean_names() %>%
mutate(valor_unitario_fob_calculado = primary_value / net_wgt) %>%
filter(
flow_desc == "Export", partner_iso != 'W00',
!is.na(valor_unitario_fob_calculado), net_wgt > 0, partner2iso == 'W00'
) %>%
with_groups(.groups = reporter_iso, mutate, n = n()) %>%
filter(n > 5) %>%
group_by(reporter_iso) %>%
nest()
imports_lm <- function(data) {
lm(log(net_wgt) ~ log(valor_unitario_fob_calculado), data = data)
}
data_imports_nested <- data |>
mutate(
model = map(data, imports_lm),
model_tidy = map(model, ~ if (is.logical(.x)) NA else tidy(.x)),
model_glance = map(model, ~ if (is.logical(.x)) NA else glance(.x))
)
data_imports_m <- data_imports_nested |> unnest(model_tidy)
coef_global <- -0.643806
coef_data <- data_imports_m %>%
filter(term == "log(valor_unitario_fob_calculado)")
coef_mex <- coef_data %>% filter(reporter_iso == "MEX") %>% pull(estimate)
coef_chl <- coef_data %>% filter(reporter_iso == "CHL") %>% pull(estimate)
ggplot(coef_data, aes(x = estimate)) +
geom_histogram(fill = "skyblue", color = "white", bins = 30) +
geom_vline(xintercept = coef_global, linetype = "dashed", color = "black", size = 1) +
annotate("text", x = coef_global + 0.3, y = 15,
label = paste0("Promedio global (", round(coef_global, 2), ")"),
hjust = 0, color = "black", fontface = "italic") +
geom_vline(xintercept = coef_mex, color = "red", size = 1.2) +
annotate("text", x = coef_mex - 0.3, y = 13,
label = paste0("Mexico (", round(coef_mex, 2), ")"),
hjust = 1, color = "red", fontface = "bold") +
geom_vline(xintercept = coef_chl, color = "blue", size = 1.2) +
annotate("text", x = coef_chl + 0.3, y = 11,
label = paste0("Chile (", round(coef_chl, 2), ")"),
hjust = 0, color = "blue", fontface = "bold") +
scale_x_continuous(breaks = seq(-6, 10, by = 2)) +
labs(
title = "Distribución de coeficientes por país",
subtitle = "Modelo log-log: log(peso neto) ~ log(precio unitario FOB)",
x = "Coeficiente estimado (elasticidad)",
y = "Número de países"
) +
theme_minimal(base_size = 14)
Para priorizar mercados estratégicos, se construyó un semáforo de elasticidad precio:
coef_data <- coef_data %>%
mutate(
clasificacion = case_when(
estimate > -0.5 ~ "Inelástica",
estimate <= -0.5 & estimate >= -1 ~ "Elasticidad media",
estimate < -1 ~ "Elástica"
)
)
world <- st_read("/Users/alanplacidoherrera/Documents/R con Alan/RET0/Data/world", quiet = TRUE) %>%
clean_names()
world_elasticidad <- world %>%
left_join(coef_data, by = c("iso3" = "reporter_iso"))
ggplot(world_elasticidad) +
geom_sf(aes(fill = clasificacion), color = "gray90", size = 0.1) +
scale_fill_manual(
name = "Elasticidad precio",
values = c(
"Inelástica" = "#2ECC71",
"Elasticidad media" = "#F1C40F",
"Elástica" = "#E74C3C"
),
na.value = "#e0e0e0"
) +
labs(
title = "Riesgo Comercial por Elasticidad Precio de las Exportaciones",
subtitle = "Clasificación de países según sensibilidad al precio del cobre",
caption = "Fuente: UN Comtrade"
) +
theme_void() +
theme(
plot.title = element_text(size = 16, face = "bold"),
plot.subtitle = element_text(size = 12),
legend.position = "bottom"
)
traduccion_iso <- c(
"KOR" = "Corea del Sur", "CHL" = "Chile", "ECU" = "Ecuador", "CHE" = "Suiza",
"TUR" = "Turquía", "BOL" = "Bolivia", "LAO" = "Laos", "GBR" = "Reino Unido",
"DOM" = "Rep. Dominicana", "RUS" = "Rusia", "ESP" = "España", "KEN" = "Kenia",
"OMN" = "Omán", "FRA" = "Francia", "ITA" = "Italia", "PNG" = "Papúa Nueva Guinea",
"POL" = "Polonia", "THA" = "Tailandia", "ZAF" = "Sudáfrica",
"ARE" = "Emiratos Árabes", "MEX" = "México", "NLD" = "Países Bajos",
"HKG" = "Hong Kong", "MRT" = "Mauritania", "BGR" = "Bulgaria", "TZA" = "Tanzania",
"SGP" = "Singapur", "GTM" = "Guatemala", "USA" = "Estados Unidos", "CHN" = "China",
"MAR" = "Marruecos", "ZMB" = "Zambia", "BEL" = "Bélgica", "MYS" = "Malasia",
"ZWE" = "Zimbabue", "UZB" = "Uzbekistán", "SAU" = "Arabia Saudita", "DEU" = "Alemania",
"NGA" = "Nigeria", "PHL" = "Filipinas", "BRA" = "Brasil", "AUS" = "Australia",
"NER" = "Níger", "NAM" = "Namibia", "SWE" = "Suecia", "IRN" = "Irán",
"KAZ" = "Kazajistán", "FIN" = "Finlandia", "PAK" = "Pakistán", "PER" = "Perú",
"ROU" = "Rumania", "PAN" = "Panamá", "AZE" = "Azerbaiyán", "ETH" = "Etiopía",
"COD" = "R.D. del Congo", "IRL" = "Irlanda", "IND" = "India", "CAN" = "Canadá",
"ARM" = "Armenia", "BWA" = "Botsuana", "KGZ" = "Kirguistán", "GEO" = "Georgia",
"PRT" = "Portugal", "MKD" = "Macedonia", "SRB" = "Serbia", "COL" = "Colombia",
"MNG" = "Mongolia", "IDN" = "Indonesia", "TJK" = "Tayikistán", "S19" = "Otros",
"JPN" = "Japón"
)
df_semaforo <- coef_data %>%
select(reporter_iso, estimate, clasificacion) %>%
mutate(pais_espanol = recode(reporter_iso, !!!traduccion_iso)) %>%
arrange(clasificacion, estimate)
print(df_semaforo, n = 30)
## # A tibble: 71 × 4
## # Groups: reporter_iso [71]
## reporter_iso estimate clasificacion pais_espanol
## <chr> <dbl> <chr> <chr>
## 1 S19 -0.998 Elasticidad media Otros
## 2 KOR -0.958 Elasticidad media Corea del Sur
## 3 CHL -0.919 Elasticidad media Chile
## 4 ECU -0.883 Elasticidad media Ecuador
## 5 CHE -0.848 Elasticidad media Suiza
## 6 TUR -0.807 Elasticidad media Turquía
## 7 BOL -0.707 Elasticidad media Bolivia
## 8 LAO -0.677 Elasticidad media Laos
## 9 GBR -0.636 Elasticidad media Reino Unido
## 10 DOM -5.61 Elástica Rep. Dominicana
## 11 TJK -3.87 Elástica Tayikistán
## 12 RUS -3.50 Elástica Rusia
## 13 ESP -3.11 Elástica España
## 14 KEN -2.37 Elástica Kenia
## 15 OMN -2.11 Elástica Omán
## 16 COG -2.03 Elástica COG
## 17 FRA -1.80 Elástica Francia
## 18 ITA -1.75 Elástica Italia
## 19 PNG -1.68 Elástica Papúa Nueva Guinea
## 20 POL -1.49 Elástica Polonia
## 21 THA -1.47 Elástica Tailandia
## 22 ZAF -1.43 Elástica Sudáfrica
## 23 ARE -1.41 Elástica Emiratos Árabes
## 24 MEX -1.40 Elástica México
## 25 NLD -1.38 Elástica Países Bajos
## 26 HKG -1.26 Elástica Hong Kong
## 27 MRT -1.23 Elástica Mauritania
## 28 BGR -1.21 Elástica Bulgaria
## 29 TZA -1.20 Elástica Tanzania
## 30 SGP -1.18 Elástica Singapur
## # ℹ 41 more rows