Datos para Capítulo 2 Nearshoring en los datos

Autor/a

Jorge Cornick, febrero-marzo 2026

Carga de librerías

pacman::p_load(
  httr, jsonlite, forcats, zoo, tidyverse, readxl, here,janitor, stringr,gt
)

Exportaciones de México por país

Descarga y almacenamiento de la base de datos original

api_url <- "https://www.economia.gob.mx/apidatamexico/tesseract/data.jsonrecords?cube=inegi_foreign_trade_country&drilldowns=Year%2CFlow%2CCountry&locale=es&measures=Trade+Value"
fetch_and_save_data(url = api_url, "RDS", "MexXMPaisINEGI.rds")
Data saved successfully to: /cloud/project/RDS/MexXMPaisINEGI.rds 

Ajustes a la base de datos original

# 1. Cargar la base de datos original
MexXMPaisINEGI <- readRDS(here::here("RDS", "MexXMPaisINEGI.rds"))

# 2. Guardar los atributos en un objeto separado (se pierden al usar summarize)
source <- attr(MexXMPaisINEGI, "source_info")

# 3. Procesar los datos
MexXMPaisINEGI <- MexXMPaisINEGI |> 
 select(Year, Flow, Country,`Trade Value`) |>  
 rename(
    Año = Year,
    Flujo = Flow,
    Pais = Country,
    Valor = `Trade Value`) |>
  mutate(
    Flujo = as.factor(Flujo),
    País = as.factor(Pais)
      ) |> 
  mutate(
    Pais = fct_relabel(Pais, \(level) str_replace_all(level, " ", "_"))
  ) |> 
  mutate(
    Pais = fct_recode(
      Pais,
      "USA" = "Estados_Unidos",
      "CoreaS" = "Corea_del_Sur"
      )
    ) |> 
  pivot_wider(
      names_from = Flujo, values_from = Valor
      ) |> 
  group_by(Año, Pais) |>
  summarise(
    Importaciones = sum(Importaciones),
    Exportaciones = sum(Exportaciones),
    .groups = "drop"
  ) 

# 4. Adjuntar los metadatos
attr(MexXMPaisINEGI,"source_info") <- source

# 5 Verificar atributos
#gt_metadata(MexXMPaisINEGI)

# 6. Guardar los datos
saveRDS(MexXMPaisINEGI,here::here("RDS", "MexXMPaisINEGI.rds"))  

Exportaciones a Estados Unidos por sección del HS

Descarga y almacenamiento de la base de datos original

api_url <- "https://www.economia.gob.mx/apidatamexico/tesseract/data.jsonrecords?Country=usa&Flow=2&cube=economy_foreign_trade_mun&drilldowns=Year%2CCountry%2CChapter%2CFlow&locale=es&measures=Trade+Value"
fetch_and_save_data(url = api_url, "RDS", "Mex_X_USA_Sec.rds")
Data saved successfully to: /cloud/project/RDS/Mex_X_USA_Sec.rds 

Ajustes a la base de datos

Mex_X_USA_Sec <- readRDS(here::here("RDS", "Mex_X_USA_Sec.rds"))

source <- attr(Mex_X_USA_Sec, "source_info")

Mex_X_USA_Sec <- Mex_X_USA_Sec |> 
# 1. Seleccionamos incluyendo el ID para que el macheo sea seguro
  select(
    Año = Year, 
    Sec_ID = `Chapter ID`, 
    Sección_Nombre = Chapter, 
    Exportaciones = `Trade Value`
  ) |> 
  # 2. Mapeo por ID (mucho más rápido y seguro)
  mutate(Sec = case_match(
    Sec_ID,
    1  ~ "Carnes",
    2  ~ "Vegetales",
    3  ~ "Subproductos",
    4  ~ "Alimentos",
    5  ~ "Minerales",
    6  ~ "Química",
    7  ~ "Plásticos",
    8  ~ "Pieles",
    9  ~ "Madera",
    10 ~ "Papel",
    11 ~ "Textiles",
    12 ~ "Calzado",
    13 ~ "Cerámica",
    14 ~ "Joyería",
    15 ~ "Metales",
    16 ~ "Maquinaria",
    17 ~ "Equip_Transp",
    18 ~ "Instrumentos",
    19 ~ "Armas",
    20 ~ "Varios",
    21 ~ "Arte",
    .default = "Otros"
  )) |> 
  # 3. Convertir a factor y limpiar columnas innecesarias si prefieres
  mutate(Sec = factor(Sec)) 
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `Sec = case_match(...)`.
Caused by warning:
! `case_match()` was deprecated in dplyr 1.2.0.
ℹ Please use `recode_values()` instead.
saveRDS(Mex_X_USA_Sec,here::here("RDS", "Mex_X_USA_Sec.rds")) 

