Web Scraping, visualização de dados com R e os decretos do Bolsonaro

Reading Time: 13 minutes

Como o atual presidente do Brasil se compara em termos de número de decretos com seus predecessores?

Estaria o presidente “governando por decreto”?

O que são os decretos?

De acordo com a Presidência da República, [decretos são] Editados pelo Presidente da República, regulamentam as leis e dispõem sobre a organização da administração pública. A Wikipedia complementa dizendo:

No sistema jurídico brasileiro, os decretos são atos administrativos da competência dos chefes dos poderes executivos (presidente, governadores e prefeitos).

Um decreto é usualmente utilizado pelo chefe do poder executivo para fazer nomeações e regulamentações de leis (como para lhes dar cumprimento efetivo, por exemplo), entre outras coisas. Decreto é a forma de que se revestem dos atos individuais ou gerais, emanados dos chefes do Poder Executivo (Presidente da República, Governador e Prefeito). Pode subdividir-se em decreto geral e decreto individual – este a pessoa ou grupo e aquele a pessoas que se encontram em mesma situação.

O decreto tem efeitos regulamentar ou de execução, expedido com base no artigo 84, IV da CF, para fiel execução da lei, ou seja, o decreto detalha a lei. Não podendo ir contra a lei ou além dela.

Wikipedia Lusófona.

Diferente do decreto, mas também de iniciativa do líder do poder executivo, existe a Medida Provisória (MP).

No âmbito do direito constitucional brasileiro, Medida Provisória (MP) é um ato unipessoal do presidente da República, com força imediata de lei, sem a participação do Poder Legislativo, que somente será chamado a discuti-la e aprová-la em momento posterior. O pressuposto da MP, de acordo com o artigo 62 da Constituição Federal é urgência e relevância, cumulativamente. Nem sempre o Executivo respeita esse critério de relevância e urgência quando edita uma MP.

Wikipedia Lusófona.

Ao longo desse texto, eu irei disponibilizar os scripts que escrevi para fazer essa análise. Sinta-se bastante à vontade para adaptar meus scripts para suas análises (os scripts contidos nesse post estão licenciados pelos termos da GNU GPLv2+, ou seja, são software livre!). Está sem ideias? Que tal replicar o que eu fiz com Medidas Provisórias, em vez de decretos? 🙂

E o que é Web Scraping?

Web Scraping, em Português coleta de dados ou raspagem de dados, é uma forma de se extrair dados de uma página Web (seja ela uma página simples ou parte de um sistema Web). Em casos mais simples, você poderia escrever um programa de computador que buscasse quem são os atores mais comuns nos 100 filmes mais bem avaliados no IMDb, ou em casos mais complexos você poderia escrever um programa de computador que interagisse com um sistema Web que gera dados sob demanda, e a partir dessa interação extrair os dados (fiz algo nessa linha em 2014 para obter os gastos dos deputados da Assembleia Legislativa do Rio Grande do Norte). Existem páginas que são feitas propositalmente para dificultar o nosso trabalho, seja gerando documentos em formatos mais chatinhos de se extrair informação (como tabelas em PDF) ou exigindo muitas interações com o mouse para se gerar os dados. Na prática, funciona como uma cerca elétrica: Amadores podem até desistir, mas não impede um profissional de obter os dados (vide Selenium). Sobre os sites e sistemas do governo facilitarem ou dificultarem o Web Scraping.. Hm.. Vamos dizer que é uma relação de amor e ódio :-/.

Por que raspar o site do Planalto?

Eu tenho estado um pouco desconectado de várias coisas que tem acontecido no Brasil. Estar fora do Brasil não ajuda, e esses últimos meses tem sido bastante atarefados. Enquanto isso, quase que a totalidade dos dados que eu analiso no trabalho e durante o doutorado hoje em dia são de instituições estrangeiras, de outros países que não o Brasil ou de indivíduos não-Brasileiros. Tudo isso combinado acaba sendo uma pulga atrás da orelha me fazendo pular em cima de qualquer oportunidade de dar uma olhada em dados brasileiros. Infelizmente, muitas vezes o tempo aperta e acabo deixando de lado (como quando comecei a analisar as atas das sessões administrativas do STF que recentemente foram liberadas, através de requerimento de um amigo do Turicas, Álvaro Justen, grande defensor do movimento por dados abertos no Brasil). Quando não é falta de tempo, acabo topando com falta de dados (como quando fui analisar preços de transporte público em Natal mas não consegui encontrar todos os preços em um período relativamente pequeno de tempo), ou de dados confiáveis.

