Presentación

Esta publicación tiene dos objetivos, uno personal y otro general. El objetivo personal es poder tener un apunte en limpio sobre el uso de la API del INEGI por medio de la librería inegiR, pues no suelo usar esta herramienta a menudo para mis propios análisis. El segundo objetivo, el general, es replicar el cálculo de la descomposición de las presiones del deflactor del PIB anual para México, con base en la metodología propuesta por la CONASAMI.

No asumo que mi código sea el más eficiente o esté libre de errores, así que cualquier corrección, sugerencia o comentario házmelo saber por este medio o a través de mi twitter ecodiegoale.

En este blog haré uso de funciones personalizadas, si te interesa profundizar sobre la programación de funciones, te recomiendo leer R for Data Science de H. Wickham y G. Grolemund, disponible en este enlace.

Además, nunca está de más revisar stackoverflow, github, rpubs o preguntarle a ChatGPT.

Aviso: Si algún link no abre con click izquierdo, trata con el derecho y abrir en otra ventana o pestaña.

Contenido

En este blog se hará uso de la API de INEGI de una manera muy sencilla utilizando principalmente la librería de tidyverse. Lo que haremos será descomponer la tasa de crecimiento del deflactor implícito del PIB de México para ver qué factores la presionan más, los impuestos, las ganancias de capital o las remuneraciones al trabajo. Dicho cálculo se elabora con base en la metodología propuesta por la CONASAMI.

Preparación

Lo primero será definir tu directorio de trabajo y cargar las librerías necesarias para el análisis.

#setwd("C:/Users/tu carpeta")

rm(list = ls()) #para borrar todos los objetos en la memoria de la consola
options(scipen=999) #para desactivar la notación científica

#Si no cuentas con los paquetes, usa el comando install.packages("ejemplo")

library(tidyverse)
library(scales)
library(ggthemes)
library(writexl)

Conforme avancemos en el blog haré mención de cuando estemos usando las librerías cargadas.

Cómo comenzar a usar la API de INEGI

Paso 1: instalación y token

Lo primero será instalar y llamar a la librería inegiR.

#install.packages("inegiR")
library(inegiR)

Recomiendo dar una revisada a la documentación de la librería. Puedes revisar el archivo PDF en este enlace.

Después entraremos al siguiente enlace para poder generar un token con el que podremos tener acceso a las series que nos interesan.

Accediendo al enlace, veremos la página del INEGI de la siguiente manera y hacemos click donde está señalado, en Constructor de Consultas.

Luego de esto, desplazamos el cursor y bajamos un poco en la página hasta encontrar el botón para registrarnos y obtener el token.

Solo bastará con poner nuestro correo, y a los pocos minutos nos llegará el token.

Después, copiamos y almacenamos dicho token en un objeto como sigue:

token <- "902b3680-7fa3-f347-be48-c59ca5710ca4"

Paso 2: Selección de variables (cuentas nacionales y encuestas de empleo)

Para este paso es necesario primeramente leer el documento metodológico donde se explica el cálculo. Puedes consultarlo en este enlace.

Por ahora mencionaré las variables que se necesitan. Estas variables son de dos naturalezas y fuentes diferentes.

Ingresos Población
Variables Remuneraciones a los asalariados, impuestos netos de subsidios y excedente bruto de operación Población ocupada total, población ocupada remunerada y población ocupada no asalariada
Fuentes Producto interno bruto por el Método del ingreso Encuestas de empleo y ocupación

Las variables relacionadas con ingreso se derivan del sistema de cuentas nacionales. Recomiendo leer la Guía Rápida de Cuentas Nacionales del INEGI si no estás familiarizado con las cuentas nacionales.

Las variables relacionadas con población ocupada se derivan de la Encuesta Nacional de Empleo y Ocupación (ENOE), que el INEGI realiza de manera trimestral. Si deseas indagar más al respecto puedes leer Cómo se hace la ENOE, documento elaborado por el INEGI.

Constructor de consultas

Para poder ver las variables que necesitamos debemos acceder al Constructor de consultas y a los metadatos del conjunto de datos del Banco de información Económica (BIE).

Una vez configurado lo anterior, nos vamos al menú de Indicador y hacemos click:

