library(rcongresso)
library(dplyr)
library(tidyr)
library(purrr)
library(ggplot2)

Recuperando dados de várias proposições

A partir dos dados da proposição (ex: PEC 171 de 1993), são necessários dois passos: descobrir o id da proposição na API e recuperar os dados da proposição como dataframe.

proposicoes = frame_data(
  ~tipo, ~numero, ~ano,
  "PEC", 171,     1993,
  "PL",  1057,    2007
) %>%
  pmap(fetch_id_proposicao) %>%
  map_df(fetch_proposicao)

glimpse(proposicoes)
## Observations: 2
## Variables: 34
## $ ano                                  <dbl> 1993, 2007
## $ dataApresentacao                     <chr> "1993-08-19T00:00", "2007...
## $ descricaoTipo                        <chr> "Proposta de Emenda à Con...
## $ ementa                               <chr> "Altera a redação do art....
## $ ementaDetalhada                      <chr> NA, NA
## $ id                                   <int> 14493, 351362
## $ idTipo                               <int> 136, 139
## $ idTipoAutor                          <dbl> NA, NA
## $ justificativa                        <chr> NA, NA
## $ keywords                             <chr> "Redução, limite de idade...
## $ numero                               <dbl> 171, 1057
## $ siglaTipo                            <chr> "PEC", "PL"
## $ statusProposicao.dataHora            <chr> "2015-08-27T00:00", "2015...
## $ statusProposicao.descricaoSituacao   <chr> "Aguardando Apreciação pe...
## $ statusProposicao.descricaoTramitacao <chr> "Apresentação de Recurso"...
## $ statusProposicao.despacho            <chr> "Apresentação do Recurso ...
## $ statusProposicao.idSituacao          <int> 926, 926
## $ statusProposicao.idTipoTramitacao    <int> 192, 128
## $ statusProposicao.regime              <chr> "Especial (Art. 202 c/c 1...
## $ statusProposicao.sequencia           <dbl> 529, 143
## $ statusProposicao.siglaOrgao          <chr> "PLEN", "MESA"
## $ statusProposicao.uriOrgao            <chr> "https://dadosabertos.cam...
## $ statusProposicao.url                 <chr> "http://www.camara.gov.br...
## $ texto                                <chr> NA, NA
## $ tipoAutor                            <chr> NA, NA
## $ uri                                  <chr> "https://dadosabertos.cam...
## $ uriAutores                           <chr> "https://dadosabertos.cam...
## $ uriOrgaoNumerador                    <chr> NA, NA
## $ uriPropAnterior                      <chr> NA, NA
## $ uriPropPosterior                     <chr> NA, "http://legis.senado....
## $ uriPropPrincipal                     <chr> NA, NA
## $ uriUltimoRelator                     <chr> NA, NA
## $ urlInteiroTeor                       <chr> "http://www.camara.gov.br...
## $ urnFinal                             <chr> NA, NA

Votações e votos da proposição

Uma proposição pode ter várias votações no plenário da câmara. Aqui vamos olhar apenas a última votação, em geral tida como a aprovação ou não da questão. Vamos usar uma função para deixar mais legível o processo de escolher e baixar dados a última votação de uma proposição:

fetch_id_ultima_votacao = function(id_proposicao){
  fetch_votacoes(id_proposicao) %>%
    ultima_votacao() %>%
    pull(id)
}

Para cada id das proposições que temos, vamos recuperar o id da última votação realizada e então recuperar os votos de todos os deputados para essa votação:

votos = proposicoes %>%
  mutate(id_votacao = map_int(id, fetch_id_ultima_votacao)) %>%
  mutate(votos = map(id_votacao, fetch_votos)) %>%
  unnest(votos)

