5  Agregados dos Setores Censitários

Talvez os conjuntos de dados mais comumente usados dos censos brasileiros sejam os microdados de pessoas e domicílios. No entanto, o IBGE também disponibiliza dados muito ricos sobre as características populacionais e ambientais agregados no nível de setores censitários. Neste capítulo, mostramos como usar o pacote {censobr} para acessar facilmente esses dados usando a função read_tracts().

5.1 Estrutura dos dados

No seu formato original, os dados agregados no nível de setores censitários estão divididos em diferentes tipos de variáveis (e.g. variáveis de características de pessoas, de domicílios, etc). Em muitos casos, esses conjuntos de variáveis estão espalhadas por vários arquivos (em alguns casos com centenas variáveis). Para facilitar o entendimento desses dados, o {censobr} reúne todos os arquivos / variáveis em 8 tabelas:

  • "Basico"
  • "Entorno"
  • "Domicilio"
  • "Pessoa"
  • "Responsavel"
  • "PessoaRenda"
  • "DomicilioRenda"
  • "ResponsavelRenda"

Todas estas tabelas estão organizadas seguindo a mesma lógica. Nos casos em que as variáveis de uma tabela provêm de arquivos diferentes, o nome da variável recebe um prefixo indicando a sua tabela de origem. Isso é feito para facilitar a consulta do significado de cada coluna no arquivo de dicionário variáveis (no próximo capítulo a gente vai ver como baixar os dicionários variáveis dos censos).

Para ilustrar isso, vejamos a tabela com variáveis de "Domicilio". Essa tabela provêm de dois arquivos separados: Domicilio01 e Domicilio02. Assim, os nomes das colunas nessa tabela são organizados da seguinte maneira:

library(censobr)

# baixa dados agregados de setores: variáveis de domicilios
dom <- read_tracts(year = 2010, 
                   dataset = 'Domicilio',
                   as_data_frame = FALSE,
                   showProgress = FALSE)

names(dom)[c(1:12,301:306)]
 [1] "code_tract"        "code_weighting"    "code_muni"        
 [4] "code_state"        "abbrev_state"      "name_state"       
 [7] "code_region"       "name_region"       "domicilio01_V1005"
[10] "domicilio01_V001"  "domicilio01_V002"  "domicilio01_V003" 
[13] "domicilio02_V050"  "domicilio02_V051"  "domicilio02_V052" 
[16] "domicilio02_V053"  "domicilio02_V054"  "domicilio02_V055" 

5.2 Dicionário de variáveis

Para verificar o significado de cada variável, você pode executar o comando data_dictionary(), que abrirá no navegador um arquivo .html ou .pdf com o dicionário de variáveis de cada conjunto de dados (ver mais info no capítulo 6 sobre Documentação).

data_dictionary(year = 2010,
                dataset = 'tracts')

5.3 Exemplos reproduzíveis

Essa organização dos dados agregados por setores censitários parece confusa a primeira vista. E é mesmo. Mas essa organização fica mais clara com alguns exemplos práticos.

Nesta seção, nós vamos utilizar alguns exemplos para ilustrar como trabalhar com dados no nível de setor censitário. Primeiro, precisamos carregar as bibliotecas que usaremos neste tutorial.

library(censobr)
library(geobr)
library(arrow)
library(dplyr)
library(ggplot2)

Nos dois exemplos abaixo, usaremos a cidade de Belo Horizonte para fins de demonstração. No primeiro exemplo, nós vamos mapear a distribuição espacial da renda com dados de 2010. No segundo exemplo, nós vamos mapear a distribuição espacial da densidade populacional de BH com os dados preliminares do censo de 2022.

5.3.1 Exemplo 1: Distribuição espacial da renda em 2010

Neste primeiro exemplo, criaremos um mapa da distribuição espacial da renda média per capita. A informação sobre o número total de residentes em cada setor censitário está disponível na tabela com conjunto de variáveis do bloco "Basico", na variável "V002". Já a informação sobre renda total do setor censiário pode ser encontradas na tabela do bloco "DomicilioRenda", na variável "V003".

Utilizando o código abaixo, podemos baixar os dados e calcular a renda per capita de todos os setores censitários no Brasil. Posteriormente nós vamos filtrar esses resultados para ficar apenas com os setores de BH.

# baixa os dados
tract_basico <- read_tracts(year = 2010,
                            dataset = "Basico",
                            showProgress = FALSE)

tract_income <- read_tracts(year = 2010,
                            dataset = "DomicilioRenda",
                            showProgress = FALSE)     

# selecionar conlunas
tract_basico <- tract_basico |> select('code_tract','V002')
tract_income <- tract_income |> select('code_tract','V003')

# unir as tabelass
tracts_df10 <- left_join(tract_basico, tract_income)
                

# calcular a renda per capita
tracts_df10 <- tracts_df10 |> 
                mutate(income_pc = V003 / V002) |>
                collect()

head(tracts_df10)
1
Download de dados do bloco Basico
2
Download de dados do bloco DomicilioRenda
3
Seleciona apenas as variáveis que vamos utilizar
4
Junta as duas variáveis num único data.frame
5
Cacula renda per capita de cada setor censitário
6
Extração dos resultados
        code_tract  V002   V003 income_pc
            <char> <num>  <num>     <num>