Se va a desplegar un menú y haremos las siguientes selecciones:

A continuación, te daré las rutas a seguir para elegir las variables en el catálogo de la API.

Como viste en la imagen anterior, hay dos fuentes de indicadores que necesitamos: Ocupación, empleo y remuneraciones y Cuentas Nacionales.

Vamos primero con las Cuentas Nacionales. La ruta queda así:

  • Cuentas Nacionales
    • Cuentas de bienes y servicios, base 2018
      • A precios corrientes
        • Cuenta de generación del ingreso
          • Usos
            • Remuneraciones a los asalariados
              • Total
            • Impuestos sobre la producción y las importaciones
              • Menos: Subsidios
              • Excedente bruto de operación
          • Recursos
            • Valor agregado bruto/ PIB, a precios de mercado
      • Índice de precios implícitos, 2018=100
        • Producto interno bruto total
          • Producto interno bruto

Ahora vamos con las series de Ocupación, empleo y remuneraciones:

  • Población ocupada, subocupada y desocupada (resultados trimestrales de la ENOE, 15 años y más)
    • Valores absolutos
      • Nacional
        • Total
          • Población ocupada
            • Por posición en la ocupación
              • Total
                • Trabajadores subordinados y remunerados
                  • Total
                • Empleadores
                • Trabajadores por cuenta propia
                • Trabajadores no remunerados

Una vez seleccionadas nuestras variables, se generará el URL de la API. Hay que copiar ese link.

Dentro de dicho URL habrá un espacio que dirá “[Aquí va tu Token]”. En ese espacio pegamos el token tal como nos llegó al correo, con todo y “[]”.

Luego hacemos lo siguiente:

url <- "https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/CL_INDICATOR/724014,724017,724023,724024,724025,783867/es/BIE/2.0/902b3680-7fa3-f347-be48-c59ca5710ca4?type=xml"

download.file(url, "metadata.xml", method = "auto")

Lo que sucederá es que en tu directorio de trabajo aparecerá un archivo HTML que se llamará metadata. Abre ese archivo, debe lucir parecido a esto:

Aquí estarán las series que elegimos y su identificador, el cual es una combinación numérica que va debajo del nombre de la serie.

Construir el dataframe

Con lo anterior ahora ya sabemos los ID de nuestras variables. Lo que sigue es almacenar esos ID es una lista.

# Lista de tus series con los IDs
series <- list(
  #Series de Cuentas Nacionales
  RA = "724014",
  ISPI = "724017",
  S = "724023",
  EBO = "724024",
  PIB = "724025",
  #Deflactor del PIB
  P = "783867",
  #Series de Población ocupada
  POT = "289272",
  POR = "289273",
  POE = "289274",
  POCP = "289275",
  PONR = "289276"
)

La descripción de las variables es la siguiente:

  • \(RA=\)remuneraciones a los asalariados
  • \(ISPI=\)impuestos sobre la producción e importaciones
  • \(S=\)subsidios
  • \(EBO=\)excedente bruto de operación
  • \(PIB=\)producto interno bruto
  • \(P=\)deflactor del PIB
  • \(POT=\)población ocupada total
  • \(POR=\)población ocupada remunerada
  • \(POE=\)población ocupada empleadora
  • \(POCP=\)población ocupada por cuenta propia
  • \(PONR=\)población ocupada no remunerada

Cabe aclarar que las variables de cuentas nacionales están en millones de pesos corrientes y las de población son el número de personas.

inegiR

Ahora para extraer las series vamos a usar la función inegi_series() de la librería inegiR.

Esta función toma dos argumentos, el ID de la serie y el token que nos dieron:

RA   <- inegi_series("724014", token)
str(RA)
## 'data.frame':    20 obs. of  4 variables:
##  $ date         : chr  "2022" "2021" "2020" "2019" ...
##  $ date_shortcut: chr  "Year" "Year" "Year" "Year" ...
##  $ values       : num  8061909 7159590 6504420 6340862 5974564 ...
##  $ notes        : logi  NA NA NA NA NA NA ...

Usando str() vemos la estructura del objeto que nos devolvió. Es un dataframe de 4 columnas y 20 filas. Como podemos ver, las columnas de importancia son date y values. Pues son los años disponibles de la serie y los valores de RA, es decir, de las remuneraciones a los asalariados.

