Introdução

O objetivo desse exercício é aprender a importar dados e fazer manipulações básicas, plotar gráficos

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

setwd("C:/Métodos Regional/Material Aula 1")

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

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

Pacotes Necessários

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("geobr")
#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.

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 que possa servir como referência para identificar os espaços.

Dados: Pessoas de 14 anos ou mais de idade (Mil pessoas) - PNAD Contínua

Fonte: tabela 4092 Sidra https://sidra.ibge.gov.br/tabela/4092

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

Dados <- read_excel("Dados_Aula1.xlsx", 
                    col_types = c("text", "text", "date", "numeric", "numeric", "numeric", "numeric"))  

# Como já indicamos o diretório, bastou indicar o nome do arquivo e a extensão.
View(Dados) # Visualiza o objeto. No ambiente basta clicar sobre o objeto para visualiza-lo

head(Dados) # Visualiza as primeiras observações do objeto
## # A tibble: 6 × 7
##   Estado Sigla Trimestre_R         Total    FT   FTO   FTD
##   <chr>  <chr> <dttm>              <dbl> <dbl> <dbl> <dbl>
## 1 Acre   AC    2012-01-01 00:00:00   534   313   284    29
## 2 Acre   AC    2012-04-01 00:00:00   537   329   299    30
## 3 Acre   AC    2012-07-01 00:00:00   539   325   299    25
## 4 Acre   AC    2012-10-01 00:00:00   542   332   305    27
## 5 Acre   AC    2013-01-01 00:00:00   543   330   294    36
## 6 Acre   AC    2013-04-01 00:00:00   550   328   296    31
#glimpse(Dados) #Outra forma de visualizar os objetos

Exemplos de Manipulação de Dados Usando Tidyverse

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

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

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

Dados <- Dados |> mutate(Tx_Des = (FTD/FT)*100) 

# Criando um novo dataframe filtrando o original para um Estado

Dados_SP <- Dados |> filter(Estado == "São Paulo")

Análise de Estatísticas Descritivas

A função summaryprovê um resumo geral dos dados.

summary(Dados)
##     Estado             Sigla            Trimestre_R                 
##  Length:1350        Length:1350        Min.   :2012-01-01 00:00:00  
##  Class :character   Class :character   1st Qu.:2015-01-01 00:00:00  
##  Mode  :character   Mode  :character   Median :2018-02-15 00:00:00  
##                                        Mean   :2018-02-14 18:14:24  
##                                        3rd Qu.:2021-04-01 00:00:00  
##                                        Max.   :2024-04-01 00:00:00  
##      Total             FT             FTO             FTD        
##  Min.   :  296   Min.   :  185   Min.   :  169   Min.   :  11.0  
##  1st Qu.: 2140   1st Qu.: 1266   1st Qu.: 1127   1st Qu.: 107.2  
##  Median : 3092   Median : 1854   Median : 1693   Median : 203.0  
##  Mean   : 6137   Mean   : 3823   Mean   : 3433   Mean   : 389.3  
##  3rd Qu.: 7466   3rd Qu.: 4130   3rd Qu.: 3706   3rd Qu.: 419.8  
##  Max.   :39480   Max.   :26320   Max.   :24580   Max.   :3636.0  
##      Tx_Des      
##  Min.   : 2.345  
##  1st Qu.: 7.441  
##  Median : 9.776  
##  Mean   :10.272  
##  3rd Qu.:12.966  
##  Max.   :21.753

Usando a função summarise_at conseguimos selecionar as variáveis que pretendemos analisar e quais as estatísticas que serão calculadas.

Além disso, usando a função group_by agrupamos os dados em função do “Estado”, ou seja, vamos extrair a média das variáveis(vars) selecionadas por Estado.

