Análisis de la balanza comercial mexicana

Comercio
Déficit
Superávit
R
Author

Roberto Valdez Rivera

Published

April 6, 2025

Ante la reciente amenaza de la imposición de aranceles a las importaciones extadounidenses por parte del gobierno del Presidente Donald Trump –considerando que ya se han establecido a los autómoviles, acero y alumunio el 25% por parte de lo procedente de México– es necesario analizar el comportamiento histórico que ha tenido la relación comercial México-Estados Unidos.

El desarrollo del presente proyecto tiene como finalidad analizar el comportamiento histórico que ha tenido la balanza comercial de mercancías de México. El estudio se reduce a los principales países que desepeñan un rol considerable en la procedencia de las exportaciones e importaciones nacionales, por lo que resultó necesario agrupar a las demás naciones.

Las información se obtuvo por medio de la conexión de una API a los datos disponibles del Banco de México sobre la balanza comercial desagregada por países. Consúltese el catálogo de series para más información. La posterior limpieza, transformación y visualziación de los datos se realizó en R.

1. Paquetes a utilizar

Code
library(siebanxicor)
library(dplyr)
library(ggplot2)
library(lubridate)
library(tidyr)
library(scales)
library(plotly)

2. Conexión con la información del Banco de México

Code
hoy <- Sys.Date()

token = "4985a72114493ee2710570247deb9745b39244dd5ec0855dbdea277277a23685"

setToken(token)

idSeries <- c("SE29146", #Total exportaciones
              "SE27277", #Exportaciones a Estados Unidos
              "SE27276", #Exportaciones a Canadá
              "SE27342", #Exportaciones a China
              "SE29147", #Total importaciones
              "SE27544", #Importaciones de Estados Unidos
              "SE27543", #Importaciones de Canadá
              "SE27609" #Importaciones de China
              )

metadatos <- getSeriesMetadata(idSeries)

series <- getSeriesData(idSeries, "2000-01-01", hoy)  

df<- as.data.frame(series)

3. Primera limpieza y transformación

Code
df <- df[,-c(3,5,7,9,11,13,15)]

df <- rename(df, "fecha"=colnames(df)[1],
              "total_x"="SE29146.value", #Exportaciones Totales
              "est_uni_x"="SE27277.value", #Exportaciones a Estados Unidos
              "canada_x"="SE27276.value", #Exportaciones a Canadá
              "china_x"= "SE27342.value", #Exportaciones a China
              "total_m"="SE29147.value", #Total Importaciones
              "est_uni_m"="SE27544.value", #Importaciones de Estados Unidos
              "canada_m"="SE27543.value", #Importaciones de Canadá
              "china_m"="SE27609.value" #Importaciones de China
            )

# Transformar datos a millones de dólares
for (col in colnames(df)) {
  if (col == "fecha") {
    next  # Salta esta iteración del bucle
  }
  # Operaciones para las demás columnas
  df[[col]] <- (df[[col]] / 1000)
}

sumar_por_año_todas <- function(datos) {
  datos %>%
    mutate(Año = year(ymd(fecha))) %>%  # Extraer el año
    group_by(Año) %>%                   # Agrupar por año
    summarize(across(where(is.numeric), sum, na.rm = TRUE))  # Sumar columnas numéricas
}

df <- sumar_por_año_todas(df)

df$Año <- as.Date(paste0(df$Año, "-01-01"))

df <- mutate(df, otro_x= total_x-(est_uni_x+canada_x+china_x), 
            otro_m=total_m-(est_uni_m+canada_m+china_m))

#======= Formato largo Exportaciones:
x <- df %>% select(Año, est_uni_x, canada_x, china_x,otro_x, total_x)

x_l <-x%>% select(-total_x)%>% 
  pivot_longer(cols=c(est_uni_x, canada_x, china_x, otro_x),
               names_to = "variable",
               values_to="Valor")

x_l <- mutate(x_l, Pais= case_when(variable == "est_uni_x" ~ "Estados Unidos",
                                   variable == "canada_x" ~ "Canadá",
                                   variable == "china_x" ~ "China",
                                   TRUE ~ "Otros paises"))

#========= Formato largo importaciones:
m <- df %>% select(Año,est_uni_m,canada_m,china_m,otro_m, total_m)

m_l <-m%>% select(-total_m)%>% 
  pivot_longer(cols=c(est_uni_m, canada_m, china_m, otro_m),
                    names_to = "variable",
                    values_to="Valor")

m_l <- mutate(m_l, Pais= case_when(
  variable == "est_uni_m" ~ "Estados Unidos",
  variable == "canada_m" ~ "Canadá",
  variable == "china_m" ~ "China",
  TRUE ~ "Otros paises"
))

4. Gráficas: Exportaciones e importaciones

