HTML compilado em: 08 de maio de 2020

## Carregar pacotes
library(tidyverse) # pacote que inclui diversos pacotes para ciência de dados
library(dplyr)
library(readr)

Roteiro

1) Vamos trabalher de novo com os dados eleitorais do Tribunal Superior Eleitoral. Vá ao Repositório de Dados Eleitorais do TSE. O TSE disponibiliza dados sobre os resultados eleitorais separadamente dos dados sobre os candidatos.

R: Recebido pelo professor por email.

1) a) Na aba de ‘resultados’, faça o download do arquivo “Votação nominal por município e zona” para 2016 e descompacte-o.

R: Recebido pelo professor por email.

1) b) Na aba de ‘candidatos’, faça o download do arquivo “Candidatos” para 2016 e descompacte-o.

R: Recebido pelo professor por email.

1) c) Dos arquivos descompactados, abre os dois bancos para Roraima (RR) em R com os parâmetros apropriados (note que o formato é um pouco diferente dos arquivos no desafio 1). Para detalhes sobre as colunas, veja o parte apropriado do documento leiame.pdf nos arquivos.

consulta_cand_2016_RR <-
  read_delim(
    "dados/consulta_cand_2016_RR.csv",
    ";",
    escape_double = FALSE,
    locale = locale(encoding = "ISO-8859-1"),
    col_types = cols(SQ_CANDIDATO = col_character(), SQ_COLIGACAO = col_character()),
    trim_ws = TRUE
  )

# View(consulta_cand_2016_RR)
votacao_candidato_munzona_2016_RR <-
  read_delim(
    "dados/votacao_candidato_munzona_2016_RR.csv",
    ";",
    escape_double = FALSE,
    col_types = cols(SQ_CANDIDATO = col_character(), SQ_COLIGACAO = col_character()),
    locale = locale(encoding = "ISO-8859-1"),
    trim_ws = TRUE
  )

# View(votacao_candidato_munzona_2016_RR)

2) Queremos analisar os resultados eleitorais baseado nas características dos candidatos, então precisamos juntar os dois bancos.

2) a) Identifique a unidade de análise do banco de candidatos - o que repesenta cada observação/linha? Quais variáveis identificam cada linha exclusivamente? (Cuidado: o número do candidato (NR_CANDIDATO) não é único para cada candidato).

R: Cada linha da base “consulta_cand_idato_2016_RR” representa um/uma candidato/a na eleição do ano de 2016, estado de Roraima. A variável que identifica cada linha exclusivamente é SQ_CANDIDATO.

# consulta_cand_2016_RR$SQ_CANDIDATO %>% unique() %>% length()

2) b) Identifique a unidade de análise do banco de resultados - o que repesenta cada observação/linha? Quais variáveis identificam cada linha exclusivamente?

R: Cada linha da base “votacao_candidato_munzona_2016_RR” representa os cadidatos por zona na eleição do ano de 2016, estado de Roraima. As variáveis que identificam cada linha exclusivamente são SQ_CANDIDATO e NR_ZONA.

# votacao_candidato_munzona_2016_RR %>% select(SQ_CANDIDATO, NR_ZONA) %>% unique() %>% nrow()

2) c) Liste as variáveis que compõem os identificadores comuns para realizar a junção dos dois bancos.

R: SQ_CANDIDATO

2) d) Use anti_join para identificador se há resultados que faltam detalhes do seu candidato no banco de dados de candidatos.

# anti_join(votacao_candidato_munzona_2016_RR,
#           consulta_cand_2016_RR,
#           by = c("SQ_CANDIDATO"))

# Aqui está dando erro.. (?)

2) e) Use anti_join para identificador se há candidatos faltando no banco de dados de resultados. (Bonus: Investigando as colunas do resultado de anti_join, você pode identificar porque eles não existem no banco de resultados?).

ex_2e <- anti_join(consulta_cand_2016_RR, votacao_candidato_munzona_2016_RR, by = "SQ_CANDIDATO") 

R: Existem 201 candidatos faltando no banco de dados de resultados.

2) f) Não precisamos trabalhar com todas as colunas para a análise então para limpar os dados e deixar mais fácil entende-los, selecionar apenas as próximas colunas:

candidatos <-
  consulta_cand_2016_RR %>% select(
    SQ_CANDIDATO,
    NM_CANDIDATO,
    SG_PARTIDO,
    NR_IDADE_DATA_POSSE,
    DS_GENERO,
    DS_GRAU_INSTRUCAO,
    DS_COR_RACA
  )