Dados |> group_by(Estado) |> summarise_at(vars(FT,FTO,FTD,Tx_Des), list(Média = mean))
## # A tibble: 27 × 5
##    Estado           FT_Média FTO_Média FTD_Média Tx_Des_Média
##    <chr>               <dbl>     <dbl>     <dbl>        <dbl>
##  1 Acre                 345.      306.      39.6        11.4 
##  2 Alagoas             1260.     1091.     169.         13.5 
##  3 Amapá                371.      317.      53.6        14.4 
##  4 Amazonas            1784.     1568.     215.         12.0 
##  5 Bahia               6967.     5922.    1044.         15.0 
##  6 Ceará               3900.     3498.     402.         10.3 
##  7 Distrito Federal    1614.     1428.     186.         11.5 
##  8 Espírito Santo      2057.     1864.     194.          9.39
##  9 Goiás               3630.     3325.     306.          8.39
## 10 Maranhão            2725.     2418.     307.         11.4 
## # ℹ 17 more rows

Suponha que o pesquisador agora queira a média por macrorregião. Para isso, vamos precisar adicionar mais algumas colunas na base de dados.

#Criei um objeto dataframe com três variáveis

x <- data.frame(
  Sigla = c(
    "AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA",
    "MT", "MS", "MG", "PA", "PB", "PR", "PE", "PI", "RJ", "RN",
    "RS", "RO", "RR", "SC", "SP", "SE", "TO"), 
  Código = c(
    "12", "27", "16", "13", "29", "23", "53", "32", "52", "21",
    "51", "50", "31", "15", "25", "41", "26", "22", "33", "24",
    "43", "11", "14", "42", "35", "28", "17"),
  Região = c(
    "Norte", "Nordeste", "Norte", "Norte", "Nordeste", "Nordeste", "Centro-Oeste", 
    "Sudeste", "Centro-Oeste", "Nordeste", "Centro-Oeste","Centro-Oeste", "Sudeste", 
    "Norte", "Nordeste","Sul", "Nordeste", "Nordeste", "Sudeste", "Nordeste","Sul", 
    "Norte", "Norte", "Sul", "Sudeste", "Nordeste", "Norte" ))

# Unindo dataframes

Dados <- Dados |> left_join(x, by="Sigla")

rm(x) # Exclui o objeto do ambiente

Usando os mesmos princípios podemos obter:

# Média e desvio padrão da taxa de desocupação para todo o período por região

a <- Dados |> group_by(Região) |> summarise_at(vars(Tx_Des), list(Média = mean, Desv.P = sd))

# Média e desvio padrão da taxa de desocupação nos estados da região Sudeste

b <- Dados |> filter(Região=="Sudeste") |> group_by(Estado) |> 
  summarise_at(vars(Tx_Des), list(Média = mean, Desv.P = sd))

a; b
## # A tibble: 5 × 3
##   Região       Média Desv.P
##   <chr>        <dbl>  <dbl>
## 1 Centro-Oeste  8.28   3.10
## 2 Nordeste     12.4    3.45
## 3 Norte        10.5    3.70
## 4 Sudeste      10.2    3.30
## 5 Sul           6.20   2.03
## # A tibble: 4 × 3
##   Estado         Média Desv.P
##   <chr>          <dbl>  <dbl>
## 1 Espírito Santo  9.39   2.87
## 2 Minas Gerais    9.12   2.59
## 3 Rio de Janeiro 11.9    4.00
## 4 São Paulo      10.5    2.91
# Média e Desvio Padrão para o período antes e depois de 2014.3 (Início da crise)

c <-  Dados |> filter(Trimestre_R < as.Date("2014-07-01")) |> group_by(Região) |> 
  summarise_at(vars(Tx_Des), list(Média = mean, Desv.P = sd))

d <-  Dados |> filter(Trimestre_R > as.Date("2014-07-01")) |> group_by(Região) |> 
  summarise_at(vars(Tx_Des), list(Média = mean, Desv.P = sd))

