Como fazer um mapa animado com dados do IBGE ❤

Marília Melo Favalesso
rladiesbh

--

Trabalhando ou não com dados, com certeza você já deve ter ouvido falar sobre o nosso Instituto Brasileiro de Geografia e Estatística (IBGE). O IBGE é uma entidade da administração pública federal, vinculada ao Ministério da Economia, responsável por prover todas as informações estatísticas oficiais do nosso país. Através do seu trabalho analítico, o IBGE nos fornece informações espaço-temporais importantes, como dados sociodemográficos, de ocupação e de uso da terra, sobre a indústria, o meio ambiente e a agricultura, além de cartas e mapas com delimitações do território brasileiro.

Com o objetivo de homenagear a fundação dessa instituição, hoje comemora-se o Dia da Criação do IBGE 🎂. Foi em 6 de julho de 1934 que o Decreto-Lei nº 24.609 foi sancionado, iniciando o projeto que se tornou a instituição que conhecemos atualmente. Para que essa data tão importante não passe em branco, hoje eu vou te ensinar a fazer um mapa animado no R utilizando dados fornecidos pelo IBGE. No meu caso, eu selecionei a variável “população estimada” para os anos entre 2001 e 2019, mas existem outras opções no Sistema IBGE de Recuperação Automática (SIDRA).

População estimada para os municípios brasileiros entre 2001 e 2019, segundo o IBGE (fonte de dados: SIDRA, 2020).

A SIDRA é uma ferramenta digital criada pelo IBGE com o intuito de permitir a consulta, de maneira simples e rápida, aos dados de estudos e pesquisas realizados pelo instituto.

A SIDRA conta com uma API que facilita o download dos dados de sua plataforma, porém, existe um limite de 50.000 informações por download, o que impossibilita a transferência direta dos dados de população estimada para o nosso projeto R. Consequentemente, é necessário realizar o download diretamente da plataforma.

Para facilitar o acesso aos dados, deixei a planilha de população estimada hospedada em meu repositório GitHub. Assim, vamos conseguir baixar e trabalhar com os dados diretamente em nosso projeto R.

Você pode rodar o script tanto local (seu computador) quanto pelo RStudio cloud, como o R-Ladies Belo Horizonte divulgou nesse post.

Vamos usar alguns pacotes para fazer o mapa: readr, sp, sf, brazilmaps, cartography, reshape2 e animation. Pode ser que para instalação de alguns deles você também precise do pacote devtools. Todos em referência no fim do post.

O pacote brazilmaps é o único que não está disponível no CRAN, portanto para instalá-lo, basta executar o comando abaixo:

devtools::install_github(“rpradosiqueira/brazilmaps”)

Vamos para a execução:

## --- Abrir os dados no R --- #### Pacotes:
# O 'readr' é um pacote que facilita a obtenção de dados direto de arquivos .csv.
library(readr)
## Vamos salvar o endereço para a planilha de dados em um objeto chamado "myfile".
myfile = ("https://raw.githubusercontent.com/mmfava/niver_IBGE/master/tab.csv")
## Vamos abrir a planilha com o comando 'read_csv2' e armazenar o conteúdo no objeto 'tab'.
tab = read_csv2(myfile, # Endereço da planilha de dados.
col_names = T) # Indicamos que a primeira linha da planilha é o nome das colunas.
## Salvar a planilha 'tab' como um data frame no R.
tab = as.data.frame(tab)
## Indicar que as colunas 3 até 19 são valores numérico:
is.numeric(tab[,3]) # São valores numéricos? NÃO!
tab[,3:19] = sapply(tab[,3:19], as.numeric) # Transformar as colunas entre 3 e 19 em números.
is.numeric(tab[,19]) # São valores numéricos? SIM!