Entre uma conversa e outra, sempre no intuito de tentar me reconectar ao que tem ocorrido no Brasil, alguns colegas mencionaram as edições de decretos por parte do atual presidente (Bolsonaro). Buscando algumas fontes na internet sobre o assunto, vi menções a “governar por decreto”, dentre afirmações similares. Ao menos naquele instante, isso foi suficiente para despertar a centelha da curiosidade que me levou ao site do planalto onde podemos ver todos os decretos presidenciais. Enfim, dessa vez comecei e consegui chegar até um estágio aceitável, embora ainda inicial. Ao menos aceitável o suficiente para compartilhar aqui 😉

Vamos raspar!

Tecnologias

Eu irei utilizar a linguagem de programação R e a interface de desenvolvimento RStudio. No R, utilizarei os seguintes pacotes:

# Vamos carregar esses pacotes no R para começar a análise
library(selectr)
library(xml2)
library(rvest)
library(stringr)
library(tidyr)
library(dplyr)
library(tibble)
library(lubridate)
library(ggplot2)
library(directlabels)
library(gganimate)

Raspar o quê?

Não é só decreto que você vai encontrar no site do planalto. Existem decretos-leis, por exemplo, mas não irei considerá-los pois eles não são previstos na atual constituição de 1988, tendo suas edições interrompidas no ano de 1988. Também existem “Decretos não numerados”, mas não existem dados para 2019, que é quando começou o atual governo. Já os outros documentos, fogem do escopo dessa análise que se limita a analisar decretos. As eleições presidenciais no Brasil ocorreram ao final de 1989, 1994, 1998, 2002, 2006, 2010, 2014 e 2018. Como estamos no início do primeiro mandato do atual governo, e aqui busco fazer uma comparação, irei analisar o início do primeiro ano de mandato de todos os predecessores do atual presidente. Logo, analisaremos o início dos anos 90, 95, 99, 2003, 2007, 2011, 2015 e 2019.

Seletores

Os pacotes para Web Scraping costumam ser muito práticos, independente da linguagem de programação utilizada. Você informa o endereço Web (URL) do site e ele busca as informações lá para você. No entanto, existem alguns sites que geram os dados que você irá visualizar de modo a impedir que você possa fazer o scraping, e é o caso da página de decretos. Eu não quis perder muito tempo com isso então eu baixei manualmente (Ctrl+S, dependendo do seu navegador) essas páginas no meu computador e as carreguei localmente com o rvest (o pacote do R que mencionei acima, para fazer o web scraping).

Embora o objetivo aqui seja falar da forma mais esmiuçada possível, abordar DOM, dentre outros assuntos introdutórios mas necessários para Web Scraping, está fora do escopo desse texto. Para quem não entende de desenvolvimento Web, tenha em mente que as informações em páginas Web estão organizadas de modo a estarem próximas de algo que vou chamar aqui de “identificadores”. É através deles que você consegue chegar na informação desejada. Em páginas de um site que buscam mostrar a mesma coisa, como decretos, a única coisa que deveria mudar deveria ser as informações, mas infelizmente não é o caso aqui. Irei inspecionar três páginas de decretos (para três anos diferentes) para que você veja, e assim entenda, o que estou tentando explicar. Para inspecionar esses “identificadores” (elementos) em uma página Web, você pode usar o seu próprio navegador. Clique do botão direito em cima do que você está interessado e vá em “Inspecionar elemento”, conforme mostro na figura abaixo.

Inspecionando um elemento na página de decretos editados em 1990.

Nas próximas figuras, você me verá inspecionando decretos em anos diferentes.

A classe que está próxima da célula contendo quando o decreto foi publicado (ou a classe a qual esse elemento pertence) chama-se primeiraColuna para a página dos decretos editados em 1990. Está sublinhada em preto na imagem acima para facilitar sua visualização.
Opa! A classe mudou! Para a página dos decretos editados em 1999, a classe chama-se visaoQuadrosTd. Está sublinhada em preto na imagem acima.
Opa! A classe mudou novamente! Para a página de decretos editados em 2003, a classe voltou a ser primeiraColuna. Está sublinhada em preto na imagem acima.

Como você pode inferir, eu precisei abrir as páginas dos oito anos que estou interessado em analisar para verificar qual seletor devo utilizar. De posse das informações apresentadas até agora, podemos começar a escrever nosso código!

Tibbles

