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:

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

Nota 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 o read.csv tradicional. O {janitor} garante que as colunas sigam o padrão snake_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.")
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