Introdução

O objetivo desse exercício é aprender a importar os insumos necessários para criar mapas e cartogramas e utilizar as ferramentas de análise exploratória de dados espaciais.

# A função para definir o diretório é: 

setwd("C:/Minicurso - Espacial")

# Troque "\" por "/" no endereço da pasta

# Importante: O R faz distinção entre letras maiúsculas e minúsculas 

Pacotes Necessários

Pacotes são grupos de funções que podem ser instalados para aumentar o ferramental disponível no sistema básico. Então, dependendo do objetivo, pode ser necessário instalar um ou mais pacotes.

Além disso, é necessário ressaltar que há muitos pacotes capazes de realizar a mesma tarefa, mas podem variar em termos de complexidade de uso e do esforço computacional que requerem.

É necessário pesquisar e praticar para encontrar a combinação de pacotes que mais atende aos seus objetivos.Todos os pacotes têm manuais de referência disponíveis.

Vamos usar os seguintes pacotes:

# A função para instalar novos pacotes é "install.packages()"

#install.packages("tidyverse")
#install.packages("ggmap")
#install.packages("sf")
#install.packages("readxl")
#install.packages("ggpubr")
#install.packages("viridis")
#install.packages("ggthemes")

Após instalar os pacotes é necessário “carregar” os pacotes para serem usados. Só é preciso instalar os pacotes uma única vez.

# Podem ser usadas as funções "require", ou "library".

library(tidyverse)
library(ggmap)
library(sf)
library(readxl)
library(ggthemes)
library(ggpubr)

Importando Atributos

O R é uma linguagem de programação orientada a objetos, isso significa que tudo que importarmos para o ambiente será armazenado como um “objeto” que pode ter 6 formas: vetores, matrizes, listas, data frame (2 dimensões), arranjos (> 2 dimensões), fatores.

Os dados(atributos) devem ter uma coluna de códigos (IBGE - 7 digítos) que possa servir como referência para identificar os espaços.

# A função para importar o arquivo em excel (xlsx ou xls) é:

Txhn <- read_excel("txh-hn_uf.xlsx", col_types = c("numeric", "text", "numeric",  "numeric"))  #Taxa de Homicídios por 100 mil hab. Homens Negros

Txhnn <- read_excel("txh-hnn_uf.xlsx", col_types = c("numeric", "text", "numeric",  "numeric")) #Taxa de Homicídios por 100 mil hab. Homens Não Negros

# Como já indicamos o diretório, bastou indicar o nome do arquivo e a extensão.

# Na sintaxe da função, a "<-" atribui ao resultado da função o nome ao novo objeto do tipo "data frame".
View(Txhn) # Visualiza o objeto, no environment basta clicar sobre o objeto para visualiza-lo

head(Txhn) # Visualiza as primeiras observações do objeto
## # A tibble: 6 × 4
##     COD UF      ANO  TAXA
##   <dbl> <chr> <dbl> <dbl>
## 1    12 AC     2000  31.2
## 2    27 AL     2000  50.7
## 3    13 AM     2000  63.2
## 4    16 AP     2000  67.7
## 5    29 BA     2000  15.5
## 6    23 CE     2000  26.5
#glimpse(Txhnn) #Outra forma de visualizar os objetos

Exemplos de Manipulação de Dados Usando Tidyverse - dplyr

Consultar: https://www.tidyverse.org/

É um conjunto de pacotes para manipulação e visualização de dados

# Mesclando os data frames com a função "left_join"

Dados <- left_join(Txhn, Txhnn, join_by(UF, ANO, COD))

#view(Dados)

# Renomeando variáveis

Dados <- Dados %>% rename(Taxahn = TAXA.x)

Dados <- Dados %>% rename(Taxahnn = TAXA.y)

# Criando uma nova variável usando a função mutate

Dados <- Dados %>% mutate(Risco = Taxahn/Taxahnn) # Risco relativo de um homem negro ser assassinado em relação a homens não negros

# Criando um novo dataframe filtrando o original para um ano específico

Dados_2000 <- Dados %>% filter(ANO ==2000)

# Exercício Proposto: Selecione um Estado 

Dados_2019 <- Dados %>% filter(ANO ==2019) # Parte da resolução do exercício proposto

Análise de Estatísticas Descritivas

Com essas funções estou criando dois objetos que nomeei de “a” e “b” que contém a média das variáveis

No objeto “a” usei a função “group_by” para agrupar dados em função do ANO e extrair a média das variáveis(vars).

No objeto “b” usei a função “group_by” para agrupar dados em função da UF e extrair a média das variáveis(vars).

