Desafio 3: Combinação e Visualização de Dados

O prazo para entregar Desafio 3 por email com título “[FLS6397] - D3” à minha conta é 14h, 08/05/2020, antes da próxima aula. Por favor entregue (i) o arquivo .Rmd, e (ii) o arquivo .html.


[Atualizada no dia 27/04/20 para inserir Q4(b) com código fornecido, resolvendo o problema de duplicação de vereadores por zona nas questões de número de candidatos]

Instruções

Siga as instruções abaixo. Documente todos os seus passos em um script. Comente no seu script todos os seus passos e explique a si mesma(o) suas escolhas e estratégias. Se você se beneficiou da assistência de outra pessoa, sempre reconheça isso em comentários no código.

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.
  1. Na aba de ‘resultados’, faça o download do arquivo “Votação nominal por município e zona” para 2016 e descompacte-o.

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

  3. 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.


resultados <- read_delim("C:/Users/Jonny/Downloads/votacao_candidato_munzona_2016/votacao_candidato_munzona_2016_RR.csv",
                   delim=";",
                   locale=locale(encoding="latin1"))

candidatos <- read_delim("C:/Users/Jonny/Downloads/consulta_cand_2016/consulta_cand_2016_RR.csv",
                   delim=";",
                   locale=locale(encoding="latin1"))
  1. Queremos analisar os resultados eleitorais baseado nas características dos candidatos, então precisamos juntar os dois bancos.
  1. 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).

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


candidatos %>% distinct(SQ_CANDIDATO)

resultados %>% distinct(SQ_CANDIDATO, CD_MUNICIPIO, NR_ZONA) #CD_CARGO e NR_TURNO são opcionais
  1. Liste as variáveis que compõem os identificadores comuns para realizar a junção dos dois bancos.

#SQ_CANDIDATO
  1. Use anti_join para identificador se há resultados que faltam detalhes do seu candidato no banco de dados de candidatos.

resultados %>% anti_join(candidatos, by="SQ_CANDIDATO")
  1. 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?).

candidatos %>% anti_join(resultados, by=c("SQ_CANDIDATO"))
  1. 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 <- candidatos %>% select(SQ_CANDIDATO, NM_CANDIDATO, SG_PARTIDO,
                                    NR_IDADE_DATA_POSSE, DS_GENERO, DS_GRAU_INSTRUCAO,
                                    DS_COR_RACA)

resultados <- resultados %>% select(SQ_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.

  1. Agregar o seu banco de resultados para ter uma linha por candidato resumindo o seu número de votos total.

  2. 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).


resultados_cand <- resultados %>% group_by(SQ_CANDIDATO) %>% 
  summarize(Tot_Votos=sum(QT_VOTOS_NOMINAIS, na.rm=T))

candidatos %>% left_join(resultados_cand, by="SQ_CANDIDATO")
  1. Execute um join do tipo apropriado para uma análise comparando as caractéristicas dos candidatos que correram e os seus resultados eleitorais.

combinado <- resultados %>% left_join(candidatos, by=c("SQ_CANDIDATO"))
    1. Filtre os seus dados juntados em Questão 3 para focar nas eleições para vereador.

combinado_vereador <- combinado %>% filter(DS_CARGO=="Vereador")
  1. [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 <- combinado_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()
  1. 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.
  1. Escolhe um tipo de gráfico apropriado e crie o gráfico.

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

  3. 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.


combinado_vereador %>% 
  ggplot() +
  geom_bar(aes(x=NM_MUNICIPIO)) +
  ggtitle("Número de Candidatos por Município") +
  xlab("Município") +
  ylab("Número de Candidatos") + 
  theme(axis.text.x = element_text(angle = 90))

  1. 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.

combinado_vereador %>% 
  ggplot() +
  geom_bar(aes(x=DS_GENERO)) +
  ggtitle("Número de Candidatos por Gênero") +
  xlab("Gênero") +
  ylab("Número de Candidatos") +
  theme_classic()

    1. 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.
  1. 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.

combinado_vereador %>% group_by(NM_MUNICIPIO, DS_GENERO) %>%
  tally() %>%
  ggplot() +
  geom_col(aes(x=NM_MUNICIPIO, y=n, fill=DS_GENERO), position="fill") +
  ggtitle("O Porcentagem de Candidatos por Município e Gênero") +
  xlab("Município") +
  ylab("Porcentagem de Candidatos") + 
  theme(axis.text.x = element_text(angle = 90)) +
  theme(legend.position="bottom")

    1. 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.

combinado_vereador_sucesso <- combinado_vereador %>% 
  mutate(Eleito=case_when(DS_SIT_TOT_TURNO %in% 
                            c("ELEITO POR QP","ELEITO POR MÉDIA", "ELEITO")~1,
                                      TRUE~0))  %>%
  group_by(NM_MUNICIPIO, DS_GENERO, Eleito) %>%
  tally() %>%
  ungroup() %>% 
  complete(NM_MUNICIPIO, DS_GENERO, Eleito, fill=list(n=0)) %>%
  group_by(NM_MUNICIPIO, DS_GENERO) %>%
  mutate(Pct_eleito=100*(n/sum(n,na.rm=T)))
  1. Mostre um gráfico de barras da taxa de sucesso (% eleito) dos candidatos femininos por município, com formatação apropriada.

combinado_vereador_sucesso %>%
  filter(DS_GENERO=="FEMININO" & Eleito==1) %>%
  ggplot() +
  geom_col(aes(x=NM_MUNICIPIO, y=Pct_eleito)) +
  ggtitle("O Porcentagem de Candidatos Eleitos por Município e Gênero") +
  xlab("Município") +
  ylab("% de Candidatos Eleitos") + 
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90))

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

