Atualização (04/02/2021): modifiquei o código para 2018 pois os pesos não possuíam o separador decimal e porque o pacote MonetDBLite foi removido do CRAN. Sugiro tomar cuidado com análises sobre 2018.

Você sabe o que é o Cadastro Único? Sabe que uma amostra dos microdados está disponível? Sabe que dá pra analisar no R?

Não? Até uns dias atrás, eu também não.
Se você tem interesse nessa base de dados, vamos lá!
Caso contrário, assista esse vídeo do MDS. Se, ainda assim, você não estiver interessado, bom… tem um presente no fim do post. Não tem nada muito a ver, mas vale a pena!

O que é?

Segundo o MDS1, O Cadastro Único para Programas Sociais do Governo Federal (doravante, CadÚnico) identifica e coleta informações sobre as famílias de baixa renda, fornecendo informações detalhadas a respeito dos seus domicílios, escolaridade, renda, etc. Embora o CadÚnico exista desde 2001, foi com o advento do Programa Bolsa Família, em 2003, que ele ficou conhecido.

O Bolsa Família ainda é2 considerado o maior programa de transferência de renda do mundo. E todos os beneficiários do Bolsa Família fazem parte do CadÚnico. Em poucas palavras, beneficiários do Bolsa Família \(\subset\) CadÚnico.
Além disso, o CadÚnico também tem informações sobre outros programas sociais, como o Minha Casa Minha Vida, Bolsa Verde, Água para Todos, Bolsa Estiagem, etc.

Então, não seria maravilhoso se tivéssemos acesso a esses dados? Bom, sim. Mas ter acesso à informações que podem identificar pessoas é uma violação do direito à privacidade. Além disso, colocaria em risco as pessoas que já estão em uma situação de vulnerabilidade social. Embora o acesso à base de dados pode ser concedido para pesquisadores através de um procedimento administrativo, existe uma alternativa.

Microdados da Amostra

Há pouco tempo, a SAGI3 disponibilizou amostras desidentificadas do CadÚnico, referentes ao mês de dezembro do período de 2012 a 2016. Para assegurar a validade da amostra, foram utilizados procedimentos de amostragem complexa4, o que garante a segurança das informações pessoais.

Entretanto, essa técnica exige cuidados na hora de analisar os dados. Muitos procedimentos que usam a suposição de amostra aleatória simples precisam ser adaptados para fornecer estimativas não-viesadas e precisas. Felizmente, a library survey traz todas as ferramentas necessárias para essa tarefa.

Na prática

Em alguns sites de discussão sobre análise de dados, comentava-se que o R não consegue lidar com bases de dados grandes. Bom, isso foi contornado de diversas maneiras.

Montando a base

Para facilitar o processo de baixar e montar a base de dados, escrevi esse script com duas funções para facilitar esse procedimento. O bloco de código abaixo mostra como fazer essa tarefa:

Esse procedimento pode ser um pouco demorado, dependendo da sua conexão com a internet e seu computador.

# instala os pacotes:
libs <- c("DBI", "RSQLite" , "fst" , "survey")
libs.novas <- libs[ !( libs %in% installed.packages()[ , "Package" ] ) ]
if( length( libs.novas ) ) install.packages( libs.novas )

# carrega os pacotes necessários
library(DBI)
library(RSQLite)
library(survey)

# carrega funções do script
downloader::source_url("https://raw.githubusercontent.com/guilhermejacob/guilhermejacob.github.io/master/scripts/cadunico.R" , prompt = FALSE )

# define o diretório onde serão depositados os dados
output_dir <- file.path( tempdir() , "CadUnico" )

# coleta o "catálogo de dados" no site do MDS:
catalog <- catalog_cadunico( output_dir )

# O próximo passo é opcional:
# Aqui, escolho apenas os dados de 2016
catalog <- catalog[ catalog$year == 2016 , ]

# Vamos usar esse "catálogo" como o argumento da função build_cadunico
# Essa última função vai montar a base de dados
build_cadunico( catalog )

Voilà! Sua base de dados foi lida e montada com sucesso.

Mas como analisar?

O código abaixo mostra como analisar os dados utilizando o desenho amostral e sem sobrecarregar a memória RAM, graças à integração do pacote survey e drivers de bases de dados:

# carrega os pacotes necessários
library(DBI)
library(RSQLite)
library(survey)

# lê o objeto com o desenho amostral
pes.design <- readRDS( file.path( output_dir , "cadunico 2016 design.rds" ) )

# abre a conexão do objeto com a base em SQLite
pes.design <- open( pes.design , driver = SQLite() )

# conta o número de observações na base
dim( pes.design )
# [1] 14836037       61

# calcula o número de crianças e adolescentes (menores de 18 anos) no CadÚnico
total.cea <- svytotal( ~I(idade < 18) , pes.design , na.rm = TRUE )
#                       total    SE
# I(idade < 18)FALSE 45823981 10613
# I(idade < 18)TRUE  31048301 14305


# calcula intervalo de confiança
confint( total.cea ) 
#                       2.5 %   97.5 %
# I(idade < 18)FALSE 45803180 45844782
# I(idade < 18)TRUE  31020265 31076338

# fecha a conexão com a base de dados
close( pes.design )

15 milhões de linhas parece um número bem razoável para uma planilha, não? E considerando que essas linhas representam mais de 70 milhões de pessoas, ainda melhor.
Vale dizer: o survey permite que você use praticamente tudo que você usaria em uma base guardada na memória. Por exemplo, modelos lineares generalizados com svyglm, curvas de sobrevivência de Kaplan-Meier com svykm, etc.

Ah, e se você quiser saber mais sobre como usar o R com o SQLite, vale dar uma lida aqui.

Bônus!

Meu presente para você que chegou até o fim desse post. Não precisa agradecer ;)


  1. Ministério do Desenvolvimento Social.↩︎

  2. Ultimamente, eu já nem sei.↩︎

  3. Secretaria de Avaliação e Gestão da Informação/MDS.↩︎

  4. Para aprender mais sobre o tema, sugiro ler esse livro , feito pelo Djalma Pessoa e Pedro Nascimento Silva.↩︎