A EVOLUÇÃO DO RENDIMENTO SALARIAL NO MERCADO DE TRABALHO

Autor

Hercilio Almeida Barbosa

1. Introdução

Passo a passo de como fazer o download dos microdados anuais da PNAD contínua de 2012 a 2024, criar médias e dummies das variáveis e gráficos e tabelas dos dados.

1.1 Dicionário

Dicionário de variáveis utilizadas na análise
Variável Descrição
UF estados
V2005 condição no domicílio
VD4002 condição de ocupação (1 = ocupado 2 = desocupado)
V2010 raça
V20082 ano de nascimento
V2009 idade (0 a 130)
V2007 sexo (1 = homem 2 = mulher)
VD3005 anos de estudo
VD4016 rendimento mensal habitual no trabalho principal (em reais)
VD4019 rendimento mensal habitual em todos os trabalhos (em reais)
V4040 tempo de emprego (categorias: 1 mês, menos de 1 ano, menos de 2 anos e 2 anos ou mais)
V40401 tempo de emprego (categorias 1 a 11, 01 mês a 11 meses)
V40402 tempo de emprego (de 1 ano a 2 anos, categorias: 00 a 11)
V40403 tempo de emprego (2 a 98 = 2 anos ou mais)
VD4009 Posição na ocupação no trabalho principal da semana de referência para pessoas de 14 anos ou mais de idade
VD4008 Posição na ocupação e categoria do emprego do trabalho principal da semana de referência para pessoas de 14 anos ou mais de idade
VD4031 Horas habitualmente trabalhadas por semana em todos os trabalhos para pessoas de 14 anos ou mais de idade
VD4012 Contribuição para instituto de previdência em qualquer trabalho da semana de referência para pessoas de 14 anos ou mais de idade
VD4010 Grupamentos de atividade principal do empreendimento do trabalho principal da semana de referência para pessoas de 14 anos ou mais de idade


1.2 Passos iniciais

Limpando enviroment, instalando e carregando pacotes
#Limpando o environment
#rm(list = ls())


#instalando e carregando pacotes
#install.packages("PNADcIBGE")
#install.packages("dplyr")
#install.packages("gt")
#install.packages("tidyr")
#install.packages("purrr")
#install.packages("ggplot2")
#install.packages("plm")
#install.packages("DT")
#install.packages("stargazer")
#install.packages("modelsummary")

library(PNADcIBGE)
library(dplyr)
library(gt)
library(tidyr)
library(purrr)
library(ggplot2)
library(plm)
library(DT)
library(stargazer)
library(modelsummary)

2. Extração, Filtragem e Manipulação dos dados

2.1. Extração

Selecionando variáveis baseado no dicionário da PNAD
#selecionado as variáveis
varselec <-  c("UF","V2005","VD4002","V2010", "V20082", "V2009", "V2007", "VD3005", "VD4016", "VD4019", 
               "V4040","V40401","V40402", "V40403", "VD4009", "VD4008", "VD4031", "VD4012", "VD4010")
Baixando base de dados de 2012 a 2023

O código abaixo faz download e armazena os dados de todos os anos de 2012 a 2024 baixados com a função get_pnadc e realiza um loop para não precisar ficar repetindo o código para todos os anos. O paramêtro Interview serve para escolher a entrevista no ano, conseguindo assim os dados anuais. Deflator = TRUE insere a variável para deflacionamento dos dados de remuneração.

# Criando função para fazer download dos microdados e que continua mesmo se algum ano der erro

baixar_dados <- possibly(
  ~ get_pnadc(
      year = .x,
      interview = 5, # nem todos os anos têm interview = 5
      design = FALSE,
      labels = FALSE,
      deflator = TRUE,
      defyear = 2024
      vars = varselec
  ),
  otherwise = NULL  # Retorna NULL se erro
)

anos <- 2012:2024

# aplicando a função criada acima em cada ano, ou seja, fazendo download dos microdados de cada ano
dados_brutos <- map(anos, baixar_dados) |> 
  set_names(paste0("PNADC", anos))
# Salva os dados brutos em um arquivo para não precisar fazer o download novamente
saveRDS(dados_brutos, "dados_brutos.rds")

2.1. Filtragem e Manipulação dos dados

