1 Introdução

A ouvidoria pública é um importante canal de participação cidadã e um instrumento de transparência institucional. No âmbito do TCE-PE, a gestão eficiente das manifestações recebidas pela ouvidoria requer soluções que auxiliem na organização, sistematização e interpretação de grandes volumes de dados. Entretanto, muitos órgãos públicos ainda enfrentam dificuldades estruturais nesse processo, como o acúmulo de demandas, baixa integração entre sistemas, interfaces pouco intuitivas e ausência de padronização nos registros, o que compromete a agilidade das respostas e enfraquece o controle social.

Estudos mostram que ferramentas de Business Intelligence (BI) têm potencial para enfrentar esses desafios, ao melhorar a categorização das manifestações, facilitar o acesso à informação e apoiar tecnicamente a tomada de decisão. Uma revisão de literatura conduzida por (Ferreira and Araújo Pereira 2025) identificou que dashboards interativos podem ampliar a transparência ativa e qualificar o monitoramento institucional. Durante a pandemia de COVID-19, por exemplo, essas ferramentas foram utilizadas em contextos sanitários e administrativos, embora enfrentassem limitações relacionadas à interoperabilidade e à qualidade dos dados (Sano, Matheus, and Vaz 2023).

Experiências práticas, como as da Ouvidoria do SUS no Rio Grande do Sul (Carli, Allebrandt, and Machado 2023) e do Ministério da Agricultura (Oliveira 2023), demonstraram que a adoção de tecnologias para visualização de dados favorece a identificação de gargalos, o encaminhamento adequado das manifestações e a elaboração de relatórios mais precisos. Além disso, soluções como os painéis “Fala.Br” e “Resolveu?” têm sido referenciadas na literatura por aprimorar a transparência ativa e permitir maior envolvimento social no acompanhamento de políticas públicas (Miranda 2023).

Nesse contexto, este projeto realiza uma análise exploratória de dados simulados com base nas características identificadas nos estudos acima. O objetivo é refletir sobre padrões de comportamento nas manifestações recebidas pela Ouvidoria do TCE-PE e discutir como a análise sistematizada dessas informações pode apoiar a qualificação institucional, mesmo em ambientes com restrições técnicas ou operacionais.

2 Pacotes Requeridos

2.1 Carregamento dos Pacotes

Antes de iniciar a análise, foi necessário carregar os pacotes que forneceneceram as funções utilizadas ao longo do projeto. Cada um deles desempenhou um papel específico no tratamento, visualização e apresentação dos dados. Abaixo, será apresentado uma breve descrição das bibliotecas utilizadas, com o objetivo de documentar claramente os recursos empregados e facilitar a reprodutibilidade do trabalho.

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'tibble' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'purrr' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## Warning: package 'stringr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)
library(ggplot2)
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
library(dplyr)
library(stringr)
library(ggrepel)
## Warning: package 'ggrepel' was built under R version 4.3.3
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
## 
## Attaching package: 'plotly'
## 
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following object is masked from 'package:graphics':
## 
##     layout
library(RColorBrewer)
## Warning: 'xfun::attr()' é obsoleto.
## Use 'xfun::attr2()' em seu lugar
## Veja help("Deprecated")
## Warning: 'xfun::attr()' é obsoleto.
## Use 'xfun::attr2()' em seu lugar
## Veja help("Deprecated")
Pacotes utilizados no projeto e suas finalidades.
Pacote Finalidade
tidyverse Conjunto de pacotes para manipulação e visualização de dados (inclui dplyr, ggplot2, readr, etc.).
dplyr Manipulação de dados em formato tabular por meio de verbos como filter(), mutate(), summarize().
stringr Manipulação e padronização de strings e textos.
lubridate Facilita a manipulação de datas e horários.
ggplot2 Criação de gráficos elegantes e personalizáveis com base no sistema de camadas.
knitr Geração de relatórios dinâmicos e bem formatados em RMarkdown.
DT Criação de tabelas interativas em HTML para visualização de dados.
ggrepel Utilizado basicamente para melhorar a posição automática dos textos/rótulos em gráficos feitos com ggplot2, evitando que eles se sobreponham.
plotly Utilizado para criar gráficos interativos em R (ou Python), ideais para relatórios HTML, dashboards e apresentações exploratórias de dados.
RColorBrewer Pacote do R que oferece paletas de cores prontas, especialmente pensadas para a visualização de dados. Essas paletas são criadas para serem esteticamente agradáveis e para facilitar a interpretação dos gráficos, respeitando princípios de percepção visual, contraste e acessibilidade.

3 Preparação dos Dados