c;d
## # A tibble: 5 × 3
##   Região       Média Desv.P
##   <chr>        <dbl>  <dbl>
## 1 Centro-Oeste  6.12  1.86 
## 2 Nordeste      9.40  1.70 
## 3 Norte         8.35  2.21 
## 4 Sudeste       7.07  0.586
## 5 Sul           4.27  0.896
## # A tibble: 5 × 3
##   Região       Média Desv.P
##   <chr>        <dbl>  <dbl>
## 1 Centro-Oeste  8.90   3.09
## 2 Nordeste     13.2    3.33
## 3 Norte        11.1    3.79
## 4 Sudeste      11.1    3.19
## 5 Sul           6.75   1.92
rm(a,b,c,d)

Visualizando Dados

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

Ver: GGPLOT galeria

# Gráfico de colunas

Dados |> filter(Região=="Nordeste", Trimestre_R==as.Date("2024-04-01"))|> # Usando a função filter do tidyverse
  ggplot()+ # Carregando biblioteca gráfica
  geom_col(aes(x= Sigla, y=Tx_Des)) # Escolhendo o tipo de gráfico (geom_***) e a estética (aes)

# Histograma

Dados %>% ggplot() + geom_histogram(aes(x=Tx_Des))
## `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 mais alguns temas gráficos além dos já pré-programados.

Ver Pacotes GGTHEME

#Função densidade de probabilidade - Estimativa (Alternativa ao uso do histograma)

  Dados |> ggplot() + geom_density(aes(x=Tx_Des), colour="red")+ theme_minimal()

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

# Boxplot

c <- Dados |> ggplot()+ geom_boxplot(aes(x=Região, y=Tx_Des)) 

c

c + theme_minimal() 

c + theme_minimal() + labs(title = "Desocupação entre as regiões", 
                           subtitle = "Distribuição trimestral 2012.1 a 2024.2",
                           y="Taxa de Desocupação",
                           x= "Regiões")

rm(c)

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.

# Gráfico de Linhas e Pontos

d <- Dados |> filter(Sigla %in% c("BA","SC","SP")) |> 
  ggplot(aes(x=Trimestre_R, y=Tx_Des, color=Estado))+ #Observe que o argumento "aes" é declarado dentro da função "ggplot"
  geom_line() + #Gráfico de linhas
  geom_point()+ #Gráfico de pontos
  theme_minimal() + #Tema
  theme(legend.position = "bottom")+ # Alterando o tema para mudar a posição das legendas
 scale_color_viridis_d(option = "viridis")+ #Usando uma escala de cores do pacote Viridis
labs(title = "Taxa de desocupação em estados selecionados", 
     subtitle = "2012.1 a 2024.2",
     x="", y="Taxa de desocupação")
d

Agora fazendo o mesmo para outra variável,taxa de participação

#Criando variável taxa de participação

Dados <- Dados |> mutate(Tx_Par = (FT/Total)*100)

e <- Dados |> filter(Sigla %in% c("BA","SC","SP")) |> 
  ggplot(aes(x=Trimestre_R,y=Tx_Par,color=Estado))+
 geom_line() + 
  geom_point()+ 
  theme_minimal() + 
   theme(legend.position = "bottom")+ 
 scale_color_viridis_d(option = "viridis")+ 
labs(title = "Taxa de participação em estados selecionados", 
     subtitle = "2012.1 a 2024.2",
     x="", y="Taxa de participação")

e

Avaliando se taxa de participação e taxa de desocupação estão correlacionadas

#Curiosidade: paradoxo de Simpson 

f <- Dados |> #filter(Sigla %in% c("BA","SC","SP")) |> 
  ggplot(aes(x=Tx_Des,y=Tx_Par))+
  geom_point(color="grey")+ 
  geom_smooth(formula = 'y ~ x',method = "lm",se=F, color="black")+ #Adicionando uma reta de regressão linear
  theme_minimal() + 
   theme(legend.position = "bottom")+ 
labs(title = "Taxa de participação e desocupação", 
     subtitle = "PNAD contínua trimestral: 2012.1 a 2024.2",
     x="Taxa de desocupação", y="Taxa de participação")