Abaixo, é criada a função processar_dados() para selecionar variáveis, aplicar filtros e gerar variáveis derivadas das originais, como faixas etárias, dummies de sexo, raça, região e rendas ajustadas. O código utiliza pipes (|>) para organizar o fluxo de manipulação. Além disso, foi selecionada a variável CO2, presente nos microdados quando Deflator = TRUE, que servirá para criar a variável renda deflacionada. No final, a função é aplicada a cada ano com map(), gerando a lista dados_processados. Atente-se aos #comentários para entender o que acontece com cada bloco do código.

# puxando os dados salvos
  dados_brutos <- readRDS("dadosbrutos_select_vars.rds")

#criando função para selecionar, filtrar e manipular os microdados
processar_dados <- function(dados) {
  ano <- unique(dados$Ano)
  
  dados |>
    #selecionando variáveis de interesse
    select(Ano, Trimestre, UF, UPA, V1008, V1014, V2005, VD4002, V2010, V20082, V2009, V2007, 
           VD3005, VD4016, VD4019, V4040, V40401, V40402, V40403, VD4009, VD4008, VD4031, 
           VD4012, VD4010, CO2, ID_DOMICILIO) |>
    filter(
      #filtrando por ano de nascimento
      V20082 >= 1959, 
      V20082 != 9999
          ) |>
    mutate(
      
      # variáveis categóricas
      escolaridade = as.integer(VD3005),
      idade = as.integer(V2009),
      
      #criando variáveis de renda 
      Renda_nominal = VD4019,
      RendaReal = VD4019 * CO2,
      renda_hora = RendaReal/(VD4031 * 4.345),
      log_renda_hora = log(renda_hora),
      
      #dummie por sexo
      Homem = as.integer(V2007 == 1),
      Mulher = 1L - Homem,
      
      #dummie por raça
      branco = as.integer(V2010 == 1),
      ñbranco = 1L - branco,
      
      # Criando dummie de Faixas etárias
      FaixaEtaria1_20a29 = case_when(idade >= 20 & idade <= 29 ~ 1L, TRUE ~ 0L),
      FaixaEtaria2_30a39 = case_when(idade >= 30 & idade <= 39 ~ 1L, TRUE ~ 0L),
      FaixaEtaria3_40a49 = case_when(idade >= 40 & idade <= 49 ~ 1L, TRUE ~ 0L),
      FaixaEtaria4_50a65 = case_when(idade >= 50 & idade <= 65 ~ 1L, TRUE ~ 0L),
      
      #criando variáveis dummies por setor de atividade
      servidor_publico = as.integer(VD4008 == 3),
      setor_privado = as.integer(VD4008 == 1),
      
      #criando variáveis dummies para os setores da economia
      setor_primario = case_when(VD4010 == "01" ~ 1L, TRUE ~ 0L),
      setor_secundario = case_when(VD4010 %in% c("02", "03") ~ 1L, TRUE ~ 0L),
      setor_terciario = case_when(VD4010 %in% c("04","05","06","07","08","09","10","11") ~ 1L, TRUE ~ 0L),
      
      #criando variáveis dummies para formalidade do emprego
      formal = case_when(
                VD4009 %in% c("01", "03", "05", "07") ~ 1L,
                VD4009 %in% c("04", "08", "09") & VD4012 == "1" ~ 1L,
                TRUE ~ 0L),
  
      informal = case_when(
                  VD4009 %in% c("02", "06", "10") ~ 1L,
                  VD4009 %in% c("04", "08", "09") & VD4012 == "2" ~ 1L,
                  TRUE ~ 0L),
      
      #criando variáveis dummies por regiões
      regiao_norte = case_when(UF %in% c(11,12,13,14,15,16,17) ~ 1L, TRUE ~ 0L),
      regiao_nordeste = case_when(UF %in% c(21,22,23,24,25,26,27,28,29) ~ 1L, TRUE ~ 0L),
      regiao_sudeste = case_when(UF %in% c(31,32,33,35) ~ 1L, TRUE ~ 0L),
      regiao_sul = case_when(UF %in% c(41,42,43) ~ 1L, TRUE ~ 0L),
      regiao_centroOeste = case_when(UF %in% c(50,51,52,53) ~ 1L, TRUE ~ 0L),
  
      
      #criando variável dummie para os anos 
      ano2012a2014 = case_when(Ano %in% 2012:2014 ~ 1L, TRUE ~ 0L),
      ano2015a2019 = case_when(Ano %in% 2015:2019 ~ 1L, TRUE ~ 0L),
      ano2020e2021 = case_when(Ano %in% 2020:2021 ~ 1L, TRUE ~ 0L),
      ano2022a2024 = case_when(Ano %in% 2022:2024 ~ 1L, TRUE ~ 0L),
      
    )|>
    group_by(ID_DOMICILIO) |>
    mutate(
      #variáveis dummies baseadas na condição de domicílio
      ChefeFamilia = as.integer(V2005 == "01"),
      Conjuge = as.integer(V2005 == "02"),
      
      #variável para identificar quais domicílios tem conjuges para identificar os casados
      tem_conjuge = as.integer(any(Conjuge == 1)),
      
      #criando variáveis dummies para estado civil
      Casados = as.integer(tem_conjuge & (ChefeFamilia == 1 | Conjuge == 1)),
      ñcasados = as.integer(Casados == 0),
      
      #criando variáveis para identificar se indivíduos casados têm filhos menores de 10 anos
      tem_filho_menor10 = as.integer(any(V2005 %in% 4:6 & V2009 < 10)),
      casado_comfilho = as.integer(Casados == 1 & tem_filho_menor10 == 1),
      casado_semfilho = as.integer(Casados == 1 & tem_filho_menor10 == 0)
    ) |>
    ungroup()
    
}

