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 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:
tidyverse - Conjunto de outros pacotes, facilitando a manipulação e visualização de dados. Dentre os pacotes do Tidyverse está o “ggplot2” que é a plataforma gráfica mais usada e uma das mais “poderosas” do ambiente R.
ggmap - Funções complementares ao “ggplot2” para visualização de dados espaciais.
sf - Permite a manipulação de dados espaciais.
readxl - Permite a importação e exportação de dados em “.xlsx” ou “.xls”
ggpubr - Permite combinar e exportar objetos gráficos em formato de imagem
ggthemes - Conjunto de temas (estéticos) pré-programados para gráficos do ggplot2
# 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)
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
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
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
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
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 )
Finalmente, vamos nos dedicar a importar os insumos necessários para criar um mapa cloroplético. O primeiro deles é a geometria
“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.
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
Criar um novo dataframe filtrando o ano de 2020 do dataframe “dados”.
Unir o dataframe criado com a geometria “Uf”.
Produzir o mapa e exportar usando as funções “ggarrange” e “ggsave”.
Criar um novo dataframe filtrando o ano de 2019 do dataframe “dados”.
Unir o dataframe criado com a geometria “Uf”.
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 )