3.1 Fonte dos Dados

Os dados foram obtidos exclusivamente a partir de um arquivo CSV, exportado do sistema utilizado pela Ouvidoria. Neste arquivo estão contidos os registros de manifestações provenientes de diversos canais de atendimento disponibilizados ao cidadão, atendimento telefônico, e-mail institucional e registros presenciais. Essa multiplicidade de canais reflete a política de acessibilidade e transparência da instituição no tratamento das demandas recebidas.

3.2 Simulação dos Dados

library(readr)

data <- read_csv("manifestacoesSisouv2024.csv")
## Rows: 4642 Columns: 7
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (5): natureza, assunto, uj, foma_atendimento, status_atual
## dbl  (1): manifestacao
## dttm (1): data
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

A leitura dos dados foi realizada utilizando o pacote readr, que oferece funções otimizadas para importação de arquivos em formatos estruturados. O comando read_csv() foi empregado para carregar o arquivo “manifestacoesSisouv2024.csv” para o ambiente R, resultando no objeto data, que serviu como base para todas as etapas subsequentes de tratamento e análise.

3.3 Limpeza e Padronização dos Dados

# Limpeza e padronização

data <- data %>%
  mutate(
    natureza = case_when(
      is.na(natureza) | natureza %in% c("NULL", "") ~ "Não Informado",
      TRUE ~ str_to_title(natureza)
    ),
    assunto = case_when(
      is.na(assunto) | assunto %in% c("NULL", "") ~ "Não Informado",
      TRUE ~ str_to_title(assunto)
    ),
    uj = case_when(
      is.na(uj) | uj %in% c("NULL", "") ~ "Não Informado",
      TRUE ~ str_to_title(uj)
    ),
    
    status_atual = str_to_title(status_atual),
    data = as.Date(data),
    mes = month(data, label = TRUE, abbr = FALSE)
  )

Para assegurar a qualidade e a consistência dos dados analisados, foi realizada uma etapa de pré-processamento composta por limpeza, padronização textual e criação de variáveis auxiliares. Essa etapa foi conduzida com o uso da função mutate() do pacote dplyr, permitindo a transformação simultânea de múltiplas variáveis.

Os campos “natureza”, “assunto” e “unidade jurisdicionada” (uj) foram tratados para substituir valores “NULL” pela expressão “Não Informado”, garantindo que a ausência de informação fosse representada de maneira uniforme. Em seguida, aplicou-se a função str_to_title() para uniformizar a capitalização dos textos, contribuindo para a consistência visual dos gráficos e tabelas.

A coluna “status_atual” também foi padronizada quanto à capitalização, e a variável “data”, originalmente em formato textual, foi convertida para o tipo Date para possibilitar análises temporais. A partir dela, derivou-se a variável “mes”, com os nomes completos dos meses (ex: Janeiro, Fevereiro), a fim de facilitar a agregação e visualização das manifestações ao longo do tempo.

Essa etapa preparatória foi essencial para mitigar ruídos no conjunto de dados e garantir maior fidedignidade às análises apresentadas posteriormente.

4 Análise Exploratória dos Dados

4.1 Volume Mensal de Manifestações

data %>%
  count(mes) %>%
  plot_ly(x = ~mes, y = ~n, type = 'scatter', mode = 'lines+markers',
          line = list(color = 'steelblue'),
          marker = list(size = 6)) %>%
  layout(
    xaxis = list(title = "Mês"),
    yaxis = list(title = "Quantidade")
    
  )

Este gráfico apresenta a evolução da quantidade de manifestações ao longo dos meses analisados. Cada ponto indica a quantidade registrada em um mês específico, e a linha conecta esses pontos para facilitar a visualização das tendências ao longo do tempo. É possível observar períodos de aumento, a saber: abril, setembro, outubro, novembro e dezembro; queda ou estabilidade no número de manifestações a saber: janeiro, fevereiro, março, maio, junho, julho e agosto.

4.2 Natureza x Status

data <- data %>%
  mutate(status_atual = str_wrap(status_atual, width = 30))

cores_acessiveis <- c(
  "#1b9e77",  # verde médio
  "#d95f02",  # laranja queimado
  "#7570b3",  # roxo médio
  "#e7298a",  # rosa choque
  "#66a61e",  # verde oliva
  "#e6ab02",  # amarelo queimado
  "#a6761d",  # marrom
  "#666666",  # cinza escuro
  "#a6cee3",  # azul claro
  "#1f78b4",  # azul escuro
  "#b2df8a",  # verde claro
  "#fb9a99",  # rosa claro
  "#fdbf6f",  # laranja pastel
  "#cab2d6",  # roxo claro
  "#ffff99"   # amarelo claro
)