# Aplicar a todos os anos
dados_processados <- map(dados_brutos, processar_dados)

2.2. Criação de Coortes e Médias por Coortes)

Esse bloco de código aplica uma transformação aos dados processados, criando uma variável identificadora chamada ID, formada pela combinação do ano de nascimento (V20082) e do sexo (V2007) de cada indivíduo. Em seguida, os dados são agrupados por essa ID, representando coortes de indivíduos com características demográficas semelhantes, e são calculadas as médias de diversas variáveis dentro de cada grupo. Essas médias são adicionadas como novas variáveis com o sufixo _ID, permitindo análises agregadas por coorte.

# puxando dados do bloco anterior para criar as coortes(IDs)
dados_IDs <- map(dados_processados, ~ {.x |>
    mutate(
      #criando ID juntando ano de nascimento e sexo separado por "_"
      ID = interaction(V20082, V2007, sep = "_")
    ) |> 
    group_by(ID) |>
    #criando média de cada variável por ID
    mutate(across(c(
      branco, ñbranco, 
      Casados, ñcasados, 
      casado_comfilho, casado_semfilho,
      ChefeFamilia, Conjuge, 
      escolaridade, 
      Renda_nominal, RendaReal,
      ano2020e2021, ano2012a2014, 
      ano2015a2019,ano2022a2024,
      servidor_publico, setor_privado,
      setor_primario, setor_secundario, setor_terciario,
      formal, informal,
      regiao_norte, regiao_nordeste, regiao_sudeste, regiao_sul, regiao_centroOeste,
      
      ), ~ mean(., na.rm = TRUE), .names = "Média_{.col}_ID")) |>
    
    ungroup()
})
2.3 Filtragem final do banco de dados

O bloco de código abaixo realiza o filtro final dos dados, selecionando apenas os indivíduos ocupados (VD4002 == 1), com 20 anos ou mais de idade, e que possuem renda nominal entre R$100 e R$100 mil. Após aplicar esses critérios a cada ano da base de dados, os dados filtrados são combinados em um único objeto com todas as observações anuais, permitindo a análise integrada de todos os anos disponíveis a partir de agora.

# Filtro final
dados_filtrados <- map(dados_IDs, ~( .x |>
    filter(
      VD4002 == 1, #apenas indivíduos ocupados
      V20082 <= 1992, #filtrando para o intervalo de idade desejável
      RendaReal >= 100,
      RendaReal <= 100000)  # que recebem entrem 100 e 100 mil
    ))

# Unir todos os anos
dados_anuais <- bind_rows(dados_filtrados)

3. Estatística Descritiva

3.1. Estatística Descritiva Geral do Banco de Dados

#calculando estatísca descritiva