1: 120001305000001   957 601805  628.8454
2: 120001305000002  1203 385033  320.0607
3: 120001305000003  1700 531794  312.8200
4: 120001305000004   182  58853  323.3681
5: 120001305000005   305 112979  370.4230
6: 120001305000006   483 263538  545.6273

O próximo passo é baixar as geometrias dos setores censitários de BH em 2010 com a função read_census_tract, do pacote {geobr}. Aqui, nós passamos o parâmetro code_tract = "MG" baixar os todos os setores do estado de Minas Gerais e depois filtramos apenas o município de Belo Horizonte.

# busca qual o código do municipio de Belo Horizonte
bh_info <- geobr::lookup_muni(name_muni = 'Belo Horizonte')
#> code_muni: 3106200

# baixa municipio de BH
muni_bh <- geobr::read_municipality(code_muni = 'MG', 
                                    year = 2010,
                                    showProgress = FALSE) |>
           filter(name_muni == "Belo Horizonte")

# baixa todos setores de Minas Gerais
tracts_2010 <- geobr::read_census_tract(code_tract = "MG",
                                        year = 2010,
                                        simplified = FALSE,
                                        showProgress = FALSE)

# filtra setores de BH
tracts_2010 <- filter(tracts_2010, name_muni == 'Belo Horizonte')

# mapa de setores censitarios
ggplot() + 
  geom_sf(data=tracts_2010, fill = 'gray90', color='gray60') +
  theme_void()
1
O comportamento padrão do {geobr} é baixar uma versão da malha espacial com geometrias ligeiramente simplificadas (simplified = TRUE) para agilizar o processamento e visualização de dados. Aqui, nós baixamos os dados com geometrias originais devido à escala espacial da visualização dos resultados.

Por fim, a gente pode fazer um merge dos dados espaciais e de renda dos setores censitários usando como variável chave o código do setor censitário (code_tract) e criar o mapa da distribuição espacial da renda per capita do município.

bh_tracts <- left_join(tracts_2010, tracts_df10, by = 'code_tract')

ggplot() +
  geom_sf(data = bh_tracts, aes(fill = ifelse(income_pc<10000,income_pc,10000)), 
          color=NA) +
  geom_sf(data = muni_bh, color='gray10', fill=NA) +
  labs(title = 'Renda per capita dos setores censitários',
       subtitle= 'Belo Horizonte, 2010') +
  scale_fill_viridis_c(name = "Reda per\ncapita (R$)",
                       na.value="white",
                       option = 'cividis',
                       breaks = c(0,  1e3, 4e3, 8e3, 1e4) ,
                        labels  = c('0',  '1.000', '4.000', '8.000', '> 10.000')
                       ) +
  theme_void()

5.3.2 Examplo 2: Distribuição espacial da população em 2022

Neste segundo exemplo, nós vamos utilizar os resultados "Preliminares" dos agregados dos setores censitários do censo de 2022, que foram divulgados pelo IBGE em março de 2024. Em particular, vamos utilizar a variável V0001 que informa a população total dos setores. Além disso, como houve uma mudança na malha espacial de setores censitários entre 2010 e 2022, nós precisamos baixar a malha do ano correspondente.

# download dados preliminares dos setores de 2022
tracts_df22 <- read_tracts(year = 2022,
                          dataset = "Preliminares",
                          showProgress = FALSE) |>
               filter(name_muni == 'Belo Horizonte') |>
               collect()

# baixa todos setores de Minas Gerais
tracts_2022 <- geobr::read_census_tract(code_tract = "MG",
                                        year = 2022,
                                        simplified = FALSE,
                                        showProgress = FALSE)

# filtra setores de BH
tracts_2022 <- filter(tracts_2022, name_muni == 'Belo Horizonte')

Agora a gente pode fazer um merge da tabela de população com os dados espaciais, calcular a área dos setores em Km2 e a densidade demográfica de cada setor, e criar o mapa.

# merge tables
tracts_df22$code_tract <- as.numeric(tracts_df22$code_tract)
bh_tracts22 <- left_join(tracts_2022, tracts_df22, by = 'code_tract')

# calcula a área dos setores
bh_tracts22 <- bh_tracts22 |>
              mutate(tract_aream2 = sf::st_area(tracts_2022),
                     tract_areakm2 = units::set_units(tract_aream2, km2))

# calcula densidade demografica
bh_tracts22 <- bh_tracts22 |>
               mutate(pop_km2 = as.numeric(V0001/ tract_areakm2))

# map
ggplot() +
  geom_sf(data = bh_tracts22, color=NA,
          aes(fill = ifelse(pop_km2<20000,pop_km2,20000))) +
  geom_sf(data = muni_bh, color='gray10', fill=NA) +
  labs(title = 'Densidade populacional dos setores censitários',
       subtitle= 'Belo Horizonte, 2022') +
  scale_fill_distiller(palette = "Reds", direction = 1, 
                       name='População por'~Km^2,
                       breaks = c(0,  5e3, 10e3, 15e3, 2e4) ,
                       labels  = c('0',  '5.000', '10.000', '15.000', '> 20.000')) +
  theme_void()