Introdução

Os dados podem conter informações úteis para a formulação de respostas a certas perguntas. Embora abundantes e onipresentes, nem sempre podem ser acessados facilmente. Tampouco publicidade implica em transparência.

O que não quer dizer que não possam ser escarafunchados.

Em alguns casos, os dados podem ser baixados de uma página ou servidor web, já estruturados, prontos para serem tratados de forma automatizada. Em outros, precisam ser pré-processados, remodelados, para serem analisados posteriormente.

No presente artigo, pretendemos demonstrar algumas ferramentas e bibliotecas da linguagem R, por meio do ambiente gráfico RStudio, utilizados para a tarefa de coleta e transformação de dados não-estruturados.

Lembramos, no entanto, que os limites da análise exploratória são impostos pela natureza dos dados.

Objetivo

Com base nos arquivos disponíveis no Portal da Transparência da Câmara Municipal de Juiz de Fora, que podem ser obtidos manualmente através do link, analisamos o consumo de combustível pela frota terceirizada. Os arquivos no formato pdf seguem um padrão comum, a partir de Julho de 2020, em que disponbilizam informações a respeito do modelo e ano do veículo, período, placa e valor gasto. Para nossos propósitos, vamos extrair apenas os dados referentes às três últimas variáveis.

Questionamentos

Esperamos responder às seguintes perguntas:

Q1: Qual o valor mensal, em reais, da despesa com combustíveis dos veículos oficiais da Câmara Municipal de Juiz de Fora?

Q2: Qual o valor semestral, em reais, da despesa com combustíveis dos veículos oficiais da Câmara Municipal de Juiz de Fora?

Q3: Qual o valor da despesa com combustíveis dos veículos oficiais da Câmara Municipal de Juiz de Fora, nos últimos 3 anos?

Q4: Quantos veículos diferentes foram alocados para a Câmara?

Q5: Houve algum veículo que apresentou algum consumo atípico durante o período avaliado?

Q6: Quais veículos estão acima do terceiro quartil, em relação ao gasto com combustíveis?

Bibliotecas

Carregamos as seguintes bibilotecas do R:

  • rvest - biblioteca para extração de dados web;
  • dplyr - pacote para manipulação de banco de dados;
  • stringr - ferramenta para manipulação de textos;
  • lubridate - biblioteca para manipular dados no formato data/hora;
  • ggplot2 - ferramenta para visualização de dados;
  • ggthemes - adiciona funcionalidades extras ao ggplot;
  • prettydoc - temas adicionais para documentos Rmarkdown;
  • reshape2 - ferramenta para transformação de dados;
  • scales - utilizada para personalizar legendas;
  • DT - para incluir tabelas em relatórios Rmarkdown;
  • gridExtra - facilita a disposição dos gráficos na página;
  • treemapify - para representação de dados usando retângulos aninhados.

Diretório de trabalho

Definimos o diretório de trabalho:

setwd("/home/gf/Scripts/cmjf")

Extração dos códigos dos relatórios

Importamos várias bibliotecas necessárias para a análise, como rvest, dplyr, stringr, dentre outras. Em seguida, definimos o diretório de trabalho e lemos o conteúdo do arquivo chamado “intervalo.txt”. Esse arquivo contém códigos e períodos relacionados aos relatórios de gastos com combustíveis.

Os códigos são extraídos usando expressões regulares (str_extract_all) para obter os valores numéricos entre as aspas, enquanto os períodos são extraídos entre as tags <option>.

Após a extração, os dados são combinados em um dataframe e são filtrados para incluir apenas os anos de 2020 a 2023. Os dados são então preparados para a próxima etapa.

  # Lemos o conteúdo do arquivo "intervalo.txt"
  conteudo_intervalo <- readLines("intervalo.txt", warn = FALSE)
  # Convertemos o conteúdo em uma única string
  texto_intervalo <- paste(conteudo_intervalo, collapse = " ")
  # Usamos str_extract_all para extrair os valores numéricos entre as aspas
  codigos <- str_extract_all(texto_intervalo, '"(\\d+)"')
  # Usamos str_extract_all para extrair os textos entre as tags <option>
  periodos <- str_extract_all(texto_intervalo, '<option value="\\d+">(.*?)</option>')
  
  # Combinamos os resultados em um data frame
  dados_intervalo <- data.frame(
    Código = unlist(codigos),
    Período = unlist(periodos)
  )
  
  # Removemos os caracteres HTML das datas
  dados_intervalo$Período <- str_replace_all(dados_intervalo$Período, "<.*?>", "")
  # Removemos as aspas duplas da coluna "Código"
  dados_intervalo$Código <- gsub("\"", "", dados_intervalo$Código)
  
  # Filtramos somente os códigos de 2020 a 2023