tabela_dadosgerais <- dados_anuais |>
  group_by(Ano) |>
  summarise(
    qtd_obs = n(),
    qtd_homens = sum(V2007 == 1, na.rm = TRUE),
    qtd_mulheres = sum(V2007 == 2, na.rm = TRUE),
    qtd_casados = sum(Casados == 1, na.rm = TRUE),
    qtd_ñcasados = sum(Casados == 0, na.rm = TRUE),
    qtd_brancos = sum(branco == 1, na.rm = TRUE),
    qtd_ñbrancos = sum(branco == 0, na.rm = TRUE),
    qtd_ChefesFamilia = sum(ChefeFamilia == 1, na.rm = TRUE),
    qtd_conjuges = sum(Conjuge == 1, na.rm = TRUE),
    
    # Faixas etárias
    qtd_faixa_20a29 = sum(FaixaEtaria1_20a29 == 1, na.rm = TRUE),
    qtd_faixa_30a39 = sum(FaixaEtaria2_30a39 == 1, na.rm = TRUE),
    qtd_faixa_40a49 = sum(FaixaEtaria3_40a49 == 1, na.rm = TRUE),
    qtd_faixa_50a65 = sum(FaixaEtaria4_50a65 == 1, na.rm = TRUE),

    # Setor de atividade (vínculo)
    qtd_servidor_publico = sum(servidor_publico == 1, na.rm = TRUE),
    qtd_setor_privado = sum(setor_privado == 1, na.rm = TRUE),

    # Setores da economia
    qtd_setor_primario = sum(setor_primario == 1, na.rm = TRUE),
    qtd_setor_secundario = sum(setor_secundario == 1, na.rm = TRUE),
    qtd_setor_terciario = sum(setor_terciario == 1, na.rm = TRUE),

    # Formalidade
    qtd_formal = sum(formal == 1, na.rm = TRUE),
    qtd_informal = sum(informal == 1, na.rm = TRUE),

    # Regiões
    qtd_regiao_norte = sum(regiao_norte == 1, na.rm = TRUE),
    qtd_regiao_nordeste = sum(regiao_nordeste == 1, na.rm = TRUE),
    qtd_regiao_sudeste = sum(regiao_sudeste == 1, na.rm = TRUE),
    qtd_regiao_sul = sum(regiao_sul == 1, na.rm = TRUE),
    qtd_regiao_centroOeste = sum(regiao_centroOeste == 1, na.rm = TRUE),

    # Anos da pandemia
    qtd_Ano2020e2021 = sum(ano2020e2021 == 1, na.rm = TRUE),

    .groups = "drop"
  )

# gerando e configurando tabela com o pacote gt
tabela_dadosgerais |>
  gt() |>
  # Formatar quantidades (separador de milhar)
  fmt_number(
    columns = starts_with("qtd"),
    decimals = 0,
    sep_mark = ".",
    dec_mark = ","
  ) 
Ano qtd_obs qtd_homens qtd_mulheres qtd_casados qtd_ñcasados qtd_brancos qtd_ñbrancos qtd_ChefesFamilia qtd_conjuges qtd_faixa_20a29 qtd_faixa_30a39 qtd_faixa_40a49 qtd_faixa_50a65 qtd_servidor_publico qtd_setor_privado qtd_setor_primario qtd_setor_secundario qtd_setor_terciario qtd_formal qtd_informal qtd_regiao_norte qtd_regiao_nordeste qtd_regiao_sudeste qtd_regiao_sul qtd_regiao_centroOeste qtd_Ano2020e2021
2012 136.217 80.198 56.019 80.073 56.144 61.142 75.075 66.442 33.239 41.764 44.716 37.535 10.514 19.342 70.314 18.316 30.396 87.410 82.426 53.791 17.409 38.586 38.369 26.595 15.258 0
2013 138.031 81.003 57.028 83.040 54.991 60.884 77.147 69.732 34.857 40.075 46.316 38.108 13.532 19.801 69.744 18.712 30.457 88.843 84.509 53.522 17.694 38.528 39.369 26.705 15.735 0
2014 137.377 80.774 56.603 83.889 53.488 60.650 76.727 70.849 35.312 34.897 46.445 39.154 16.881 20.491 67.531 18.855 29.515 88.977 85.376 52.001 17.860 39.235 38.733 26.347 15.202 0
2015 134.589 78.970 55.619 83.818 50.771 58.856 75.733 70.958 35.641 29.837 45.721 38.973 20.058 19.911 63.818 18.693 28.327 87.543 84.073 50.516 17.266 38.290 37.859 26.302 14.872 0
2016 129.492 75.565 53.927 81.471 48.021 55.644 73.848 69.408 34.694 23.831 43.923 38.773 22.965 19.325 59.464 18.696 25.426 85.356 80.724 48.768 16.931 36.234 36.960 25.042 14.325 0
2017 122.688 70.933 51.755 78.112 44.576 52.611 70.077 65.757 34.603 19.467 41.585 37.142 24.494 18.814 54.834 17.037 23.590 82.042 75.481 47.207 15.771 33.295 35.152 23.952 14.518 0
2018 121.725 69.707 52.018 78.663 43.062 51.447 70.278 65.563 35.481 15.804 41.464 37.616 26.841 18.696 53.432 16.447 22.802 82.429 74.194 47.531 15.370 32.402 36.726 22.917 14.310 0
2019 122.913 70.275 52.638 80.759 42.154 51.375 71.538 66.329 36.667 12.429 41.918 38.602 29.964 19.072 52.629 16.388 22.600 83.882 74.227 48.686 15.812 32.349 37.140 23.051 14.561 0
2020 99.020 56.996 42.024 66.227 32.793 42.779 56.241 53.296 30.696 7.173 33.632 31.903 26.312 16.473 41.762 12.878 18.069 68.036 61.900 37.120 12.657 24.803 30.347 19.740 11.473 99.020
2021 86.921 50.205 36.716 56.389 30.532 37.140 49.781 48.062 26.166 3.538 28.808 29.252 25.323 14.353 34.985 12.548 16.038 58.308 53.062 33.859 11.720 21.642 26.135 17.153 10.271 86.921
2022 99.665 56.989 42.676 65.117 34.548 42.270 57.395 54.794 31.292 1.435 32.929 34.188 31.113 16.126 40.595 14.286 17.939 67.410 59.475 40.190 13.393 25.552 28.772 19.678 12.270 0
2023 100.668 57.155 43.513 65.129 35.539 42.427 58.241 55.418 31.645 0 31.564 35.230 33.874 16.495 40.934 13.912 18.077 68.660 60.423 40.245 13.262 26.175 29.175 19.635 12.421 0
2024 102.596 58.372 44.224 66.680 35.916 43.012 59.584 56.984 33.242 0 30.356 36.915 35.325 16.525 42.350 14.131 18.909 69.540 61.569 41.027 13.050 27.023 30.303 20.219 12.001 0

