Visualizaciones base datos comercio, inversion en Mexico y empleo IMMEX

Jorge Cornick, 11 de agosto 2025

library(tidyverse)
library(here)
library(forcats)

Exportaciones totales

El paquete here que fue cargado en el paso anterior nos ahorra dolores de cabeza al especificar el “path” en donde están los archvivos que necesitemos: simplemente pasamos el nombre de la carpeta y del archivo que nos interesan como argumentos a here, y esta determina el “path” y lo pasa a load().

load(here("Data", "MexXMtotpais.RData"))

El nombre del data frame es un poco extenso, lo cual es conveniente para recordar su contenido, pero inconveniente a la hora de escribir código, así que creamos una base de datos temporal con un nombre mucho más corto. Para evitar ocupar espacio de memoria con dos bases de datos idénticas, eliminamos MexXMtotpais una vez que hemos creado xm

xm <- MexXMtotpais
names(xm)
[1] "Año"           "Pais"          "Importaciones" "Exportaciones"
rm(MexXMtotpais)

Los nombres de variables de dos palabras requieren de manejo especial en R, así que para simplificar, reducimos el nombre de Estados Unidos a USA. Nótese que en la línea de código que sigue la variable País se ha escrito entre comillas. Ello es necesario debido al uso de la tilde, que puede confundir a R.

Un detalle importante. El título y subtítulo del gráfico están definidos en la parte superior, que son instrucciones para Quarto a la hora de reproducir (render) el documento, pero no aparecen en la consola cuando el código se ejecuta dentro de Quarto.

A USA

1993-2024

Código
xm |>  
  filter(Pais == "USA", Año < 2025) |> 
  ggplot(aes(Año, Exportaciones/1000))+
  theme_bw()+
  scale_color_brewer(palette = "Dark2")+
  scale_x_continuous(breaks = seq(from =1993, to = 2024, by = 2)) +
  geom_line(linewidth = 1, color = "steelblue4")+
  geom_smooth(color = "steelblue1", 
              fill = "steelblue1", alpha = 0.4)+
  labs(
    x = "",
    y = "", 
    caption = "J.Cornick con base en Data Mexico "
  )
Figura 1: Mexico, exportaciones totales a USA, 1993 - 2024
(En miles de millones de US $)

2015-2024

Código
xm |>  
  filter(Pais == "USA", Año > 2014 & Año < 2025) |> 
  ggplot(aes(Año, Exportaciones/1000))+
  theme_bw()+
  scale_color_brewer(palette = "Dark2")+
  scale_x_continuous(breaks = seq(from =2015, to = 2024, by = 1)) +
  geom_line(linewidth = 1, color = "steelblue4")+
  geom_smooth(color = "steelblue1", 
              fill = "steelblue1", alpha = 0.4)+
  labs(
    x = "",
    y = "",
    caption = "J.Cornick con base en Data Mexico"
  )+
  theme(legend.position = "bottom")
Figura 2: Mexico, exportaciones totale a USA, 2011 - 2024
(En miles de millones de US $)

Otros socios comericales

1993-2024

Código
xm |>  
  filter(Pais != "USA" & Pais != "Otros", Año < 2025) |> 
  ggplot(aes(Año, Exportaciones/1000, color = Pais))+
  theme_bw()+
  scale_color_brewer(palette = "Dark2")+
  scale_x_continuous(breaks = seq(from =1993, to = 2024, by = 2)) +
  geom_line(linewidth = 1)+
  geom_smooth(aes(fill = Pais), alpha = 0.2, linetype = 3)+
  labs(
    x = "",
    y = "",
    fill = "",
    color = "",
    caption = "J.Cornick con base en Data Mexico"
  )+
  theme(legend.position = "bottom")
Figura 3: Mexico, exportaciones totales, países seleccionados, 1993 - 2024
(En miles de millones de US $)

2015-2024

