-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaniversario_ibge.qmd
323 lines (230 loc) · 17.3 KB
/
aniversario_ibge.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
---
title: Como fazer um mapa animado com dados do IBGE ❤
author: Marília Melo Favalesso
---
![](image.png)
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)_](https://www.ibge.gov.br/institucional/o-ibge.html). 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 06 de julho de 1934 que o _Decreto de 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 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)](https://sidra.ibge.gov.br/Tabela/6579#resultado).
![**População estimada para os municípios brasileiros entre 2001 e 2019 (fonte de dados: SIDRA - IBGE, 2020**).](https://github.com/mmfava/niver_IBGE/blob/master/pop_BR.gif?raw=true)
<br />
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](https://cran.r-project.org/web/packages/sidrar/vignettes/Introduction_to_sidrar.html), 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](https://sidra.ibge.gov.br/Tabela/6579#resultado).
Para facilitar o acesso aos dados, deixei a [planilha de população estimada hospedada em meu repositório GitHub](https://github.com/mmfava/niver_IBGE/). Assim, vamos conseguir baixar e trabalhar com os dados diretamente em nosso projeto R.
Você pode rodar o script tanto localmente (seu computador) quanto pelo RStudio cloud, como o Rladies Belo Horizonte divulgou nesse [post](https://medium.com/rladiesbh/r-studio-cloud-como-programar-em-r-usando-a-web-aa6313a5fb8c).
Vamos usar alguns pacotes para fazer o mapa: *readr*, *sp*, *sf*, *brazilmaps*, *cartography*, *reshape2* e *animation*. Pode ser que para a instalação de alguns deles você também precise do pacote *remotes*. Todos em referência no fim do post.
```{r setup, include=FALSE, message=FALSE, warning=FALSE, paged.print=FALSE}
## Instalação e carregamento dos pacotes
required_packages <- c("readr", "sp", "sf", "brazilmaps", "cartography", "reshape2", "animation", "remotes")
# Função para instalar pacotes que não estão instalados
install_if_missing <- function(packages) {
new_packages <- packages[!(packages %in% installed.packages()[, "Package"])]
if (length(new_packages)) {
install.packages(new_packages)
}
}
# Chama a função para instalar os pacotes necessários
install_if_missing(required_packages)
# Carrega os pacotes
lapply(required_packages, library, character.only = TRUE)
# Instalação do pacote brazilmaps se não estiver disponível
if (!requireNamespace("brazilmaps", quietly = TRUE)) {
remotes::install_github("rpradosiqueira/brazilmaps")
library(brazilmaps)
}
# Instalação do pacote animation se não estiver disponível
if (!requireNamespace("animation", quietly = TRUE)) {
# - SE problema com instalação do magick,
# rodar no terminal: `sudo apt-get install libmagick++-dev`
remotes::install_github("yihui/animation")
library(animation)
}
```
```{r message=FALSE, warning=FALSE, paged.print=FALSE}
## ~~~ Abrir os dados no R ~~~ ##
## Pacotes
library(readr) # O 'readr' é um pacote que facilita a obtenção de dados direto de arquivos .csv.
## 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 = TRUE) # 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éricos.
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.
str(tab)
```
**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
* 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).**](https://github.com/mmfava/niver_IBGE/blob/master/tab.png?raw=true).
<br />
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.
```{r}
## ~~~ 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 <- brazilmaps::get_brmap(geo = "City", # Polígonos para municípios.
class = "sf") # Classe espacial = 'sf'.
# Visualização do mapa.
plot(st_geometry(brasil))
```
<br />
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 correspondem aos códigos IBGE como chaves.
```{r}
## ~~~ 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 = 'City', by.y = 'cod_ibge', # Nome das colunas com os códigos de pareamento (= código IBGE)
all.x = TRUE) # Para manter todos os valores da planilha 'x' (= brasil).
head(tab_brasil)
```
<br />
Os mapas com as estimativas populacionais são criados com o uso do pacote [“cartography”](https://cran.r-project.org/web/packages/cartography/vignettes/cartography.html).
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.
A gente começa selecionando as colunas com as informações propriamente ditas (colunas dos anos) e deixando esse histórico das populações em um formato longo/empilhado:
```{r}
## ~~~ 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.
head(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](https://tidyr.tidyverse.org/).
Agora, definimos os valores dos intervalos da variável tamanho populacional. Se a gente quiser fazer por percentis:
```{r}
## Utilizamos a função "getBreaks" para obter 10 intervalos de valores.
breaks_map <- getBreaks(desc$value, # Valores de estimativa populacional para todos municípios e anos.
nclass = 10) # Número de intervalos de valores que queremos.
# Vendo como ficou:
breaks_map
```
Devido à grande variabilidade da variável tamanho populacional os intervalos foram definidos, possivelmente de um jeito pouco intuitivo. Por exemplo, todos os municípios com população entre `r breaks_map[10]` e `r breaks_map[11]` habitantes seriam representados de modo semelhante (com a mesma cor) sendo que uma cidade com 12 milhões de habitantes é mais de 200 vezes maior que uma cidade com 55.000 habitantes.
Vou quebrar de outro jeito. Note que eu especifiquei valores segundo uma percepção subjetiva de quais seriam quebras interessantes e passei as quantidades como um vetor.
```{r}
## Utilizamos a função "getBreaks" para obter 10 intervalos de valores.
breaks_map <- c(min(desc$value, na.rm = TRUE),
2500, 5000, 10000, 50000, 100000, 1000000,
max(desc$value, na.rm = TRUE))
breaks_map
```
E vamos ao mapa!
```{r}
## ~~ > 2. O mapa.
## 2.1 Fundo colorido para o mapa.
## Plotamos as dimensões do Brasil: st_geometry(tab_brasil)
## Não incluir bordas ou cores nesse mapa: col = NA; border = NA
## Colorir em lavanda o nosso background: bg = "lavender"
## Retirar títulos do mapa: main = NULL
plot(st_geometry(tab_brasil),
col = NA,
border = NA,
bg = "lavender",
main = NULL)
## 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 com os municípios do Brasil e dados de população estimada (formato "sf").
var = "2011", # Aqui especificamos qual variável queremos plotar no mapa.
breaks = breaks_map, # Aqui são os intervalos de valores para o mapa.
col = carto.pal(pal1 = "harmo.pal", n1 = 10), # Palheta de cores selecionada.
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", # Legenda na parte inferior e direita do mapa.
title.txt = "População \nestimada", # Título da legenda.
breaks = breaks_map, # Intervalo de valores para a legenda (= mapa).
col = carto.pal(pal1 = "harmo.pal", n1 = 10), # Cores legenda (= mapa).
nodata = TRUE, # Incluir um quadrado branco para 'NA'.
nodata.txt = "Sem dados") # Nome dado à legenda de valores faltantes.
# 3. Informações do nosso mapa:
layoutLayer(title = "Distribuição da população em 2011", # Título do mapa.
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.
```
<br />
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) é necessário que você defina um diretório de trabalho para salvar os mapas.
```{r}
## ~~~ Criando a animação ~~~ ##
## Working directory
## a pasta do seu computador onde vamos salvar nosso 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.
saveGIF({
for(i in ano){ ## Vamos usar a função saveGIF do pacote "animation".
## for(i in ano) = Para cada ano (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 = "Sem dados")
## 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 do gif.
```
<br />
Com a finalização do laço, o gif é aberto 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 tutorial!
Desejo ver suas gifs animadas em comemoração ao aniversário do nosso IBGE ♡
Um abraço forte!
✿
M.
### Revisão por @larissa.sayuri.fcs
# Referências
* Pacote [readr](https://CRAN.R-project.org/package=readr):
Hadley Wickham, Jim Hester e 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/
* Pacote [brazilmaps](http://github.com/rpradosiqueira/brazilmaps):
Renato Prado Siqueira (2020). brazilmaps: Brazilian Maps from Different Geographic Levels. R package version 0.1.0. http://github.com/rpradosiqueira/brazilmaps
* Pacote [sp](https://cran.r-project.org/web/packages/sp/index.html):
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](https://cran.r-project.org/web/packages/sf/index.html):
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
* Pacote [cartography](https://cran.r-project.org/web/packages/cartography/index.html):
Giraud, T. e Lambert, N. (2016). cartography: Create and Integrate Maps in your R Workflow. JOSS, 1(4). doi: 10.21105/joss.00054.
Giraud, T. e Lambert, N. (2017). “Reproducible Cartography.” In Peterson M. (ed.), _Advances in Cartography and GIScience. ICACI 2017. Lecture Notes in Geoinformation and Cart
ography._, pp. 173-183. doi: 10.1007/978-3-319-57336-6_13.
* Pacote [reshape2](https://cran.r-project.org/web/packages/reshape2/index.html):
Hadley Wickham (2007). Reshaping Data with the reshape Package. Journal of Statistical Software, 21(12), 1-20. URL http://www.jstatsoft.org/v21/i12/.
* Pacote [animation](https://cran.r-project.org/web/packages/animation/index.html):
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.
* Pacote [remotes](https://cran.r-project.org/web/packages/remotes/index.html):
Csárdi G, Hester J, Wickham H, Chang W, Morgan M, Tenenbaum D (2024). remotes: R Package Installation from Remote Repositories, Including 'GitHub'. R package version 2.5.0, https://github.com/r-lib/remotes#readme, https://remotes.r-lib.org.