4. Análise Econométrica

Criando Pseudo Painel
# puxando os dados salvos
  #dados_anuais <- readRDS("dados_anuais.rds")

# filtrando para criar o pseudo painel
pseudopainel <- dados_anuais |> 
  select(Ano, ID, log_renda_hora, ends_with("_ID")) |> 
  distinct(Ano, ID, .keep_all = TRUE)

# criando painel
pseudopainel <- pdata.frame(pseudopainel, index = c("ID", "Ano"))

# exibindo painel 
datatable(pseudopainel, options = list(scrollX = TRUE))
4.1
#colocando a coluna ID como chr para poder selecionar as IDs por sexo
pseudopainel$ID <- as.character(pseudopainel$ID)

# filtrando painel apenas para ID de indivíduos homens
painel_homens <- pseudopainel |> 
  filter(substr(pseudopainel$ID, nchar(pseudopainel$ID), nchar(pseudopainel$ID)) == "1")

#regressao para ID homens com efeito fixo (within)
regressao_renda_hora_homens <- plm(
  log_renda_hora ~ 
    Média_escolaridade_ID,
  data = painel_homens,
  model = "within"
)

# Resumo da regressão
#summary(regressao_renda_hora_homens)
cat("### Regressão: Renda por Hora Homens\n\n")
### Regressão: Renda por Hora Homens
modelsummary(regressao_renda_hora_homens,
             stars = TRUE,
             statistic = "std.error", 
             output = "html")
(1)
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
Média_escolaridade_ID 0.280*
(0.135)
Num.Obs. 442
R2 0.011
R2 Adj. -0.072
AIC 912.2
BIC 920.4
RMSE 0.68
# filtrando painel apenas para ID de indivíduos mulheres
painel_mulheres <- pseudopainel |> 
  filter(substr(pseudopainel$ID, nchar(pseudopainel$ID), nchar(pseudopainel$ID)) == "2")

#regressao para ID homens com efeito fixo (within)
regressao_renda_hora_mulheres <- plm(
  log_renda_hora ~ 
    Média_escolaridade_ID,
  data = painel_mulheres,
  index = c("ID", "Ano"),
  model = "within"
)

# Resumo da regressão
#summary(regressao_renda_hora_mulheres)
cat("### Regressão: Renda por Hora Mulheres\n\n")
### Regressão: Renda por Hora Mulheres
modelsummary(regressao_renda_hora_mulheres,
             stars = TRUE,
             statistic = "std.error", 
             output = "html")
(1)
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
Média_escolaridade_ID 0.297*
(0.131)
Num.Obs. 442
R2 0.012
R2 Adj. -0.070
AIC 984.9
BIC 993.1
RMSE 0.73