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

Como automatizar tarefas repetitivas usando Python? Um exemplo para largar o Excel

Manter relatórios diários com dados e análises atualizados é um desafio, pois envolve várias etapas: coleta de dados, tratamento de informações, produção de análises e atualização de relatório. Para superar este desafio algumas ferramentas como Python + Quarto + GitHub podem ser usadas para automatizar tudo que for automatizável. Neste artigo mostramos um exemplo com dados do mercado financeiro.

Criando um Dashboard de análise de Ações no Python

Um Dashboard é um painel de controle que consolida uma variedade de informações sobre um determinado objeto de estudo em um ou mais painéis. Ele simplifica significativamente o processo de análise de dados, oferecendo uma visão global e fácil de entender. Uma maneira simples de construir um Dashboard para acompanhar uma ação específica é utilizando duas ferramentas: Quarto e Python. Neste post, mostramos o resultado da criação de um Dashboard de Ação.

Analisando séries temporais no Python e esquecendo de vez o Excel

Séries temporais representam uma disciplina extremamente importante em diversas áreas, principalmente na economia e na ciência de dados. Mas, afinal, como lidar com esses dados que se apresentam ao longo do tempo? Neste exercício, demonstraremos como compreender uma série temporal e como o Python se destaca como uma das melhores ferramentas para analisar esse tipo de dado.

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.