Código
xm |>  
  filter(Pais != "USA" & Pais != "Otros", Año >2014 & Año < 2025) |> 
  ggplot(aes(Año, Exportaciones/1000, color = Pais))+
  theme_bw()+
  scale_color_brewer(palette = "Dark2")+
  scale_x_continuous(breaks = seq(from =2015, to = 2024, by = 1)) +
  geom_line(linewidth = 1)+
  geom_smooth(aes(fill = Pais), alpha = 0.2, linetype = 3)+
  labs(
    x = "",
    y = "",
    fill = "",
    color = "",
    caption = "J.Cornick con base de Data Mexico"
  )+
  theme(legend.position = "bottom")
Figura 4: Mexico, exportaciones totales, países seleccionados, 2011 - 2024
(En miles de millones de US $)

USA y resto del mundo, proporciones

1993-2024

Código
xm_percentages <- xm |>
  filter(Pais %in% c("USA", "Otros")) |>
  group_by(Año) |>
  mutate(percent_valor = Exportaciones / sum(Exportaciones, na.rm = TRUE)) |>
  ungroup()

ggplot(xm_percentages, aes(x = Año, y = percent_valor, fill = Pais)) +
  theme_bw() + # Use a clean black-and-white theme
  scale_fill_brewer(palette = "Dark2") + # Use the specified color palette for fill
  geom_col(position = "stack") + # Stacks the pre-calculated percentages
  scale_x_continuous(breaks = seq(from = 1995, to = 2025, by = 5)) + # Display labels every 5 years
  scale_y_continuous(
    breaks = seq(0, 1, by = 0.1), # Set breaks at 10% increments
    labels = scales::percent # Formats the y-axis as percentages
  ) +
  geom_hline(
    yintercept = seq(0.1, 0.9, by = 0.1), # Add horizontal lines for each break
    color = "white",
    linetype = "dashed",
    linewidth = 0.5
  ) +
  labs(
    x = "",
    y = "",
    fill = "",
    color = "",
    caption = "J.Cornick con base de Data Mexico"
    )+
  theme(legend.position = "bottom")
Figura 5: Mexico, distribucion porcentual de las exportaciones, 1993 - 2024
(Estados Unidos y resto del mundo)

2015-2024

Código
xm_percentages <- xm |>
  filter(Pais %in% c("USA", "Otros"), Año >2014 & Año < 2025) |>
  group_by(Año) |>
  mutate(percent_valor = Exportaciones / sum(Exportaciones, na.rm = TRUE)) |>
  ungroup()

ggplot(xm_percentages, aes(x = Año, y = percent_valor, fill = Pais)) +
  theme_bw() + # Use a clean black-and-white theme
  scale_fill_brewer(palette = "Dark2") + # Use the specified color palette for fill
  geom_col(position = "stack") + # Stacks the pre-calculated percentages
  scale_x_continuous(breaks = seq(from = 2015, to = 2025, by = 1)) + # Display labels every 5 years
  scale_y_continuous(
    breaks = seq(0, 1, by = 0.1), # Set breaks at 10% increments
    labels = scales::percent # Formats the y-axis as percentages
  ) +
  geom_hline(
    yintercept = seq(0.1, 0.9, by = 0.1), # Add horizontal lines for each break
    color = "white",
    linetype = "dashed",
    linewidth = 0.5
  ) +
  labs(
    x = "",
    y = "",
    fill = "",
    color = "",
    caption = "J.Cornick con base de Data Mexico"
      ) +
  theme(legend.position = "bottom")
Figura 6: Mexico, distribucion porcentual de las exportaciones, 1993 - 2024
(Estados Unidos y resto del mundo)

Importaciones totales

De USA

1993-2024

Código
xm |>  
  filter(Pais == "USA", Año < 2025) |> 
  ggplot(aes(Año, Importaciones/1000))+
  theme_bw()+
  scale_color_brewer(palette = "Dark2")+
  scale_x_continuous(breaks = seq(from =1993, to = 2024, by = 2)) +
  geom_line(linewidth = 1, color = "steelblue4")+
  geom_smooth(color = "steelblue1", 
              fill = "steelblue1", alpha = 0.2)+
  labs(
    x = "",
    y = "", 
    caption = "J.Cornick con base en Data Mexico "
  )
Figura 7: Mexico, importaciones totales de USA, 1993 - 2024
(En miles de millones de US $)

2015-2024