Vamos a revisar los años disponibles:

unique(RA$date)
##  [1] "2022" "2021" "2020" "2019" "2018" "2017" "2016" "2015" "2014" "2013"
## [11] "2012" "2011" "2010" "2009" "2008" "2007" "2006" "2005" "2004" "2003"

Tenemos dos opciones, hacer lo anterior 11 veces, una vez por cada variable, o hacer una función, pues estas permiten automatizar tareas comunes de una manera más eficiente que copiar y pegar, ya que al copiar y pegar nos exponemos a equivocarnos, pues podríamos no reemplazar apropiadamente los parámetros necesarios.

Lo que haré será la segunda opción. No me detendré mucho a explicar cómo escribí mi función. Así que recomiendo tres cosas por si no estás familiarizado con la escritura de funciones.

  • Recomiendo mucho revisar R for Data Science de H. Wickham y G. Grolemund, disponible en este enlace. Hay un capítulo dedicado exclusivamente a este tema.

  • Recomiendo revisar mi propio blog. Ya traté el tema de las funciones de una manera más amplia. El enlace es este.

  • Recomiendo preguntarle a ChatGPT o a Copilot del navegador Edge. Son excelentes herramientas para desglosar código función por función, y ahorran mucho tiempo.

Función personalizada

La siguiente función hará uso de dos librerías: inegiR() y dplyr().

Con inegiR() vamos a extraer las series tal como lo hicimos con las remuneraciones a los asalariados (\(RA\)).

Con dplyr() vamos a manipular el dataframe resultante de inegiR(). Lo que haré será convertirla en un tibble (si estás leyendo mi blog en Edge usa a Copilot para preguntarle qué es esto, pero en pocas palabras es un dataframe más apropiado para tidyverse). Una vez convertido en tibble elimino las columnas que no me interesan y finalmente ordeno los años de menor a mayor.

# Definir función para procesar cada serie
procesar_serie <- function(serie_id, token) {
  serie <- inegi_series(serie_id, token)
  serie <- as_tibble(serie) %>%
    select(-date_shortcut, -notes) %>%
    arrange(date)
  return(serie)
}

Mi función toma 2 argumentos, el ID de la serie y mi token.

Ahora empleamos nuestra función personal procesar_serie() por medio de una iteración con for.

No me detendré en este blog a explicar a detalle cómo funciona, tal vez lo haga en una siguiente entrada (prometí eso en mi último blog).

Pero si te quedas con la duda, puedes tomar alguna de mis recomendaciones anteriores (pídele a ChatGPT que explique paso a paso el siguiente código).

# Procesar cada serie
for (nombre_serie in names(series)) {
  assign(nombre_serie, procesar_serie(series[[nombre_serie]], token))
}

Construcción del tibble

Al correr el código del bucle for, lo que sucedió fue que nos creó 11 tibbles separados, uno por cada variable con su respectivo nombre. Vamos a revisar la estructura de dos de ellos:

str(PIB)
## tibble [20 × 2] (S3: tbl_df/tbl/data.frame)
##  $ date  : chr [1:20] "2003" "2004" "2005" "2006" ...
##  $ values: num [1:20] 8259533 9248390 9999599 11120116 12046753 ...

Las series de cuentas nacionales vienen en términos anuales.

Ahora vamos a ver alguna de población ocupada:

str(POT)
## tibble [75 × 2] (S3: tbl_df/tbl/data.frame)
##  $ date  : Date[1:75], format: "2005-01-01" "2005-04-01" ...
##  $ values: num [1:75] 41441076 41676868 42334898 42863703 42740936 ...

Estas vienen en ¡términos trimestrales! Antes de abordar este problema, considero prudente juntar en un solo tibble ambos tipos de variables, así que primero vamos a juntar el tibble de Cuentas Nacionales.

Cuentas nacionales

Las variables que van a conformar este tibble son \(RA\), \(ISPI\), \(S\), \(EBO\), \(PIB\) y \(P\), las cuales ya están cargadas en nuestro ambiente de trabajo.

Al haber sido construidas con el mismo método y de la misma fuente, todas tienen las mismas dimensiones y el mismo nombre en todas sus columnas.