Code
gx <- x_l %>% filter(Año<"2025-01-01") %>%
    ggplot(aes(x=Año, y=Valor, fill=Pais))+geom_bar(stat="identity", alpha=0.6)+
    theme_classic()+
    scale_x_date(date_breaks = "3 years", 
                 date_labels = "%Y")+
    scale_y_continuous(labels=label_number())+
    labs(title="Gráfica 1. Destino de las exportaciones mexicanas \nMillones de dólares",
         caption= "Fuente: Elaboración propia con base en datos del SIE, Banxico.",
         y=" ",x="")+
    scale_fill_manual(values = c("Canadá"="red",
                                  "Estados Unidos"="dodgerblue",
                                  "China" = "gold",
                                  "Otros paises"="green3"))+
    theme(legend.position = "bottom",
          legend.title = element_blank(),
          panel.grid.major.y = element_line(),
          panel.grid.minor.y = element_line(),
          axis.text.x = element_text(size=10),
          axis.text.y = element_text(size=10),
          legend.text = element_text(size=10),
          plot.title = element_text(size=12),
          axis.line.y=element_line(color="azure4"),
          axis.line.x = element_line(color="azure4"),
          axis.title.y=element_text(size=10))

ggplotly(gx) %>%
  layout(
    legend = list(
      x = 0.5,  # Posición horizontal (0: izquierda, 1: derecha)
      y = -0.2, # Posición vertical (0: abajo, 1: arriba)
      xanchor = "center", # Anclar al centro
      orientation = "h"   # Cambiar a orientación horizontal
    )
  )
Code
gm <- m_l%>% filter(Año<"2025-01-01") %>%
  ggplot(aes(x=Año, y=Valor, fill=Pais))+geom_bar(stat="identity", alpha=0.6)+
    theme_classic()+
    scale_x_date(date_breaks = "3 years",
                 date_labels = "%Y")+
    scale_y_continuous(labels=label_number())+
    labs(title="Gráfica 2. Procedencia de las importaciones mexicanas \nMillones de dólares",
         caption= "Fuente: Elaboración propia con base en datos del SIE, Banxico.",
         y="",x="")+
    scale_fill_manual(values = c("Canadá"="red",
                                  "Estados Unidos"="dodgerblue",
                                  "China" = "gold",
                                  "Otros paises"="green3"))+
    theme(legend.title = element_blank(),
          panel.grid.major.y = element_line(),
          panel.grid.minor.y = element_line(),
          axis.text.x = element_text(size=10),
          axis.text.y = element_text(size=10),
          legend.text = element_text(size=10),
          plot.title = element_text(size=12),
          axis.line.y=element_line(color="azure4"),
          axis.line.x = element_line(color="azure4"),
          axis.title.y=element_text(size=10))

ggplotly(gm) %>%
  layout(
    legend = list(x = 0.5,y = -0.2,xanchor = "center", orientation = "h")
  )

5. Segunda transformación

Code
df1 <- df %>% mutate(total = (total_x-total_m), canada=(canada_x-canada_m),
              est_uni=(est_uni_x-est_uni_m), china=(china_x-china_m)) %>% 
  select(Año, total, canada, est_uni, china)%>% filter(Año<"2025-01-01")

#====== Formato largo:
df1_l <- df1 %>% pivot_longer(cols= c(total, china, est_uni, canada),
                              values_to = "Valor", names_to = "Paises")

df1_l <- df1_l %>% mutate(Pais = case_when(Paises== "total"~ "Total",
                                           Paises == "est_uni"~ "Estados Unidos",
                                           Paises == "canada" ~ "Canadá",
                                           TRUE ~ "China"))

6. Gráfica de serie temporal

Code
gp <- ggplot(df1_l)+geom_line(aes(x=Año, y=Valor,color=Pais),linewidth=1, alpha=0.7)+
  geom_hline(yintercept = 0, linetype = "dashed")+
  theme_classic()+scale_x_date(date_breaks = "3 years",
                 date_labels = "%Y")+
  labs(title = "Gráfica 3. Superávit y Déficit comercial de México con los países seleccionados \nMillones de dólares",
       caption= "Fuente: Elaboración propia con base en datos del SIE, Banxico.",
        x="",y="")+
  scale_y_continuous(labels=label_number())+
  scale_color_manual(values = c("Canadá"="red",
                                  "Estados Unidos"="dodgerblue",
                                  "China" = "gold",
                                  "Otros paises"="green3",
                                "Total"= "black"))+
  theme(legend.position = c(0.15,0.8),
          legend.title = element_blank(),
          axis.text.x = element_text(size=10),
          axis.text.y = element_text(size=10),
          legend.text = element_text(size=10),
          plot.title = element_text(size=12),
          axis.line.y=element_line(color="azure4"),
          axis.line.x = element_line(color="azure4"),
          plot.caption = element_text(hjust=0))

ggplotly(gp) %>%
  layout(
    legend = list(x = 0.5,y = -0.2,xanchor = "center", orientation = "h")
  )