glimpse(votos)
## Observations: 1,000
## Variables: 45
## $ ano                                  <dbl> 1993, 1993, 1993, 1993, 1...
## $ dataApresentacao                     <chr> "1993-08-19T00:00", "1993...
## $ descricaoTipo                        <chr> "Proposta de Emenda à Con...
## $ ementa                               <chr> "Altera a redação do art....
## $ ementaDetalhada                      <chr> NA, NA, NA, NA, NA, NA, N...
## $ id                                   <int> 14493, 14493, 14493, 1449...
## $ idTipo                               <int> 136, 136, 136, 136, 136, ...
## $ idTipoAutor                          <dbl> NA, NA, NA, NA, NA, NA, N...
## $ justificativa                        <chr> NA, NA, NA, NA, NA, NA, N...
## $ keywords                             <chr> "Redução, limite de idade...
## $ numero                               <dbl> 171, 171, 171, 171, 171, ...
## $ siglaTipo                            <chr> "PEC", "PEC", "PEC", "PEC...
## $ statusProposicao.dataHora            <chr> "2015-08-27T00:00", "2015...
## $ statusProposicao.descricaoSituacao   <chr> "Aguardando Apreciação pe...
## $ statusProposicao.descricaoTramitacao <chr> "Apresentação de Recurso"...
## $ statusProposicao.despacho            <chr> "Apresentação do Recurso ...
## $ statusProposicao.idSituacao          <int> 926, 926, 926, 926, 926, ...
## $ statusProposicao.idTipoTramitacao    <int> 192, 192, 192, 192, 192, ...
## $ statusProposicao.regime              <chr> "Especial (Art. 202 c/c 1...
## $ statusProposicao.sequencia           <dbl> 529, 529, 529, 529, 529, ...
## $ statusProposicao.siglaOrgao          <chr> "PLEN", "PLEN", "PLEN", "...
## $ statusProposicao.uriOrgao            <chr> "https://dadosabertos.cam...
## $ statusProposicao.url                 <chr> "http://www.camara.gov.br...
## $ texto                                <chr> NA, NA, NA, NA, NA, NA, N...
## $ tipoAutor                            <chr> NA, NA, NA, NA, NA, NA, N...
## $ uri                                  <chr> "https://dadosabertos.cam...
## $ uriAutores                           <chr> "https://dadosabertos.cam...
## $ uriOrgaoNumerador                    <chr> NA, NA, NA, NA, NA, NA, N...
## $ uriPropAnterior                      <chr> NA, NA, NA, NA, NA, NA, N...
## $ uriPropPosterior                     <chr> NA, NA, NA, NA, NA, NA, N...
## $ uriPropPrincipal                     <chr> NA, NA, NA, NA, NA, NA, N...
## $ uriUltimoRelator                     <chr> NA, NA, NA, NA, NA, NA, N...
## $ urlInteiroTeor                       <chr> "http://www.camara.gov.br...
## $ urnFinal                             <chr> NA, NA, NA, NA, NA, NA, N...
## $ id_votacao                           <int> 6517, 6517, 6517, 6517, 6...
## $ id_votacao1                          <int> 6517, 6517, 6517, 6517, 6...
## $ parlamentar.id                       <int> 178957, 178864, 178914, 1...
## $ parlamentar.idLegislatura            <int> 55, 55, 55, 55, 55, 55, 5...
## $ parlamentar.nome                     <chr> "ABEL MESQUITA JR.", "ADA...
## $ parlamentar.siglaPartido             <chr> "PDT", "PHS", "PTB", "PT"...
## $ parlamentar.siglaUf                  <chr> "RR", "CE", "PE", "MG", "...
## $ parlamentar.uri                      <chr> "https://dadosabertos.cam...
## $ parlamentar.uriPartido               <chr> "https://dadosabertos.cam...
## $ parlamentar.urlFoto                  <chr> "http://www.camara.leg.br...
## $ voto                                 <chr> "null", "Sim", "Sim", "Nã...

Vendo os votos

Quantos votos foram a favor e contra (e abstenções e obstruções) para cada proposição?

votos %>%
  group_by(siglaTipo, numero, ano, voto) %>%
  count() %>%
  ggplot(aes(x = paste(siglaTipo, numero, ano), y = n, fill = voto)) +
  geom_col() + 
  coord_flip()

Cruzando votos e dados dos deputados