names(ISPI)
## [1] "date"   "values"

Así que lo primero será juntarlas, al ser de las mismas dimensiones podemos usar sin ningún problema bind_cols().

ingresos <- bind_cols(RA, ISPI, S, EBO, PIB, P)
names(ingresos)
##  [1] "date...1"    "values...2"  "date...3"    "values...4"  "date...5"   
##  [6] "values...6"  "date...7"    "values...8"  "date...9"    "values...10"
## [11] "date...11"   "values...12"

¡Tenemos un nuevo problema! La columna con los años aparece múltiples veces y las columnas con los valores se llaman values…[i]. La solución que ofrezco es la siguiente:

ingresos <- ingresos %>%
  #Solo mantendremos una columna de años
  #Renombro la primera como "year"
  rename(year = date...1)%>%
  #Elimino todas las otras columnas de años
  #Elimino todas aquellas columnas cuyos nombres inician con "date..."
  select(-starts_with("date..."))

names(ingresos)
## [1] "year"        "values...2"  "values...4"  "values...6"  "values...8" 
## [6] "values...10" "values...12"

Ahora renombraremos todas aquellas que inician con values…[i].

Primero, creo un vector con los nombres en el mismo orden de cuando juntamos los tibbles con bind_cols(). Luego usando names() asigno los nombres.

names <- c("year", "RA", "ISPI", "S", "EBO", "PIB", "P")
names(ingresos) <- names
str(ingresos)
## tibble [20 × 7] (S3: tbl_df/tbl/data.frame)
##  $ year: chr [1:20] "2003" "2004" "2005" "2006" ...
##  $ RA  : num [1:20] 2287334 2455847 2641257 2869049 3078945 ...
##  $ ISPI: num [1:20] 472365 471527 481896 549551 597544 ...
##  $ S   : num [1:20] 27144 33451 32401 85389 90284 ...
##  $ EBO : num [1:20] 5526978 6354468 6908847 7786906 8460549 ...
##  $ PIB : num [1:20] 8259533 9248390 9999599 11120116 12046753 ...
##  $ P   : num [1:20] 46.1 49.9 52.8 56.1 59.5 63.2 66.6 69.5 73.4 76.7 ...

Ya tenemos un solo tibble de ingresos.

Población ocupada

El proceso con las variables de población será similar al de las cuentas nacionales, únicamente habrá un paso extra. Recordemos que estas series son trimestrales, es decir, cada trimestre se reporta el número de personas ocupadas que recibían una remuneración bajo diferentes conceptos, no es acumulativo. Lo que haremos será obtener el promedio anual, es decir, promediar las poblaciones de cada trimestre en el año.

Primero, repetimos el proceso anterior:

poblacion <- bind_cols(POT, POR, POE, POCP, PONR)%>%
  rename(year = date...1)%>%
  select(-starts_with("date..."))

names <- c("year", "POT", "POR", "POE", "POCP", "PONR")

names(poblacion) <- names

Ahora, calculamos el promedio anual para todas las variables de población.

Vamos a ver la estructura de nuestros datos nuevamente:

str(poblacion)
## tibble [75 × 6] (S3: tbl_df/tbl/data.frame)
##  $ year: Date[1:75], format: "2005-01-01" "2005-04-01" ...
##  $ POT : num [1:75] 41441076 41676868 42334898 42863703 42740936 ...
##  $ POR : num [1:75] 26775337 26832406 27025515 27780891 27960261 ...
##  $ POE : num [1:75] 1956538 1978047 1999268 2027317 2081454 ...
##  $ POCP: num [1:75] 9788414 9898730 10126492 10064021 9921033 ...
##  $ PONR: num [1:75] 2920787 2967685 3183623 2991474 2778188 ...

Lo que hay que destacar es que la variable year es de tipo fecha y viene almacenada de una manera similar a esto “2008-01-01”, “2008-04-01”, …

Así que propongo extraer únicamente el año, luego agrupamos nuestro tibble utilizando de criterio el año, es decir, nuestro tibble estará conformado en pequeños grupos, cada grupo es un año, así que cada grupo tendrá 4 elementos (4 trimestres), luego aplicamos promedios a cada grupo. Nuevamente, cualquier duda copia mi código y pídele a ChatGPT que te explique línea por línea, el aprendizaje debe ser activo, no pasivo.