resultados <-
  votacao_candidato_munzona_2016_RR %>% select(
    SQ_CANDIDATO,
    NM_CANDIDATO,
    NM_MUNICIPIO,
    NR_ZONA,
    DS_CARGO,
    NR_TURNO,
    DS_CARGO,
    DS_SIT_TOT_TURNO,
    QT_VOTOS_NOMINAIS
  )

2)* Por algum motivo, queremos calcular um resumo do total de votos recebidos por cada candidato em todas as eleições de 2016 - todas as zonas, todos os turnos, etc.

2) a) * Agregar o seu banco de resultados para ter uma linha por candidato resumindo o seu número de votos total.

resultados_votos_totais <- resultados %>%
  group_by(SQ_CANDIDATO) %>%
  summarise(total_votos = sum(QT_VOTOS_NOMINAIS, na.rm = TRUE))

2) b)* Execute um join do tipo apropriado para criar uma tabela de todos os candidatos que se inscreveram para a eleição com os seus dados pessoais, incluindo o número de votos total calculado em (a).

ex_2b <- left_join(candidatos, resultados_votos_totais, by = "SQ_CANDIDATO") 

head(ex_2b)

3) Execute um join do tipo apropriado para uma análise comparando as caractéristicas dos candidatos que correram e os seus resultados eleitorais.

dados_unidos <- left_join(resultados, candidatos, by = c("SQ_CANDIDATO", "NM_CANDIDATO"))

4) a) Filtre os seus dados juntados em Questão 3 para focar nas eleições para vereador.

eleicoes_vereador <- dados_unidos %>% filter(DS_CARGO == "Vereador")

4) b) [Omitida na versão inicial, exemplo de código fornecido] Resume os dados dos vereadores para agregar os dados por município (somando os dados das zonas eleitorais em cada município).

combinado_vereador <- eleicoes_vereador %>%
  group_by(
    SQ_CANDIDATO,
    NM_MUNICIPIO,
    DS_CARGO,
    NR_TURNO,
    DS_SIT_TOT_TURNO,
    NM_CANDIDATO,
    SG_PARTIDO,
    NR_IDADE_DATA_POSSE,
    DS_GENERO,
    DS_GRAU_INSTRUCAO,
    DS_COR_RACA
  ) %>%
  summarize(QT_VOTOS_NOMINAIS = sum(QT_VOTOS_NOMINAIS, na.rm = T)) %>%
  ungroup()

5) Para o nosso primeiro gráfico, vamos apresentar o número de candidatos para vereador por município, usando o banco de dados criado em questão 4.

5) a) Escolhe um tipo de gráfico apropriado e crie o gráfico.

eleicoes_vereador %>%
  group_by(NM_MUNICIPIO) %>%
  tally() %>%
  ggplot() +
  geom_col(aes(x = reorder(NM_MUNICIPIO , n), y = n), fill = "lightblue") +
  coord_flip() +
  theme_bw() +
  labs(
    title = "Número de candidatos(as) para o cargo de vereador(a) \n por município",
    subtitle = "Na eleição de 2016 para o estado de RR",
    x = "Município",
    y = "Número de candidatos(as)"
  )

5) b) Adicione um título ao seu gráfico, e rótulos nos eixos.

R: Feito no exercício anterior.

5) c) Use o código da camada + theme(axis.text.x = element_text(angle = 90)) para virar o texto do município para deixar mais visível.

eleicoes_vereador %>%
  group_by(NM_MUNICIPIO) %>%
  tally() %>%
  ggplot() +
  geom_col(aes(x = reorder(NM_MUNICIPIO , n), y = n), fill = "lightblue") +
  theme_bw() +
  labs(
    title = "Número de candidatos(as) para o cargo de vereador(a) \n por município",
    subtitle = "Na eleição de 2016 para o estado de RR",
    x = "Município",
    y = "Número de candidatos(as)"
  ) +
  theme(axis.text.x = element_text(angle = 90)) 

6) Agora, a nossa questão de pesquisa é o número de candidatos por gênero (variável DS_GENERO) no estado inteiro, usando o banco de dados de vereadores de questão 4. Prepare um gráfico apropriado, com título, rótulos nos eixos e aplique um tema simples da sua escolha.

eleicoes_vereador %>%
  group_by(DS_GENERO) %>% tally() %>%
  ggplot() +
  geom_col(aes(x = DS_GENERO, y = n, fill = DS_GENERO)) +
  scale_fill_brewer(palette = "Dark2", direction = -1) +
  theme_light() +
  labs(
    x = "Gênero",
    y = "Número de candidatos(as)",
    title = "Número de candidatos(as) para o cargo de vereador(a) \n por gênero",
    subtitle = "Na eleição de 2016 para o estado de RR",
    fill = "Gênero"
  )

6) a) Gere um gráfico apropriado que mostra o porcentagem de candidatos por gênero em cada município, usando o banco de dados de vereadores de questão 4.