Homens e mulheres votaram diferente? Para responder, recuperamos primeiro os dados dos deputados mencionados no dataframe de votos:

Devido à instabilidades da API é sempre bom utilizar programação defensiva para nos protegermos de possíveis erros 404. Dessa forma, vamos encapsular a função fetch_deputado em um safely da biblioteca purrr.

safely_fetch_deputado <- possibly(fetch_deputado, otherwise = NA)
deputados = tibble(parlamentar.id = unique(votos$parlamentar.id)) %>% 
  mutate(dados_parlamentar = map(parlamentar.id, safely_fetch_deputado)) %>% 
  filter(!is.na(dados_parlamentar)) %>%
  unnest(dados_parlamentar)

glimpse(deputados)
## Observations: 500
## Variables: 32
## $ parlamentar.id                 <int> 178957, 178864, 178914, 178890,...
## $ cpf                            <chr> "", "", "", "", "", "", "", "",...
## $ dataFalecimento                <chr> NA, NA, NA, NA, NA, NA, NA, NA,...
## $ dataNascimento                 <chr> "1962-03-29", "1963-07-11", "19...
## $ escolaridade                   <chr> "Superior Incompleto", "Ensino ...
## $ id                             <int> 178957, 178864, 178914, 178890,...
## $ municipioNascimento            <chr> "Boa Vista", "Solonópole", "Jua...
## $ nomeCivil                      <chr> "ABEL SALVADOR MESQUITA JUNIOR"...
## $ sexo                           <chr> "M", "M", "M", "M", "M", "M", "...
## $ ufNascimento                   <chr> "RR", "CE", "BA", "MG", "SE", "...
## $ ultimoStatus.condicaoEleitoral <chr> "Titular", "Titular", "Titular"...
## $ ultimoStatus.data              <chr> "2015-02-01", "2016-04-15", "20...
## $ ultimoStatus.descricaoStatus   <chr> NA, NA, NA, "Revogação da limin...
## $ ultimoStatus.gabinete.andar    <dbl> 2, 3, 4, 6, 9, NA, NA, 2, 3, 6,...
## $ ultimoStatus.gabinete.email    <chr> "dep.ABELMESQUITAJR.@camara.leg...
## $ ultimoStatus.gabinete.nome     <dbl> 248, 335, 402, 627, 937, NA, 37...
## $ ultimoStatus.gabinete.predio   <chr> "4", "4", "4", "4", "4", NA, "3...
## $ ultimoStatus.gabinete.sala     <dbl> 248, 335, 402, 627, 937, NA, 37...
## $ ultimoStatus.gabinete.telefone <chr> "3215-5248", "3215-5335", "3215...
## $ ultimoStatus.id                <int> 178957, 178864, 178914, 178890,...
## $ ultimoStatus.idLegislatura     <int> 55, 55, 55, 55, 55, 55, 55, 55,...
## $ ultimoStatus.nome              <chr> "ABEL MESQUITA JR.", "ADAIL CAR...
## $ ultimoStatus.nomeEleitoral     <chr> "ABEL MESQUITA JR.", "ADAIL CAR...
## $ ultimoStatus.siglaPartido      <chr> "DEM", "PODE", "AVANTE", "PT", ...
## $ ultimoStatus.siglaUf           <chr> "RR", "CE", "PE", "MG", "SE", "...
## $ ultimoStatus.situacao          <dbl> NA, NA, NA, NA, NA, NA, NA, NA,...
## $ ultimoStatus.uri               <chr> "https://dadosabertos.camara.le...
## $ ultimoStatus.uriPartido        <chr> "https://dadosabertos.camara.le...
## $ ultimoStatus.urlFoto           <chr> "http://www.camara.leg.br/inter...
## $ uri                            <chr> "https://dadosabertos.camara.le...
## $ urlWebsite                     <chr> NA, NA, NA, NA, NA, "www.ademir...
## $ redeSocial                     <list> [NA, NA, NA, NA, NA, NA, NA, N...
votos %>% 
  left_join(deputados, by = "parlamentar.id") %>% 
  group_by(siglaTipo, numero, ano, voto, sexo) %>%
  count() %>%
  ggplot(aes(x = paste(siglaTipo, numero, ano), y = n, fill = voto)) +
  geom_col(position = "dodge") + 
  facet_wrap(~ sexo) + 
  coord_flip()