Exportaciones de México a Estados Unidos por Capítulo (HS”), secciones 16, 17 y 18

Descarga y almacenamiento de la base de datos principal

api_url <- "https://www.economia.gob.mx/apidatamexico/tesseract/data.jsonrecords?Chapter=16%2C17%2C18&Country=usa&Flow=2&cube=economy_foreign_trade_mun&drilldowns=Year%2CCountry%2CFlow%2CChapter%2CHS2&locale=es&measures=Trade+Value"
fetch_and_save_data(url = api_url, "RDS", "Mex_X_USA_Cap.rds")
Data saved successfully to: /cloud/project/RDS/Mex_X_USA_Cap.rds 
Mex_X_USA_Cap <- readRDS(here::here("RDS", "Mex_X_USA_Cap.rds"))

Mex_X_USA_Cap <- Mex_X_USA_Cap |> 
  # 1. Eliminamos las columnas innecesarias
  select(-c(`Country ID`, Country, `Flow ID`, Flow)) |> 
  # 2. Renombramos las variables al castellano
  rename(
    Año = Year,
    ID_Sección = `Chapter ID`,
    Sección = Chapter,
    ID_Capítulo = `HS2 ID`,
    Capítulo = HS2,
    Exportaciones = `Trade Value`
  ) |> 
  # 3. Creamos 'Cap' y convertimos a factor
  mutate(
    Cap = case_match(ID_Capítulo,
      1684 ~ "Reactores/Maq",
      1685 ~ "Electrónica",
      1786 ~ "Ferroviario",
      1787 ~ "Vehículos",
      1788 ~ "Aeroespacial",
      1789 ~ "Barcos",
      1890 ~ "Óptica/Médico",
      1891 ~ "Relojería",
      1892 ~ "Musicales",
      .default = as.character(ID_Capítulo)
    ),
    # Convertimos a factor las variables solicitadas
    Sección = as.factor(Sección),
    Capítulo = as.factor(Capítulo),
    Cap = as.factor(Cap)
  ) |> 
  # 4. Reorganizamos para que 'Cap' esté junto a su descripción
  relocate(Cap, .after = Capítulo)

saveRDS(Mex_X_USA_Cap,here::here("RDS", "Mex_X_USA_Cap.rds")) 

Exportaciones de México a Estados Unidos por Partida de las Secciones 16, 17 y 18

Carga y almacenamiento de la base de datos original

api_url <- "https://www.economia.gob.mx/apidatamexico/tesseract/data.jsonrecords?Chapter=16%2C17%2C18&Country=usa&Flow=2&cube=economy_foreign_trade_mun&drilldowns=Year%2CCountry%2CFlow%2CChapter%2CHS2%2CProduct+Level%2CHS4&locale=es&measures=Trade+Value"
fetch_and_save_data(url = api_url, "RDS", "Mex_X_USA_Part.rds")
Data saved successfully to: /cloud/project/RDS/Mex_X_USA_Part.rds 

Ajustes a la base de datos.

Identificar las 10 partidas más importantes en cada capítulo

# 1. Load the original data
Mex_X_USA_Part <- readRDS(here::here("RDS", "Mex_X_USA_Part.rds"))

# 1.1 Save source info
source <- attr(MexXMPaisINEGI, "source_info")

# 2. Filter for specific Capítulos (HS2) and Clean Names
# We use numeric codes 1684, 1685, 1787, 1890
Mex_X_USA_topPart <- Mex_X_USA_Part |>
  filter(`HS2 ID` %in% c(1684, 1685, 1787, 1890)) |>
  subset(select = c(Year, Chapter, HS2, HS4, `Trade Value`)) |>
  setNames(c("Año", "Sección", "Capítulo", "Partida", "Exportaciones"))

# 3. Identify Top 10 Partidas per Capítulo (HS2) based on 2020-2025
top_10_list <- Mex_X_USA_topPart |>
  filter(Año >= 2020 & Año <= 2025) |>
  group_by(Capítulo, Partida) |>
  summarise(Recent_Total = sum(Exportaciones, na.rm = TRUE), .groups = "drop") |>
  group_by(Capítulo) |>
  slice_max(order_by = Recent_Total, n = 10) |>
  select(Capítulo, Partida) |>
  mutate(Is_Top_10 = TRUE)

