Introdução Link para o cabeçalho

Nesta semana fiquei interessado em verificar como é a distribuição de cor da pele no Brasil, em nível municipal. Pensei que assim talvez seja possível detectar algum padrão de dispersão das cores da pele através do território brasileiro. Não tenho nenhum objetivo com isso além da minha própria curiosidade.

Isso posto, mão à obra.

Download dos Dados Link para o cabeçalho

Utilizarei o Sistema IBGE de Recuperação Automática - SIDRA Para ter acessso aos dados oficiais mais atualizados sobre esse assunto. Para isso, basta usar o pacote sidrar e escolher a tabela mais adequada. Neste caso, tal tabela é a de número 9605, para o ano de 2022, em nível municipal.

# pacotes necessarios

library(sidrar)
library(tidyverse)
theme_set(theme_void())
library(janitor)
# devtools::install_github("rpradosiqueira/brazilmaps")
library(brazilmaps)
library(sf)
library(knitr)
library(kableExtra)
raca_municipios <- 
  get_sidra(x = "9605",
            period = "2022",
            geo = "City") |> 
  # padronizacao dos nomes das colunas, deixando todas em letras minusculas
  # alem de remover espacos e caracteres especiais
  clean_names()

E pronto. Agora é só processar os dados e criar o mapa.

Mapa do Percentual de Brancos por Município Link para o cabeçalho

Depois dos dados brutos baixados, eu faço uma limpeza neles. O principal motivo disso é selecionar dados apenas as variáveis que me interessam do conjunto de dados e, a partir delas, calcular a proporção de brancos em cada município.

raca_municipios_limpo <- 
  raca_municipios |> 
  # remover totais
  filter(cor_ou_raca != "Total") |> 
  # selecionar apenas as variaveis que me interessam
  select(valor, municipio, municipio_codigo, cor_ou_raca) |> 
  # criar a proporcao de brancos
  mutate(indicadora = ifelse(cor_ou_raca == "Branca", "Branca", "Outra")) |> 
  # agrupar por municipio e calcular o percentual de brancos nele
  group_by(municipio_codigo) |> 
  mutate(percentual_branca = valor/sum(valor, na.rm = TRUE)*100) |> 
  # encontrar apenas o percentual de brancos e outros
  group_by(municipio_codigo, indicadora) |> 
  summarise(percentual_branca = sum(percentual_branca, na.rm = TRUE)) |> 
  filter(indicadora == "Branca")

Como curiosidade, esta é uma tabela com as 10 cidades com maior e menor percentual de brancos, respectivamente.

raca_municipios_limpo |> 
  ungroup() |> 
  left_join(raca_municipios, by = "municipio_codigo") |> 
  select(municipio, percentual_branca) |> 
  distinct() |> 
  arrange(desc(percentual_branca)) |> 
  slice(1:10, (n()-9):n()) |> 
  kable(col.names = c("Município", "Percentual de Brancos"),
        digits = 2) |> 
  kable_minimal(full_width = F)
Município Percentual de Brancos
Morrinhos do Sul - RS 97.43
Forquetinha - RS 97.16
Monte Belo do Sul - RS 96.17
Canudos do Vale - RS 96.01
Angelina - SC 96.01
Centenário - RS 95.99
Três Arroios - RS 95.99
Cunhataí - SC 95.88
Vespasiano Corrêa - RS 95.43
Pedras Grandes - SC 95.34
Boa Vista do Ramos - AM 3.88
Terra Nova - BA 3.77
Tonantins - AM 3.68
São Gabriel da Cachoeira - AM 3.25
Normandia - RR 2.97
Amaturá - AM 2.72
Serrano do Maranhão - MA 2.72
São Paulo de Olivença - AM 2.38
Santa Isabel do Rio Negro - AM 1.64
Uiramutã - RR 0.99

Por fim, ploto o mapa com cada município pintado de acordo com o percentual de brancos na população. Para facilitar a visualização, coloco também as fronteiras entre os estados.

mapa_br <- 
  get_brmap("City") |> 
  mutate(municipio_codigo = as.character(City))

mapa_br_uf <- 
  get_brmap("State")

