O datacaged simplifica o acesso aos microdados do
CAGED (Cadastro Geral de Empregados e Desempregados)
diretamente do HuggingFace do Ministério do Trabalho e Emprego (MTE),
carregando os dados em um banco DuckDB local para
análise eficiente.
Ele suporta três séries:
| Período | Série | Tabela no banco |
|---|---|---|
| Jan/2020 – hoje | Novo CAGED | caged_mov, caged_for,
caged_exc |
| Jan/1992 – Dez/2019 | CAGED antigo | caged_antigo |
| Jan/1992 – Dez/2019 | CAGED Ajustes | caged_ajustes |
O datacaged é compatível com Windows, macOS e
Linux sem configuração adicional para o Novo CAGED (2020+).
| Recurso | Windows | macOS | Linux |
|---|---|---|---|
| Download (HTTPS) | OK | OK | OK |
| Downloads paralelos | OK | OK | OK |
| Novo CAGED (2020+) | OK | OK | OK |
| CAGED antigo (pré-2020, PPMd) | (!) requer 7-Zip | (!) requer 7-Zip | (!) requer 7-Zip |
O CAGED antigo usa compressão PPMd. Se precisar desses dados, instale o 7-Zip:
brew install 7-zipsudo apt install 7zip ou
sudo dnf install 7zipO Novo CAGED (2020+) usa LZMA, suportado nativamente pelo pacote
archive em todas as plataformas.
Por padrão, o pacote baixa 3 arquivos simultaneamente (MOV, FOR e EXC de cada mês), o que resulta em aproximadamente 3× mais velocidade em relação ao modo sequencial.
A função caged_load() faz tudo em um só comando: baixa
os .7z do HuggingFace, extrai, normaliza e grava no
DuckDB.
library(datacaged)
# Baixa Novo CAGED de Jan–Dez/2023 para SP e RJ
# Novo CAGED: arquivo nacional, `states` não filtra
caged_load(
years = 2023,
months = seq_len(12L),
db_path = "caged.duckdb"
)O progresso é exibido no terminal com barra de andamento e resumo final.
Após popular o banco, conecte e consulte com dplyr ou
SQL puro:
library(dplyr)
con <- caged_connect("caged.duckdb")
# Saldo de empregos por mês em 2023
saldo_mensal <- tbl(con, "caged_mov") |>
group_by(competenciamov) |>
summarise(saldo = sum(saldomovimentacao, na.rm = TRUE)) |>
arrange(competenciamov) |>
collect()
saldo_mensal# Ou com SQL direto
DBI::dbGetQuery(con, "
SELECT
competenciamov,
uf,
SUM(saldomovimentacao) AS saldo,
AVG(salario) AS salario_medio,
COUNT(*) AS movimentacoes
FROM caged_mov
WHERE uf = 35 -- Sao Paulo
GROUP BY competenciamov, uf
ORDER BY competenciamov
")Sempre feche a conexão ao terminar:
Para mais controle, use as funções individualmente:
caged_info("caged.duckdb")
#> ── caged.duckdb ────────────────────────────────────────
#> Tamanho do arquivo: 142.3 MB
#> ── Tabelas ──────────────────────────────────────────────
#> * "caged_mov" Registros: 3,665,155
#> * "caged_for" Registros: 91,098
#> * "caged_exc" Registros: 7,900
#> Registros : 4.823.901
#> Competências: 202301 – 202312# Baixa CAGED antigo para Nordeste (2015–2019)
nordeste <- c("MA", "PI", "CE", "RN", "PB", "PE", "AL", "SE", "BA")
caged_load(
years = 2015:2019,
db_path = "caged_historico.duckdb"
)
con <- caged_connect("caged_historico.duckdb")
# Evolução anual do saldo formal no Nordeste
tbl(con, "caged_antigo") |>
mutate(ano = as.integer(substr(as.character(competencia), 1, 4))) |>
group_by(ano, uf) |>
summarise(saldo = sum(saldomovimentacao, na.rm = TRUE)) |>
collect() |>
tidyr::pivot_wider(names_from = uf, values_from = saldo)
DBI::dbDisconnect(con, shutdown = TRUE)O CAGED Ajustes contém correções retroativas do CAGED antigo (até
2019). Use caged_adjustments_load() para baixar e gravar na
tabela caged_ajustes.
# Baixar ajustes de 2019
caged_adjustments_load(years = 2019, months = seq_len(12L), db_path = "caged.duckdb")
# Listar o que está disponível no HuggingFace
caged_hf_files(type = "ajustes")
# Comparar saldo original vs ajustado
con <- caged_connect("caged.duckdb")
antigo <- dplyr::tbl(con, "caged_antigo") |>
dplyr::group_by(competencia) |>
dplyr::summarise(saldo_original = sum(saldomovimentacao, na.rm = TRUE))
ajustes <- dplyr::tbl(con, "caged_ajustes") |>
dplyr::group_by(competencia) |>
dplyr::summarise(saldo_ajuste = sum(saldomovimentacao, na.rm = TRUE))
dplyr::full_join(antigo, ajustes, by = "competencia") |>
dplyr::mutate(saldo_final = saldo_original + saldo_ajuste) |>
dplyr::collect()
DBI::dbDisconnect(con, shutdown = TRUE)select()
antes de collect() para trazer apenas as colunas
necessárias.caged_load() pula
competências já no banco por padrão. Use
overwrite_competencies = TRUE para regravar..7z: os arquivos baixados
ficam em ~/.local/share/R/datacaged. Você pode
reutilizá-los sem nova conexão ao HuggingFace.# Verificar se o HuggingFace está online antes de baixar
caged_status()
# Listar competências disponíveis no HuggingFace
caged_hf_files() # Novo CAGED (últimos 12 meses)
caged_hf_files(type = "antigo") # CAGED antigo
caged_hf_files(type = "ajustes") # CAGED Ajustes
# Atualização incremental — baixa apenas o que ainda não está no banco
caged_update(db_path = "caged.duckdb")
caged_update(db_path = "caged.duckdb", series = c("novo", "antigo"))
# Exportar tabelas para Parquet (nativo DuckDB, muito rápido)
caged_to_parquet("caged.duckdb", output_dir = "~/exports")
caged_to_parquet("caged.duckdb", output_dir = "~/exports",
tables = "caged_mov", partition_by = "uf")| Coluna | Descrição |
|---|---|
competenciamov |
Competência no Novo CAGED, formato AAAAMM (ex:
202301) |
competencia |
Competência no CAGED antigo e Ajustes, formato
AAAAMM |
uf |
Código IBGE da UF (ex: 35 = SP) |
municipio |
Código IBGE do município |
saldomovimentacao |
+1 admissão, -1 desligamento |
salario |
Salário contratual em R$ |
sexo |
1 masculino, 3 feminino |
idade |
Idade em anos |
escolaridade |
Código de grau de instrução (1–9) |
racacor |
Código de raça/cor (1–5) |
tipomovimentacao |
Código do motivo da movimentação |
secao |
Seção da CNAE 2.0 (Novo CAGED) |
fonte_tipo |
MOV, FOR, EXC,
ANTIGO ou AJUSTES |