combinado_vereador_sucesso %>%
  filter(Eleito==1) %>%
  ggplot() +
  geom_col(aes(x=NM_MUNICIPIO, y=Pct_eleito, fill=DS_GENERO), position="dodge") +
  ggtitle("O Porcentagem de Candidatos Eleitos por Município e Gênero") +
  xlab("Município") +
  ylab("% de Candidatos Eleitos") + 
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90))

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

mun_sucesso_feminino <- combinado_vereador_sucesso %>% filter(Eleito==1) %>% 
  select(-n) %>%
  pivot_wider(names_from="DS_GENERO", 
              values_from="Pct_eleito") %>%
  filter(FEMININO>MASCULINO) %>%
  pull(NM_MUNICIPIO)

O município em que as mulheres têm uma maior taxa de sucesso que os homens é CAROEBE.

  1. 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.

combinado_vereador %>% group_by(NM_MUNICIPIO, DS_GENERO) %>%
  tally() %>%
  ggplot() +
  geom_tile(aes(x=DS_GENERO, y=NM_MUNICIPIO, fill=n)) +
  scale_fill_gradient(low="#efedf5", high="#3f007d") +
  ggtitle("Número de Candidatos por Município e Gênero") +
  xlab("Município") +
  ylab("Número de Candidatos") + 
  theme_classic()

    1. 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.

combinado_vereador %>% 
  mutate(NR_IDADE_DATA_POSSE=case_when(NR_IDADE_DATA_POSSE==999~NA_real_,
                                       TRUE~NR_IDADE_DATA_POSSE)) %>%
  ggplot() +
  geom_histogram(aes(x=NR_IDADE_DATA_POSSE)) +
  ggtitle("Histograma de Candidatos por Idade") +
  xlab("Idade") +
  ylab("Número de Candidatos") + 
  theme_classic()

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

combinado_vereador %>% 
  mutate(NR_IDADE_DATA_POSSE=case_when(NR_IDADE_DATA_POSSE==999~NA_real_,
                                       TRUE~NR_IDADE_DATA_POSSE)) %>%
  ggplot() +
  geom_histogram(aes(x=NR_IDADE_DATA_POSSE, fill=DS_GENERO), 
                 position="dodge") +
  ggtitle("Histograma de Candidatos por Idade") +
  xlab("Idade") +
  ylab("Número de Candidatos") + 
  theme_classic()

  1. 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.

combinado_vereador %>% 
  mutate(NR_IDADE_DATA_POSSE=case_when(NR_IDADE_DATA_POSSE==999~NA_real_,
                                       TRUE~NR_IDADE_DATA_POSSE)) %>%
  ggplot() +
  geom_histogram(aes(x=NR_IDADE_DATA_POSSE, fill=DS_GENERO)) +
  ggtitle("Histograma de Candidatos por Idade") +
  xlab("Idade") +
  ylab("Número de Candidatos") + 
  theme_classic() +
  facet_grid(rows=vars(DS_COR_RACA), cols=vars(DS_GENERO))

    1. Calcule o porcentagem de votos dos candidatos no seu município.

combinado_vereador <- combinado_vereador %>% 
  group_by(NM_MUNICIPIO) %>%
  mutate(Pct_Votos=100*(QT_VOTOS_NOMINAIS/sum(QT_VOTOS_NOMINAIS,na.rm=T)))
  1. Calcule a média do porcentagem de votos dos candidatos por idade.

combinado_vereador_votos_idade <- combinado_vereador %>% 
mutate(NR_IDADE_DATA_POSSE=case_when(NR_IDADE_DATA_POSSE==999~NA_real_,
                                       TRUE~NR_IDADE_DATA_POSSE)) %>% 
  group_by(NR_IDADE_DATA_POSSE) %>%
  summarize(Media_Pct_Votos=mean(Pct_Votos,na.rm=T)) 
  1. 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.

combinado_vereador_votos_idade %>%
  ggplot() +
  geom_line(aes(x=NR_IDADE_DATA_POSSE, y=Media_Pct_Votos)) +
  ggtitle("Porcentagem de Votos de Candidatos por Idade") +
  xlab("Idade") +
  ylab("Média de Porcentagem de Votos") + 
  theme_classic()

  1. Mostre num gráfico da linhas o porcentagem de votos dos candidatos (no eixo y) por idade do candidato (no eixo x), com linhas separadas por gênero.

