Giter VIP home page Giter VIP logo

bd_case's Introduction

Arthur Gusmão

O BD Case:

Elaborar uma visualização, usando pelo menos uma das seguintes bases:
  • Eleições Brasileiras.
  • Sistema de Informações Contábeis e Fiscais do Setor Público Brasileiro (Siconfi).
  • Inflação.

A base escolhida foi a de Eleições Brasileiras.

O código para as visualizações é o CaseBD.Rmd, que está presente no repositório, ele é completamente reprodutível. A única ressalva fica para o set_billing_id() que, no caso, contém o meu billing id.

Então vamos nessa! Importando os pacotes:

library(basedosdados)
library(tidyverse)
library(geofacet)
library(ggh4x)
library(extrafont)

O objetivo da minha análise é visualizar a evolução no tempo do número de vereadoras eleitas e compará-lo com o número de vereadores eleitos, para todas as Unidades Federativas do Brasil. Para isso, usei a base de eleições (do TSE), disponibilizada no datalake. De maneira resumida, carreguei as bases com os resultados e fiz um merge() com a base dos candidatos, que é a que contêm os dados de gênero, raça, instrução e etc.

Baixando os dados do datalake com a função basedosdados::bdplyr() e construindo a query com o dplyr:

set_billing_id("casebd")

## base de resultados
query <- bdplyr("br_tse_eleicoes.resultados_candidato") %>%
  select(ano, id_municipio, sigla_uf,
         turno, tipo_eleicao, cargo,
         numero_candidato, id_candidato_bd,
         resultado, ano)%>%
  filter(ano > 2007,cargo == "vereador", resultado != "nao eleito")

df_resultado <- bd_collect(query)


## base de candidatos

query2 <- bdplyr("br_tse_eleicoes.candidatos") %>%
  select(ano,sigla_uf,id_candidato_bd,nome,situacao,ocupacao, genero, idade,instrucao,raca)%>%
  filter(ano > 2007)

df_candidatos <- bd_collect(query2)

## base de diretórios

query4 <- bdplyr("br_bd_diretorios_brasil.uf")%>%
  select(sigla, nome)

diretorio <- bd_collect(query4)

Como disse, fiz o merge() das bases de candidatos e do resultado das eleições, e também fiz um merge() com a base de diretórios, para facilitar a visualização dos nomes das UF’s.

candidatos_merged <- merge(df_candidatos, df_resultado, by = c("id_candidato_bd","ano"))

diretorio <- diretorio %>%
  rename(nome_uf = nome, sigla_uf = sigla) #%>%

candidatos_merged <- merge(candidatos_merged, diretorio, by.x = "sigla_uf.x", by.y = "sigla_uf")

Com as funções do dplyr, montei uma base (a) com número de candidatos(as) eleitos(as), por gênero, e a propoção entre os dois gêneros.

a <- candidatos_merged %>%
  filter(resultado != "suplente")%>%
  filter(tipo_eleicao == "eleicao ordinaria", situacao == "deferido")%>%
  #mutate(militar = case_when(str_detect(ocupacao,c("policia|militar reformado"))~ "Policial ou Militar",TRUE ~ "Outras ocupações"))%>% ##tinha pensado em fazer algo relacionado à policia, mas desisti...
  group_by(ano, sigla_uf.x, genero)%>%
  summarise(N = n()) %>%
  group_by(ano, sigla_uf.x)%>%
  mutate(total = sum(N), proporcao =round(N/total,2))%>%
  mutate(genero = if_else(is.na(genero), "nao respondido", genero))%>%
  mutate(genero = as.factor(genero)) 

Com a base pronta, criei uma primeira visualização, com o pacote ggplot2, mostrando a evolução temporal da proporção de pessoas eleitas, para o cargo de vereador(a), do gênero feminino, comparada com o total de vereadores(as) eleitos(as), por UF. Com o geofacet::facet_geo() pude deixar a visualização um pouquinho mais “bonita”, dando ao gráfico o formato, não tão exato, do mapa do Brasil.

Primeira visualização:

## gráfico com o facet_geo()
a %>%
  filter(genero=="feminino")%>%
  ggplot(aes(x = ano, y = proporcao))+
  geom_area(fill = "#009688",alpha=0.4) +
  geom_line(color="#762a83", size=1, alpha = 0.5) +
  geom_point(size=1.5, color="#762a83", alpha = 0.5)+
  scale_y_continuous(labels = scales::percent)+
  facet_geo(~sigla_uf.x, grid = "br_states_grid1")+
  scale_x_continuous(breaks = seq(2008, 2020, 4)) +
  labs(
    title = "Percentual de\nvereadoras(es) do gênero\nfeminino eleitas(os),\n2008-2020:",
    caption = "Fonte: @basedosdados · Elaboração: Arthur Gusmão\nObs: Não há eleições municipais no Distrito Federal"
  ) +
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    legend.pos = c(0.875, 0.975),
    legend.direction = "horizontal",
    legend.box = "vertical",
    legend.title = element_blank(),
    plot.background = element_rect(fill = "#F5F4EF", color = NA),
    plot.margin = margin(40, 60, 40, 60),
    plot.title = element_text(
      margin = margin(0, 0, 0, 0), 
      size = 20,
      family = "Georgia",
      face = "bold",
      vjust = 0, 
      color = "grey25"
    ),
    plot.caption = element_text(size = 11, family = "Georgia", color = "grey25"),
    axis.title = element_blank(),
    axis.text.x = element_text(color = "grey40", size = 8),
    axis.text.y = element_text(color = "grey40", size = 6),
    strip.text = element_text(face = "bold", color = "grey20")
    
  )

