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 aos anos de 2024 a abril de 2026. A abordagem compreende:

  1. 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).
  2. 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)    # Manipulação de dados fluida e intuitiva
library(plotly)   # Criação de gráficos interativos (foco em experiência do usuário)
library(DT)       # Tabelas interativas que evitam o dump de dados no HTML 

# --- 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 .xlsx

Nota de justificativa dos pacotes utilizados:

Pacotes Clássicos da Disciplina: - {dplyr}: Utilizado como motor principal para a manipulação, transformação e engenharia de atributos do dataset. Através de funções verbais e do operador pipe (%>%), ele otimiza operações de filtragem, agrupamento e junções relacionais com performance baseada em um backend em C++. - {plotly}: Adotado para a construção de visualizações de dados dinâmicas. Ele encapsula a biblioteca JavaScript Plotly, permitindo que os gráficos finais do relatório possuam interatividade nativa, elevando a experiência do usuário. - {DT}: Responsável por renderizar matrizes de dados em tabelas HTML interativas via biblioteca DataTables. Ele é indispensável nesta análise para permitir a paginação e busca rápida na amostra de dados sem causar o dump (travamento) do navegador ao lidar com o volume de dados tratado.

Pacotes Extras (Pontos de Criatividade): - {vroom} e {readr}: Estratégicos para contornar a limitação de hardware (std::bad_alloc). O {vroom} faz uma leitura indexada sem carregar o arquivo inteiramente de imediato, enquanto o {readr} realiza a persistência incremental em disco via streaming. - {janitor}: Garante o saneamento dos metadados originais, forçando que todas as colunas sigam o padrão snake_case, mitigando erros de sintaxe em tempo de execução.


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."
  )

Nota técnica sobre a métrica salarial: Conforme a documentação oficial do Novo CAGED, a variável de remuneração é registrada com duas casas decimais implícitas (centavos) omitidas de separador flutuante no banco de dados bruto. Portanto, valores como 180000 e 144900 correspondem a R$ 1.800,00 e R$ 1.449,00, respectivamente, refletindo saldos salariais operacionais perfeitamente condizentes com a realidade do mercado.

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.")
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

Análise Exploratória

Saldo Mensal de Empregos em Pernambuco

saldo_mensal <- dados_pe_limpos %>%
  group_by(mes) %>%
  summarise(saldo_total = sum(saldo), .groups = "drop")

plot_ly(saldo_mensal, x = ~mes, y = ~saldo_total, type = "bar",
        marker = list(color = ~ifelse(saldo_total >= 0, "#2ecc71", "#e74c3c"))) %>%
  layout(
    title  = "Saldo Mensal de Empregos Formais — Pernambuco",
    xaxis  = list(title = "Mês"),
    yaxis  = list(title = "Saldo (Admissões − Desligamentos)"),
    bargap = 0.2
  )

Análise de Sazonalidade: O comportamento temporal do emprego formal em Pernambuco demonstra picos claros de contratação e demissão ao longo dos meses. Esse padrão se repete de forma cíclica a cada ano observado dentro da série temporal de 28 meses: os primeiros meses do ano (particularmente janeiro) concentram saldos negativos devido ao encerramento de contratos temporários do comércio varejista e à dinâmica da entresafra da cana-de-açúcar, enquanto os meses seguintes de cada ciclo anual apresentam uma curva consistente de recuperação.

Top 10 Setores por Saldo Líquido

saldo_setor <- dados_pe_limpos %>%
  group_by(descricao_cnae) %>%
  summarise(saldo_total = sum(saldo), .groups = "drop") %>%
  arrange(desc(abs(saldo_total))) %>%
  slice_head(n = 10)

plot_ly(saldo_setor,
        x = ~saldo_total,
        y = ~reorder(descricao_cnae, saldo_total),
        type = "bar",
        orientation = "h",
        marker = list(color = "#3498db")) %>%
  layout(
    title  = "Top 10 Setores por Saldo Líquido de Empregos — Pernambuco",
    xaxis  = list(title = "Saldo Líquido (Admissões - Desligamentos)"),
    yaxis  = list(title = "", automargin = TRUE) # Impede que o texto corte na esquerda
  )

Análise Setorial: O gráfico horizontal evidencia uma forte dualidade na economia pernambucana. Os grandes motores de geração de vagas concentram-se no setor de Serviços e Infraestrutura, liderados por Fornecimento e Gestão de Recursos Humanos para Terceiros (+17.375 vagas) e Construção de Edifícios (+12.200 vagas). Em contrapartida, as maiores retrações ocorrem no setor agroindustrial tradicional (Fabricação de Açúcar em Bruto com -10.987 vagas e Cultivo de Cana-de-Açúcar com -3.729 vagas), indicando flutuações sazonais severas ou reestruturação de mercado nessas cadeias produtivas.

Perfil Demográfico dos Trabalhadores Admitidos

perfil <- dados_pe_limpos %>%
  filter(saldo == 1) %>%                           # apenas admissões
  group_by(descricao_escolaridade, genero) %>%
  summarise(total = n(), .groups = "drop")

