Skip to content

Commit

Permalink
mata inicial
Browse files Browse the repository at this point in the history
  • Loading branch information
joaoguedesneto committed Nov 17, 2023
1 parent 9c41542 commit f996038
Showing 1 changed file with 154 additions and 1 deletion.
155 changes: 154 additions & 1 deletion 03-exercicio-final.Rmd
Original file line number Diff line number Diff line change
@@ -1,3 +1,156 @@
# Atividades Extras

Texto texto texto.
## Marta Suplicy em 2000

Nosso primeiro passo é sempre carregar os pacotes que são relevantes para o nosso trabalho. A única novidade em relação aos exercícios anteriores é o pacote *RColorBrewer*. Já que queremos plotar mapas bonitos, ele nos auxília apresentando uma série de paletas de cores adicionais.

```{r pacotes, message = FALSE}
library(dplyr)
library(tidyr)
library(sf)
library(ggplot2)
library(ggspatial)
library(RColorBrewer)
```

Os procedimentos iniciais são muito parecidos com o que realizamos para as tarefas anteriores. Começamos baixando a base de dados que possui os resultados por local de votação na cidade de São Paulo no ano 2000 (nomeada *lv2000*). Além dela, também importaremos o mapa de distritos de São Paulo.

```{r importa-bases, message = FALSE}
# Importa os dados de resultado por local de votação em SP
lv2000 <- readRDS("base/base2000_sp.rds")
# Importa o mapa de distritos de São Paulo
mapa <- readRDS("base/mapa_distritos_sp.rds")
```

Agora identificaremos o total de votos por local de votação. Note que a base *lv2000* do CEM/USP já contém os dados de votação dos candidatos a prefeito. Nela, as colunas com os dados de votação seguem o seguinte padrão: PF00_111. Neste código, PF indica votação para prefeito; o primeiro dígito depois de "_" indica o turno; os dois números seguintes indicam o número do prefeito. A coluna com a votação da Marta Suplicy no primeiro turno, portanto, é PF00_113. Para mais informações, consulte a <a href="https://centrodametropole.fflch.usp.br/pt-br/file/18772/download?token=t4vNFXTg" target="blank">documentação em PDF</a> preparada pelos pesquisadores do CEM/USP.


```{r votos-por-LV, message = FALSE}
# Obtenção do total de votos validos para prefeito por local de votação
votos_pref <- lv2000 |>
# Remove as colunas de geometria espacial
st_drop_geometry() |>
# Seleciona as colunas 'ID' e um intervalo de colunas de 'PF00_111' a 'PF00_156'
select(ID, PF00_111:PF00_156) |>
# Transforma as colunas de votos em linhas
pivot_longer(cols = c(PF00_111:PF00_156),
names_to = "coluna",
values_to = "voto") |>
# Substitui valores NA em 'voto' por 0
mutate(voto = replace_na(voto, 0)) |>
# Cria uma nova coluna 'voto_total' que é a soma dos votos por 'ID'
group_by(ID) |>
summarise(voto_total = sum(voto)) |>
ungroup()
```



```{r tibble-marta, message = FALSE}
# Cria um novo tibble 'lv2000_2' a partir do 'lv2000'
lv2000_2 <- lv2000 |>
# Combina 'lv2000' com 'votos_pref' usando um leftjoin pelo 'ID'
left_join(votos_pref, by = "ID") |>
# Seleciona as colunas 'ID', 'PF00_113' e 'voto_total'
select(ID, PF00_113, voto_total)
```

Agora integraremos a base de LV (ponto) com seus respecitvos distritos (poligonos).

```{r spatial-join-marta, message = FALSE}
# Spatial join dos pontos com os poligonos
# trazendo informação dos polígonos para os pontos
mapa_unificado <- st_join(lv2000_2, mapa)
```

DEU ERRO! Por que? Investigue a razão!

```{r crs-marta, message = FALSE}
# Transforma o crs para 4674
lv2000_2 <- st_transform(lv2000_2, crs = 4674)
```

O que mudamos aqui? O sistema de referencia de coordenadas! Agora os dois objetos espaciais estao sob o mesmo crs

```{r integra-bases, message = FALSE}
# Unifica as bases com st_join.
# Isso garante que os pontos sejam associados espacialmente com os poligonos
mapa_unificado <- st_join(mapa, lv2000_2)
```

Por que mapa_unificado agora tem 1135 linhas e não 1134?
Dica: investigue o distrito (em mapa) de Marsilac no extremo sul da cidade.

Agrupar as votações da candidata por distrito

```{r porcetagem-votos-marta, message = FALSE}
# Usa o tibble 'mapa_unificado'
mapa_final <- mapa_unificado |>
# Calcula a soma total dos votos para 'Marta' e no total em cada distrito
group_by(name_district) |>
summarise(marta = sum(PF00_113),
voto_total = sum(voto_total)) |>
ungroup() |>
# Calcula a porcentagem de votos para 'Marta' e arredonda para 1 casa decimal
mutate(porc = round(marta/voto_total*100, 1))
```

```{r ajuda-visualiza-marta, message = FALSE}
# Cria uma variavel categorica para melhorar a visualizacao
mapa_final <- mutate(
mapa_final,
voto_cat = case_when(
is.na(porc) ~ "Sem LV",
TRUE ~ cut(porc,
seq(25, 49, 6),
labels = c("25-31%", "31-37%",
"37-43%","43-49%"))))
```

Produz a visualizacao de mapa com ggplot

```{r visualiza-marta, message = FALSE}
# Monta uma string de cores.
cores <- brewer.pal(4, "OrRd")
cores <- c(cores, "#999999")
# Inicia o ggplot
mapa_final |>
ggplot() +
# Usa uma camada de sf
geom_sf(aes_string(fill = "voto_cat"), color = "black", size = 0.1) +
# Retira o datum
theme_void() +
# Coloca o fill na paleta de verdes
scale_fill_manual(values = cores) +
# Adicionar titulo, subtitulo e legenda
labs(
title = "Votação de Marta Suplicy (2000, 1º turno)",
subtitle = "Distritos do município de São Paulo",
caption = "Fonte: Elaborado a partir de\ndados do CEM e IBGE.") +
# Adiciona escala
ggspatial::annotation_scale(
location = "br", width_hint = 0.4, line_width = 0.5,
height = unit(0.1,"cm")) +
# Coloca titulo na legenda
guides(fill = guide_legend(title = "Votos válidos")) +
# Ajusta elementos do tema do ggplot
theme(
# Posicao e direcao da legenda
legend.position = "bottom",
legend.direction = "horizontal",
# Centralizacao de alguns elementos textuais
plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
plot.caption = element_text(hjust = 0.5)) +
# Adiciona rosa-dos-ventos
ggspatial::annotation_north_arrow(
location = "br", which_north = "true",
style = north_arrow_fancy_orienteering(),
# Ajusta a altura da rosa-dos-ventos (pode exigir tentativa e erro)
pad_x = unit(17.5, "cm"), pad_y = unit(8.5, "cm"))
```


## Eduardo Paes em 2020

0 comments on commit f996038

Please sign in to comment.