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")