a <- Dados %>% group_by(ANO) %>% summarise_at(vars(Taxahn, Taxahnn, Risco), list(Média = mean))

b <- Dados %>% group_by(UF) %>% summarise_at(vars(Taxahn, Taxahnn, Risco), list(Média = mean))

a;b # Podemos usar ";" para separar códigos em uma mesma linha
## # A tibble: 20 × 4
##      ANO Taxahn_Média Taxahnn_Média Risco_Média
##    <dbl>        <dbl>         <dbl>       <dbl>
##  1  2000         53.9          34.5        1.96
##  2  2001         56.0          36.2        1.92
##  3  2002         60.4          37.5        2.13
##  4  2003         61.2          34.6        2.29
##  5  2004         55.1          28.3        2.47
##  6  2005         55.6          28.9        2.33
##  7  2006         58.4          30.0        2.65
##  8  2007         58.4          27.1        2.89
##  9  2008         62.7          27.3        3.00
## 10  2009         64.5          27.5        3.21
## 11  2010         67.2          26.9        3.31
## 12  2011         68.1          26.9        3.10
## 13  2012         71.8          30.0        2.99
## 14  2013         71.0          32.5        2.78
## 15  2014         75.7          33.4        2.93
## 16  2015         76.6          31.5        3.10
## 17  2016         82.8          33.0        3.54
## 18  2017         87.5          35.4        3.27
## 19  2018         78.6          31.6        3.33
## 20  2019         61.4          25.5        4.32
## # A tibble: 27 × 4
##    UF    Taxahn_Média Taxahnn_Média Risco_Média
##    <chr>        <dbl>         <dbl>       <dbl>
##  1 AC            51.9          51.3        1.28
##  2 AL           107.           15.3        9.83
##  3 AM            62.6          24.2        2.87
##  4 AP            75.9          23.8        3.81
##  5 BA            65.2          19.3        3.26
##  6 CE            56.2          16.1        3.31
##  7 DF            83.6          18.5        4.62
##  8 ES            95.9          26.9        3.75
##  9 GO            72.7          36.7        1.96
## 10 MA            45.1          23.7        1.85
## # ℹ 17 more rows

Visualizando Dados

O pacote “ggplot2” é o pacote de visualização de dados mais usado do R, também o mais versátil.

# Usando a função as.date e a função paste0 para criar uma variável que possa ser reconhecida como temporal

Dados$ANO <- as.Date(paste0(Dados$ANO, "-01-01"))

# gráfico de colunas

Dados_2000 %>% ggplot()+ geom_col(aes(x=UF, y=Risco))

# Histograma

Dados %>% ggplot() + geom_histogram(aes(x=Risco))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

É possível construir gráficos mais elaborados e mudar a sua estética somando mais funções e/ou especificando argumentos dentro das funções.

Usando o pacote “ggthemes” é possível carregar alguns temas gráficos já pré-programados.

Ver https://ggplot2.tidyverse.org/reference/ggtheme.html

Dados %>% ggplot() + geom_density(aes(x=Risco), colour="red")+ theme_economist() 

É possível criar objetos gráficos e adicionar camadas ao objeto com novas funções.

# Boxplot

c <- Dados %>% ggplot()+ geom_boxplot(aes(x=UF, y=Risco)) 

c + theme_classic() 

c + theme_economist() +ylim(0,20)
## Warning: Removed 1 rows containing non-finite values (`stat_boxplot()`).

Podemos combinar vários tipos de gráficos em um mesmo “plot”. No exemplo abaixo, estou criando o gráfico “d” a partir de uma combinação de gráfico de linhas e gráfico de pontos (scatter plot)

Também estou usando a função “filter” para selecionar somente alguns estados.

# Gráfico de Linhas e Pontos

d <- Dados %>% filter(UF %in% c("AL","DF", "SP")) %>% ggplot(aes(x=`ANO`, y=Risco,colour=UF))+ #Estabelecendo a estética do gráfico
  geom_line() + #Gráfico de linhas
  geom_point()+ #Gráfico de pontos
  theme_classic() + #Tema clássico
  labs(y = "Risco Relativo", 
       x = "ANO", 
       subtitle = "Homens Não Brancos em Relação a Brancos (2000-2020)", 
       title = "Risco Relativo de Assassinato Por Arma de Fogo") + 
  scale_color_viridis_d(option = "cividis") #Usando uma escala de cores do pacote Viridis

d

Agora fazendo o mesmo para outra variável, taxa de homicídios por arma de fogo entre homens negros