Quais foram as orientações das bancadas nessas votações?

orientacoes = proposicoes %>%
  mutate(id_votacao = map_int(id, fetch_id_ultima_votacao)) %>%
  mutate(o = map(id_votacao, fetch_orientacoes)) %>%
  unnest(o)

glimpse(orientacoes)
## Observations: 34
## Variables: 39
## $ ano                                  <dbl> 1993, 1993, 1993, 1993, 1...
## $ dataApresentacao                     <chr> "1993-08-19T00:00", "1993...
## $ descricaoTipo                        <chr> "Proposta de Emenda à Con...
## $ ementa                               <chr> "Altera a redação do art....
## $ ementaDetalhada                      <chr> NA, NA, NA, NA, NA, NA, N...
## $ id                                   <int> 14493, 14493, 14493, 1449...
## $ idTipo                               <int> 136, 136, 136, 136, 136, ...
## $ idTipoAutor                          <dbl> NA, NA, NA, NA, NA, NA, N...
## $ justificativa                        <chr> NA, NA, NA, NA, NA, NA, N...
## $ keywords                             <chr> "Redução, limite de idade...
## $ numero                               <dbl> 171, 171, 171, 171, 171, ...
## $ siglaTipo                            <chr> "PEC", "PEC", "PEC", "PEC...
## $ statusProposicao.dataHora            <chr> "2015-08-27T00:00", "2015...
## $ statusProposicao.descricaoSituacao   <chr> "Aguardando Apreciação pe...
## $ statusProposicao.descricaoTramitacao <chr> "Apresentação de Recurso"...
## $ statusProposicao.despacho            <chr> "Apresentação do Recurso ...
## $ statusProposicao.idSituacao          <int> 926, 926, 926, 926, 926, ...
## $ statusProposicao.idTipoTramitacao    <int> 192, 192, 192, 192, 192, ...
## $ statusProposicao.regime              <chr> "Especial (Art. 202 c/c 1...
## $ statusProposicao.sequencia           <dbl> 529, 529, 529, 529, 529, ...
## $ statusProposicao.siglaOrgao          <chr> "PLEN", "PLEN", "PLEN", "...
## $ statusProposicao.uriOrgao            <chr> "https://dadosabertos.cam...
## $ statusProposicao.url                 <chr> "http://www.camara.gov.br...
## $ texto                                <chr> NA, NA, NA, NA, NA, NA, N...
## $ tipoAutor                            <chr> NA, NA, NA, NA, NA, NA, N...
## $ uri                                  <chr> "https://dadosabertos.cam...
## $ uriAutores                           <chr> "https://dadosabertos.cam...
## $ uriOrgaoNumerador                    <chr> NA, NA, NA, NA, NA, NA, N...
## $ uriPropAnterior                      <chr> NA, NA, NA, NA, NA, NA, N...
## $ uriPropPosterior                     <chr> NA, NA, NA, NA, NA, NA, N...
## $ uriPropPrincipal                     <chr> NA, NA, NA, NA, NA, NA, N...
## $ uriUltimoRelator                     <chr> NA, NA, NA, NA, NA, NA, N...
## $ urlInteiroTeor                       <chr> "http://www.camara.gov.br...
## $ urnFinal                             <chr> NA, NA, NA, NA, NA, NA, N...
## $ id_votacao                           <int> 6517, 6517, 6517, 6517, 6...
## $ id_votacao1                          <int> 6517, 6517, 6517, 6517, 6...
## $ nomeBancada                          <chr> "PmdbPpPtbPscPhsPen", "PT...
## $ uriBancada                           <chr> "https://dadosabertos.cam...
## $ voto                                 <chr> "Sim", "Não", "Sim", "Sim...