Alt text

Segunda visualização:

## Pegando as UF's que tiveram resultado positivo na comparação 2008-2020
a %>%
  filter(genero == "feminino", ano == 2008 | ano ==2020) %>%
  mutate(sigla_uf.x = factor(sigla_uf.x, levels = sigla_uf.x))%>%
  group_by(sigla_uf.x)%>%
  mutate(pct_change = (proporcao/lag(proporcao) - 1))%>% 
  mutate(pct_change = coalesce(pct_change,0))%>%
  mutate(id = case_when(pct_change > 0  ~ "positivo",
                        TRUE ~"negativo"))%>%
  filter(id == "positivo")%>%
  pull(sigla_uf.x) -> positivos


## Base com os resultados positivos, irá ficar mais ressaltada no grafico:
### Dica do https://uc-r.github.io/cleveland-dot-plots
highlight <- a %>%
  filter(genero == "feminino", ano == 2008 | ano ==2020) %>%
  group_by(ano)%>%
  arrange(proporcao)%>%
  mutate(sigla_uf.x = factor(sigla_uf.x, levels = sigla_uf.x))%>%
  filter(sigla_uf.x %in% positivos)


## Criando as bases com os labels
label_esq <- a %>%
  filter(genero == "feminino", ano == 2008) %>%
  group_by(ano)%>%
  arrange(proporcao)%>%
  mutate(sigla_uf.x = factor(sigla_uf.x, levels = sigla_uf.x))%>%
  filter(sigla_uf.x %in% positivos)

label_dir <- a %>%
  filter(genero == "feminino",ano ==2020) %>%
  group_by(ano)%>%
  arrange(proporcao)%>%
  mutate(sigla_uf.x = factor(sigla_uf.x, levels = sigla_uf.x))%>%
  filter(sigla_uf.x %in% positivos)

## O gráfico:
plot3 <- a %>%
  filter(genero == "feminino", ano == 2008 | ano ==2020) %>%
  group_by(ano)%>%
  arrange(ano)%>%
  mutate(sigla_uf.x = factor(sigla_uf.x, levels = sigla_uf.x))%>%
  ggplot(aes(proporcao,sigla_uf.x))+
  geom_line(aes(group = sigla_uf.x), alpha = 0.4)+
  geom_line(data= highlight, aes(group = sigla_uf.x), size = 0.6)+
  geom_point(aes(color = as.factor(ano)), alpha = 0.4, size= 1.5)+
  geom_point(data = highlight, aes(color = as.factor(ano)), size = 3)+
  geom_text(data = label_dir, aes(label= scales::percent(proporcao,accuracy = 0.1)), size = 2.5, hjust = -0.5)+
  geom_text(data = label_esq, aes(label=  scales::percent(proporcao, accuracy = 0.1)), size = 2.5, hjust = 1.5)+
  scale_x_continuous(labels = scales::percent)


##  Ajustes finais:
plot3 +
  scale_color_manual(values=c("#009688", "#762a83"))+
  scale_y_discrete(expand = c(.02, 0)) +
        labs(title = "Percentual de vereadoras(es) do \ngênero feminino eleitos(as), 2008-2020:",
             subtitle = "Das 26 Unidades Federativas Brasileiras, 13 apresentaram crescimento da proporção de eleitos(as)\ndo gênero feminino no período 2008-2020.\nEssas 13 Unidades Federativas estão ressaltadas no gráfico.",
             caption = "Fonte: @basedosdados · Elaboração: Arthur Gusmão") +
        theme_minimal() +
        theme(axis.title = element_blank(),
              plot.background = element_rect(fill = "#F5F4EF", color = NA),
              panel.grid.major.x = element_blank(),
              panel.grid.minor = element_blank(),
              legend.title = element_blank(),
              plot.margin = margin(10, 10, 10, 10),
              legend.justification = c(0, 1), 
              legend.position = c(.1, 1.075),
              legend.background = element_blank(),
              legend.direction="horizontal",
              text = element_text(family = "Georgia"),
              plot.title = element_text(size = 20, margin = margin(b = 10), color = "grey25", face = "bold"),
              plot.subtitle = element_text(size = 10, color = "grey20", margin = margin(b = 25)),
              plot.caption = element_text(size = 8, margin = margin(t = 10), color = "grey25", hjust = 0))

Alt text

É isso, espero que gostem :)

bd_case's People

Contributors

arthurfg avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.