Usamos across() para indicar que aplique cierta operación (promedio) a todas las columnas que cumplan cierto criterio, en este caso, saca promedios a todas las columnas que empiecen con P. Esto ahorra el tedioso proceso de sacar los promedios columna por columna.

poblacion <- poblacion%>%
  mutate(
  year = year(year),
  year = as.character(year)
)%>%
  group_by(year)%>%
  summarize(
    across(
      starts_with("P"),
      ~mean(.)
    )
  )

Vemos ahora la estructura:

str(poblacion)
## tibble [19 × 6] (S3: tbl_df/tbl/data.frame)
##  $ year: chr [1:19] "2005" "2006" "2007" "2008" ...
##  $ POT : num [1:19] 42079136 43378461 44231248 44943527 45435352 ...
##  $ POR : num [1:19] 27103537 28311684 29002421 29841590 29847164 ...
##  $ POE : num [1:19] 1990293 2141499 2236257 2123886 2021504 ...
##  $ POCP: num [1:19] 9969414 10005072 10035876 10041656 10628932 ...
##  $ PONR: num [1:19] 3015892 2920206 2956695 2936396 2937752 ...

Ya no es un tibble de 75 filas, ahora es de 19, pues ya están anualizadas.

Tibble final

Ahora, como lo que nos interesa es aprovechar al máximo la disponibilidad de las variables de ingresos, vamos a añadirle la información de población como sigue:

ingresos <- ingresos%>%
  left_join(poblacion, by = c("year"))%>%
  na.omit()

Usar left_join() es como usar =BUSCARV() en Excel, para más información sobre el funcionamiento de los join toma cualquiera de las recomendaciones que ya hice en este blog.

Ahora vemos la nueva estructura:

str(ingresos)
## tibble [18 × 12] (S3: tbl_df/tbl/data.frame)
##  $ year: chr [1:18] "2005" "2006" "2007" "2008" ...
##  $ RA  : num [1:18] 2641257 2869049 3078945 3324877 3415612 ...
##  $ ISPI: num [1:18] 481896 549551 597544 663585 632608 ...
##  $ S   : num [1:18] 32401 85389 90284 278028 51691 ...
##  $ EBO : num [1:18] 6908847 7786906 8460549 9217328 8752590 ...
##  $ PIB : num [1:18] 9999599 11120116 12046753 12927761 12749118 ...
##  $ P   : num [1:18] 52.8 56.1 59.5 63.2 66.6 69.5 73.4 76.7 78 81.5 ...
##  $ POT : num [1:18] 42079136 43378461 44231248 44943527 45435352 ...
##  $ POR : num [1:18] 27103537 28311684 29002421 29841590 29847164 ...
##  $ POE : num [1:18] 1990293 2141499 2236257 2123886 2021504 ...
##  $ POCP: num [1:18] 9969414 10005072 10035876 10041656 10628932 ...
##  $ PONR: num [1:18] 3015892 2920206 2956695 2936396 2937752 ...
##  - attr(*, "na.action")= 'omit' Named int [1:2] 1 2
##   ..- attr(*, "names")= chr [1:2] "1" "2"

Descomposición del deflactor

Vamos a dar un breve repaso de macroeconomía y cuentas nacionales.

El Producto Interno Bruto (PIB) por el método del ingreso es una forma de calcular la producción económica de un país midiendo los ingresos generados por la producción de bienes y servicios. Se suma el valor agregado generado por todos los sectores económicos, incluyendo salarios, intereses, alquileres y ganancias. En resumen, es una forma de medir la actividad económica de un país observando los ingresos generados en lugar de los gastos o la producción.

El PIB, desde este enfoque puede expresarse como sigue:

\(PIB=VAB+IN\)

Donde \(VAB\) es valor agregado bruto, \(IN\) son los impuestos netos.

La definición contable anterior puede reescribirse como

\(PIB=Ganancias+Salarios+IN\)

Entendiendo a las \(Ganancias\) como aquellos ingresos derivados de la posesión de capital y los \(Salarios\) como aquellos derivados de la venta de fuerza de trabajo.