# 4. Group the non-leaders as "Otras" across all years
Mex_X_USA_topPart <- Mex_X_USA_topPart |>
  left_join(top_10_list, by = c("Capítulo", "Partida")) |>
  mutate(
    Partida_Final = ifelse(!is.na(Is_Top_10), as.character(Partida), "Otras")
  ) |>
  select(-Is_Top_10)

# 5. Adjuntar los metadatos

attr(Mex_X_USA_topPart,"source_info") <- source

#6 Save the intermediate file
saveRDS(Mex_X_USA_topPart, here::here("RDS", "Mex_X_USA_topPart.rds"))

# 7. Sanity Check: Confirm we have the 4 Capítulos
unique(Mex_X_USA_topPart$Capítulo)
[1] "Reactores Nucleares, Calderas, Maquinaria, Etc"        
[2] "Equipos Eléctricos, Electrónicos"                      
[3] "Vehículos"                                             
[4] "Aparatos Ópticos, Fotográficos, Técnicos, Médicos, Etc"

Crear nombres cortos para las partidas top

# 1. Load Step 1 data and preserve metadata
Mex_X_USA_topPart <- readRDS(here::here("RDS", "Mex_X_USA_topPart.rds"))


# 2. Comprehensive Cleaning and One-Word Mapping
Mex_X_USA_topPart <- Mex_X_USA_topPart |>
  mutate(
    # Rename Capítulo (HS2) for cleaner presentation
    Capítulo = case_when(
      Capítulo == "Reactores Nucleares, Calderas, Maquinaria, Etc" ~ "Reactores/Maq",
      Capítulo == "Equipos Eléctricos, Electrónicos" ~ "Electrónica",
      Capítulo == "Vehículos" ~ "Vehículos",
      Capítulo == "Aparatos Ópticos, Fotográficos, Técnicos, Médicos, Etc" ~ "Óptica/Médico",
      TRUE ~ as.character(Capítulo)
    ),
    # Map Partida_Final to single-word short names (Part)
    Part = case_when(
      Partida_Final == "Otras" ~ "Otras",
      
      # Recently identified items (2020-2025 leaders)
      grepl("Piezas para Motores", Partida_Final) ~ "PiezasMotores",
      Partida_Final == "Bombas para Líquidos" ~ "BombasLiq",
      Partida_Final == "Bombas de Aire o Bombas de Vacío" ~ "BombasAire",
      Partida_Final == "Refrigeradores, Congeladores y otros Equipos de Refrigeración o Congelación" ~ "Refrigeración",
      Partida_Final == "Aparatos para Filtrar o Purificar Líquidos o Gases" ~ "Filtros",
      Partida_Final == "Maquinaria y Aparatos Mecánicos que tienen Funciones Individuales, no Especificadas en otra Parte" ~ "MaqMecánica",
      Partida_Final == "Iluminación Eléctrica o Equipos de Señalización" ~ "Iluminación",
      Partida_Final == "Bicicletas y Demás Velocípedos (Incluidos los Triciclos de Reparto), sin Motor" ~ "Bicicletas",
      Partida_Final == "Circuitos Electrónicos Integrados" ~ "Circuitos",
      grepl("Carretillas Automóvil sin Dispositivo de Elevación", Partida_Final) ~ "Carretillas",
      Partida_Final == "Partes y Accesorios de Máquinas" ~ "PartesMaq",
      Partida_Final == "Máquinas y Aparatos no Especificados" ~ "OtrasMaq",

      # Chapter: Reactores/Maq & Electrónica
      Partida_Final == "Maquinaria para Aire Acondicionado" ~ "AireAcond",
      Partida_Final == "Máquinas y Unidades de Procesamiento de Datos, no Especificados o Incluidos en otro Lugar" ~ "Computación",
      Partida_Final == "Válvulas y Artículos Similares para Tuberías, Cubetas o Similares, Incluidas las Válvulas Reductoras de Presión y las Válvulas Controladas Termostáticamente" ~ "Válvulas",
      Partida_Final == "Motores y Generadores" ~ "MotoresGen",
      Partida_Final == "Transformadores de Potencia, Convertidores Estáticos e Inductores" ~ "Transformadores",
      Partida_Final == "Teléfonos, Incluidos los Teléfonos Móviles y los de otras Redes Inalámbricas" ~ "Teléfonos",
      Partida_Final == "Aparatos Eléctricos para Conmutar o Proteger Circuitos Eléctricos" ~ "Interruptores",
      Partida_Final == "Tableros, Consolas y otras Bases para el Control o Distribución de Electricidad" ~ "Tableros",
      Partida_Final == "Alambres y Cables Eléctricos" ~ "Cables",
      
      # Chapter: Vehículos
      Partida_Final == "Partes de Vehículos para Vías Férreas" ~ "PartesTren",
      Partida_Final == "Tractores (Excepto las Carretillas Tractor de la Partida 87.09)" ~ "Tractores",
      Partida_Final == "Automóviles y otros Vehículos Automóviles Diseñados Principalmente para el Transporte de Personas" ~ "Autos",
      Partida_Final == "Vehículos de Motor para el Transporte de Mercancías" ~ "Carga",
      Partida_Final == "Carrocerías de Vehículos Automóviles de las Partidas 87.01 a 87.05, Incluidas las Cabinas" ~ "Carrocerías",
      Partida_Final == "Partes y Accesorios de Vehículos Automotores" ~ "PartesAutos",
      Partida_Final == "Partes y Accesorios de Vehículos de las Partidas 87.11 a 87.13" ~ "PartesMotoBici",
      Partida_Final == "Remolques y Semirremolques para Cualquier Vehículo; los Demás Vehículos no Automóviles; sus Partes" ~ "Remolques",
      Partida_Final == "Vagones para Transporte de Mercancías sobre Carriles (Rieles)" ~ "Vagones",
      
      # Chapter: Óptica/Médico
      Partida_Final == "Partes de los Aparatos de las Partidas 88.01 u 88.02" ~ "Aeroespacial",
      Partida_Final == "Dispositivos de Cristal Líquido que no Constituyen Artículos Previstos en otros Títulos" ~ "LCD",
      Partida_Final == "Instrumentos y Aparatos Utilizados en Ciencias Médicas" ~ "DispMed",
      Partida_Final == "Mecanoterapia, Aparatos de Masaje; Respiración Artificial u otro Aparato de Respiración Terapéutico" ~ "TerapiaResp",
      Partida_Final == "Férulas u otros Artículos y Aparatos de Fractura; Artículos y Extremidades Artificiales; Audífonos" ~ "Ortopedia",
      Partida_Final == "Instrumentos y Aparatos para la Medida o Control del Caudal, Nivel, Presión u otras Características Variables de Líquidos o Gases" ~ "MediciónFlujo",
      Partida_Final == "Instrumentos y Aparatos para Medir la Viscosidad, la Porosidad, la Expansión, la Tensión Superficial o Similares para Mediciones de Calor, Sonido o Luz" ~ "ÓpticaFísica",
      Partida_Final == "Contadores de Gas, Líquido o Electricidad. Incluye los de Calibración" ~ "Contadores",
      Partida_Final == "Instrumentos y Aparatos para Medir o Detectar Radiación Alfa, Beta, Gamma, Rayos X, Cósmicos u otras Radiaciones Ionizantes" ~ "Radiación",
      Partida_Final == "Instrumentos, Aparatos y Máquinas para Medir o Verificar, no Especificados en otra Parte" ~ "MediciónEspec",
      Partida_Final == "Instrumentos y Aparatos de Regulación o Control" ~ "ControlReg",
      Partida_Final == "Monitores y Proyectores, que no Incorporan Aparatos de Recepción de Televisión" ~ "Monitores",
      
      TRUE ~ "Revisar"
    )
  )

# 3. Factorization
# Año remains numeric. Others converted to factors for plotting.
Mex_X_USA_topPart$Sección       <- factor(Mex_X_USA_topPart$Sección)
Mex_X_USA_topPart$Capítulo      <- factor(Mex_X_USA_topPart$Capítulo)
Mex_X_USA_topPart$Partida_Final <- factor(Mex_X_USA_topPart$Partida_Final)
Mex_X_USA_topPart$Part          <- factor(Mex_X_USA_topPart$Part)

# 4. Re-attach metadata and save
attr(Mex_X_USA_topPart,"source_info") <- source
saveRDS(Mex_X_USA_topPart, here::here("RDS", "Mex_X_USA_topPart.rds"))