# Criei uma tabela com as informações básicas sobre as eleições
library(tibble)
nomepresidente <- c('Collor', 'FHC', 'FHC2', 'Lula', 'Lula2', 'Dilma', 'Dilma2', 'Bolsonaro')
mandato <- c(1, 1, 2, 1, 2, 1, 2, 1)
# Se você observar o formato das datas publicadas, irá observar que
# 1990 é escrito como 90 e 2019 como 2019. Por essa razão utilizei
# o formato abaixo
ano <- c(90, 95, 99, 2003, 2007, 2011, 2015, 2019)
presidentes <- as_tibble(cbind(nomepresidente, mandato, ano))
Conteúdo da variável presidentes.

Raspando

Vamos raspar os decretos editados em 1990:

url <- '/home/mribeirodantas/Área de Trabalho/decretos/90 - Decretos — Portal da Legislação.html'
webpage <- read_html(url)
decretos <- webpage %>%
    # Raspar todas as informações associadas com
    # esse seletor
    html_nodes('.primeiraColuna') %>%
    # Aqui eu utilizo expressões regulares para
    # capturar uma string no formato DD.MM.90
    # como 01.01.90 (Primeiro de Janeiro de 1990)
    str_extract('[0-9]{1,2}\.[0-9]{1,2}\.90') %>% 
    # Converta em tibble (estrutura de dados)
    as_tibble %>%
    # Remova NAs
    drop_na %>%
    # Parse para objeto de data do lubridate
    dmy(.$value) %>%
    # Remova os NAs
    na.omit %>%
    # Converta em tibble
    as_tibble
decretos
Saída do código acima.

Manipulando os dados

Mas se deixarmos apenas as datas, na hora de juntar com as datas dos outros anos iremos perder o controle de quem foi o responsável por esse decreto. Vamos criar uma estrutura organizada para armazenar esses dados:

decretos <- decretos %>%
    arrange(.$value) %>% 
    mutate('presidente' = 'Collor') %>%
    # Cada entrada é um decreto, podendo ter >1/dia 
    mutate('nDecreto' = seq(1:nrow(decretos))) %>%
    mutate('Dia' = day(.$value)) %>%
    mutate('Mes' = month(.$value)) %>%
    mutate('Ano' = year(.$value))
Em 1990, Collor editou 1143 decretos.

Eu repeti esse processo para os outros anos e no final uni os tibbles:

decretos_final <- full_join(decretos_collor, decretos_fhc) %>%
    full_join(decretos_fhc2) %>% 
    full_join(decretos_lula) %>%
    full_join(decretos_lula2) %>%
    full_join(decretos_dilma) %>%
    full_join(decretos_dilma2) %>%
    full_join(decretos_bolsonaro)
    colnames(decretos_final) <- c('Publicado', 'Presidente',
                                  'nDecretos', 'Dia', 'Mes',
                                  'Ano')

A ideia é analisar até os dados do dia de hoje (22/05/2019), que é o que temos do governo Bolsonaro e filtrar nossos dados para que também só analisemos os dados até o período equivalente no ano do mandato do predecessor.

decretos_plot <- decretos_final %>%
  filter(month(Publicado) <= month(today()))
# Removendo o período de 23 em diante do mês e Maio
decretos_plot <- decretos_plot %>%
  filter(!(month(Publicado) == 5 & day(Publicado) > 22))

Por que não comparo a data inteira e sim o mês no filtro? Porque qualquer data anterior a hoje (2019), será válida na expressão. Qualquer data em 2018 é inferior a uma data em 2019. Já se comparo o mês, Junho de 2018 é posterior a Maio de 2019.

Visualização

De posse de todos os decretos publicados até o 22 de Maio de todos os primeiros anos de mandato dos presidentes desde a redemocratização, podemos começar a visualizar esses dados. Primeiro irei sumarizar os dados por presidente e então plotar um gráfico de barras.

bar_plot <- decretos_plot %>%
   group_by(Presidente) %>%
   summarise(n())
colnames(bar_plot) <- c('Presidente', 'N')
# Essa linha é importante para que o gráfico
# de barras esteja com as barras ordenadas
bar_plot$Presidente <- factor(bar_plot$Presidente,
                       levels = bar_plot$Presidente[order(bar_plot$N)])

ggplot(bar_plot, aes(x=Presidente, y=N)) +
    geom_bar(stat="identity", fill='steelblue') +
    xlab('Mandato') + ylab('Número de decretos') +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    labs(title = 'Decretos de 1 de Janeiro a 22 de Maio do primeiro ano de mandato',
    caption= "Marcel Ribeiro Dantas (2019). http://mribeirodantas.me")