ggplot(data, aes(x = natureza, fill = status_atual)) +
  geom_bar(position = "fill", width = 0.6) +
  scale_x_discrete(expand = expansion(add = c(0.5, 0.5))) +
  labs(x = "Natureza", y = "Proporção") +
  scale_fill_manual(values = cores_acessiveis) + 
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "bottom",
    legend.title = element_blank(),
    legend.text = element_text(size = 5)
  ) +
  guides(fill = guide_legend(nrow = 3, byrow = TRUE))

Este gráfico apresenta uma visualização da distribuição dos status atuais de cada tipo de manifestação. É possível observar que as denúncias concentram-se majoritariamente nos status de “Concluída” e “Encaminhada para análise”, o que indica uma priorização institucional no tratamento desses casos, provavelmente em razão de sua gravidade e relevância social.

4.3 Evolução de manifestações por dia

data %>%
  filter(format(as.Date(data), "%Y") == "2024") %>%
  group_by(data) %>%
  summarise(qtd = n()) %>%
  plot_ly(x = ~as.Date(data), y = ~qtd,
          type = 'scatter', mode = 'lines',
          line = list(color = 'darkgreen')) %>%
  layout(
    xaxis = list(title = "Data"),
    yaxis = list(title = "Quantidade")
  )

A análise da série temporal revela picos de manifestações concentrados em dias específicos dos meses de abril, setembro, outubro e dezembro de 2024. Esses aumentos podem estar associados a eventos específicos ocorridos nessas épocas, como campanhas de divulgação, mudanças no canal de ouvidoria, ou problemas pontuais nos serviços públicos que geraram maior volume de manifestações. Em contraste, observa-se que em outros períodos há quedas significativas na quantidade de registros, o que pode indicar momentos de menor engajamento da população ou possíveis dificuldades operacionais no atendimento das demandas.

4.4 Distribuição por status atual

data %>%
  count(status_atual) %>%
  arrange(status_atual) %>%
  mutate(
    percent = n / sum(n) * 100,
    label_text = ifelse(percent >= 5, paste0(round(percent, 1), "%"), "")
  ) %>%
  plot_ly(
    labels = ~status_atual,
    values = ~n,
    type = 'pie',
    text = ~label_text,
    textinfo = 'text',
    textfont = list(size = 10),
    hoverinfo = 'label+percent',
    marker = list(
      colors = RColorBrewer::brewer.pal(n = max(3, length(unique(data$status_atual))), name = "Set3"),
      line = list(color = '#FFFFFF', width = 1)
    )
  ) %>%
  layout(
    showlegend = TRUE,
    margin = list(l = 40, r = 40, b = 20, t = 20),
  height = 500,
  width = 800
  )
## Warning in RColorBrewer::brewer.pal(n = max(3, length(unique(data$status_atual))), : n too large, allowed maximum for palette Set3 is 12
## Returning the palette you asked for with that many colors
## Warning: Specifying width/height in layout() is now deprecated.
## Please specify in ggplotly() or plot_ly()

A maioria das manifestações encontra-se com o status “Concluída pela Ouvidoria”, seguido por aquelas “Concluída Pelo Segmento Competente” e logo em seguida as “Encaminhadas Para Análise Segmento Competente”. Esse resultado demonstra que a maior parte das demandas estão recebendo tratativas finais, o que pode indicar um bom fluxo de resolução. No entanto, a quantidade de manifestações ainda em análise sugere que há casos pendentes, que exigem monitoramento para evitar atrasos excessivos.

4.5 Distribuição das Manifestações por Tipo de Natureza

data %>%
  count(natureza) %>%
  plot_ly(
    x = ~natureza,
    y = ~n,
    type = 'bar',
    marker = list(color = "steelblue")
  ) %>%
  layout(
    xaxis = list(title = "Natureza", tickangle = -45),
    yaxis = list(title = "Frequência")
  )

O gráfico apresenta a distribuição das manifestações por natureza, evidenciando que as denúncias representam o tipo mais frequente de registro, seguidas pelas solicitações. Em contrapartida, manifestações como elogios e críticas apresentaram ocorrência significativamente menor. Esse padrão sugere que há uma maior preocupação da população em relatar irregularidades e problemas relacionados aos serviços públicos, o que pode refletir tanto em uma percepção crítica sobre a qualidade desses serviços quanto na cultura mais voltada à fiscalização.

4.6 Top 5 Assuntos mais frequentes