A nossa planilha contém os seguintes dados:

  • “cod_ibge”: os códigos do IBGE para cada município brasileiro
  • “município”: o nome de cada um dos 5.570 municípios brasileiros com a sigla dos respectivos estados entre parênteses, e
  • entre a 3ª até a 19ª temos as estimativas populacionais para os anos entre 2001 e 2019
Estimativa populacional para os municípios brasileiros entre 2001 e 2019, segundo o IBGE (fonte: Sidra, 2020).

A próxima etapa do nosso projeto é a obtenção de polígonos para os municípios do Brasil. Para tal, vamos utilizar dados do tipo ‘sf’ (spatial data simplified) do pacote ‘brazilmaps’. A parte legal desse pacote é que ele já fornece os limites dos municípios com os códigos do IBGE.

## --- Mapa do Brasil --- #### Pacotes.
library(sp) # Vai auxiliar o brazilmaps na produção dos mapas.
library(sf) # Vai auxiliar o brazilmaps na produção dos mapas.
library(brazilmaps) # Polígono com os municípios do Brasil.
## Usamos o comando 'get_map' do pacote 'brazilmaps' para
## a obtenção dos polígonos municipais.
brasil = get_brmap(geo = "City", # Polígonos para municípios.
class = "sf") # Classe espacial = 'sf'.
# Visualização do mapa.
plot(st_geometry(brasil))

Para a construção dos mapas, é necessário associar os valores de população estimada com os polígonos que delimitam os municípios brasileiros. Para isso, vamos utilizar o comando “merge” com as colunas que correspondentes aos códigos IBGE como chaves.

## --- Unir as tabelas --- #### Vamos unir as tabelas a partir dos códigos do IBGE para os municípios.
tab_brasil = merge(brasil, tab, # Planilhas que queremos unir.
by.x = c('City'), by.y = c('cod_ibge'), # Nome das colunas com os códigos de pareamento (= código IBGE)
all.x = T) # Para manter todos os valores da planilha 'x' (= brasil).

Os mapas com as estimativas populacionais são criados com o uso do pacote ‘cartography.

Para facilitar o entendimento do uso do pacote, primeiro vamos criar um mapa com as estimativas populacionais para 2011, deixando a animação para o último passo do projeto.

Cada polígono do mapa denota um município do Brasil. Desse jeito, cada polígono precisa ser colorido com a respectiva informação de população. Sendo assim, vamos criar intervalos da variável tamanho populacional, nos passos abaixo. E, apesar de o mapa inicial ser de 2011 vamos definir os valores dos intervalos da variável tamanho populacional com base no histórico inteiro.

Começamos selecionando as colunas com as informações ditas (colunas dos anos) e deixamos esse histórico das populações em um formato longo/empilhado:

## --- Mapa com estimativa populacional para 2011 --- #### Pacotes:
library(reshape2) ## Para mudar o formato de uma tabela.
library(cartography) ## Para a produção do mapa.
## ~> 1. A primeira etapa é criar um vetor com intervalos de população estimada, considerando os dados para todos os municípios e anos da planilha 'tab_brasil'.## Mudamos o formato da tabela com a função "melt", de modo que cada linha descreve um município, de um estado e sua respectiva população
desc = tab[, 3:19] %>%
melt()
# Assim, temos anos em uma coluna e estimativa populacional em outra.
desc

Note que a função “melt” do pacote deixa os dados em formato longo, assim como a função “pivot_wider” do pacote ‘tidyr.

Agora, definimos os valores dos intervalos da variável tamanho populacional. Se quisermos fazer por percentis:

## Utilizamos a função "getBreaks" para obter 10 intervalos de valores. 
breaks_map = getBreaks(desc[, 2], # População estimada.
nclass = 10) # Percentil.
# Resultado:
breaks_map

Devido a grande variabilidade da ‘população estimada’ os intervalos por percentis são pouco intuitivos. Por exemplo, todos os municípios com população entre 54.402 e 12.252.023 de habitantes seriam representados de modo semelhante (com a mesma cor), sendo que uma cidade com 12 milhões de habitantes é 200 vezes maior em população que uma cidade com 55.000.