mapa_br |> 
  left_join(raca_municipios_limpo, by = "municipio_codigo") |> 
  ggplot() +
  geom_sf(aes(fill = percentual_branca), colour = NA) +
  geom_sf(data = mapa_br_uf, colour = "#ffe4e1", fill = NA, linewidth = 0.5) +
  scale_fill_gradient(low = "black", high = "white", limits = c(0, 100)) +
  labs(fill = "Percentual\nde Brancos\nna População",
       title = "", caption = "marcusnunes.me") +
  theme_void() + 
  theme(legend.position = "bottom")

Mapa do Percentual de Pretos por Município Link para o cabeçalho

Para isso, basta adaptar o código anterior, substituindo cada ocorrência de cor_ou_raca Branca para Preta. O mapa quase se faz sozinho.

raca_municipios_limpo <- 
  raca_municipios |> 
  # remover totais
  filter(cor_ou_raca != "Total") |> 
  # selecionar apenas as variaveis que me interessam
  select(valor, municipio, municipio_codigo, cor_ou_raca) |> 
  # criar a proporcao de brancos
  mutate(indicadora = ifelse(cor_ou_raca == "Preta", "Preta", "Outra")) |> 
  # agrupar por municipio e calcular o percentual de brancos nele
  group_by(municipio_codigo) |> 
  mutate(percentual_preta = valor/sum(valor, na.rm = TRUE)*100) |> 
  # encontrar apenas o percentual de pretos e outros
  group_by(municipio_codigo, indicadora) |> 
  summarise(percentual_preta = sum(percentual_preta, na.rm = TRUE)) |> 
  filter(indicadora == "Preta")

raca_municipios_limpo |> 
  ungroup() |> 
  left_join(raca_municipios, by = "municipio_codigo") |> 
  select(municipio, percentual_preta) |> 
  distinct() |> 
  arrange(desc(percentual_preta)) |> 
  slice(1:10, (n()-9):n()) |> 
  kable(col.names = c("Município", "Percentual de Pretos"),
        digits = 2) |> 
  kable_minimal(full_width = F)
Município Percentual de Pretos
Serrano do Maranhão - MA 58.48
Antônio Cardoso - BA 55.08
Ouriçangas - BA 52.79
Cachoeira - BA 51.83
Santo Amaro - BA 50.88
Conceição da Feira - BA 50.27
São Francisco do Conde - BA 49.91
Pedrão - BA 49.67
Salinas da Margarida - BA 47.09
São Gonçalo dos Campos - BA 47.02
Vespasiano Corrêa - RS 0.44
Atalanta - SC 0.43
Salete - SC 0.43
Lajeado Grande - SC 0.41
Ibiam - SC 0.40
Uiramutã - RR 0.37
Floriano Peixoto - RS 0.36
São João do Oeste - SC 0.35
Ubiretama - RS 0.30
Charrua - RS 0.29
mapa_br <- 
  get_brmap("City") |> 
  mutate(municipio_codigo = as.character(City))

mapa_br_uf <- 
  get_brmap("State")

mapa_br |> 
  left_join(raca_municipios_limpo, by = "municipio_codigo") |> 
  ggplot() +
  geom_sf(aes(fill = percentual_preta), colour = NA) +
  geom_sf(data = mapa_br_uf, colour = "#ffb6c1", fill = NA, linewidth = 0.5) +
  scale_fill_gradient(low = "white", high = "black", limits = c(0, max(raca_municipios_limpo$percentual_preta))) +
  labs(fill = "Percentual\nde Pretos\nna População",
       title = "", caption = "marcusnunes.me") +
  theme_void() + 
  theme(legend.position = "bottom")

Mapa do Percentual de Pardos, Indígenas e Amarelos por Município Link para o cabeçalho

Para criar mapas e tabelas das outras cores de pele, é só expandir o que já foi feito, alterando novamente as instâncias de Branca por Parda, Indígena e Amarela:

raca_municipios_limpo <- 
  raca_municipios |> 
  # remover totais
  filter(cor_ou_raca != "Total") |> 
  # selecionar apenas as variaveis que me interessam
  select(valor, municipio, municipio_codigo, cor_ou_raca) |> 
  # criar a proporcao de amarelos
  mutate(indicadora = ifelse(cor_ou_raca == "Parda", "Parda", "Outra")) |> 
  # agrupar por municipio e calcular o percentual de pardos nele
  group_by(municipio_codigo) |> 
  mutate(percentual_parda = valor/sum(valor, na.rm = TRUE)*100) |> 
  # encontrar apenas o percentual de pardos e outros
  group_by(municipio_codigo, indicadora) |> 
  summarise(percentual_parda = sum(percentual_parda, na.rm = TRUE)) |> 
  filter(indicadora == "Parda")

raca_municipios_limpo |> 
  ungroup() |> 
  left_join(raca_municipios, by = "municipio_codigo") |> 
  select(municipio, percentual_parda) |> 
  distinct() |> 
  arrange(desc(percentual_parda)) |> 
  slice(1:10, (n()-9):n()) |> 
  kable(col.names = c("Município", "Percentual de Pardos"),
        digits = 2) |> 
  kable_minimal(full_width = F)
Município Percentual de Pardos
Boa Vista do Ramos - AM 92.68
São João da Ponta - PA 87.43
Tracuateua - PA 87.40
Cachoeira Grande - MA 86.23
Urucará - AM 86.21
Nhamundá - AM 86.20
Primeira Cruz - MA 85.57
Augusto Corrêa - PA 85.49
Belágua - MA 85.22
Caapiranga - AM 84.99
Cunhataí - SC 3.61
Três Arroios - RS 3.32
Angelina - SC 3.30
Charrua - RS 2.78
Centenário - RS 2.76
São Valério do Sul - RS 2.63
Monte Belo do Sul - RS 2.54
Canudos do Vale - RS 2.48
Forquetinha - RS 1.80
Morrinhos do Sul - RS 1.69
mapa_br <- 
  get_brmap("City") |> 
  mutate(municipio_codigo = as.character(City))

mapa_br_uf <- 
  get_brmap("State")

mapa_br |> 
  left_join(raca_municipios_limpo, by = "municipio_codigo") |> 
  ggplot() +
  geom_sf(aes(fill = percentual_parda), colour = NA) +
  geom_sf(data = mapa_br_uf, colour = "#ffb6c1", fill = NA, linewidth = 0.5) +
  scale_fill_gradient(low = "white", high = "brown", limits = c(0, max(raca_municipios_limpo$percentual_parda))) +
  labs(fill = "Percentual\nde Pardos\nna População",
       title = "", caption = "marcusnunes.me") +
  theme_void() + 
  theme(legend.position = "bottom")
raca_municipios_limpo <- 
  raca_municipios |> 
  # remover totais
  filter(cor_ou_raca != "Total") |> 
  # selecionar apenas as variaveis que me interessam
  select(valor, municipio, municipio_codigo, cor_ou_raca) |> 
  # criar a proporcao de amarelos
  mutate(indicadora = ifelse(cor_ou_raca == "Indígena", "Indígena", "Outra")) |> 
  # agrupar por municipio e calcular o percentual de indigenas nele
  group_by(municipio_codigo) |> 
  mutate(percentual_indigena = valor/sum(valor, na.rm = TRUE)*100) |> 
  # encontrar apenas o percentual de indigenas e outros
  group_by(municipio_codigo, indicadora) |> 
  summarise(percentual_indigena = sum(percentual_indigena, na.rm = TRUE)) |> 
  filter(indicadora == "Indígena")

raca_municipios_limpo |> 
  ungroup() |> 
  left_join(raca_municipios, by = "municipio_codigo") |> 
  select(municipio, percentual_indigena) |> 
  distinct() |> 
  arrange(desc(percentual_indigena)) |> 
  slice(1:10, (n()-9):n()) |> 
  kable(col.names = c("Município", "Percentual de Indígenas"),
        digits = 2) |> 
  kable_minimal(full_width = F)