dados_intervalo <- dados_intervalo %>% filter(grepl("2020|2021|2022|2023", Período))

  # Resultado final
  datatable(dados_intervalo, list(iDisplayLength = 5))

Download dos relatórios mensais

Iiteramos sobre os códigos extraídos, construímos aas URLs dos relatórios e realizamos o download dos arquivos PDF correspondentes. Em seguida, utilizamos a biblioteca pdftools para extrair o texto desses PDFs e processá-los.

Os dados relevantes, como período, placa e valor gasto, são extraídos das páginas PDF. Um dataframe temporário é criado para armazenar esses dados, que são posteriormente combinados ao dataframe final.

  # Inicializamos um data frame vazio para armazenar os dados finais
  df_final <- data.frame()
  # Listamos os códigos obtidos no data frame "dados_intervalo"
  codigos <- dados_intervalo$Código
  periodos <- dados_intervalo$Período
  
  # Loop sobre os códigos para baixar e extrair os relatórios
  for (i in 1:length(codigos)) {
    # Criamos a URL para o relatório com base no código
    codigo <- codigos[i]
    periodo <- periodos[i]
    url <- paste("https://www.camarajf.mg.gov.br/relatorio.php?cod_relatorio=", codigo, sep = "")
    
    # Fazemos o download do arquivo pdf
    temp_pdf <- tempfile(fileext = ".pdf")
    download.file(url, temp_pdf, mode = "wb")
    # Convertemos o formato pdf em texto
    texto <- pdftools::pdf_text(temp_pdf)
    # Separamos o texto em páginas
    paginas <- str_split(texto, "\f")[[1]]
    # Inicializamos vetores para armazenar as informações
    periodo_formatado <- character(0)
    placas <- character(0)
    valores_gasto <- numeric(0)
    
    # Iteramos sobre as páginas
    for (pagina in paginas) {
      linhas <- str_split(pagina, "\n")[[1]]
      for (linha in linhas) {
        if (str_detect(linha, "Placa:") && str_detect(linha, "Valor gasto:")) {
          placa <- str_extract(linha, "Placa:\\s*([A-Z0-9]+[\\s-]*[A-Z0-9]+)|Placa:\\s*([A-Z0-9]+)")
          #"Placa:\\s*([A-Z0-9]+\\s*[A-Z0-9]*)\\s*")
          placa <- gsub("Placa:\\s*|-\\s*|\\s", "", placa)
          placa <- substr(placa, 1, 7)
          valor_gasto <- str_extract(linha, "Valor gasto: (\\d{1,3}(?:\\.\\d{3})*(?:,\\d{1,2})?)")
          valor_gasto <- str_trim(str_replace(valor_gasto, "Valor gasto:", ""))
          periodo_formatado <- c(periodo_formatado, periodo)
          placas <- c(placas, placa)
          valores_gasto <- c(valores_gasto, valor_gasto)
        }
      }
    }
    
    # Criamos um data frame temporário para armazenar os dados deste relatório
    df_temp <- data.frame(
      Período = periodo_formatado,
      Placa = placas,
      Valor_Gasto = valores_gasto
    )
    
    # Combinamos o data frame temporário ao data frame final
    df_final <- rbind(df_final, df_temp)
  }
  
  # Renomeamos as colunas 
  colnames(df_final) <- c("Período", "Placa", "Valor_Gasto")
  
  # Visualizamos o data frame final
  datatable(df_final, list(iDisplayLength = 5))

Pré-processamento

Após a coleta e preparação dos dados, efetuamos o pré-processamento:

  • A coluna “Período” é convertida para o formato de data.
  • Removemos o separador de milhar da coluna “Valor_Gasto”.
consumo <- df_final %>%
  mutate(Referencia = gsub(" de", "", Período),
  Referencia = format(as.Date(as.character(paste0("01 ", Referencia)), format = "%d %B %Y"), "%Y/%m/%d"),
  Valor_Gasto = gsub("\\.", "", Valor_Gasto),
  Valor_Gasto = as.numeric(gsub("\\,", ".", Valor_Gasto))) %>%
  select(Referencia, Placa, Valor_Gasto)
  
datatable(consumo, list(iDisplayLength = 5))

Análise de dados

Após o pré-processamento, damos início à análise dos dados:

  • A análise começa com a pergunta sobre o valor mensal da despesa com combustíveis dos veículos oficiais.
  • Em seguida, investigamos o valor semestral da despesa.
  • Posteriormente, analisamos a despesa anual com combustíveis nos últimos 3 anos.
  • Finalmente, são identificados possíveis consumos atípicos e veículos que estão acima do terceiro quartil em relação ao gasto com combustíveis.

Visualização dos dados

A visualização dos dados é realizada principalmente com o auxílio da biblioteca ggplot2, gerando gráficos de barras para representar os gastos mensais, semestrais, anuais e a distribuição dos gastos por veículo.