Assim, vamos realizar a quebra de outra maneira. Note que eu especifiquei valores segundo uma percepção subjetiva de quais seriam quebras interessantes e passei as quantidades como um vetor.

## Quebra com valores inteiros.
breaks_map = c(min(desc$value, na.rm = TRUE),
2500, 5000, 10000, 50000, 100000, 1000000,
max(desc$value, na.rm = TRUE))

E vamos ao mapa! 🌎

## ~~ > 2. O mapa. 
## 2.1 Fundo colorido para o mapa.
plot(st_geometry(tab_brasil),
col = NA,
border = NA,
bg = "lavender",
main = NULL)
## st_geometry(tab_brasil): Plotamos as dimensões do Brasi.
## col = NA; border = NA: Não incluir bordas ou cores nesse mapa.
## bg = "lavender": Colorir em lavanda o nosso background.
## main = NULL: Retirar títulos do mapa.
## Vamos plotar os valores de população para o ano de 2011 com a função "choroLayer" do pacote "cartography".
## O mapa:
choroLayer(x = tab_brasil, # Tabela em formato "sf".
var = "2011", # Variável que vamos plotar.
breaks = breaks_map, # Breaks que calculamos.
col = carto.pal(pal1 = "harmo.pal", n1 = 10), # Cores.
border = NA, # Sem bordas no mapa.
legend.pos = NA, # Sem legendas no mapa.
legend.title.txt = NA, # Sem título de legenda no mapa.
add = TRUE) # Adicionar o mapa sob o fundo lavanda.
## A legenda:
legendChoro(pos = "bottomright", # Na parte inferior-direira da fig.
title.txt = "População \nestimada", # Título da legenda.
breaks = breaks_map, # Break que calculamos (= mapa).
col = carto.pal(pal1 = "harmo.pal", n1 = 10), # Cores.
nodata = TRUE, # Incluir um quadrado branco para 'NAs'.
nodata.txt = "Sem dados") # Nome dado aos valores faltantes na legenda.
# 3. Informações do nosso mapa:
layoutLayer(title = "Distribuição da população em 2011", # Título.
author = "M. M. Favalesso (2020)", # Autor do mapa.
sources = "IBGE, estimativa populacional (2020)", # Fonte dos dados (= IBGE ❤)
scale = NULL, # Sem barras de escala.
south = TRUE) # Indicação do sul.
Mapa com a população estimada para os municipios brasileiros em 2011, segundo o IBGE (fonte: SIDRA, 2020).

O último passo do nosso projeto é criar um mapa animado com as estimativas populacionais para os municípios do Brasil. Para tal, vamos usar o pacote ‘animation’. Esse pacote salva uma sequência de imagens dentro de um laço como um gif animado. Particularmente, é um dos meus pacotes (R) favoritos 😁.

Se você não estiver usando um projeto (.Rproj) você deve definir um diretório de trabalho para salvar os mapas.

## --- Mapa animado! --- #### Working directory
## Local onde você deseja salvar a sua GIF.
## setwd("pasta_onde_voce_quer_salvar")
## Pacote:
library(animation) ## Pacote para a criação das animações.
## Vetor com o nome das colunas que queremos plotar em nosso laço de repetição, para que apareçam em nossa animação em sequência.
ano = colnames(tab_brasil)[8:24]
## Usamos um laço de repetição para criar os mapas com as estimativas populacionais e inseri-los na nossa animação.
## Vamos usar a função saveGIF do pacote "animate".
saveGIF({for(i in ano){ ## = Para cada valor(i) no objeto "ano" ...

## Background colorido.
plot(st_geometry(tab_brasil), col = NA, border = NA, bg = "lavender", main = NULL)

## Mapas de população estimada.
choroLayer(x = tab_brasil,
var = i, # A cada laço de repetição, um novo ano é plotado.
breaks = breaks_map,
col = carto.pal(pal1 = "harmo.pal", n1 = 10),
border = NA,
legend.pos = NA,
legend.title.txt = NA,
add = TRUE)

## Legenda.
legendChoro(pos = "bottomright",
title.txt = "População \nestimada",
breaks = breaks_map,
col = carto.pal(pal1 = "harmo.pal", n1 = 10),
nodata = TRUE, nodata.txt = "No Data")


## Informações do mapa.
layoutLayer(title = paste0("Distribuição da população em ", i), # Título do mapa para cada ano.
author = "M. M. Favalesso (2020)",
sources = "IBGE, estimativa populacional (2020)",
scale = NULL,
south = TRUE)

}}, movie.name = "pop_BR.gif") # Nome da gif.