combinado_vereador_votos_idade_genero <- combinado_vereador %>% 
mutate(NR_IDADE_DATA_POSSE=case_when(NR_IDADE_DATA_POSSE==999~NA_real_,
                                       TRUE~NR_IDADE_DATA_POSSE)) %>% 
  group_by(DS_GENERO, NR_IDADE_DATA_POSSE) %>%
  summarize(Media_Pct_Votos=mean(Pct_Votos,na.rm=T)) 

combinado_vereador_votos_idade_genero %>%
  ggplot() +
  geom_line(aes(x=NR_IDADE_DATA_POSSE, y=Media_Pct_Votos, group=DS_GENERO, colour=DS_GENERO))

  1. Em qual idade os homens e as mulheres tem a maior chance para ganhar a eleição?

combinado_vereador_votos_idade_genero_maior <- combinado_vereador_votos_idade_genero %>%
  group_by(DS_GENERO) %>%
  arrange(DS_GENERO, -Media_Pct_Votos) %>%
  top_n(1, Media_Pct_Votos)
    1. Calcule o voto total de cada partido (não candidato) em cada município nas eleições para vereador em 2016. Depois, calcular o porcentagem do voto de cada partido em cada município.

combinado_vereador_mun_partido <- combinado_vereador %>% group_by(NM_MUNICIPIO, SG_PARTIDO) %>%
  summarize(Tot_Votos=sum(QT_VOTOS_NOMINAIS, na.rm=T)) %>%
  group_by(NM_MUNICIPIO) %>%
  mutate(Pct_Votos=100*(Tot_Votos/sum(Tot_Votos,na.rm=T)))
  1. Use o código abaixo para gerar uma tabela de IDH (Indíce de Desenvolvimento Humano em 2010) por município.

IDH <- tibble(NM_MUNICIPIO=c("ALTO ALEGRE", "AMAJARI", "BOAVISTA", "BONFIM",
                      "CANTÁ", "CARACARAÍ", "CAROEBE", "IRACEMA", "MUCAJAÍ", 
                      "NORMANDIA", "PACARAIMA", "RORAINOPOLIS", 
                      "SÃO JOÃO DA BALIZA", "SÃO LUIZ", "UIRAMUTÃ"),
       IDH=c(0.542, 0.484, 0.752, 0.626, 0.619, 0.624, 0.639, 0.582, 0.665, 
             0.594, 0.650, 0.619, 0.655, 0.649, 0.453))
  1. Juntar os dados de voto por partido de questão (a) com a tabela de HDI de questão (b). Verifique que o join deu certo para todas as observações, identifique o motivo pelos erros, e corrija os erros.

combinado_vereador_mun_partido %>% anti_join(IDH, by="NM_MUNICIPIO") %>%
  distinct(NM_MUNICIPIO) #Boa Vista e Roraionopolis não cruzados

IDH <- IDH %>% mutate(NM_MUNICIPIO=case_when(NM_MUNICIPIO=="BOAVISTA"~"BOA VISTA",
                             NM_MUNICIPIO=="RORAINOPOLIS"~"RORAINÓPOLIS",
                             TRUE~NM_MUNICIPIO))

combinado_vereador_mun_partido_IDH <- combinado_vereador_mun_partido %>% 
  left_join(IDH, by="NM_MUNICIPIO")
  1. Crie um gráfico de pontos do IDH do município no eixo X por porcentagem de votos do partido PMDB no eixo Y. Adicione um título e rótulos nos eixos.

combinado_vereador_mun_partido_IDH %>% 
  filter(SG_PARTIDO=="PMDB") %>%
  ggplot() + 
  geom_point(aes(x=IDH, y=Pct_Votos)) +
  ggtitle("IDH do Município e Porcentagem de Votos do PMDB") +
  xlab("IDH") +
  ylab("Porcentagem de Votos do PMDB") + 
  theme_classic()

  1. Ajuste o seu gráfico na questão (d) para que o tamanho do ponto mostra o total de votos que o PMDB recebeu no munícipio.

combinado_vereador_mun_partido_IDH %>% 
  filter(SG_PARTIDO=="PMDB") %>%
  ggplot() + 
  geom_point(aes(x=IDH, y=Pct_Votos, size=Tot_Votos)) +
  ggtitle("IDH do Município e Porcentagem de Votos do PMDB") +
  xlab("IDH") +
  ylab("Porcentagem de Votos do PMDB") + 
  theme_classic()

  1. Ajuste o seu gráfico na questão (d) para que o cor dos pontos (em vez do tamanho) mostra o total de votos que o PMDB recebeu no munícipio. Aplique uma escala de cores apropriado da sua escolha.

combinado_vereador_mun_partido_IDH %>% 
  filter(SG_PARTIDO=="PMDB") %>%
  ggplot() + 
  geom_point(aes(x=IDH, y=Pct_Votos, colour=Tot_Votos)) +
  scale_colour_gradient(low="#fee6ce", high="#a63603") +
  ggtitle("IDH do Município e Porcentagem de Votos do PMDB") +
  xlab("IDH") +
  ylab("Porcentagem de Votos do PMDB") + 
  theme_classic()