f1 <- Dados |> 
  ggplot(aes(x=Tx_Des,y=Tx_Par, color=Região))+
  geom_point()+ 
  geom_smooth(formula = 'y ~ x',method = "lm",se=F)+ #Adicionando uma reta de regressão linear
  theme_minimal() + 
  scale_color_viridis_d()+
   theme(legend.position = "bottom")+ 
labs(title = "Taxa de participação e desocupação", 
     subtitle = "PNAD contínua trimestral: 2012.1 a 2024.2",
     x="Taxa de desocupação", y="Taxa de participação")





g <- Dados |> filter(Sigla %in% c("BA","SC","SP")) |> 
  ggplot(aes(x=Tx_Des,y=Tx_Par, color=Estado))+
  geom_point()+ 
  geom_smooth(formula = 'y ~ x',method = "lm",se=F)+ #Adicionando uma reta de regressão linear
  theme_minimal() + 
   theme(legend.position = "bottom")+ 
 scale_color_viridis_d(option = "viridis")+ 
labs(title = "Taxa de participação e desocupação em estados selecionados", 
     subtitle = "2012.1 a 2024.2",
     x="Taxa de desocupação", y="Taxa de participação")


f;f1; g

cor(Dados$Tx_Des,Dados$Tx_Par) #Correlação
## [1] -0.4520161

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

Vamos usar o pacote ggpubr para criar uma combinação dos gráficos f e g, 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(f,g, nrow = 2)

z

ggsave("Gráficos de Exemplo.pdf", last_plot(), height = 10, width = 10, dpi = 1000 ) #pdf, png, jpeg...

Mapas coropláeticos simples

Importanto Geometria - Shapefile

Finalmente, vamos nos dedicar a importar os insumos necessários para criar um mapa coroplé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 nossos propósitos, vamos utilizar o pacote geobrdesenvolvido para carregar shapes diretamente no ambiente R.

Uf <- read_state(showProgress = F, year = 2010) #Há vários argumentos possíveis, mas vamos utilizar o padrão
## Using year/date 2010
plot(st_geometry(Uf)) #Geometria vazia

Unindo Dados ao Shapefile

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

Primeiro precisamos selecionar os dados de que semestre queremos plotar.

Dados_2014.2 <- Dados |> filter(Trimestre_R == as.Date("2014-04-01"))

Dados_2024.2 <- Dados |> filter(Trimestre_R == as.Date("2024-04-01"))

#criando novos objetos para preservar o original Uf

Uf2014.2 <- left_join(Uf, Dados_2014.2, by=c("abbrev_state"="Sigla")) 
Uf2024.2 <- left_join(Uf, Dados_2024.2, by=c("abbrev_state"="Sigla"))

rm(Dados_2014.2,Dados_2024.2)

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.

Uf2024.2 |> ggplot()+geom_sf(aes(fill=Tx_Des))+ theme_minimal()

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

Uf2014.2 |> ggplot()+geom_sf(aes(fill=Tx_Des), color="black")+scale_fill_gradient(low = "white", high = "red")+ theme_minimal() + labs(title = "Taxa de desemprego", subtitle = "Segundo semestre de 2014")

Uf2024.2 |> ggplot()+geom_sf(aes(fill=Tx_Des), color="black")+scale_fill_gradient(low = "white", high = "red")+ theme_minimal() + labs(title = "Taxa de desemprego", subtitle = "Segundo semestre de 2024")

Uf2024.2 |> ggplot()+
  geom_sf(aes(fill=Tx_Par,), color="white")+ 
  geom_sf_label(aes(label = abbrev_state),  size=1.8)+ #Legendas
  scale_fill_viridis_c(guide = guide_colourbar(direction = "horizontal", title.position = "top"), option = "cividis")+ 
  theme_minimal()+ 
  theme(legend.position ="inside",legend.position.inside = c(0.825, 0.1))+
  labs(title = "Taxa de participação", subtitle = "Segundo semestre de 2024", fill="Taxa de participação", x="", y="")
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data