Com a finalização do laço, o gif é aberto (ou fica salvo no diretório do cloud, em caso de você está usando o RStudio Cloud) e você poderá verificar o resultado. O arquivo ficará salvo no seu working directory com o nome “pop_brasil.gif”.

Espero que você tenha gostado desse tutorialzinho!

Desejo ver suas gifs animadas em comemoração ao aniversário do nosso IBGE! 🎈

Um abraço forte!

M.

Referências:

Hadley Wickham, Jim Hester and Romain Francois
(2018). readr: Read Rectangular Text Data. R
package version 1.3.1.
https://CRAN.R-project.org/package=readr

Roger S. Bivand, Edzer Pebesma, Virgilio
Gomez-Rubio, 2013. Applied spatial data analysis
with R, Second edition. Springer, NY.
https://asdar-book.org/

Renato Prado Siqueira (2020). brazilmaps: Brazilian
Maps from Different Geographic Levels. R package
version 0.1.0.
http://github.com/rpradosiqueira/brazilmaps

  • Pacote sp:

Pebesma, E.J., R.S. Bivand, 2005. Classes and
methods for spatial data in R. R News 5 (2),
https://cran.r-project.org/doc/Rnews/.

  • Pacote sf:

Pebesma, E., 2018. Simple Features for R:
Standardized Support for Spatial Vector Data. The R
Journal 10 (1), 439–446,
https://doi.org/10.32614/RJ-2018-009

Giraud, T. and Lambert, N. (2016). cartography:
Create and Integrate Maps in your R Workflow. JOSS,
1(4). doi: 10.21105/joss.00054.

Giraud, T. and Lambert, N. (2017). “Reproducible
Cartography.” In Peterson M. (ed.), _Advances in
Cartography and GIScience. ICACI 2017. Lecture
Notes in Geoinformation and Cartography._, pp.
173–183. doi: 10.1007/978–3–319–57336–6_13.

Hadley Wickham (2007). Reshaping Data with the
reshape Package. Journal of Statistical Software,
21(12), 1–20. URL
http://www.jstatsoft.org/v21/i12/.

Yihui Xie (2013). animation: An R Package for
Creating Animations and Demonstrating Statistical
Methods. Journal of Statistical Software, 53(1),
1–27. URL http://www.jstatsoft.org/v53/i01/.

Yihui Xie [aut, cre], Christian Mueller [ctb],
Lijia Yu [ctb], Weicheng Zhu [ctb] (2018).
animation: A Gallery of Animations in Statistics
and Utilities to Create Animations. R package
version 2.6.

Hadley Wickham, Jim Hester and Winston Chang
(2020). devtools: Tools to Make Developing R
Packages Easier. R package version 2.2.2.
https://CRAN.R-project.org/package=devtools

— — —

Revisão por Larissa Sayuri Futino Castro Dos Santos (obrigada ♥).

— — —

--

--

Marília Melo Favalesso
rladiesbh

📊 GECD Foz do Iguaçu 👩🏻‍💻 Data Science student 👩🏻‍🔬 Epidemiology student 🐛 Disease ecologist 🍕 pizza-lover.