vignettes/purrr-e-rcongresso.Rmd
purrr-e-rcongresso.Rmd
library(rcongresso)
library(dplyr)
library(tidyr)
library(purrr)
library(ggplot2)
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
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ã...
Quantos votos foram a favor e contra (e abstenções e obstruções) para cada proposição?
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()
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...