Gráfico 1 – Número de decretos editados pelos presidentes nos primeiros 144 dias de seus respectivos mandatos. Cada barra representa um mandato.

Após visualizar esse gráfico de barras, me ocorreu de comparar os números dos presidentes com alguma medida de centralidade. A média, no entanto, não é uma boa medida de centralidade quando temos outliers. Será que é o caso? Para checar, podemos plotar um boxplot (O que é Boxplot?) e pintar de vermelho os outliers.

ggplot(bar_plot, aes(y=N)) +
    geom_boxplot(fill="steelblue",
                 outlier.color = 'red') +
    ylab('Número de decretos')
Gráfico 2 – Boxplot do número de decretos editados por mandato durante os primeiros 144 dias do primeiro ano de governo. Em vermelho, temos um outlier que é o primeiro (e único) mandato de Fernando Collor.

Intuitivamente, já era esperado que o número de decretos de Collor fosse um outlier. Por causa disso, ele irá puxar a média para cima, gerando uma distorção. Nesse caso, o mais indicado é utilizar a mediana. Vamos plotar novamente o gráfico de barras mas com a mediana.

mediana <- decretos_plot %>%
    group_by(Presidente) %>%
    summarise(n()) %>%
    pull(`n()`) %>%
    median
ggplot(bar_plot, aes(x=Presidente,
                       y=N)) +
    geom_bar(stat="identity", fill='steelblue') +
    geom_hline(aes(yintercept=mediana), color="black") +
    xlab('Mandato') + ylab('Número de decretos') +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    labs(title = 'Decretos de 1 de Janeiro a 22 de Maio do primeiro ano de mandato',
    caption= "Marcel Ribeiro Dantas (2019). http://mribeirodantas.me")
Gráfico 3 – Número de decretos editados pelos presidentes nos primeiros 144 dias de seus respectivos mandatos. Cada barra representa um mandato. A linha horizontal preta é a mediana do número de decretos entre os presidentes para esse período.

Uma outra curiosidade que me veio em mente foi com relação a quando esses decretos eram publicados, se as edições seguiam alguma sazonalidade, se algum dos presidentes teve períodos de rajadas com vários decretos e outros períodos mais calmos, e se o comportamento entre eles era similar. O resultado está no GIF abaixo:

Gráfico 4 – Evolução do número de decretos editados pelos presidentes ao longo dos primeiros 144 dias de seus respectivos mandatos. Cada curva representa um mandato.

Vamos ao código 🙂

O gráfico acima mostra a evolução no número de decretos editados dia a dia durante o período analisado. Entretanto, se eu utilizasse a variável dia para plotar, teríamos ciclos de dias e isso complicaria a visualização. Por essa razão, eu criei a variável ID.

library(ggplot2)
library(directlabels)

decretos_plot <- decretos_plot %>% 
  mutate(ID = group_indices_(decretos_plot, .dots=c("Mes", "Dia")))

p <- ggplot(decretos_plot, aes(ID,
                               nDecretos,
                               group = Presidente,
                               color = Presidente)) +
     geom_line() +
     geom_hline(aes(yintercept=mediana), color="black") +
     labs(x = "De 1 de Janeiro a 22 de Maio do primeiro ano de mandato",
          y = "Número de decretos",
          caption = "Marcel Ribeiro Dantas (2019). http://mribeirodantas.me") +
     theme(legend.position = "top") +
     geom_dl(aes(label = decretos_plot$Presidente),
                 method = list(dl.combine("last.points"))
             )
library(gganimate)
 a <- p + transition_reveal(ID)
 anim <- animate(a, fps=8, renderer = gifski_renderer(loop = F))

E se observássemos o número de decretos por mês, por mandato de cada presidente?

ggplot(decretos_plot, aes(Mes)) +
    geom_bar(fill='steelblue') +
    facet_wrap(~Presidente) +
    xlab('Mês') +
    ylab('Número de decretos') +
    labs(caption = 'Marcel Ribeiro Dantas (2019). http://mribeirodantas.me')
Gráfico 5 – Número de decretos editados por mês. Cada grid representa um mandato.

Uma visualização similar é a de barras empilhadas (stacked).

decretos_plot %>%
    filter(Presidente != 'Collor') %>%
    group_by(Presidente,Mes) %>%
    count %>%
    ggplot() +
    geom_bar(aes(y=n,x=Mes,fill=Presidente), stat="identity") +
    labs(x = 'Mês', y = 'Número de decretos',
         caption = "Marcel Ribeiro Dantas (2019). http://mribeirodantas.me")