De lo anterior, se deriva que el deflactor del PIB (PIB nominal entre PIB real) puede ser expresado como la suma de costos laborales unitarios (CLU), ganancias unitarias (GU) e impuestos unitarios netos (IU):

\(\frac{PIB}{PIB^r}=Deflactor=GU+CLU+IU\)

Aclaradas estas definiciones, vamos a seguir paso a paso la metodología de CONASAMI.

Paso 1: Impuestos netos de subsidios

“Primero, se calculan los impuestos netos de subsidios \((INS)\) como la resta de los impuestos sobre la producción e importaciones \((ISPI)\) menos los subsidios \((S)\) para cada periodo \(t\).” (CONASAMI, 2023, p. 6).

\(INS_t=ISPI_t-S_t\)

ingresos <- ingresos%>%
  mutate(
    #INS
    INS = ISPI - S)

Paso 2: Ajuste a las remuneraciones

“Se calcula una remuneración promedio de las personas asalariadas y se multiplica por el número de personas ocupadas no asalariadas (Personas empleadoras, personas trabajadoras por cuenta propia y personas trabajadoras sin pago); ese monto se resta del \(EBO\) y se suma a la remuneración de asalariados \((RA)\)”. (CONASAMI, 2023, p. 6).

¿Qué quiere decir lo anterior? ¿Por qué es necesario realizar este ajuste? Las RA de las cuentas nacionales, grosso modo, buscan medir los ingresos derivados de la venta de fuerza de trabajo, pero los ingresos de los trabajadores por cuenta propia no son salarios en el sentido tradicional. El problema ocurre cuando estos representan a una gran proporción de la población ocupada total, pues sus ingresos no se incluyen en las RA. Además, en el sector informal, distinguir los ingresos por trabajo de los ingresos por derecho de propiedad (ingresos del capital) puede ser complicado. Por ejemplo, consideremos una familia que gestiona y es dueña de una fonda que no está legalmente constituida ni está obligada a llevar una contabilidad. Esta familia percibe ingresos tanto como propietaria del negocio como por el trabajo que realizan en él. Este tipo de ingresos se contabilizan como ingresos mixtos.

Por lo tanto, cuando estas personas representan un gran porcentaje de la fuerza laboral, es esencial ajustar las RA para reflejar con precisión la diversidad de fuentes de ingresos derivadas del trabajo, incluyendo a los trabajadores por cuenta propia y al sector informal.

En esencia, lo que haremos para ajustar la RA es agregarle una parte de los ingresos mixtos a las remuneraciones de los asalariados y el resto se suma al excedente de operación (las ganancias).

Primero, ajustamos la RA.

\(RA_{aj}=RA*\frac{POT}{POR}\)

El factor de ajuste \(\frac{POT}{POR}\) se interpreta como sigue: Al dividir la población ocupada total entre la población ocupada remunerada, obtienes la proporción de la población ocupada que recibe una remuneración por su trabajo. Cuanto mayor sea el resultado de esta división, mayor será la proporción de la fuerza laboral que está empleada en trabajos remunerados en comparación con otros tipos de ocupaciones, como trabajo no remunerado o autónomo. Al multiplicar por RA obtenemos una estimación del componente de ingresos del trabajo en el Producto Interno Bruto (PIB).

Ahora toca ajustar el excedente bruto de operación. El excedente bruto de operación, para su estimación, normalmente es tratado como un residuo (\(PIB-RA\)), por lo que ya incluye a los ingresos mixtos, pero como dije, hay que quitar una porción de estos ingresos y añadirlos a la RA.

\(EBO_{aj,t}=EBO_t-(RA_{aj,t}-RA_t)\)

Restar a RA ajustado el RA nos da la magnitud que hay que sustraer del ingreso mixto, el cual compone el excedente bruto de operación.

ingresos <- ingresos %>%
  mutate(
    #RA Ajustada
    RA_aj = RA * POT/POR,
    #EBO Ajustado
    EBO_aj = EBO - (RA_aj - RA)
  )

Paso 3: \(\frac{PIB}{PIB^r}=GU+CLU+IU\)