data %>%
  count(assunto, sort = TRUE) %>%
  top_n(5, n) %>%
  arrange(n) %>%  # importante: para manter a ordem ao plotar horizontalmente
  plot_ly(
    x = ~n,
    y = ~factor(assunto, levels = assunto),
    type = 'bar',
    orientation = 'h',
    marker = list(color = "tomato")
  ) %>%
  layout(
    xaxis = list(title = "Quantidade"),
    yaxis = list(title = "Assunto")
  )

Os assuntos mais frequentes foram Concurso Público, Gestão Administrativa Irregular, e Acúmulo de Cargos, entre outros. Isso reforça uma preocupação recorrente da população com processos seletivos públicos e a regularidade da gestão de pessoal. O tema Desvio de Recursos também aparece com destaque, apontando possíveis percepções de má gestão financeira por parte dos cidadãos.

4.7 Tabela Interativa

datatable(data,
          options = list(
            pageLength = 5,
            scrollX = TRUE
          ),
          filter = 'top')

A tabela interativa acima apresenta o detalhamento de todas as manifestações recebidas, incluindo variáveis como natureza, assunto, unidade gestora, forma de atendimento, status atual e data de registro.

O recurso de filtros na parte superior permite ao usuário explorar os dados de forma dinâmica, facilitando a identificação de casos específicos ou padrões dentro de atributos como:

  • Filtrar apenas manifestações de um determinado assunto ou unidade gestora;

  • Analisar rapidamente quais manifestações foram canceladas, concluídas ou estão em análise;

  • Visualizar as manifestações por data, permitindo observar a distribuição temporal.

Essa tabela complementa as análises gráficas apresentadas anteriormente, proporcionando uma visão mais detalhada e interativa dos registros, permitindo um diagnóstico mais preciso por parte dos gestores.

5 Conclusões

A partir da análise exploratória dos dados, por meio dos gráficos apresentados anteriormente, foi possível identificar padrões de comportamento importantes nas manifestações recebidas pela ouvidoria.

Entre os principais achados observados nas análises gráficas, destacam-se:

  • A predominância de denúncias, evidenciada no gráfico de distribuição por natureza, reforçando a percepção de que a população utiliza a ouvidoria principalmente para relatar irregularidades e problemas.

  • Picos de manifestações em datas específicas, observados na análise temporal, o que pode indicar episódios pontuais ou maior divulgação de canais de denúncia em determinados períodos.

  • A concentração dos temas em áreas sensíveis como Concurso Público, Gestão Administrativa e Acúmulo de Cargos, como apontado no gráfico de assuntos mais recorrentes.

  • O alto número de registros com campos não preenchidos (“Não Informado”) em alguns atributos, que pode ocultar informações importantes para o controle social. Isso ficou perceptível durante a análise de variáveis como “assunto” e “unidade gestora”, exigindo um olhar mais atento para a qualidade do registro dos dados.

Ao empregar o R como ferramenta de apoio à exploração dos dados, o projeto contribui para a estruturação de análises mais robustas, servindo de base para a construção de soluções visuais em outras plataformas. Dessa forma, reforça-se a importância da integração entre técnicas de ciência de dados e práticas de gestão pública orientadas por evidências.

Referências

Carli, Patrícia De, Sérgio Luís Allebrandt, and Guilherme Fortes Machado. 2023. “Controle Social e Pandemia: Uma Análise a Partir Da Ouvidoria SUS Do Rio Grande Do Sul.” Interações (Campo Grande) 24 (2): 461–72. https://interacoes.ucdb.br/interacoes/article/view/3470.
Ferreira, Mário Roberto, and Gilberto de Araújo Pereira. 2025. “Utilização de Painéis de Indicadores (Dashboards) Na Gestão pública Brasileira: Revisão Integrativa.” OBSERVATÓRIO DE LA ECONOMÍA LATINOAMERICANA 23 (1): e8610–10.
Miranda, Bruna Marques. 2023. “Administração pública Contemporânea: Uma análise Das Inovações Democráticas Digitais Da CGU Para Transparência Governamental.” Enepcp.
Oliveira, Naiara. 2023. “O Emprego de Ferramentas de Tecnologias de Dados Na Avaliação Dos Serviços e Tomadas de Decisão: Um Estudo de Caso Do Serviço de Informação Ao Cidadão Do Ministério Da Agricultura, Pecuária e Abastecimento.” Cadernos Técnicos Da CGU 5.
Sano, Hironobu, Ricardo Matheus, and José Carlos Vaz. 2023. “Transparency of COVID-19 Information: A Comparison of Open Data Transparency Dashboards.” Ciência Da Informação 52 (2).