Gráfico 6 – Número de decretos editados nos primeiros 144 dias agrupados por mês, empilhados para cada mandato. O mandato do Collor foi removido, pois de outro modo “esmagaria” os outros mandatos e dificultaria a visualização.

Agora vejamos número de decretos por dia e por mandato de cada presidente.

ggplot(decretos_plot, aes(ID)) +
    geom_bar(fill='steelblue') +
    facet_wrap(~Presidente) +
    xlab('Dia') +
    ylab('Número de decretos') +
    labs(caption = 'Marcel Ribeiro Dantas (2019). http://mribeirodantas.me')
Gráfico 7 – Número de decretos editados nos primeiros 144 dias agrupados por dia. Cada grid representa um mandato.

E aí?

O que podemos ver através desses gráficos é que, em questão de números de decretos editados, o atual presidente não tem mostrado um comportamento muito diferente de seus predecessores, nem em questão de números de decretos nem na frequência de edição de decretos, inclusive estando atualmente abaixo da mediana do número de decretos editados pelos presidentes ao longo de seus mandatos nesse período inicial do primeiro ano de mandato.

O gráfico 5 nos mostra o comportamento de cada presidente em seus respectivos mandatos por mês, em termos de número de decretos editados. Podemos ver, por exemplo, que houve crescimento da proporção do número de decretos que FHC editou por mês em seu primeiro mandato, um aumento da proporção e posterior redução dessas proporções no primeiro mandato de Lula e um alto número de decretos no primeiro mês do mandato de Bolsonaro, além do comportamento completamente outlier dos decretos do Collor.

Quem são os campeões por mês?

decretos_plot %>%
    group_by(Mes) %>%
    filter(nDecretos == max(nDecretos)) %>% 
    select('Presidente', 'nDecretos')

Não deveríamos nos surpreender, né? :-). Vamos excluir o Collor (acho que você já está começando a tomar abuso de outliers haha).

decretos_plot %>%
    filter(Presidente != 'Collor') %>%
    group_by(Mes) %>%
    filter(nDecretos == max(nDecretos))

Existe alguma explicação para essa tendência?

Aqui fizeram uma análise dos primeiros 134 dias de governo e, até aquele período, apenas FHC (no segundo mandato) e Collor haviam editado mais decretos que Bolsonaro (com Lula na cola, com 2 decretos a menos que Bolsonaro). E a partir disso, o autor da reportagem tentou explicar que isso se devia a FHC (no segundo mandato), Collor e Bolsonaro estarem tentando governar sem o congresso (cada um com suas razões) e que os decretos acabam sendo utilizados como modo de governar. No entanto, Dilma em seu segundo mandato também estava sem apoio do congresso e ainda assim seus números foram muito parecidos com o de seu primeiro mandato, que são inferiores aos números dos demais presidentes, o que me parece que talvez seja uma questão mais de perfil de governo e de governante do que de qualquer outra coisa. Em relação a Collor, foi o primeiro governo posterior a constituição de 1988, e como vocês viram lá ao início desse texto, os decretos também servem para “regulamentações de leis (como para lhes dar cumprimento efetivo, por exemplo)“. Essa pode ser uma explicação para o alto número de decretos ao longo do governo Collor.

Alto lá!

Durante todo esse texto, conversamos quase que exclusivamente através de uma abordagem quantitativa. Se pegarmos aleatoriamente um punhado de decretos, nós iremos encontrar decretos com os mais diversos objetivos, e como com qualquer outro tipo de texto, com qualidade variada. Inclusive, em várias situações houveram acusações de que um determinado decreto tinha ido além do seu limite legal e que portanto deveria ser revogado pela justiça. Infelizmente, sem o conhecimento legal adequado, fico de mãos atadas para fazer essa avaliação. Ainda assim, deixo essa nota para que leitores desavisados não achem que um determinado presidente tenha sido melhor por ter editado mais decretos, pior por ter editado menos, ou seja o que for por um determinado padrão de edições. De modo a compreender mais sobre esses números é fundamental se debruçar sobre esses períodos. Se o objetivo fosse fazer um estudo sério (diferente do propósito desse texto que é ensinar Web Scraping e visualização de dados com R), seria fundamental a participação de economistas, historiadores, gestores públicos, cientistas de dados, e a lista segue.

Um ponto interessante da metodologia que eu utilizei aqui é que qualquer pessoa pode executar meus scripts em seu computador e obter os resultados atualizados do dia que a pessoa executou o script :-). Em breve eu vou organizar os códigos e colocar no GitHub, daí volto aqui e edito colocando o link do repositório 😉