Hay que seguir la igualdad contable que titula este paso. Antes, recordemos que el deflactor también puede ser escrito como sigue:

\(Deflactor_t=\frac{PIB_t}{PIB^r_t}*100\)

Por lo tanto:

\(PIB^r_t=\frac{PIB_t}{Deflactor_t/100}\)

Recordemos que nuestras series son en millones de pesos corrientes, por lo que necesitamos deflactar el PIB nominal y así obtener el PIB real.

Luego, retomando nuestra definición que titula este paso:

\(IU_t =\frac{INS_t}{PIB^r_t}\)

\(GU_t =\frac{EBO_{aj,t}}{PIB^r_t}\)

\(CLU_t=\frac{RA_{aj,t}}{PIB^r_t}\)

ingresos <- ingresos%>%
  mutate(
    #PIB real (deflactamos)
    PIBr = PIB / (P/100),
    #Unitarios
    IU = INS / PIBr,
    GU = EBO_aj / PIBr,
    CLU = RA_aj / PIBr
  )

La contribución de cada componente a la variación anual del deflactor o la presión sobre los precios de cada componente, se calcula como:

\(IU_{cont,t} =(\frac{IU_{t}}{IU_{t-1}}-1)*\frac{INS_{t-1}}{PIB_{t-1}}\)

\(GU_{cont,t} =(\frac{GU_{t}}{GU_{t-1}}-1)*\frac{EBO_{aj,t-1}}{PIB_{t-1}}\)

\(CLU_{cont,t}=(\frac{CLU_{t}}{CLU_{t-1}}-1)*\frac{RA_{aj,t-1}}{PIB_{t-1}}\)

¿Cómo interpretar las definiciones anteriores? Vamos a paso a paso, solo explicaré a detalle a \(CLU_{cont,t}\), pues el razonamiento para el resto es el mismo.

Tenemos que la contribución de los Costos laborales unitarios a la tasa de crecimiento del deflactor del PIB (los precios de toda la economía) es igual al producto de dos factores:

  • El primer factor no es más que la tasa de crecimiento de \(CLU_t\) de un periodo al otro.
    • El subíndice \(t-1\) indica el periodo inmediato anterior.
  • El segundo factor es lo que se conoce como participación (ajustada) de los salarios en el ingreso total
    • Se divide la masa salarial \((RA_{aj})\) entre el PIB nominal del mismo periodo \((PIB)\), esto no es más que el porcentaje que representaron los salarios en el total de la economía. Solamente que lo haremos con los datos del periodo inmediato anterior \((t-1)\).

Recordemos que el objetivo es saber cuánto contribuyen los factores productivos a la tasa de crecimiento de los precios, entonces lo que estamos haciendo es calcular la tasa de crecimiento de dichos factores del periodo \(t\) respecto del periodo \(t-1\), una vez calculada se multiplica por lo que dicho factor representó en el agregado de la economía del periodo \(t-1\), es decir, calculamos la tasa de crecimiento de un factor y ajustamos dicha tasa por la proporción que representó en el total, así nos queda una tasa de crecimiento ajustada por el tamaño que su factor representa en la economía, así la suma de las tasas de crecimiento de todos los factores debe ser igual a la tasa de crecimiento del deflactor del PIB.

\(TC_P = TC_{GU} + TC_{CLU} + TC_{IN}\)

ingresos <- ingresos%>%
  #Tasas de crecimiento
  mutate(
    TC_IU = IU/lag(IU)-1,
    TC_GU = GU/lag(GU)-1,
    TC_CLU = CLU/lag(CLU)-1
  )

ingresos <- ingresos%>%
  #Tasas de crecimiento ajustadas
  mutate(
    CONT_IU  =TC_IU * (lag(INS)/lag(PIB)),
    CONT_GU  =TC_GU * (lag(EBO_aj)/lag(PIB)),
    CONT_CLU =TC_CLU* (lag(RA_aj)/lag(PIB))
  )

Con el código anterior obtenemos las contribuciones de los factores a la tasa de crecimiento del deflactor del PIB, ahora solo como manera de corrobar que lo hicimos bien vamos a calcular la tasa de crecimiento del deflactor y vamos a compararlo con la suma de las tasas de crecimiento de los factores.

