Levando a cota parlamentar ao R

"Primeiro eu queria cumprimentar os internautas: oi internautas!"
- Roussef, DILMA. 2010
Tudo bem, seres humanos? Este é meu primeiro post aqui no blog e, comovido pelos protestos que tomaram as ruas do país e pelo recente afastamento-e-retorno do presidente do Senado, escolhi falar sobre o seguinte tema: cota parlamentar.
Antes de analisar qualquer coisa, é bom entender um pouco sobre o tema, não é mesmo?

No site da Câmara dos Deputados[1] lemos o seguinte:
"O Ato da Mesa nº 43 de 2009, que detalha as regras para o uso da CEAP, determina que só podem ser indenizadas despesas com passagens aéreas; telefonia; serviços postais; manutenção de escritórios de apoio à atividade parlamentar; assinatura de publicações; fornecimento de alimentação ao parlamentar; hospedagem; outras despesas com locomoção, contemplando locação ou fretamento de aeronaves, veículos automotores e embarcações, serviços de táxi, pedágio e estacionamento e passagens terrestres, marítimas ou fluviais; combustíveis e lubrificantes; serviços de segurança; contratação de consultorias e trabalhos técnicos; divulgação da atividade parlamentar, exceto nos 120 dias anteriores às eleições; participação do parlamentar em cursos, palestras, seminários, simpósios, congressos ou eventos congêneres; e a complementação do auxílio-moradia."

Ok, digamos que você queira conferir se seu deputado só utilizou sua cota nestas categorias, ou que você queira fazer alguma análise mais geral. Como fazer isso com R?
Felizmente 80% do trabalho já está feito, devido ao genial @dfalbel. Neste repositório no GitHub[2] já existe código R para transformar o XML "feio" do site da Câmara em arquivos CSV. Aliás, no repositório encontramos 3 coisas importantíssimas:
1. Descrição dos dados
2. Exemplo (dados 2016)
3. Código para reproduzir os resultados

Com o código encontrado no repositório, criei dois dataframes - dados_2015 e dados_2016. Os seus CSVs respectivos estão aqui[3]. Vamos olhar?

library(tidyverse)
library(lubridate)

options(scipen=999) ## Nada de notação científica

dados_2015 <- read_rds("data/processed/cota-parlamentar-2015.rds")
dados_2016 <- read_rds("data/processed/cota-parlamentar-2016.rds")

## Juntando e selecionando apenas as colunas mais importantes
dados <- rbind(
        dados_2015 %>%
                select(
                        datEmissao,
                        nuCarteiraParlamentar,
                        nuDeputadoId,
                        sgPartido,
                        sgUF,
                        txtCNPJCPF,
                        txtDescricao,
                        txtFornecedor,
                        txNomeParlamentar,
                        vlrLiquido
                ),
        dados_2016 %>%
                select(
                        datEmissao,
                        nuCarteiraParlamentar,
                        nuDeputadoId,
                        sgPartido,
                        sgUF,
                        txtCNPJCPF,
                        txtDescricao,
                        txtFornecedor,
                        txNomeParlamentar,
                        vlrLiquido
                )
)


## Ajustando tipos das colunas

dados <- dados %>%
        mutate(
                vlrLiquido = as.numeric(vlrLiquido),
                datEmissao = as_date(datEmissao)
        )

head(dados) # Vamos ver!
# 
# datEmissao nuCarteiraParlamentar nuDeputadoId sgPartido sgUF     txtCNPJCPF
# 1 2015-11-14                     1         3074       DEM   RR 05939467000115
# 2 2015-12-10                     1         3074       DEM   RR 05939467000115
# txtDescricao
# 1 MANUTENÇÃO DE ESCRITÓRIO DE APOIO À ATIVIDADE PARLAMENTAR
# 2 MANUTENÇÃO DE ESCRITÓRIO DE APOIO À ATIVIDADE PARLAMENTAR
# txtFornecedor txNomeParlamentar vlrLiquido
# 1 COMPANHIA DE AGUAS E ESGOTOS DE RORAIMA ABEL MESQUITA JR.     165.65
# 2 COMPANHIA DE AGUAS E ESGOTOS DE RORAIMA ABEL MESQUITA JR.      59.48

Bacana! Agora vamos desenhar os top 10 fornecedores:

## Top Fornecedores

top_fornecedores <- dados %>%
        group_by(txtCNPJCPF, txtFornecedor) %>% 
        summarise(
                totalRecebido = sum(vlrLiquido)
        ) %>%
        ungroup() %>%
        arrange(desc(totalRecebido)) %>%
        filter(!(
                stringr::str_detect(txtFornecedor, "Cia Aérea"))) %>%
        head(10) %>%
        mutate(order = as.factor(row_number()))

top_fornecedores.plot <-
        ggplot(top_fornecedores) +
        aes(x = order, 
            y = totalRecebido/1000000) +
        geom_bar(stat = "identity") +
        scale_x_discrete(labels = top_fornecedores$txtFornecedor, breaks = order) +
        labs(title = "Top Fornecedores 2015/16",
             x = "Fornecedor",
             y= "Valor recebido (R$1m)")+
        theme(
                axis.text.x=element_text(size = 8)
        ) +
        coord_flip()

