Hipótesis

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.

Objetivo

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.

Pregunta de Investigación

¿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?

Librerías

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))

Intercambio Comercial Global de México por Estado

Se muestran los flujos acumulados de comercio internacional de cobre entre los estados mexicanos y sus socios globales durante el periodo 2007–2024.

  • En los primeros años del periodo, Ciudad de México desempeñó un papel central como nodo exportador.
  • A partir de 2023, se observa un cambio estructural en la red: Sonora emerge como el nuevo punto focal de las exportaciones mexicanas de cobre.
  • Aunque la red sugiere una participación amplia de entidades federativas, los datos recientes revelan una concentración creciente en un número reducido de estados.

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"
  )

Principales entidades exportadoras de cobre en México (2024)

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:

  • Sonora exportó 3,146.9 millones de dólares, lo que representa el 96.07% del total nacional.
  • Coahuila de Zaragoza aportó 121.0 millones de dólares, equivalente al 3.70%.
  • San Luis Potosí registró 7.8 millones de dólares, lo que equivale al 0.24%.
  • Ningún otro estado reportó exportaciones significativas de este mineral durante el año.

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

Intercambio Comercial Global de México

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)
  )

Balanza comercial de cobre y sus concentrados

Durante el periodo 2018–2024, México mantuvo consistentemente una balanza comercial superavitaria en el comercio exterior de cobre.

  • 2019 marcó un punto alto inicial, con un fuerte incremento en exportaciones.
  • En 2020, la pandemia por COVID-19 provocó una contracción significativa.
  • A partir de 2021, la balanza se recupera rápidamente. Se destaca 2023, con el mayor superávit del periodo.
  • En 2024, las exportaciones alcanzan su máximo histórico, superando los 4,300 millones de USD.
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)

Red Global de Exportaciones de Cobre (2024)

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.

  • China y Japón se consolidan como los mayores compradores globales de cobre.
  • Chile es el principal nodo exportador, con una fuerte concentración de flujos hacia China.
  • México aparece como un exportador relevante pero no central.
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)")

Comparativo Global de Exportadores e Importadores 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")

Exportaciones de cobre de México en 2024 y 2023

Países que Aumentaron sus Importaciones

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íses con Disminuciones

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%

Exportaciones de cobre de México en 2024

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.

Exportaciones de cobre de México en 2023

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.

Importaciones de cobre hacia China en 2024

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

Importaciones de cobre hacia Japón en 2024

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.

Importaciones de cobre hacia Alemania en 2024

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.

Regresión de efectos fijos

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")

Distribución de Elasticidades de Exportación por País

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)

Recomendaciones

Estrategia Comercial Basada en Elasticidad Precio del Cobre

Para priorizar mercados estratégicos, se construyó un semáforo de elasticidad precio:

  • Inelásticos (verde): países que siguen comprando aunque suba el precio.
  • Elasticidad media (amarillo): respuesta moderada a los cambios de precio.
  • Elásticos (rojo): países que reducen mucho su demanda si el precio sube.
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

Conclusiones

  1. China es el principal destino de las exportaciones mexicanas de cobre (86.2% en 2024).
  2. México tiene una alta elasticidad-precio (-1.4), lo que sugiere sensibilidad a fluctuaciones de precios.
  3. Japón mostró una caída del 87% en importaciones desde México, requiriendo atención estratégica.
  4. Alemania emerge como destino prometedor con crecimiento del 127%.
  5. La concentración en Sonora (96% de exportaciones) representa tanto fortaleza como vulnerabilidad.