ingresos <- ingresos%>%
  mutate(
    TC_P_aj = CONT_IU + CONT_GU + CONT_CLU,
    TC_P = P/lag(P)-1)

Si todo está bien, la igualdad debe cumplirse

ingresos <- ingresos%>%
   mutate(
     Son_iguales=TC_P_aj/TC_P
   )

ingresos$Son_iguales
##  [1] NA  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1

Visualización de los resultados

Ahora vamos a visualizar nuestros datos, vamos a reproducir esta gráfica que se encuentra en el documento ya citado de CONASAMI:

Para hacerlo, a continuación presento mi código, no me detendré a explicar a detalle, pues ya tengo varias entradas en este blog sobre cómo graficar con ggplot2, puedes revisarlos aquí.

#Cambio la forma de mi tibble de "wide" a "long
ingresos_long <- ingresos%>%
  select(year, starts_with("CONT_"))%>%
  pivot_longer(
    cols = starts_with("CONT_"),
    names_to = "origen",
    values_to = "cont"
  )%>%
  left_join(
    ingresos%>%select(year, TC_P_aj), by = c("year") 
  )%>%
  na.omit()

#Creo una nueva variable con el nombre de los factores
ingresos_long <- ingresos_long %>%
  mutate(
    origen = case_when(
      origen == "CONT_IU"~ "Impuestos unitarios",
      origen == "CONT_GU"~ "Ganancias unitarias",
      origen == "CONT_CLU" ~ "Costos laborales unitarios"
    )
  )

Ahora, con el tibble listo graficamos:

colores_personalizados <- c("Costos laborales unitarios" = "#FFC300",
                            "Ganancias unitarias" = "#FF5733",
                            "Impuestos unitarios" = "#C70039")

clu <- ggplot(data = ingresos_long, aes(x=year, y=cont, fill=origen))+
  geom_bar(stat="identity")+
  geom_line(aes(group = origen, y = TC_P_aj,
                color = "Deflactor"),
            linewidth = 1)+
  geom_hline(yintercept = 0, linewidth=0.8)+
  scale_y_continuous(label=percent)+
  scale_color_manual(values = c("Deflactor" = "#581845"), name = "") +  # Define el color de la línea
  scale_linetype_manual(values = c("Deflactor" = "solid"), name = "") +  # Define el linetype de la línea
  scale_fill_manual(values = colores_personalizados,
                    name = "")+
  theme_hc()+
  theme(legend.position = "right",
        plot.caption = element_text(hjust = 0))+
  ylab("")+
  xlab("")+
  labs(title="Descomposición del deflactor del PIB",
       caption="Elaborado por @ecodiegoale con información de INEGI (2024).")

Finalmente, tenemos nuestra gráfica donde se refleja la descomposición de la tasa de crecimiento del deflactor del PIB. Ahora, una pequeña advertencia, es un hecho que la inflación es en todo momento un fenómeno distributivo y que el poder de mercado de las empresas para fijar precios, la poca capacidad de negociación de los trabajadores, las restricciones de capacidad en mercados competitivos, o demás estructuras de mercado que permiten beneficios extraordinarios deben estar en la agenda de la política económica y evaluar sus consecuencias en el crecimiento y desarrollo económico resulta primordial, sin embargo, este gráfico no debe interpretarse con un carácter causal, pues hacer afirmaciones de esta naturaleza con solo un ejercicio de contabilidad nacional puede llevarnos a conclusiones equivocadas. Por poner algunos puntos sobre la mesa, esta metodología no toma en cuenta las presiones de precios externas, como sí lo hace la metodología del deflactor del consumo que propone el Fondo Monetario Internacional (click aquí para leer el estudio), e incluso contabilizando dichas presiones tampoco podemos llegar a conclusiones de causalidad. El hecho de que en 2022 la tasa de crecimiento tanto del deflactor y como de las ganancias unitarias hayan ido al alza no implica necesariamente que estas sean las principales responsables de la aceleración de la inflación, implican que los beneficios han tenido un mejor desempeño relativo que los salarios, mas no que haya habido un crecimiento acelerado de la rentabilidad o los markup; la participación de las ganancias en el ingreso total pueden incrementar sin la necesidad de un crecimiento de estos.