Projeto 2ªVA - Análise do Mercado de Trabalho Formal em Pernambuco utilizando o CAGED
Introdução
O mercado de trabalho é um dos principais termômetros da saúde socioeconômica de uma região. No estado de Pernambuco, compreender a dinâmica de admissões e desligamentos permite identificar não apenas os setores mais resilientes da economia, mas também o perfil demográfico da força de trabalho formal.
O Problema de Negócio
Formular políticas públicas eficientes e direcionar investimentos privados exige precisão. Diante de flutuações econômicas e sazonalidades, governantes, analistas de mercado e entidades de classe enfrentam o desafio de responder: quais setores geram emprego real em Pernambuco, quem está sendo contratado e como a sazonalidade afeta essas vagas?
Público-Alvo
- Gestores Públicos e Secretarias de Desenvolvimento: Para direcionamento de políticas de capacitação profissional e incentivos fiscais.
- Sindicatos e Associações Comerciais: Para entender o poder de barganha e o crescimento de nichos industriais/comerciais.
- Analistas de Recursos Humanos e Economistas: Para benchmarking setorial e relatórios de tendências de mercado.
Abordagem Metodológica
Esta análise utiliza os microdados brutos do Novo CAGED (Cadastro Geral de Empregados e Desempregados) referentes ao ano base. A abordagem compreende:
- Tratamento e Engenharia de Dados: Consolidação de arquivos mensais, filtragem geográfica para Pernambuco e decodificação de variáveis utilizando tabelas auxiliares da CNAE (setores) e CBO (ocupações).
- Análise Exploratória Interativa: Uso de visualizações dinâmicas para identificar picos sazonais, disparidades demográficas (gênero, idade, escolaridade) e o saldo líquido de empregos por setor.
Configuração do Ambiente e Pacotes
Para garantir a reprodutibilidade e a eficiência no tratamento de grandes volumes de dados, utilizamos os seguintes pacotes:
# --- Pacotes clássicos da disciplina ---
library(dplyr)
library(plotly)
library(DT)
# --- Pacotes extras ---
library(vroom) # Leitura ultrarrápida de arquivos grandes
library(janitor) # Limpeza automática de nomes de colunas e tabelas de frequência
library(lubridate) # Manipulação inteligente de datas para análise de sazonalidade
library(stringr) # Tratamento de strings e preenchimento de zeros à esquerda (str_pad)
library(readxl) # Leitura das tabelas auxiliares (CBO, CNAE) em formato .xlsxNota de justificativa: O pacote
{vroom}é estratégico dado o volume do dataset — ele indexa o arquivo sem carregá-lo inteiramente na memória de imediato, tornando a leitura drasticamente mais rápida que oread.csvtradicional. O{janitor}garante que as colunas sigam o padrãosnake_case, evitando erros de sintaxe ao longo da análise.
Limpeza e Transformação dos Dados
Fonte dos Dados
Os microdados do Novo CAGED são disponibilizados mensalmente pelo Ministério do Trabalho e Emprego (MTE) através do portal PDET: http://pdet.mte.gov.br/microdados. Cada arquivo representa um mês de movimentações (admissões e desligamentos) do mercado formal brasileiro, contendo variáveis como UF, setor de atividade (CNAE), ocupação (CBO), escolaridade, gênero, idade e remuneração — todas codificadas numericamente, o que exige o cruzamento com tabelas auxiliares para torná-las legíveis.
Importação e Concatenação dos Arquivos Mensais
Os arquivos mensais (ex.: CAGEDMOV202501.txt,
CAGEDMOV202502.txt, …) devem ser baixados do portal PDET e
salvos na pasta dados_brutos/.
# --- Estratégia de Persistência em Disco (RAM Constante) ---
library(vroom)
library(dplyr)
library(janitor)
library(readr) # Pacote necessário para o salvamento incremental
# 1. Mapeia todos os 28 arquivos .txt
arquivos_caged <- list.files(
path = "dados_brutos",
pattern = "\\.txt$",
full.names = TRUE
)
# Definimos o nome do arquivo único que será criado na raiz
arquivo_final_pe <- "dados_pe_consolidados.csv"
# Se esse arquivo já existir de alguma rodada anterior, deletamos para evitar duplicar
if (file.exists(arquivo_final_pe)) {
file.remove(arquivo_final_pe)
}## [1] TRUE
# 2. Laço 'for' processando e jogando o resultado no SSD
for (i in seq_along(arquivos_caged)) {
arquivo_atual <- arquivos_caged[i]
cat("Processando arquivo ", i, " de ", length(arquivos_caged), ": ", basename(arquivo_atual), "\n", sep = "")
# Leitura temporária do mês inteiro (Brasil)
df_mes_completo <- vroom(arquivo_atual, delim = ";", show_col_types = FALSE) %>%
clean_names()
# Filtra apenas Pernambuco
df_pe <- df_mes_completo %>%
filter(uf == 26) %>%
as.data.frame()
# Salva direto no arquivo físico.
# Se i == 1 (primeiro mês), ele cria o arquivo com cabeçalho.
# Se i > 1, ele apenas adiciona (append) as novas linhas no final.
write_delim(df_pe, file = arquivo_final_pe, delim = ";", append = (i > 1))
# Liberação de RAM para a próxima rodada
rm(df_mes_completo, df_pe)
gc()
}## Processando arquivo 1 de 28: CAGEDMOV202401.txt
## Processando arquivo 2 de 28: CAGEDMOV202402.txt
## Processando arquivo 3 de 28: CAGEDMOV202403.txt
## Processando arquivo 4 de 28: CAGEDMOV202404.txt
## Processando arquivo 5 de 28: CAGEDMOV202405.txt
## Processando arquivo 6 de 28: CAGEDMOV202406.txt
## Processando arquivo 7 de 28: CAGEDMOV202407.txt
## Processando arquivo 8 de 28: CAGEDMOV202408.txt
## Processando arquivo 9 de 28: CAGEDMOV202409.txt
## Processando arquivo 10 de 28: CAGEDMOV202410.txt
## Processando arquivo 11 de 28: CAGEDMOV202411.txt
## Processando arquivo 12 de 28: CAGEDMOV202412.txt
## Processando arquivo 13 de 28: CAGEDMOV202501.txt
## Processando arquivo 14 de 28: CAGEDMOV202502.txt
## Processando arquivo 15 de 28: CAGEDMOV202503.txt
## Processando arquivo 16 de 28: CAGEDMOV202504.txt
## Processando arquivo 17 de 28: CAGEDMOV202505.txt
## Processando arquivo 18 de 28: CAGEDMOV202506.txt
## Processando arquivo 19 de 28: CAGEDMOV202507.txt
## Processando arquivo 20 de 28: CAGEDMOV202508.txt
## Processando arquivo 21 de 28: CAGEDMOV202509.txt
## Processando arquivo 22 de 28: CAGEDMOV202510.txt
## Processando arquivo 23 de 28: CAGEDMOV202511.txt
## Processando arquivo 24 de 28: CAGEDMOV202512.txt
## Processando arquivo 25 de 28: CAGEDMOV202601.txt
## Processando arquivo 26 de 28: CAGEDMOV202602.txt
## Processando arquivo 27 de 28: CAGEDMOV202603.txt
## Processando arquivo 28 de 28: CAGEDMOV202604.txt
# 3. Agora que o arquivo de Pernambuco está consolidado, lemos ele de uma vez.
cat("\n[Sucesso] Criado arquivo em disco. Carregando dados estáveis de PE...\n")##
## [Sucesso] Criado arquivo em disco. Carregando dados estáveis de PE...
dados_pe_brutos <- vroom(arquivo_final_pe, delim = ";", show_col_types = FALSE)
print(paste("Registros carregados de Pernambuco com sucesso:", format(nrow(dados_pe_brutos), big.mark=".")))## [1] "Registros carregados de Pernambuco com sucesso: 2.964.772"
Decodificação das Variáveis (Tabelas Auxiliares)
O CAGED armazena setores, ocupações e grau de instrução como códigos
numéricos. Para tornar os dados legíveis, realizamos junções
(left_join) com as tabelas auxiliares disponíveis no Layout
do Novo CAGED (arquivo zipado no portal PDET).
# --- 1. Carregamento Seguro das Tabelas Auxiliares do Excel na Raiz ---
aux_cnae <- read_excel("Layout Não-identificado Novo Caged Movimentação.xlsx", sheet = "subclasse") %>%
select(codigo = `Código`, descricao_cnae = `Descrição`) %>%
mutate(codigo = as.character(codigo))
aux_cbo <- read_excel("Layout Não-identificado Novo Caged Movimentação.xlsx", sheet = "cbo2002ocupação") %>%
select(codigo = `Código`, descricao_cbo = `Descrição`) %>%
mutate(codigo = as.character(codigo))
aux_escolaridade <- read_excel("Layout Não-identificado Novo Caged Movimentação.xlsx", sheet = "graudeinstrução") %>%
select(codigo = `Código`, descricao_escolaridade = `Descrição`) %>%
mutate(codigo = as.integer(codigo))
aux_sexo <- read_excel("Layout Não-identificado Novo Caged Movimentação.xlsx", sheet = "sexo") %>%
select(codigo = `Código`, genero = `Descrição`) %>%
mutate(codigo = as.integer(codigo))
# --- 2. Processamento e Cruzamento do Dataset Principal ---
dados_pe_limpos <- dados_pe_brutos %>%
# Alinhando os tipos de dados para o cruzamento
mutate(
subclasse = as.character(subclasse),
cbo2002ocupacao = as.character(cbo2002ocupacao),
graudeinstrucao = as.integer(graudeinstrucao),
sexo = as.integer(sexo)
) %>%
# Realizando os cruzamentos
left_join(aux_cnae, by = c("subclasse" = "codigo")) %>%
left_join(aux_cbo, by = c("cbo2002ocupacao" = "codigo")) %>%
left_join(aux_escolaridade, by = c("graudeinstrucao" = "codigo")) %>%
left_join(aux_sexo, by = c("sexo" = "codigo")) %>%
# --- 3. Engenharia de Variáveis e Sazonalidade ---
mutate(
saldo = if_else(saldomovimentacao == 1, 1L, -1L),
mes = ym(competenciamov),
ano = year(mes),
nome_mes = month(mes, label = TRUE, abbr = FALSE)
) %>%
# --- 4. Filtro (remoção de NAs) ---
filter(
!is.na(descricao_cnae),
!is.na(descricao_cbo),
!is.na(descricao_escolaridade)
)Resumo dos Dados Tratados
A tabela abaixo apresenta as 10 primeiras linhas do dataset final, conforme a restrição do projeto:
dados_pe_limpos %>%
select(mes, descricao_cnae, descricao_cbo, descricao_escolaridade,
genero, idade, salario, saldo) %>%
head(10) %>%
datatable(
options = list(pageLength = 5, scrollX = TRUE),
caption = "Tabela 1: Amostra dos Dados Consolidados do Novo CAGED — Pernambuco."
)Resumo consolidado do dataset tratado:
# Resumo das dimensões e variáveis
tibble(
Variável = c("Período coberto", "Total de registros (PE)",
"Admissões", "Desligamentos", "Saldo líquido"),
Valor = c(
paste(min(dados_pe_limpos$mes), "a", max(dados_pe_limpos$mes)),
format(nrow(dados_pe_limpos), big.mark = "."),
format(sum(dados_pe_limpos$saldo == 1), big.mark = "."),
format(sum(dados_pe_limpos$saldo == -1), big.mark = "."),
format(sum(dados_pe_limpos$saldo), big.mark = ".")
)
) %>%
knitr::kable(caption = "Tabela 2: Resumo do Dataset Tratado.")| Variável | Valor |
|---|---|
| Período coberto | 2024-01-01 a 2026-04-01 |
| Total de registros (PE) | 2.963.897 |
| Admissões | 1.549.885 |
| Desligamentos | 1.414.012 |
| Saldo líquido | 135.873 |