diff --git a/03-exercicio-final.Rmd b/03-exercicio-final.Rmd index 2d91c69..6fddb8d 100644 --- a/03-exercicio-final.Rmd +++ b/03-exercicio-final.Rmd @@ -1,3 +1,156 @@ # Atividades Extras -Texto texto texto. \ No newline at end of file +## 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 documentação em PDF 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 \ No newline at end of file