e <- Dados %>% filter(UF %in% c("AL","DF", "SP")) %>% ggplot(aes(x=`ANO`, y=Taxahn,colour=UF))+ 
  geom_line() +   
  geom_point()+
  theme_classic() + 
  ylim(0,165)+ # Aqui estou estabelecendo a escala do eixo y para facilitar a comparação entre os gráficos
  labs(y = "Taxa", 
       x = "ANO", 
       title = "Homicídios por Arma de Fogo",
       subtitle = "Homens Não Brancos - (Taxa por 100 mil hab.)")+ 
  scale_color_viridis_d(option = "cividis")

e

Taxa de homicídios por arma de fogo entre homens não negros

f <- Dados %>% filter(UF %in% c("AL","DF", "SP")) %>% ggplot(aes(x=`ANO`, y=Taxahnn,colour=UF))+ 
  geom_line()+ 
  geom_point()+
  theme_classic()+ 
  ylim(0,165)+
  labs(y = "Taxa", 
       x = "ANO", 
       title = "Homicídios por Arma de Fogo",
       subtitle = "Homens Brancos - (Taxa por 100 mil hab.)")+ 
  scale_color_viridis_d(option = "cividis")

f

Salvando gráficos e imagens em alta resolução

Vamos usar o pacote “ggpubr” para criar uma combinação dos gráficos “d”, “e” e “f”, armazenando o resultado em um objeto “z”.

O pacote também conta com a função “ggsave” para exportar o arranjo de gráficos.

z <- ggarrange(d, ggarrange(e,f), nrow = 2)

z

ggsave("Gráficos.png", last_plot(), height = 8, width = 12, dpi = 1000 )

Importanto Geometria - Shapefile

Finalmente, vamos nos dedicar a importar os insumos necessários para criar um mapa cloroplético. O primeiro deles é a geometria

Shapefile

“Um shapefile é um formato de armazenamento de dados de vetor desenvolvido pela empresa Esri para armazenar a posição, a forma e os atributos de feições geográficas.”

Na verdade, um shapefile é um conjunto de arquivos relacionados.

O IBGE possui uma biblioteca de malhas territoriais com shapes para diversos recortes.

ver <Malhas territoriais | IBGE>

Para ler o shape vamos utilizar a função “read_sf” do pacote “sf”.

Uf <- read_sf(dsn="./BR_Shapes", layer="BR_UF_2022")

plot(st_geometry(Uf))

##Unindo Dados ao Shapefile

Assim como fizemos anteriormente, podemos unir nosso dataframe “Dados_2000” com o objeto “Uf” a partir de uma coluna comum como referência.

Uf1 <- left_join(Uf, Dados_2000, by=c("SIGLA_UF"="UF"))

##Nosso primeiro mapa

A partir da biblioteca do “ggplot2” podemos criar um polígono a partir da função “geom_sf”, no argumento “aes” precisamos indicar qual variável deve preencher (“fill”) o nosso mapa.

Uf1 %>% ggplot()+geom_sf(aes(fill=Risco))

#A partir do mapa básico podemos adicionar novas funções e argumentos para modificar a estética do nosso mapa

Uf1 %>% ggplot()+geom_sf(aes(fill=Risco))+scale_fill_gradient(low = "white", high = "red")

a <- Uf1 %>% ggplot()+geom_sf(aes(fill=Risco), color="white")+
  scale_fill_viridis_c(guide = guide_colourbar(direction = "horizontal", title.position = "top"), 
                       option = "cividis", limits = c(0,6), na.value = "red")+ #Adicionei limites para escala e defini uma cor para >6
  theme_economist()+ 
  theme(legend.position = c(0.825, 0.1))+
  labs(title="Risco Relativo de Morte por Arma de Fogo", 
       subtitle = "Homens Negros em Relação a Homens Não Negros", 
       caption = "Fonte: Observatório da Violência - IPEA 2OOO")

a

Exercícios Propostos

  1. Construa um mapa semelhante para o ano de 2019, combine os dois mapas em um único objeto e exporte. Para isso será necessário:

Resolução

Uf2 <- left_join(Uf, Dados_2019, by=c("SIGLA_UF"="UF"))
b <- Uf2 %>% ggplot()+geom_sf(aes(fill=Risco), color="white")+
  scale_fill_viridis_c(guide = guide_colourbar(direction = "horizontal", title.position = "top"), 
                       option = "cividis", limits = c(0,6), na.value = "red")+
  theme_economist()+ 
  theme(legend.position = c(0.825, 0.1))+
  labs(title="Risco Relativo de Morte por Arma de Fogo", 
       subtitle = "Homens Negros em Relação a Homens Não Negros", 
       caption = "Fonte: Observatório da Violência - IPEA 2O19")

ggarrange(a,b)

ggsave("Mapas.png", last_plot(), height = 8, width = 12, dpi = 1000 )