O código acima gerou o seguinte gráfico:
top_fornecedores-plot

Repare no uso da função filter: tiramos os gastos com cias aéreas. Você consegue explicar o motivo?

Podemos alterar só um pouco o código e fazer o mesmo para ter o top 10 parlamentares e as top 10 atividades:

## Top 10 parlamentares

top_parlamentares <- dados %>%
        group_by(nuDeputadoId, txNomeParlamentar, nuCarteiraParlamentar, sgPartido) %>% 
        summarise(
                totalUtilizado = sum(vlrLiquido)
        ) %>%
        ungroup() %>%
        arrange(desc(totalUtilizado)) %>%
        head(10) %>%
        mutate(order = as.factor(row_number()))

top_parlamentares.plot <-
        ggplot(top_parlamentares) +
        aes(x = order, 
            y = totalUtilizado/(10^5), 
            fill = sgPartido) +
        geom_bar(stat = "identity") +
        scale_x_discrete(labels = top_parlamentares$txNomeParlamentar, breaks = order) +
        labs(title = "Top Parlamentares 2015-16",
             x = "Parlamentar",
             y= "Valor utilizado (R$100k)") +
        guides(fill = guide_legend(title = "Partido"))+
        theme(
                axis.text.x=element_text(size = 6)
        ) +
        coord_flip()

## Top Atividades

top_atividades <- dados %>%
        group_by(txtDescricao) %>% 
        summarise(
                totalUtilizado = sum(vlrLiquido)
        ) %>%
        ungroup() %>%
        arrange(desc(totalUtilizado)) %>%
        head(10) %>%
        mutate(order = as.factor(row_number()))

top_atividades.plot <-
        ggplot(top_atividades) +
        aes(x = order, 
            y = totalUtilizado/1000000) +
        geom_bar(stat = "identity") +
        scale_x_discrete(labels = top_atividades$txtDescricao, breaks = order) +
        labs(title = "Top Atividades 2015/16",
             x = "Atividade",
             y= "Valor utilizado (R$1m)") +
        theme(
                axis.text.y=element_text(size = 6)
        ) +
        coord_flip()

Com isso, temos:
top_parlamentares-plot

top_atividades-plot

Que acha de desenharmos a série? Também é fácil:

## Gastos ao longo do tempo

serie_gastos <- dados %>%
        filter(
                !is.na(datEmissao)
        ) %>%
        mutate(
                Ano = year(datEmissao),
                Mes = month(datEmissao),
                Data = as_date(paste(Ano,Mes,"01",sep = "-"))
        ) %>%
        group_by(Data) %>%
        summarise(
                totalMensal = sum(vlrLiquido)
        ) %>%
        mutate(
                totalAcumulado = cumsum(totalMensal)
        )

serie_gastos.plot <- 
        ggplot(serie_gastos) +
        aes(x = Data,
            y = totalMensal/1000000) +
        geom_jitter() +
        geom_smooth(span = 0.3, method = "loess") +
        labs(title = "Utilização mensal - Cota Parlamentar",
             x = "Ano-Mês",
             y= "Valor utilizado (R$1m)")

Essa série eu deixo pro mestre Wilher interpretar! 🙂
serie_gastos-plot

Na série, não vimos todos os valores porque muitos não tem data (NA no nosso dataset) e filtramos eles logo no início. Vamos entender quanto ficou de fora, e qual a descrição desses gastos?

## Entendendo o valor que ficou fora da análise
datas_na <- dados %>%
        filter(
                is.na(datEmissao)
        ) %>%
        group_by(txDescricao) %>%
        summarise(
                total = sum(vlrLiquido)
        )

head(datas_na)
# 
# # A tibble: 1 x 2
# txtDescricao   total
# <chr>   <dbl>
#         1    TELEFONIA 3923815
# 3m de gastos com telefonia sem data! Pode isso, Arnaldo?

Resumindo
Vimos como analisar rapidamente alguns dados públicos em R.

E agora é com vocês: que acharam? Devo aprofundar a análise destes dados públicos?

Até a próxima!

Referências:
[1] http://www2.camara.leg.br/participe/fale-conosco/perguntas-frequentes/cota-para-o-exercicio-da-atividade-parlamentar
[2] https://github.com/dfalbel/cota-parlamentar
[3] Download dos dados

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Análise regional do mercado de trabalho com dados do CAGED usando Python

Os microdados dos CAGED fornecem informações detalhadas a nível de cidade, sexo, raça, nível de instrução, idade, salário e outras sobre os trabalhadores formais do Brasil, possibilitando ricas análises regionais de dados. Neste artigo mostramos como acessar, processar e analisar estes dados utilizando o Python.

Transfer Learning: mostrando porque o Python está na ponta do desenvolvimento

A aprendizagem por transferência (transfer learning) é o reuso de um modelo pré-treinado em um novo problema. Portanto, sua utilização torna-se um avanço enorme para a previsão de diferentes tipos de variáveis, principalmente para aquelas ordenadas no tempo. Mostramos nesta postagem o uso do Transfer Learning com o Python para o caso de Séries Temporais.

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.