plot_ly(perfil, x = ~descricao_escolaridade, y = ~total,
        color = ~as.factor(genero), type = "bar", barmode = "group") %>%
  layout(
    title  = "Perfil de Escolaridade e Gênero nas Admissões — Pernambuco",
    xaxis  = list(title = "Grau de Instrução", tickangle = -30),
    yaxis  = list(title = "Nº de Admissões"),
    legend = list(title = list(text = "Gênero"))
  )

Análise Demográfica: O perfil das admissões revela uma centralidade absoluta de trabalhadores com o Ensino Médio Completo, registrando 667.675 contratações de homens e 397.369 de mulheres. É perceptível uma disparidade de gênero no volume total de contratações operacionais. Contudo, destaca-se a presença de Mulheres com Ensino Superior Completo como a terceira força demográfica absoluta de admissão (+69.337 vagas), superando ligeiramente a ala masculina de mesma escolaridade (que figura logo em seguida como quarta força), sinalizando uma sólida e expressiva inserção feminina em postos de trabalho que exigem maior qualificação técnica no estado.

Tabela Interativa — Saldo por Setor e Mês

dados_pe_limpos %>%
  group_by(Setor = descricao_cnae, Mês = nome_mes) %>%
  summarise(Saldo = sum(saldo), .groups = "drop") %>%
  datatable(
    filter  = "top",
    options = list(pageLength = 10, scrollX = TRUE),
    caption = "Tabela 3: Saldo de Empregos por Setor e Mês — Pernambuco."
  )

Conclusões

Esta análise evidenciou de forma robusta e interativa os principais padrões e forças motrizes do mercado de trabalho formal em Pernambuco, cobrindo o período de 2024 a abril de 2026 a partir dos microdados do Novo CAGED. Os resultados indicam:

  • Sazonalidade Sucroalcooleira e Comercial: O mercado formal do estado é fortemente impactado por ciclos sazonais. Os meses de início de ano concentram desligamentos associados ao encerramento de contratos temporários no comércio e, crucialmente em Pernambuco, ao fim da safra da cana-de-açúcar, gerando retrações temporárias no saldo líquido.
  • Setores Dinâmicos: A geração real de empregos no estado é puxada fortemente pelo setor de serviços e infraestrutura urbana, liderada por Fornecimento e Gestão de Recursos Humanos para Terceiros (saldo de +17.375) e pela Construção de Edifícios (+12.200). Por outro lado, a agroindústria tradicional da Zona da Mata (Fabricação de Açúcar em Bruto com -10.987 e Cultivo de Cana-de-Açúcar com -3.729) figurou como a principal responsável pela retração de postos formais no acumulado.
  • Perfil Demográfico: O mercado formal exige majoritariamente a escolaridade de nível Ensino Médio Completo, onde as contratações de homens (667.675) ainda superam significativamente as de mulheres (397.369). Contudo, destaca-se a forte inserção de mulheres com Ensino Superior Completo como a terceira maior força demográfica de admissão (+69.337), sinalizando a ocupação feminina em postos de maior qualificação técnica.

Implicações para os Públicos-Alvo

Os resultados subsidiam decisões estratégicas diretas: 1. Gestores Públicos: Devem direcionar políticas de qualificação e atração de empresas para os setores de serviços estáveis e infraestrutura, além de criar redes de suporte para os trabalhadores da cadeia do açúcar nos meses de entresafra. 2. Sindicatos e Associações: Ganham embasamento técnico para negociações coletivas em setores superaquecidos, como a construção civil. 3. Analistas de RH e Economistas: Conseguem prever melhor as janelas de escassez ou abundância de mão de obra com base nos ciclos sazonais mapeados.

Limitações e Trabalhos Futuros

  • A análise está estritamente restrita aos registros do mercado formal (trabalhadores celetistas). O mercado informal, sabidamente expressivo no estado de Pernambuco, não é capturado pela base do CAGED, limitando a visão holística da força de trabalho.
  • Dimensão Ocupacional (CBO): Embora o pipeline de engenharia de dados tenha higienizado e decodificado com sucesso as strings da Classificação Brasileira de Ocupações (CBO), optou-se por focar as visualizações atuais na dinâmica macro dos setores econômicos (CNAE). A exploração detalhada de saldos por cargos específicos e profissões fica registrada como um desdobramento natural para trabalhos futuros.
  • Como trabalho futuro estendido, recomenda-se correlacionar os saldos de contratação aqui mapeados com o PIB trimestral do estado e dados de arrecadação do ICMS por setor econômico, enriquecendo a interpretação causal dos fenômenos observados.

Referências

  • Ministério do Trabalho e Emprego. Novo CAGED — Microdados. Disponível em: http://pdet.mte.gov.br/microdados. Acesso em: junho de 2026.
  • IBGE. Tabela de Códigos de Municípios. Disponível em: https://www.ibge.gov.br.
  • Wickham, H. et al. dplyr: A Grammar of Data Manipulation. R package, 2023.
  • Sievert, C. Interactive Web-Based Data Visualization with R, plotly, and shiny. Chapman and Hall/CRC, 2020.