eleicoes_vereador %>%
  group_by(NM_MUNICIPIO, DS_GENERO) %>% tally() %>%
  ggplot() +
  geom_col(aes(
    x = reorder(NM_MUNICIPIO , n),
    y = n,
    fill = DS_GENERO
  ), position = "fill") +
  scale_fill_brewer(palette = "Dark2", direction = -1) +
  coord_flip() +
  theme_light() +
  labs(
    x = "Município",
    y = "Porcentagem (%)",
    title = "Porcentagem de de candidatos(as) para o cargo de \n vereador(a) gênero",
    subtitle = "Na eleição de 2016 para o estado de RR",
    fill = "Gênero"
  ) +
  theme(legend.position = "bottom")

6) b) Formate o seu gráfico com títulos, rótulos nos eixos, virando o texto no eixo x, e ajuste a legenda para que ela fique abaixo do gráfico.

R: Feito no exercício anterior.

7) a) Gere uma variável binário para os vereadores eleitos (da variável DS_SIT_TOT_TURNO), e calcule a taxa de sucesso (% eleito) de candidatos por município e gênero.

eleicoes_vereador <-
  eleicoes_vereador %>% mutate(
    binario_eleito = case_when(
      DS_SIT_TOT_TURNO == "ELEITO POR QP" ~ TRUE,
      DS_SIT_TOT_TURNO == "ELEITO POR MÉDIA" ~ TRUE,
      DS_SIT_TOT_TURNO == "NÃO ELEITO" ~ FALSE,
      DS_SIT_TOT_TURNO == "SUPLENTE" ~ FALSE
      
    )
  )

genero_porcentagem <-
  eleicoes_vereador %>% group_by(NM_MUNICIPIO, DS_GENERO) %>%
  summarise(
    total_eleito = sum(binario_eleito == TRUE),
    total_nao_eleito = sum(binario_eleito == FALSE)
  ) %>%
  mutate(
    total = total_eleito + total_nao_eleito,
    porcentagem_eleito = (total_eleito / total) * 100
  )

7) b) Mostre um gráfico de barras da taxa de sucesso (% eleito) dos candidatos femininos por município, com formatação apropriada.

genero_porcentagem  %>%
  ggplot() +
  geom_col(aes(
    x = reorder(NM_MUNICIPIO , porcentagem_eleito),
    y = porcentagem_eleito,
    fill = DS_GENERO
  ),
  position = "dodge") +
  coord_flip() +
  scale_fill_brewer(palette = "Dark2", direction = -1) +
  theme_light() +
  labs(
    x = "Município",
    y = "Porcentagem de eleição (%)",
    title = "Porcentagem de candidatos(as) eleitos para o cargo de \n vereador(a) por gênero",
    subtitle = "Na eleição de 2016 para o estado de RR",
    fill = "Gênero"
  ) +
  theme(legend.position = "bottom")

7) c) Extende o seu gráfico para mostrar a taxa de sucesso de homens e mulheres lado a lado, por município.

R: Feito no exercício anterior.

7) d) Qual é o município em que as mulheres têm uma maior taxa de sucesso que os homens?

R: Caroebe

8) Gere um gráfico de ‘tile’, que mostra o número de candidatos por município e gênero. Aplique uma escala de cores apropriado da sua escolha. Formate o seu gráfico.

eleicoes_vereador %>%
  group_by(NM_MUNICIPIO, DS_GENERO) %>% tally() %>%
  ggplot() +
  geom_tile(aes(x = NM_MUNICIPIO, y = DS_GENERO, fill = n)) +
  scale_fill_viridis_c() +
  theme_light() +
  theme(axis.text.x = element_text(angle = 90)) +
  labs(
    x = "Município",
    y = "Gênero",
    title = "Quantidade de candidatos(as) para o cargo de \n vereador(a) por gênero e município",
    subtitle = "Na eleição de 2016 para o estado de RR",
    fill = "Número de \n candidatos(as)"
  )

9) a) Apresente um gráfico de histograma da idade dos candidatos (NR_IDADE_DATA_POSSE). Faça qualquer ajuste necessário para que o seu gráfico faz sentido e incorpora valores de idade possíveis. Formate o seu gráfico.

# Essa base tem valores discrepantes criado por um erro! Filtrei para idade menor que 100 anos.
eleicoes_vereador %>%
  filter(NR_IDADE_DATA_POSSE < 100) %>%
  ggplot() +
  geom_histogram(aes(x = NR_IDADE_DATA_POSSE), fill = "lightblue")   +
  theme_light() +
  theme(axis.text.x = element_text(angle = 90)) +
  labs(
    x = "Idade (anos)",
    y = "Quantidade de candidatos(as)",
    title = "Histograma de idade na data da posse, dos(as) candidatos(as) \n para o cargo de vereador(a)",
    subtitle = "Na eleição de 2016 para o estado de RR"
  )

