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 |
A EVOLUÇÃO DO RENDIMENTO SALARIAL NO MERCADO DE TRABALHO
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
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
<- c("UF","V2005","VD4002","V2010", "V20082", "V2009", "V2007", "VD3005", "VD4016", "VD4019",
varselec "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
<- possibly(
baixar_dados ~ 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
)
<- 2012:2024
anos
# aplicando a função criada acima em cada ano, ou seja, fazendo download dos microdados de cada ano
<- map(anos, baixar_dados) |>
dados_brutos 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
<- readRDS("dadosbrutos_select_vars.rds")
dados_brutos
#criando função para selecionar, filtrar e manipular os microdados
<- function(dados) {
processar_dados <- unique(dados$Ano)
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
>= 1959,
V20082 != 9999
V20082 |>
) 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(
%in% c("01", "03", "05", "07") ~ 1L,
VD4009 %in% c("04", "08", "09") & VD4012 == "1" ~ 1L,
VD4009 TRUE ~ 0L),
informal = case_when(
%in% c("02", "06", "10") ~ 1L,
VD4009 %in% c("04", "08", "09") & VD4012 == "2" ~ 1L,
VD4009 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
<- map(dados_brutos, processar_dados) dados_processados
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)
<- map(dados_processados, ~ {.x |>
dados_IDs 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
<- map(dados_IDs, ~( .x |>
dados_filtrados filter(
== 1, #apenas indivíduos ocupados
VD4002 <= 1992, #filtrando para o intervalo de idade desejável
V20082 >= 100,
RendaReal <= 100000) # que recebem entrem 100 e 100 mil
RendaReal
))
# Unir todos os anos
<- bind_rows(dados_filtrados) dados_anuais
3. Estatística Descritiva
3.1. Estatística Descritiva Geral do Banco de Dados
#calculando estatísca descritiva
<- dados_anuais |>
tabela_dadosgerais 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),
casados = sum(Casados == 0, na.rm = TRUE),
qtd_ñqtd_brancos = sum(branco == 1, na.rm = TRUE),
brancos = sum(branco == 0, na.rm = TRUE),
qtd_ñ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
<- dados_anuais |>
pseudopainel select(Ano, ID, log_renda_hora, ends_with("_ID")) |>
distinct(Ano, ID, .keep_all = TRUE)
# criando painel
<- pdata.frame(pseudopainel, index = c("ID", "Ano"))
pseudopainel
# exibindo painel
datatable(pseudopainel, options = list(scrollX = TRUE))
4.1
#colocando a coluna ID como chr para poder selecionar as IDs por sexo
$ID <- as.character(pseudopainel$ID)
pseudopainel
# filtrando painel apenas para ID de indivíduos homens
<- pseudopainel |>
painel_homens filter(substr(pseudopainel$ID, nchar(pseudopainel$ID), nchar(pseudopainel$ID)) == "1")
#regressao para ID homens com efeito fixo (within)
<- plm(
regressao_renda_hora_homens ~
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
<- pseudopainel |>
painel_mulheres filter(substr(pseudopainel$ID, nchar(pseudopainel$ID), nchar(pseudopainel$ID)) == "2")
#regressao para ID homens com efeito fixo (within)
<- plm(
regressao_renda_hora_mulheres ~
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 |