Q1: Qual o valor mensal, em reais, da despesa com combustíveis dos veículos oficiais da Câmara Municipal de Juiz de Fora?

consumo_mensal <- consumo %>%
  mutate(Data = format(as.Date(Referencia,"%Y/%m/%d"), "%Y/%m")) %>%
  group_by(Data) %>%
  summarise(Gasto_mensal = sum(Valor_Gasto)) 
  

  ggplot(consumo_mensal, aes(x = Data, y = Gasto_mensal)) +
  geom_bar(stat = "identity") + 
  labs(x = "", y = "Valor(em Reais)",
       title = "Despesa mensal de combustíveis",
       subtitle = "Câmara Municipal de Juiz de Fora") +  
    scale_y_continuous(breaks=seq(0, 30000, 5000)) +
  theme_economist() +   # Estilo do gráfico
  theme(axis.text.x = element_text(angle=45, hjust=.5),
        text = element_text(size=8))

Ao analisar os gastos mensais, notamos que houve uma redução progressiva dos gastos com combustível no segundo semestre de 2020, em linha com o recrudescimento da pandemia de COVID-19 e as políticas de isolamento social. No entanto, a partir do início do ano seguinte, verificamos um aumento vertiginoso do consumo de combustível, cujo pico atinge um platô de 11/2021 a 07/2022, com excessão de janeiro e fevereiro de 2022. Tal aumento pode estar relacionado à elevação do preço da gasolina, derivado de petróleo duramente afetado pela volatilidade da cotação da commodity, em dólar. Os veículos também pode ter sido colocados à disposição das bases eleitorais, no pico da pandemia, com deslocamentos para atendimento médico-hospitalar e vacinação. A partir do segundo semestre de 2022, há uma queda nas despesas, até o início do ano seguinte. Nesse período, com a população praticamente vacinada, houve o recuo da doença, a vida aos poucos voltou ao normal. Em 2023, houve o aumento paulatino dos gastos, provavelmente devido ao aumento da gasolina, que sofreu a recomposição dos preços, com retorno dos impostos suspensos durante a pandemia.

Q2: Qual o valor semestral, em reais, da despesa com combustíveis dos veículos oficiais da Câmara Municipal de Juiz de Fora?

  consumo_semestral <- consumo %>%
  mutate(Ano = lubridate::year(Referencia),
         Mes = lubridate::month(Referencia),
         Semestre = case_when(
           Mes %in% 01:06 ~ paste0("1SEM", Ano),
           Mes %in% 07:12 ~ paste0("2SEM", Ano))) %>%
  group_by(Semestre) %>%
  summarise(Gasto_semestral = sum(Valor_Gasto)) 

  consumo_semestral %>%
    arrange(Semestre) %>%
    mutate(Semestre = factor(Semestre, levels=c("2SEM2020", 
                                                "1SEM2021", 
                                                "2SEM2021", 
                                                "1SEM2022", 
                                                "2SEM2022", 
                                                "1SEM2023", 
                                                "2SEM2023"))) %>%
    
    ggplot(aes(x = Semestre, y = Gasto_semestral)) +
    geom_bar(stat = "identity", fill = "red") +  
    labs(x = "", y = "Valor(em Reais)",
       title = "Despesa semestral de combustíveis",
       subtitle = "Câmara Municipal de Juiz de Fora") +  
    theme_economist() +   
    theme(axis.text.x = element_text(angle = 45))

Analisando os gastos semestrais, observamos que o pico ocorreu no primeiro semestre de 2022. O aumento nos gastos durante nesse período de pode ser atribuído a diversos fatores, como aumento nos preços dos combustíveis ou aumento na demanda de transporte.

Q3: Qual o valor da despesa com combustíveis dos veículos oficiais da Câmara Municipal de Juiz de Fora, nos últimos 3 anos?

consumo_anual <- consumo %>%
    mutate(Ano = lubridate::year(Referencia)) %>%
    filter(Ano > 2020) %>%
    group_by(Ano) %>%
    summarise(Gasto_anual = sum(Valor_Gasto))
  
    consumo_anual %>%  
    ggplot(aes(x = Ano, y = (Gasto_anual/1000))) +
    geom_bar(stat = "identity", fill = "red") +  
    labs(x = "", y = "Valor(em R$ mil)",
       title = "Despesa anual de combustíveis",
       subtitle = "Câmara Municipal de Juiz de Fora") +  
    theme_economist() +   
    theme(axis.text.x = element_text(angle = 45))

Ao analisar os gastos anuais, notamos que houve um aumento dos gastos com combustível no ano de 2022, que pode estar relacionado ao fim da política de isolamento social, por causa da COVID-19, à necessidade de atendimento das demandas reprimidas; enfim, ao retorno à normaliadade das rotinas que satisfazem a atividade política. No entanto, em 2023 houve variação negativa em relação ao ano de 2021.