Código
xm |>  
  filter(Pais == "USA", Año > 2014 & Año < 2025) |> 
  ggplot(aes(Año, Importaciones/1000))+
  theme_bw()+
  scale_color_brewer(palette = "Dark2")+
  scale_x_continuous(breaks = seq(from =2015, to = 2024, by = 1)) +
  geom_line(linewidth = 1, color = "steelblue4")+
  geom_smooth(color = "steelblue1", 
              fill = "steelblue1", alpha = 0.4)+
  labs(
    x = "",
    y = "",
    caption = "J.Cornick con base en Data Mexico"
  )+
  theme(legend.position = "bottom")
Figura 8: Mexico, importaciones totale a USA, 2011 - 2024
(En miles de millones de US $)

Otros socios comerciales

1993-2024

Código
xm |>  
  filter(Pais != "USA" & Pais != "Otros", Año < 2025) |> 
  ggplot(aes(Año, Importaciones/1000, color = Pais))+
  theme_bw()+
  scale_color_brewer(palette = "Dark2")+
  scale_x_continuous(breaks = seq(from =1993, to = 2024, by = 2)) +
  geom_line(linewidth = 1)+
  geom_smooth(aes(fill = Pais), alpha = 0.2, linetype = 3)+
  labs(
    x = "",
    y = "",
    fill = "",
    color = "",
    caption = "J.Cornick con base en Data Mexico"
  )+
  theme(legend.position = "bottom")
Figura 9: Mexico, importaciones totales, países seleccionados, 1993 - 2024
(En miles de millones de US $)

2015-2024

Código
xm |>  
  filter(Pais != "USA" & Pais != "Otros", Año >2014 & Año < 2025) |> 
  ggplot(aes(Año, Exportaciones/1000, color = Pais))+
  theme_bw()+
  scale_color_brewer(palette = "Dark2")+
  scale_x_continuous(breaks = seq(from =2015, to = 2024, by = 1)) +
  geom_line(linewidth = 1)+
  geom_smooth(aes(fill = Pais), alpha = 0.2, linetype = 3)+
  labs(
    x = "",
    y = "",
    fill = "",
    color = "",
    caption = "J.Cornick con base de Data Mexico"
  )+
  theme(legend.position = "bottom")
Figura 10: Mexico, importacionones totales, países seleccionados, 2011 - 2024
(En miles de millones de US $)

USA y resto del mundo, proporciones

1993-2024

Código
xm_percentages <- xm |>
  filter(Pais %in% c("USA", "Otros")) |>
  group_by(Año) |>
  mutate(percent_valor = Importaciones / sum(Importaciones, na.rm = TRUE)) |>
  ungroup()

ggplot(xm_percentages, aes(x = Año, y = percent_valor, fill = Pais)) +
  theme_bw() + # Use a clean black-and-white theme
  scale_fill_brewer(palette = "Dark2") + # Use the specified color palette for fill
  geom_col(position = "stack") + # Stacks the pre-calculated percentages
  scale_x_continuous(breaks = seq(from = 1995, to = 2025, by = 5)) + # Display labels every 5 years
  scale_y_continuous(
    breaks = seq(0, 1, by = 0.1), # Set breaks at 10% increments
    labels = scales::percent # Formats the y-axis as percentages
  ) +
  geom_hline(
    yintercept = seq(0.1, 0.9, by = 0.1), # Add horizontal lines for each break
    color = "white",
    linetype = "dashed",
    linewidth = 0.5
  ) +
  labs(
    x = "",
    y = "",
    fill = "",
    color = "",
    caption = "J.Cornick con base de Data Mexico"
    )+
  theme(legend.position = "bottom")
Figura 11: Mexico, distribucion porcentual de las importaciones, 1993 - 2024
(Estados Unidos y resto del mundo)

2015-2024

Código
xm_percentages <- xm |>
  filter(Pais %in% c("USA", "Otros"), Año >2014 & Año < 2025) |>
  group_by(Año) |>
  mutate(percent_valor = Importaciones / sum(Importaciones, na.rm = TRUE)) |>
  ungroup()