Município Percentual de Indígenas
Uiramutã - RR 94.45
São Gabriel da Cachoeira - AM 88.66
Santa Isabel do Rio Negro - AM 84.83
Marcação - PB 81.40
Carnaubeira da Penha - PE 77.11
Baía da Traição - PB 76.57
Normandia - RR 76.12
São João das Missões - MG 71.94
Amajari - RR 65.51
Santa Rosa do Purus - AC 63.26
Montividiu do Norte - GO 0.00
Ouro Verde de Goiás - GO 0.00
Palminópolis - GO 0.00
Petrolina de Goiás - GO 0.00
Porteirão - GO 0.00
Rianápolis - GO 0.00
Santa Rosa de Goiás - GO 0.00
Teresina de Goiás - GO 0.00
Trombas - GO 0.00
Turvelândia - GO 0.00
mapa_br <- 
  get_brmap("City") |> 
  mutate(municipio_codigo = as.character(City))

mapa_br_uf <- 
  get_brmap("State")

mapa_br |> 
  left_join(raca_municipios_limpo, by = "municipio_codigo") |> 
  ggplot() +
  geom_sf(aes(fill = percentual_indigena), colour = NA) +
  geom_sf(data = mapa_br_uf, colour = "#ffb6c1", fill = NA, linewidth = 0.5) +
  scale_fill_gradient(low = "white", high = "yellow", limits = c(0, max(raca_municipios_limpo$percentual_indigena))) +
  labs(fill = "Percentual\nde Indígenas\nna População",
       title = "", caption = "marcusnunes.me") +
  theme_void() + 
  theme(legend.position = "bottom")
raca_municipios_limpo <- 
  raca_municipios |> 
  # remover totais
  filter(cor_ou_raca != "Total") |> 
  # selecionar apenas as variaveis que me interessam
  select(valor, municipio, municipio_codigo, cor_ou_raca) |> 
  # criar a proporcao de amarelos
  mutate(indicadora = ifelse(cor_ou_raca == "Amarela", "Amarela", "Outra")) |> 
  # agrupar por municipio e calcular o percentual de amarelos nele
  group_by(municipio_codigo) |> 
  mutate(percentual_amarela = valor/sum(valor, na.rm = TRUE)*100) |> 
  # encontrar apenas o percentual de amarelos e outros
  group_by(municipio_codigo, indicadora) |> 
  summarise(percentual_amarela = sum(percentual_amarela, na.rm = TRUE)) |> 
  filter(indicadora == "Amarela")

raca_municipios_limpo |> 
  ungroup() |> 
  left_join(raca_municipios, by = "municipio_codigo") |> 
  select(municipio, percentual_amarela) |> 
  distinct() |> 
  arrange(desc(percentual_amarela)) |> 
  slice(1:10, (n()-9):n()) |> 
  kable(col.names = c("Município", "Percentual de Amarelos"),
        digits = 2) |> 
  kable_minimal(full_width = F)
Município Percentual de Amarelos
Assaí - PR 11.46
Bastos - SP 10.33
Uraí - PR 5.88
São Sebastião da Amoreira - PR 4.85
Pereira Barreto - SP 4.18
Nova América da Colina - PR 3.75
Mogi das Cruzes - SP 3.68
Mirandópolis - SP 3.66
Biritiba Mirim - SP 3.61
Guatapará - SP 3.50
Itaguari - GO 0.00
Jesúpolis - GO 0.00
Mossâmedes - GO 0.00
Nova América - GO 0.00
Perolândia - GO 0.00
Pilar de Goiás - GO 0.00
São João da Paraúna - GO 0.00
Sítio d'Abadia - GO 0.00
Turvânia - GO 0.00
Varjão - GO 0.00
mapa_br <- 
  get_brmap("City") |> 
  mutate(municipio_codigo = as.character(City))

mapa_br_uf <- 
  get_brmap("State")

mapa_br |> 
  left_join(raca_municipios_limpo, by = "municipio_codigo") |> 
  ggplot() +
  geom_sf(aes(fill = percentual_amarela), colour = NA) +
  geom_sf(data = mapa_br_uf, colour = "#ffb6c1", fill = NA, linewidth = 0.5) +
  scale_fill_gradient(low = "white", high = "yellow", limits = c(0, max(raca_municipios_limpo$percentual_amarela))) +
  labs(fill = "Percentual\nde Amarelos\nna População",
       title = "", caption = "marcusnunes.me") +
  theme_void() + 
  theme(legend.position = "bottom")