Q4: Quantos veículos diferentes foram alocados para a Câmara?

veiculos <- n_distinct(consumo$Placa)
print(veiculos)
## [1] 92

Q5: Houve algum veículo que apresentou algum consumo atípico durante o período avaliado?

    find_outlier <- function(x) {
      return(x < quantile(x, .25) - 1.4*IQR(x) | 
               x > quantile(x, .75) + 1.5*IQR(x))
    }
    
    consumo_veiculo <- consumo %>%
      group_by(Placa) %>%
      summarise(Gasto_veicular = sum(Valor_Gasto))
    
   outlier_valor <- consumo_veiculo %>%
    mutate(outlier = ifelse(find_outlier(Gasto_veicular), Gasto_veicular, NA))
    
  box1 <- outlier_valor %>% 
      ggplot(aes("", Gasto_veicular)) +
      geom_boxplot() +
      geom_text(aes(label=outlier), na.rm=TRUE, hjust=-.5)
    
  outlier_placa <- consumo_veiculo %>%
      mutate(outlier = ifelse(find_outlier(Gasto_veicular), Placa, NA))
    
  box2 <- outlier_placa %>% 
      ggplot(aes("", Gasto_veicular)) +
      geom_boxplot() +
      geom_text(aes(label=outlier), na.rm=TRUE, hjust=-.5)
  
  grid.arrange(box1, box2, ncol = 2)

Ao examinar os gastos por veículo e identificar possíveis consumos atípicos, percebemos que o veículo com a placa PUV-6088 apresentou gasto significativamente acima da média, cujos motivos não podem ser determinados, no total de R$ 27.824,34, para o período acumulado.

Q6: Quais veículos estão acima do terceiro quartil, em relação ao gasto com combustíveis?

  summary(consumo_veiculo$Gasto_veicular)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   150.4  1762.3  6017.0  7319.9 10678.5 27824.3
  destaques <- consumo_veiculo %>%
    filter(Gasto_veicular > 10678.5)
  
  destaques <- destaques[order(destaques$Gasto_veicular, decreasing = TRUE), ]
  
  ggplot(destaques, aes(area = Gasto_veicular, fill = Placa,
                       label = paste(Placa, scales::dollar(Gasto_veicular, 
                                                            prefix = "R$ ",
                                                            decimal.mark = ",", 
                                                            big.mark = "."), 
                                                            sep = "\n"))) +
    geom_treemap() +
    geom_treemap_text(colour = "white",
                      place = "centre",
                      size = 15) +
    theme(legend.position = "none") 

Ao destacar os veículos consistentemente acima do terceiro quartil em termos de gastos com combustíveis, podemos inferir que um a cada quatro veículo registrou gastos expressivos no período. De acordo com o resumo estatítico descrito pela função summary, exibido visualmente pelo gráfico de caixa e bigode (boxplot), metade dos veículos teve gasto médio em torno de R$ 6.000,00, ao passo que um quarto ou vinte e cinco por cento dos veículos registrou gastos acima de R$ 10.700,00. É importante investigar mais a fundo as razões por trás desses altos gastos e implementar medidas para otimizar o consumo de combustível. Mais uma vez, enfatizamos as ressalvas impostas pelo momento pandêmico.

Conclusão

Os resultados obtidos a partir da análise dos gastos com combustíveis da Câmara Municipal de Juiz de Fora fornecem insights valiosos sobre a eficiência e transparência na gestão dos recursos públicos. Ao refletir sobre esses resultados, podemos destacar os seguintes aspectos:

Relevância dos Resultados: Os insights obtidos destacam a importância da análise de dados para a identificação de padrões de gastos, otimização de recursos e detecção de possíveis irregularidades.

Próximos Passos e Recomendações: Com base nos resultados da análise, recomendamos a implementação de medidas proativas para controlar e otimizar os gastos com combustíveis. Isso inclui revisões periódicas das políticas de frota, investimentos em tecnologias mais eficientes e monitoramento regular dos gastos.

Transparência e Accountability: A análise de dados desempenha um papel fundamental na promoção da transparência e accountability nas instituições governamentais. Ao tornar os dados acessíveis e compreensíveis, fortalecemos a confiança dos cidadãos e a eficácia da gestão pública.

Pandemia: Embora a situação excepcional provocada pela pandemia da COVID-19 dificulte análise mais aprofundada dos dados, dois aspectos, que mereceram pouca ênfase, devem ser levados em consideração: a variação dos preços dos combustíveis e as distâncias percorridas pelos veículos.

Em síntese, reforçamos a importância da análise de dados para uma gestão eficiente e responsável dos recursos públicos, além de oferecer insights valiosos para futuras ações e tomadas de decisão.