ggplot(xm_percentages, aes(x = Año, y = percent_valor, fill = Pais)) +
  theme_bw() + # Use a clean black-and-white theme
  scale_fill_brewer(palette = "Dark2") + # Use the specified color palette for fill
  geom_col(position = "stack") + # Stacks the pre-calculated percentages
  scale_x_continuous(breaks = seq(from = 2015, to = 2025, by = 1)) + # Display labels every 5 years
  scale_y_continuous(
    breaks = seq(0, 1, by = 0.1), # Set breaks at 10% increments
    labels = scales::percent # Formats the y-axis as percentages
  ) +
  geom_hline(
    yintercept = seq(0.1, 0.9, by = 0.1), # Add horizontal lines for each break
    color = "white",
    linetype = "dashed",
    linewidth = 0.5
  ) +
  labs(
    x = "",
    y = "",
    fill = "",
    color = "",
    caption = "J.Cornick con base de Data Mexico"
      ) +
  theme(legend.position = "bottom")
Figura 12: Mexico, distribucion porcentual de las importaciones, 1993 - 2024
(Estados Unidos y resto del mundo)

Exportaciones por producto

load(here("Data", "MexXMproducto.RData"))
xm <- MexXMproducto
rm(MexXMproducto)

Primero graficamos las exportaciones de todos los capítulos, para darnos una idea de orden de magnitud.

Un detalle técnico que puede ser de interés: como vamos a graficar muchas variables, puede ser difícil identificar cuál etiqueta, en la parte derecha del gráfico, corresponde a cual línea en el cuerpo del gráfico. Para evitar confusiones, es conveniente que las etiquetas en la parte derecha aparezcan en el mismo orden en que aparecen las líneas en el cuerpo del gráfico en la última observación. El código que sigue logra esto. Se han incluido comentarios explicativos por ser la primera vez que se utiliza esta técnica en este documento.

Todos 1993-2024

Código
xm |>
  arrange(Trimestre) |>
  # Si nuestras observaciones están ordenadas por Trimestre, como es el caso, este paso no es estrictamente necesario.  Sin embargo, "mejores prácticas" aconseja incluirlo, para protegernos de la posibilidad de que en algún paso anterior del análisis la base de datos haya sido reordenada con otros criterios.
  mutate(Capítulo = fct_reorder(Capítulo, desc(Exportaciones), .fun = last)) |>
  # Esta segunda línea asegura que los factores se ordenen según el valor que tienen en la última observación, y con eso logramos que las etiquetas se ordenen con ese mismo criterio
  ggplot(aes(Trimestre, Exportaciones/1000, color = Capítulo)) +
  theme_bw() + # Use a clean black-and-white theme
  scale_fill_brewer(palette = "Dark2") + # Use the specified color palette for fill
  scale_x_continuous(
    breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 2), # Label every year
    minor_breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 0.25)
    ) + # Tick mark every trimester
    geom_line(linewidth = .5) +
  labs(color = "Capítulo", 
       caption = "J.Cornick con base en Data México")
Figura 13: Mexico, exportaciones trimestrales por producto, 1993 - 2024
(en miles de millones US $)

La escala de los datos sugiere la conveniencia de crear un gráfico para Máquinas, Transporte y Minerales, y otro para las demás variables.

Primero, entonces, graficamos Máquinas, Transporte y Minerales

Máquinas, transporte y minerales 1993-2024

Código
xm |>
  filter(Capítulo %in% c("Máquinas", "Transporte", "Minerales")) |> 
  arrange(Trimestre) |>
  mutate(Capítulo = fct_reorder(Capítulo, desc(Exportaciones), .fun = last)) |>
  ggplot(aes(Trimestre, Exportaciones/1000, color = Capítulo)) +
  theme_bw() + 
  scale_fill_brewer(palette = "Dark2") + 
  scale_x_continuous(
    breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 2), 
    minor_breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 0.25)
    ) + 
    geom_line(linewidth = 0.75) +
  labs(color = "Capítulo", 
       caption = "J.Cornick con base en Data México")
Figura 14: Mexico, exportaciones trimestrales de Máquinas, Transporte y Minerales, 1993 - 2024
(en miles de millones US $)

Máquinas, transporte y minerales 2015-2024