9) b) Apresente o mesmo gráfico de histograma da idade dos candidatos, mas agora separado por gênero.

# Essa base tem valores discrepantes criado por um erro! Filtrei para idade menor que 100 anos.
eleicoes_vereador %>%
  filter(NR_IDADE_DATA_POSSE < 100) %>%
  ggplot() +
  geom_histogram(aes(x = NR_IDADE_DATA_POSSE, fill = DS_GENERO))   +
  scale_fill_brewer(palette = "Dark2", direction = -1) +
  theme_light() +
  theme(axis.text.x = element_text(angle = 90)) +
  labs(
    x = "Idade (anos)",
    y = "Quantidade de candidatos(as)",
    title = "Histograma de idade na data da posse, dos(as) candidatos(as) \n para o cargo de vereador(a)",
    subtitle = "Na eleição de 2016 para o estado de RR",
    fill = "Gênero"
  )

9) c) Como uma forma alternativa de apresentar os dados, divide o seu gráfico de histograma em facets diferentes, dividido por gênero e raça.

# Essa base tem valores discrepantes criado por um erro! Filtrei para idade menor que 100 anos.
eleicoes_vereador %>%
  filter(NR_IDADE_DATA_POSSE < 100) %>%
  ggplot() +
  geom_histogram(aes(x = NR_IDADE_DATA_POSSE, fill = DS_GENERO))   +
  scale_fill_brewer(palette = "Dark2", direction = -1) +
  theme_light() +
  theme(axis.text.x = element_text(angle = 90)) +
  labs(
    x = "Idade (anos)",
    y = "Quantidade de candidatos(as)",
    title = "Histograma de idade na data da posse, dos(as) candidatos(as) \n para o cargo de vereador(a), segundo o gênero e raça",
    subtitle = "Na eleição de 2016 para o estado de RR",
    fill = "Gênero"
  ) +
  facet_grid(DS_GENERO ~ DS_COR_RACA) +
  theme(legend.position = "bottom")

10) a) Calcule o porcentagem de votos dos candidatos no seu município.

eleicoes_vereador_porcentagem <-
  eleicoes_vereador %>% 
  group_by(SQ_CANDIDATO, NM_CANDIDATO, NM_MUNICIPIO) %>%
  summarise(total_votos_candidato = sum(QT_VOTOS_NOMINAIS, na.rm = TRUE)) %>%
  ungroup() %>%
  group_by(NM_MUNICIPIO) %>%
  mutate(
    total_votos_municipio = sum(total_votos_candidato, na.rm = TRUE),
    porcentagem_votos_munic = round((
      total_votos_candidato /
        total_votos_municipio
    ) * 100, 2)
  ) %>%
  select(-total_votos_candidato, -total_votos_municipio)

head(eleicoes_vereador_porcentagem)
# Checando se totaliza 100% para cada municipio
# eleicoes_vereador_porcentagem %>% group_by(NM_MUNICIPIO) %>% summarise(total_porc = sum(porcentagem_votos_munic, na.rm = TRUE))

10) b) Calcule a média do porcentagem de votos dos candidatos por idade.

eleicoes_vereador_porc_idade <-
  eleicoes_vereador %>% left_join(
    eleicoes_vereador_porcentagem,
    by = c("SQ_CANDIDATO", "NM_CANDIDATO", "NM_MUNICIPIO")
  ) %>%
  filter(NR_IDADE_DATA_POSSE < 100) %>%
  group_by(NR_IDADE_DATA_POSSE) %>%
  summarise(media_porcentagem_idade = round(mean(porcentagem_votos_munic, na.rm = TRUE), 2))

head(eleicoes_vereador_porc_idade)

10) c) Mostre num gráfico de linhas o porcentagem média de votos dos candidatos (no eixo y) por idade do candidato (no eixo x). Formate o seu gráfico.

eleicoes_vereador_porc_idade %>%
  ggplot() +
  geom_line(aes(x =  NR_IDADE_DATA_POSSE, y = media_porcentagem_idade)) +
  geom_point(aes(x =  NR_IDADE_DATA_POSSE, y = media_porcentagem_idade),
             alpha = 0.5) +
  theme_light() +
  labs(
    x = "Idade (anos)",
    y = "Porcentagem média de votos dos candidatos (%)",
    title = "Porcentagem média de votos, dos(as) candidatos(as) \n para o cargo de vereador(a), segundo a idade",
    subtitle = "Na eleição de 2016 para o estado de RR"
  ) +
  theme(legend.position = "bottom")