En este gráfico, además de hacer un “zoom” en el periodo más reciente, hay varios detalles que conviene explicar.

  • Como queremos que la linda de datos (continua) y la de tendencias (puntos) sean del mismo color, y además queremos evitar que los intervalos de confianza sean de color gris pálido, en ggplot(aes()) definimos tanto “color” como “fill”. Luego, definimos escalas de color tanto para “color” como para “fill”. Finalmente, para evitar que se impriman dos cajas con leyendas a la derecha, una para cada geom_(), añadimos la línea “guides(fill =”none”).
Código
xm |>
  filter(Capítulo %in% c("Máquinas", "Transporte", "Minerales")) |> 
  filter(Trimestre > 2014.75) |> 
  arrange(Trimestre) |>
  mutate(Capítulo = fct_reorder(Capítulo, desc(Exportaciones), .fun = last)) |>
  ggplot(aes(Trimestre, Exportaciones/1000, color = Capítulo, fill = Capítulo)) +
  theme_bw() + 
  scale_color_brewer(palette = "Dark2") + 
  scale_fill_brewer(palette = "Dark2")+
  scale_x_continuous(
    breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 1), 
    minor_breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 0.25)
    ) + 
    geom_line(linewidth = 0.75) +
    geom_smooth(alpha = 0.2, linetype = 3) +
  labs(
    color = "Capítulo", 
    caption = "J.Cornick con base en Data México",
    x = "",
    y = "Miles de millones, US ")+
  guides(fill = "none")
Figura 15: Mexico, exportaciones trimestrales de Máquinas, Transporte y Minerales, 2015-1 - 2025-1
(en miles de millones US $)

Si graficamos ahora todos los demás productos, tenemos un gráfico que todavía contiene demasiada información, incluyendo productos de poca importancia en el total de exportaciones:

Los demás

Código
xm |>
  filter(!(Capítulo %in% c("Máquinas", "Transporte", "Minerales"))) |> 
  arrange(Trimestre) |>
  mutate(Capítulo = fct_reorder(Capítulo, desc(Exportaciones), .fun = last)) |>
  ggplot(aes(Trimestre, Exportaciones/1000, color = Capítulo)) +
  theme_bw() + 
  scale_fill_brewer(palette = "Dark2") + 
  scale_x_continuous(
    breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 2), 
    minor_breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 0.25)
    ) + 
    geom_line(linewidth = .75) +
  labs(color = "Capítulo", 
       caption = "J.Cornick con base en Data México")
Figura 16: Mexico, exportaciones trimestrales otros productos, 1993 - 2024
(en miles de millones US $)

Como último paso, entonces, vamos a crear un gráfico únicamente con los cinco productos más importantes después de Máquinas, Transporte y Minerales, y dejando de lado la categoría “Otros”

Top 5 excluyendo máquinas, transporte, minerales y “otros”

Código
xm |>
  filter(Capítulo %in% c("Instrumentos", "Alimentos", "Vegetales", "Rieles", "Plásticos")) |> 
  arrange(Trimestre) |>
  mutate(Capítulo = fct_reorder(Capítulo, desc(Exportaciones), .fun = last)) |>
  ggplot(aes(Trimestre, Exportaciones/1000, color = Capítulo)) +
  theme_bw() + 
  scale_fill_brewer(palette = "Dark2") + 
  scale_x_continuous(
    breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 2), 
    minor_breaks = seq(min(xm$Trimestre), max(xm$Trimestre), by = 0.25)
    ) + 
    geom_line(linewidth = .75) +
  labs(color = "Capítulo", 
       caption = "J.Cornick con base en Data México")
Figura 17: Mexico, exportaciones trimestrales otros productos, 1993 - 2024
(en miles de millones US $)

Próximos pasos

Podemos considerar dos pasos adicionales: hacer un “zoom” en el período 2015-2024, y luego seleccionar los capítulos clave para los cuales nos gustaría examinar datos más desagregados, que afortunadamente están disponibles en Mexico Data.

También podríamos considerar si conviene trabajar con datos trimestrales, o si podría ser conveniente usar datos anuales, puesto que la variabilidad estacional no es de interés para nuestros propósitos.

Inversión extranjera directa

Empleo y otros datos IMMEX