Resumo

Este projeto apresenta uma análise exploratória das solicitações urbanas registradas pela Central de Atendimento de Serviços da Emlurb 156 no Recife durante o ano de 2024. A análise utiliza dados públicos disponibilizados no Portal de Dados Abertos da Prefeitura do Recife e busca identificar padrões territoriais, temporais e operacionais relacionados às demandas urbanas registradas pela população.

Foram realizadas etapas de importação, inspeção, limpeza, padronização textual, conversão de datas, criação de variáveis temporais, cálculo de tempo de atendimento, taxa de atendimento e construção de gráficos, tabelas e visualizações interativas. Os resultados indicam concentração de solicitações em determinados bairros, predominância de alguns grupos de serviço e variações mensais no volume de chamados.

Introdução

A gestão urbana envolve a organização, manutenção e melhoria dos espaços públicos, sendo essencial para a qualidade de vida da população. Serviços como limpeza urbana, manutenção de vias, drenagem, arborização, iluminação pública e conservação de logradouros estão diretamente relacionados ao funcionamento cotidiano da cidade.

No Recife, parte dessas demandas é registrada por meio da Central de Atendimento de Serviços da Emlurb 156. Esse canal permite que a população informe problemas urbanos e solicite serviços públicos, gerando uma base de dados relevante para compreender como as demandas se distribuem pelo território, ao longo do tempo e por tipo de serviço.

Problema de pesquisa: quais padrões espaciais, temporais e operacionais podem ser identificados nas solicitações urbanas registradas pela Central de Atendimento da Emlurb no Recife durante o ano de 2024?

A análise é importante porque transforma registros administrativos em informações úteis para compreensão das demandas urbanas. Para a gestão pública, esse tipo de estudo pode apoiar a priorização de serviços, o planejamento territorial, o acompanhamento de regiões com maior demanda e a formulação de ações preventivas.

Objetivo geral

Realizar uma análise exploratória das solicitações urbanas registradas pela Central de Atendimento de Serviços da Emlurb 156 no Recife em 2024.

Objetivos específicos

  • Identificar os principais grupos de serviços solicitados.
  • Verificar quais serviços específicos aparecem com maior frequência.
  • Identificar bairros e RPAs com maior volume de solicitações.
  • Analisar a evolução mensal, trimestral e semanal dos chamados.
  • Avaliar a situação dos atendimentos e a taxa de atendimento.
  • Calcular e analisar o tempo médio de atendimento.
  • Investigar relações entre bairros e grupos de serviços.
  • Apontar limitações e possibilidades de trabalhos futuros.

Referencial conceitual

Dados abertos governamentais

Dados abertos governamentais são informações disponibilizadas por órgãos públicos para consulta, reutilização e análise pela sociedade. Esse tipo de dado contribui para a transparência pública e permite que cidadãos, pesquisadores e gestores acompanhem fenômenos urbanos de maneira mais objetiva.

No contexto deste trabalho, a base da Emlurb 156 representa uma fonte de dados administrativos sobre solicitações urbanas realizadas pela população do Recife. Esses registros permitem observar demandas relacionadas à manutenção urbana e podem auxiliar no planejamento de ações públicas.

Gestão urbana baseada em dados

A gestão urbana baseada em dados utiliza informações coletadas por sistemas administrativos, canais de atendimento e outras fontes para apoiar decisões relacionadas à cidade. Ao analisar padrões de solicitações, é possível identificar regiões com maior demanda, serviços mais recorrentes e períodos de maior volume de chamados.

Esse tipo de abordagem é importante porque permite transformar registros operacionais em indicadores que podem orientar a priorização de recursos, o acompanhamento de políticas públicas e a melhoria dos serviços prestados.

Análise exploratória de dados

A análise exploratória de dados busca compreender a estrutura de um conjunto de dados antes de aplicar técnicas mais avançadas. Ela envolve inspeção da base, identificação de valores ausentes, criação de variáveis, agrupamentos, tabelas e visualizações.

Neste projeto, a análise exploratória é utilizada para identificar padrões iniciais nas solicitações da Emlurb, permitindo uma compreensão mais clara sobre as demandas urbanas registradas no Recife em 2024.

Metodologia

Fonte e descrição da base

Os dados foram obtidos no Portal de Dados Abertos da Prefeitura do Recife, no conjunto Central de Atendimento de Serviços da Emlurb - 156, referente ao ano de 2024.

Fonte dos dados: https://dados.recife.pe.gov.br/dataset/central-de-atendimento-de-servicos-da-emlurb-156

A base contém registros administrativos de solicitações urbanas feitas pela população. Cada linha representa uma solicitação registrada no sistema, contendo informações como grupo de serviço, serviço solicitado, bairro, RPA, data da demanda, situação do atendimento e coordenadas geográficas quando disponíveis.

Pacotes utilizados

Os pacotes foram carregados no início do relatório para garantir que a análise possa ser reproduzida. A tabela a seguir apresenta a finalidade de cada pacote utilizado.

library(readr)
library(dplyr)
library(stringr)
library(lubridate)
library(ggplot2)
library(plotly)
library(DT)
library(knitr)
library(scales)
library(tidyr)
library(forcats)
pacotes <- data.frame(
  Pacote = c("readr", "dplyr", "stringr", "lubridate", "ggplot2",
             "plotly", "DT", "knitr", "scales", "tidyr", "forcats"),
  Finalidade = c(
    "Importação do arquivo CSV com controle do separador e da codificação.",
    "Manipulação dos dados, criação de variáveis, filtros, agrupamentos e contagens.",
    "Tratamento de textos, padronização de maiúsculas/minúsculas e remoção de espaços extras.",
    "Conversão e manipulação de datas, permitindo criar mês, trimestre e dia da semana.",
    "Criação dos gráficos exploratórios estáticos.",
    "Transformação de gráficos em visualizações interativas.",
    "Criação de tabelas interativas no relatório HTML.",
    "Melhoria da apresentação das tabelas no relatório.",
    "Formatação de números nos eixos dos gráficos.",
    "Reorganização de dados em formato adequado para tabelas e resumos.",
    "Reordenação de categorias em gráficos para melhorar a leitura visual."
  )
)

kable(pacotes)
Pacote Finalidade
readr Importação do arquivo CSV com controle do separador e da codificação.
dplyr Manipulação dos dados, criação de variáveis, filtros, agrupamentos e contagens.
stringr Tratamento de textos, padronização de maiúsculas/minúsculas e remoção de espaços extras.
lubridate Conversão e manipulação de datas, permitindo criar mês, trimestre e dia da semana.
ggplot2 Criação dos gráficos exploratórios estáticos.
plotly Transformação de gráficos em visualizações interativas.
DT Criação de tabelas interativas no relatório HTML.
knitr Melhoria da apresentação das tabelas no relatório.
scales Formatação de números nos eixos dos gráficos.
tidyr Reorganização de dados em formato adequado para tabelas e resumos.
forcats Reordenação de categorias em gráficos para melhorar a leitura visual.

Importação dos dados

dados_brutos <- read_delim(
  "emlurb_156_2024.csv",
  delim = ";",
  locale = locale(encoding = "UTF-8"),
  show_col_types = FALSE
)

Conhecendo a base

dim(dados_brutos)
## [1] 108082     13

A base bruta possui 108082 registros e 13 colunas.

glimpse(dados_brutos)
## Rows: 108,082
## Columns: 13
## $ GRUPOSERVICO_CODIGO    <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ GRUPOSERVICO_DESCRICAO <chr> "LIMPEZA URBANA", "LIMPEZA URBANA", "LIMPEZA UR…
## $ SERVICO_CODIGO         <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ SERVICO_DESCRICAO      <chr> "REMOCAO DE ANIMAIS MORTOS PEQUENOS", "REMOCAO …
## $ LOGRADOURO             <chr> "1TR  da Campinas", "2TR  So Nos Dois", "3TR  S…
## $ NUMERO                 <chr> "65                  ", "8                   ",…
## $ BAIRRO                 <chr> "Jardim Sao Paulo", "Passarinho", "Iputinga", "…
## $ RPA                    <dbl> 5, 3, 4, 4, 2, 2, 2, 2, 6, 6, 3, 4, 6, 6, 6, 6,…
## $ DATA_DEMANDA           <date> 2024-08-03, 2024-08-12, 2024-04-12, 2023-12-18…
## $ SITUACAO               <chr> "ATENDIDA", "ATENDIDA", "ATENDIDA", "ATENDIDA",…
## $ DATA_ULT_SITUACAO      <date> 2024-08-05, 2024-08-14, 2024-04-12, 2024-02-05…
## $ latitude               <dbl> -8.085209, -7.989594, -8.028294, -8.035960, NA,…
## $ longitude              <dbl> -34.94910, -34.92591, -34.93435, -34.95567, NA,…

A estrutura da base mostra a presença de variáveis categóricas, textuais, temporais, numéricas e geográficas. Isso torna o conjunto adequado para análises por tipo de serviço, bairro, RPA, situação, período e localização.

Preparação e limpeza dos dados

A preparação dos dados foi realizada para transformar a base bruta em uma versão mais adequada para análise. O objetivo foi manter o máximo de registros possível, descartando dados somente quando a ausência ou inconsistência inviabilizava determinada análise.

Diagnóstico inicial

diagnostico_inicial <- data.frame(
  Indicador = c(
    "Linhas na base bruta",
    "Colunas na base bruta",
    "Registros duplicados na base bruta",
    "Registros com data de demanda ausente"
  ),
  Valor = c(
    nrow(dados_brutos),
    ncol(dados_brutos),
    sum(duplicated(dados_brutos)),
    sum(is.na(dados_brutos$DATA_DEMANDA))
  )
)

kable(diagnostico_inicial)
Indicador Valor
Linhas na base bruta 108082
Colunas na base bruta 13
Registros duplicados na base bruta 0
Registros com data de demanda ausente 0

Critérios de aceitação e descarte

Foram adotados os seguintes critérios:

  • Aceitos: registros com informações suficientes para análise exploratória, especialmente data da demanda, bairro, grupo de serviço, serviço, RPA e situação.
  • Aceitos: datas que puderam ser convertidas corretamente para o formato de data do R.
  • Aceitos: textos após padronização de escrita, removendo espaços extras e ajustando maiúsculas/minúsculas.
  • Aceitos: coordenadas geográficas preenchidas e convertidas para formato numérico.
  • Descartados da base final: registros duplicados.
  • Descartados da base final: registros cuja data da demanda não pôde ser convertida.
  • Filtrados para a análise principal: registros cuja data de demanda não pertence ao ano de 2024.
  • Descartados apenas em análises específicas: registros com bairro, grupo de serviço, situação, mês ou coordenadas ausentes foram removidos somente no gráfico ou tabela em que aquela variável era indispensável.
dados_preparados <- dados_brutos |>
  distinct() |>
  mutate(
    DATA_DEMANDA = ymd(DATA_DEMANDA),
    DATA_ULT_SITUACAO = ymd(DATA_ULT_SITUACAO),

    GRUPOSERVICO_DESCRICAO = str_squish(str_to_title(GRUPOSERVICO_DESCRICAO)),
    SERVICO_DESCRICAO = str_squish(str_to_title(SERVICO_DESCRICAO)),
    BAIRRO = str_squish(str_to_title(BAIRRO)),
    SITUACAO = str_squish(str_to_title(SITUACAO)),
    LOGRADOURO = str_squish(str_to_title(LOGRADOURO)),

    latitude = as.numeric(latitude),
    longitude = as.numeric(longitude),

    ano_demanda = year(DATA_DEMANDA),
    mes_numero = month(DATA_DEMANDA),
    mes = month(DATA_DEMANDA, label = TRUE, abbr = FALSE),
    dia_semana = wday(DATA_DEMANDA, label = TRUE, abbr = FALSE),
    trimestre = paste0(quarter(DATA_DEMANDA), "º trimestre"),

    tempo_atendimento_dias = as.numeric(DATA_ULT_SITUACAO - DATA_DEMANDA),

    atendida = if_else(SITUACAO == "Atendida", 1, 0)
  )

dados <- dados_preparados |>
  filter(!is.na(DATA_DEMANDA), ano_demanda == 2024)

O que foi tratado

As principais etapas de tratamento foram:

  1. Remoção de duplicidades exatas.
  2. Conversão de DATA_DEMANDA e DATA_ULT_SITUACAO para data.
  3. Padronização textual de bairro, grupo de serviço, serviço, situação e logradouro.
  4. Conversão de latitude e longitude para formato numérico.
  5. Criação das variáveis ano_demanda, mes_numero, mes, dia_semana e trimestre.
  6. Criação da variável tempo_atendimento_dias, calculada pela diferença entre a data da última situação e a data da demanda.
  7. Criação da variável atendida, usada para calcular a taxa de atendimento.
  8. Filtragem da análise principal para solicitações com DATA_DEMANDA em 2024.

Comparação das etapas de limpeza

comparacao_limpeza <- data.frame(
  Etapa = c(
    "Base bruta importada",
    "Após remoção de duplicados e preparação inicial",
    "Base final filtrada para demandas de 2024"
  ),
  Linhas = c(
    nrow(dados_brutos),
    nrow(dados_preparados),
    nrow(dados)
  ),
  Colunas = c(
    ncol(dados_brutos),
    ncol(dados_preparados),
    ncol(dados)
  )
)

kable(comparacao_limpeza)
Etapa Linhas Colunas
Base bruta importada 108082 13
Após remoção de duplicados e preparação inicial 108082 20
Base final filtrada para demandas de 2024 97555 20

A filtragem por ano foi realizada porque o objetivo do trabalho é analisar as solicitações urbanas registradas em 2024. Como a base pode conter registros com datas de demanda anteriores, esses casos foram retirados da análise principal para manter coerência temporal.

Valores ausentes

ausentes <- dados |>
  summarise(across(everything(), ~sum(is.na(.)))) |>
  pivot_longer(cols = everything(), names_to = "Variavel", values_to = "Valores_Ausentes") |>
  arrange(desc(Valores_Ausentes))

kable(ausentes)
Variavel Valores_Ausentes
latitude 73777
longitude 73777
GRUPOSERVICO_CODIGO 0
GRUPOSERVICO_DESCRICAO 0
SERVICO_CODIGO 0
SERVICO_DESCRICAO 0
LOGRADOURO 0
NUMERO 0
BAIRRO 0
RPA 0
DATA_DEMANDA 0
SITUACAO 0
DATA_ULT_SITUACAO 0
ano_demanda 0
mes_numero 0
mes 0
dia_semana 0
trimestre 0
tempo_atendimento_dias 0
atendida 0

A presença de valores ausentes é mais relevante nas variáveis de localização. Isso impacta principalmente análises geográficas, pois somente registros com latitude e longitude válidas podem ser representados no mapa de pontos.

Tabela-resumo das variáveis principais

resumo_variaveis <- data.frame(
  Variavel = c(
    "GRUPOSERVICO_DESCRICAO", "SERVICO_DESCRICAO", "BAIRRO", "RPA",
    "DATA_DEMANDA", "SITUACAO", "DATA_ULT_SITUACAO", "latitude",
    "longitude", "mes", "dia_semana", "trimestre", "tempo_atendimento_dias", "atendida"
  ),
  Tipo = c(
    "Categórica", "Categórica", "Categórica", "Numérica/categórica",
    "Data", "Categórica", "Data", "Numérica", "Numérica",
    "Categórica temporal", "Categórica temporal", "Categórica temporal",
    "Numérica derivada", "Numérica derivada"
  ),
  Descricao = c(
    "Grupo geral do serviço solicitado.",
    "Descrição específica do serviço solicitado.",
    "Bairro associado à solicitação.",
    "Região Político-Administrativa do Recife.",
    "Data em que a demanda foi registrada.",
    "Situação administrativa da solicitação.",
    "Data da última atualização da situação.",
    "Coordenada geográfica de latitude.",
    "Coordenada geográfica de longitude.",
    "Mês extraído da data da demanda.",
    "Dia da semana extraído da data da demanda.",
    "Trimestre extraído da data da demanda.",
    "Diferença em dias entre a última atualização e a abertura da demanda.",
    "Indicador binário para solicitações atendidas."
  )
)

kable(resumo_variaveis)
Variavel Tipo Descricao
GRUPOSERVICO_DESCRICAO Categórica Grupo geral do serviço solicitado.
SERVICO_DESCRICAO Categórica Descrição específica do serviço solicitado.
BAIRRO Categórica Bairro associado à solicitação.
RPA Numérica/categórica Região Político-Administrativa do Recife.
DATA_DEMANDA Data Data em que a demanda foi registrada.
SITUACAO Categórica Situação administrativa da solicitação.
DATA_ULT_SITUACAO Data Data da última atualização da situação.
latitude Numérica Coordenada geográfica de latitude.
longitude Numérica Coordenada geográfica de longitude.
mes Categórica temporal Mês extraído da data da demanda.
dia_semana Categórica temporal Dia da semana extraído da data da demanda.
trimestre Categórica temporal Trimestre extraído da data da demanda.
tempo_atendimento_dias Numérica derivada Diferença em dias entre a última atualização e a abertura da demanda.
atendida Numérica derivada Indicador binário para solicitações atendidas.

Amostra da base final

dados |>
  select(
    GRUPOSERVICO_DESCRICAO, SERVICO_DESCRICAO, BAIRRO, RPA,
    DATA_DEMANDA, mes, dia_semana, trimestre, SITUACAO,
    tempo_atendimento_dias, latitude, longitude
  ) |>
  head(20) |>
  kable()
GRUPOSERVICO_DESCRICAO SERVICO_DESCRICAO BAIRRO RPA DATA_DEMANDA mes dia_semana trimestre SITUACAO tempo_atendimento_dias latitude longitude
Limpeza Urbana Remocao De Animais Mortos Pequenos Jardim Sao Paulo 5 2024-08-03 agosto sábado 3º trimestre Atendida 2 -8.085209 -34.94910
Limpeza Urbana Remocao De Animais Mortos Pequenos Passarinho 3 2024-08-12 agosto segunda-feira 3º trimestre Atendida 2 -7.989594 -34.92591
Limpeza Urbana Remocao De Animais Mortos Pequenos Iputinga 4 2024-04-12 abril sexta-feira 2º trimestre Atendida 0 -8.028294 -34.93435
Limpeza Urbana Remocao De Animais Mortos Pequenos Agua Fria 2 2024-04-15 abril segunda-feira 2º trimestre Atendida 1 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Agua Fria 2 2024-10-12 outubro sábado 4º trimestre Atendida 2 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Arruda 2 2024-08-19 agosto segunda-feira 3º trimestre Atendida 1 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Agua Fria 2 2024-07-04 julho quinta-feira 3º trimestre Atendida 4 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Boa Viagem 6 2024-10-10 outubro quinta-feira 4º trimestre Atendida 0 -8.152785 -34.90832
Limpeza Urbana Remocao De Animais Mortos Pequenos Boa Viagem 6 2024-12-18 dezembro quarta-feira 4º trimestre Atendida 0 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Gracas 3 2024-07-18 julho quinta-feira 3º trimestre Atendida 0 -8.054708 -34.90316
Limpeza Urbana Remocao De Animais Mortos Pequenos Madalena 4 2024-03-05 março terça-feira 1º trimestre Atendida 3 -8.048775 -34.90440
Limpeza Urbana Remocao De Animais Mortos Pequenos Boa Viagem 6 2024-04-09 abril terça-feira 2º trimestre Atendida 0 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Boa Viagem 6 2024-06-27 junho quinta-feira 2º trimestre Atendida 1 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Boa Viagem 6 2024-04-22 abril segunda-feira 2º trimestre Atendida 0 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Pina 6 2024-12-13 dezembro sexta-feira 4º trimestre Atendida 3 -8.098648 -34.88386
Limpeza Urbana Remocao De Animais Mortos Pequenos Boa Viagem 6 2024-08-15 agosto quinta-feira 3º trimestre Atendida 1 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Boa Viagem 6 2024-12-18 dezembro quarta-feira 4º trimestre Atendida 0 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Brasilia Teimosa 6 2024-09-15 setembro domingo 3º trimestre Atendida 2 -8.084019 -34.87778
Limpeza Urbana Remocao De Animais Mortos Pequenos Iputinga 4 2024-07-17 julho quarta-feira 3º trimestre Atendida 1 NA NA
Limpeza Urbana Remocao De Animais Mortos Pequenos Madalena 4 2024-05-02 maio quinta-feira 2º trimestre Atendida 1 -8.054662 -34.91382

Painel de indicadores

Antes dos gráficos detalhados, foi criado um resumo executivo com indicadores gerais da base tratada. Esse painel facilita a leitura inicial do projeto e oferece uma visão consolidada da base analisada.

taxa_atendimento <- mean(dados$atendida, na.rm = TRUE) * 100

tempo_valido <- dados |>
  filter(!is.na(tempo_atendimento_dias), tempo_atendimento_dias >= 0)

indicadores <- tibble::tibble(
  Indicador = c(
    "Total de solicitações analisadas",
    "Bairros distintos",
    "Serviços distintos",
    "Grupos de serviço distintos",
    "RPAs distintas",
    "Taxa geral de atendimento",
    "Tempo médio de atendimento",
    "Tempo mediano de atendimento",
    "Registros com coordenadas válidas"
  ),
  Valor = c(
    format(nrow(dados), big.mark = "."),
    n_distinct(dados$BAIRRO, na.rm = TRUE),
    n_distinct(dados$SERVICO_DESCRICAO, na.rm = TRUE),
    n_distinct(dados$GRUPOSERVICO_DESCRICAO, na.rm = TRUE),
    n_distinct(dados$RPA, na.rm = TRUE),
    paste0(round(taxa_atendimento, 1), "%"),
    paste0(round(mean(tempo_valido$tempo_atendimento_dias, na.rm = TRUE), 1), " dias"),
    paste0(round(median(tempo_valido$tempo_atendimento_dias, na.rm = TRUE), 1), " dias"),
    format(sum(!is.na(dados$latitude) & !is.na(dados$longitude)), big.mark = ".")
  )
)

kable(indicadores)
Indicador Valor
Total de solicitações analisadas 97.555
Bairros distintos 95
Serviços distintos 98
Grupos de serviço distintos 21
RPAs distintas 6
Taxa geral de atendimento 75.6%
Tempo médio de atendimento 13.4 dias
Tempo mediano de atendimento 2 dias
Registros com coordenadas válidas 23.778

Os indicadores executivos mostram a dimensão da base e apresentam medidas criadas a partir dos dados, como taxa geral de atendimento e tempo de atendimento. Esses indicadores ajudam a transformar registros individuais em informações de gestão.

Resultados e análise exploratória

Os resultados foram organizados em abas para facilitar a navegação e deixar o relatório mais limpo.

Grupos de serviços

top_grupos <- dados |>
  filter(!is.na(GRUPOSERVICO_DESCRICAO), GRUPOSERVICO_DESCRICAO != "") |>
  count(GRUPOSERVICO_DESCRICAO, sort = TRUE) |>
  slice_head(n = 10)

ggplot(top_grupos, aes(x = reorder(GRUPOSERVICO_DESCRICAO, n), y = n)) +
  geom_col(fill = "#2171b5") +
  coord_flip() +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Top 10 grupos de serviços mais solicitados",
       x = "Grupo de serviço", y = "Quantidade de solicitações") +
  theme_minimal(base_size = 13)

Os grupos de serviços mais frequentes representam as principais demandas urbanas registradas pela população. Essa análise permite identificar quais áreas da manutenção urbana concentram maior volume de solicitações.

Serviços específicos

top_servicos <- dados |>
  filter(!is.na(SERVICO_DESCRICAO), SERVICO_DESCRICAO != "") |>
  count(SERVICO_DESCRICAO, sort = TRUE) |>
  slice_head(n = 10)

ggplot(top_servicos, aes(x = reorder(SERVICO_DESCRICAO, n), y = n)) +
  geom_col(fill = "#238b45") +
  coord_flip() +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Top 10 serviços mais solicitados",
       x = "Serviço", y = "Quantidade de solicitações") +
  theme_minimal(base_size = 13)

A análise por serviço detalha melhor as necessidades registradas, permitindo observar quais solicitações específicas aparecem com maior frequência dentro dos grupos de serviços.

Bairros

top_bairros <- dados |>
  filter(!is.na(BAIRRO), BAIRRO != "") |>
  count(BAIRRO, sort = TRUE) |>
  slice_head(n = 10)

ggplot(top_bairros, aes(x = reorder(BAIRRO, n), y = n)) +
  geom_col(fill = "#756bb1") +
  coord_flip() +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Top 10 bairros com mais solicitações",
       x = "Bairro", y = "Quantidade de solicitações") +
  theme_minimal(base_size = 13)

Os bairros com maior volume de solicitações podem indicar áreas com maior demanda por serviços urbanos, maior densidade populacional ou maior utilização dos canais de atendimento. Portanto, o resultado deve ser interpretado como volume de registros, e não necessariamente como medida direta da gravidade dos problemas urbanos.

RPA

rpa_total <- dados |>
  filter(!is.na(RPA)) |>
  count(RPA, sort = TRUE)

ggplot(rpa_total, aes(x = factor(RPA), y = n)) +
  geom_col(fill = "#f16913") +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Quantidade de solicitações por RPA",
       x = "Região Político-Administrativa (RPA)",
       y = "Quantidade de solicitações") +
  theme_minimal(base_size = 13)

A análise por RPA permite observar a distribuição das solicitações em regiões administrativas do Recife. Essa visão pode auxiliar o planejamento territorial dos serviços urbanos, pois agrupa bairros em áreas de gestão.

Evolução mensal

solicitacoes_mes <- dados |>
  filter(!is.na(mes)) |>
  count(mes_numero, mes) |>
  arrange(mes_numero)

ggplot(solicitacoes_mes, aes(x = mes, y = n, group = 1)) +
  geom_line(color = "#08519c", linewidth = 1.2) +
  geom_point(color = "#08519c", size = 3) +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Evolução mensal das solicitações em 2024",
       x = "Mês", y = "Quantidade de solicitações") +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

A evolução mensal permite identificar oscilações no volume de chamados ao longo do ano. Essas variações podem estar associadas a fatores climáticos, operacionais ou à maior utilização do serviço em determinados períodos.

Trimestres

solicitacoes_trimestre <- dados |>
  filter(!is.na(trimestre)) |>
  count(trimestre)

ggplot(solicitacoes_trimestre, aes(x = trimestre, y = n)) +
  geom_col(fill = "#2b8cbe") +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Solicitações por trimestre",
       x = "Trimestre", y = "Quantidade de solicitações") +
  theme_minimal(base_size = 13)

A análise por trimestre resume a evolução temporal em períodos maiores, facilitando a observação de concentração ou queda das demandas ao longo do ano.

Dia da semana

solicitacoes_dia <- dados |>
  filter(!is.na(dia_semana)) |>
  count(dia_semana)

ggplot(solicitacoes_dia, aes(x = dia_semana, y = n)) +
  geom_col(fill = "#6a51a3") +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Solicitações por dia da semana",
       x = "Dia da semana", y = "Quantidade de solicitações") +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 35, hjust = 1))

A distribuição por dia da semana ajuda a observar se os registros se concentram em dias úteis ou finais de semana. Essa informação pode contribuir para o planejamento operacional das equipes de atendimento e manutenção.

Situação

situacao_total <- dados |>
  filter(!is.na(SITUACAO), SITUACAO != "") |>
  count(SITUACAO, sort = TRUE)

ggplot(situacao_total, aes(x = reorder(SITUACAO, n), y = n)) +
  geom_col(fill = "#cb181d") +
  coord_flip() +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Situação das solicitações registradas",
       x = "Situação", y = "Quantidade de solicitações") +
  theme_minimal(base_size = 13)

A análise da situação dos atendimentos oferece uma visão inicial do andamento das solicitações. Essa informação é útil para compreender o fluxo dos chamados e avaliar a proporção de registros atendidos ou ainda em outra situação administrativa.

Taxa de atendimento

taxa_grupo <- dados |>
  filter(!is.na(GRUPOSERVICO_DESCRICAO), GRUPOSERVICO_DESCRICAO != "") |>
  group_by(GRUPOSERVICO_DESCRICAO) |>
  summarise(
    total = n(),
    atendidas = sum(atendida, na.rm = TRUE),
    taxa_atendimento = 100 * atendidas / total,
    .groups = "drop"
  ) |>
  filter(total >= 100) |>
  arrange(desc(total)) |>
  slice_head(n = 10)

ggplot(taxa_grupo, aes(x = reorder(GRUPOSERVICO_DESCRICAO, taxa_atendimento),
                       y = taxa_atendimento)) +
  geom_col(fill = "#31a354") +
  coord_flip() +
  scale_y_continuous(labels = function(x) paste0(x, "%")) +
  labs(title = "Taxa de atendimento por grupo de serviço",
       x = "Grupo de serviço", y = "Taxa de atendimento") +
  theme_minimal(base_size = 13)

A taxa de atendimento é um indicador criado a partir da situação das solicitações. Ela permite ir além da contagem de chamados, oferecendo uma visão sobre a proporção de demandas atendidas em cada grupo de serviço.

Tempo de atendimento

tempo_grupo <- dados |>
  filter(!is.na(tempo_atendimento_dias),
         tempo_atendimento_dias >= 0,
         !is.na(GRUPOSERVICO_DESCRICAO),
         GRUPOSERVICO_DESCRICAO != "") |>
  group_by(GRUPOSERVICO_DESCRICAO) |>
  summarise(
    quantidade = n(),
    tempo_medio_dias = mean(tempo_atendimento_dias, na.rm = TRUE),
    tempo_mediano_dias = median(tempo_atendimento_dias, na.rm = TRUE),
    desvio_padrao = sd(tempo_atendimento_dias, na.rm = TRUE),
    .groups = "drop"
  ) |>
  filter(quantidade >= 100) |>
  arrange(desc(tempo_medio_dias)) |>
  slice_head(n = 10)

ggplot(tempo_grupo, aes(x = reorder(GRUPOSERVICO_DESCRICAO, tempo_medio_dias),
                        y = tempo_medio_dias)) +
  geom_col(fill = "#238b45") +
  coord_flip() +
  labs(title = "Grupos de serviço com maior tempo médio de atendimento",
       x = "Grupo de serviço", y = "Tempo médio em dias") +
  theme_minimal(base_size = 13)

kable(tempo_grupo)
GRUPOSERVICO_DESCRICAO quantidade tempo_medio_dias tempo_mediano_dias desvio_padrao
Planejamento De Limpeza Urbana 119 70.75630 41 76.44528
Acao Educativa 236 36.16949 0 77.36268
Macrodrenagem 752 31.41090 0 67.16084
Drenagem 8451 24.81588 0 61.62614
Limpeza Urbana 18331 24.58027 8 39.26487
Arborizacao 11641 21.22094 0 44.20430
Denuncias 2719 20.43876 17 18.90662
Pavimentacao 3819 18.30165 0 46.06489
Fiscalizacao Urbana 1037 15.64224 7 28.41967
Pracas 1062 13.69492 0 37.81730

O tempo médio de atendimento é uma variável criada a partir das datas da base. Essa informação permite observar quais grupos podem exigir maior esforço operacional ou apresentar maior complexidade. Para evitar distorções, foram considerados apenas grupos com pelo menos 100 registros válidos.

Heatmap bairro x serviço

bairros_heat <- dados |>
  filter(!is.na(BAIRRO), BAIRRO != "") |>
  count(BAIRRO, sort = TRUE) |>
  slice_head(n = 10) |>
  pull(BAIRRO)

grupos_heat <- dados |>
  filter(!is.na(GRUPOSERVICO_DESCRICAO), GRUPOSERVICO_DESCRICAO != "") |>
  count(GRUPOSERVICO_DESCRICAO, sort = TRUE) |>
  slice_head(n = 8) |>
  pull(GRUPOSERVICO_DESCRICAO)

heatmap_dados <- dados |>
  filter(BAIRRO %in% bairros_heat,
         GRUPOSERVICO_DESCRICAO %in% grupos_heat) |>
  count(BAIRRO, GRUPOSERVICO_DESCRICAO)

ggplot(heatmap_dados, aes(x = GRUPOSERVICO_DESCRICAO, y = BAIRRO, fill = n)) +
  geom_tile(color = "white") +
  scale_fill_gradient(low = "#deebf7", high = "#08519c",
                      labels = label_number(big.mark = ".")) +
  labs(title = "Concentração de solicitações por bairro e grupo de serviço",
       x = "Grupo de serviço", y = "Bairro", fill = "Quantidade") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

O heatmap permite observar padrões cruzados entre bairros e grupos de serviço. Essa visualização vai além das contagens isoladas, pois mostra quais demandas predominam em determinados territórios.

Interativo

grafico_bairros_interativo <- ggplot(
  top_bairros,
  aes(
    x = reorder(BAIRRO, n),
    y = n,
    text = paste("Bairro:", BAIRRO, "<br>Solicitações:", n)
  )
) +
  geom_col(fill = "#3182bd") +
  coord_flip() +
  labs(title = "Top 10 bairros com mais solicitações",
       x = "Bairro", y = "Quantidade") +
  theme_minimal(base_size = 13)

ggplotly(grafico_bairros_interativo, tooltip = "text")
tabela_servicos <- dados |>
  filter(!is.na(GRUPOSERVICO_DESCRICAO), !is.na(SERVICO_DESCRICAO)) |>
  count(GRUPOSERVICO_DESCRICAO, SERVICO_DESCRICAO, sort = TRUE) |>
  rename(`Grupo de serviço` = GRUPOSERVICO_DESCRICAO,
         Serviço = SERVICO_DESCRICAO,
         Quantidade = n)

datatable(
  tabela_servicos,
  options = list(
    pageLength = 10,
    language = list(url = "//cdn.datatables.net/plug-ins/1.10.11/i18n/Portuguese-Brasil.json")
  ),
  rownames = FALSE
)

O uso de gráfico e tabela interativos facilita a exploração dos dados pelo leitor, permitindo observar quantidades e categorias de forma dinâmica.

Geografia

dados_mapa <- dados |>
  filter(!is.na(latitude), !is.na(longitude))

ggplot(dados_mapa, aes(x = longitude, y = latitude)) +
  geom_point(alpha = 0.25, color = "#08519c", size = 1) +
  labs(title = "Distribuição geográfica das solicitações com coordenadas",
       x = "Longitude", y = "Latitude") +
  theme_minimal(base_size = 13)

amostra_mapa <- dados_mapa |>
  sample_n(size = min(6000, nrow(dados_mapa)))

plot_ly(
  amostra_mapa,
  x = ~longitude,
  y = ~latitude,
  type = "scatter",
  mode = "markers",
  text = ~paste(
    "Bairro:", BAIRRO,
    "<br>Serviço:", SERVICO_DESCRICAO,
    "<br>Situação:", SITUACAO
  ),
  marker = list(size = 4, opacity = 0.45)
) |>
  layout(
    title = "Mapa interativo aproximado das solicitações com coordenadas",
    xaxis = list(title = "Longitude"),
    yaxis = list(title = "Latitude")
  )

A visualização geográfica utiliza apenas registros com latitude e longitude válidas. O mapa interativo permite explorar pontos individualmente e observar a distribuição espacial das solicitações no território.

Discussão

Os resultados indicam que as solicitações urbanas registradas pela Emlurb em 2024 apresentam concentração em determinados bairros, grupos de serviço e regiões administrativas. Essa concentração pode estar relacionada a fatores como densidade populacional, infraestrutura urbana, extensão territorial, facilidade de acesso aos canais de atendimento e intensidade de uso dos serviços públicos.

A predominância de alguns grupos e serviços mostra que determinadas demandas urbanas são mais recorrentes no cotidiano da cidade. Essa informação pode ser útil para a gestão pública, pois ajuda a identificar áreas em que há maior procura por manutenção e atendimento.

A análise temporal também é importante, pois mostra que o volume de solicitações pode variar ao longo dos meses, trimestres e dias da semana. Esses padrões podem apoiar o planejamento das equipes, a organização de escalas e a priorização de serviços em períodos de maior demanda.

O cruzamento entre bairro e grupo de serviço fornece uma visão mais detalhada das necessidades locais. Em vez de observar apenas o volume total de chamados, essa análise permite identificar o tipo de demanda mais comum em cada localidade.

Os indicadores de taxa de atendimento e tempo médio agregam uma visão operacional ao projeto. Eles permitem observar não apenas onde e quais demandas ocorrem, mas também como essas solicitações evoluem dentro do fluxo de atendimento.

Limitações da análise

Apesar do volume expressivo de registros, a análise apresenta algumas limitações. A primeira delas está relacionada à existência de valores ausentes, principalmente nas variáveis de latitude e longitude. Isso limita a precisão das análises geográficas.

Outra limitação é que a base representa apenas as solicitações registradas oficialmente pela população. Portanto, os dados não indicam necessariamente todos os problemas urbanos existentes no Recife, mas apenas aqueles que foram informados e registrados no sistema da Emlurb.

Também é importante destacar que bairros com maior número de solicitações não necessariamente possuem mais problemas urbanos. Esse resultado pode estar associado à população do bairro, ao maior conhecimento sobre o canal 156, à extensão territorial ou à maior disposição dos moradores em registrar solicitações.

Além disso, esta análise é exploratória e não busca estabelecer relações causais. Os resultados indicam padrões observados na base, mas não explicam sozinhos as causas desses padrões.

Conclusão

A análise exploratória das solicitações urbanas registradas pela Central de Atendimento da Emlurb 156 permitiu identificar padrões relevantes nas demandas da população do Recife em 2024. Os resultados mostram concentração de solicitações em determinados bairros, predominância de alguns grupos de serviços e variações temporais no volume de chamados.

A preparação dos dados foi uma etapa essencial do projeto, pois permitiu converter datas, padronizar textos, criar variáveis temporais, calcular tempo de atendimento, taxa de atendimento e identificar limitações relacionadas a valores ausentes. A partir dessas transformações, foi possível construir gráficos, tabelas e visualizações interativas para compreender melhor a base.

Do ponto de vista da gestão pública, os resultados podem contribuir para a priorização de serviços urbanos, acompanhamento das demandas por região e planejamento de ações de manutenção. A análise também reforça a importância dos dados abertos como ferramenta de transparência e apoio à tomada de decisão.

Como trabalhos futuros, recomenda-se cruzar a base da Emlurb com outros dados públicos, como população por bairro, indicadores socioeconômicos, dados de chuva e infraestrutura urbana. Também seria possível aplicar técnicas de modelagem preditiva para estimar períodos e regiões com maior probabilidade de aumento nas solicitações.

Referências

Prefeitura do Recife. Portal de Dados Abertos. Central de Atendimento de Serviços da Emlurb - 156. Disponível em: https://dados.recife.pe.gov.br/dataset/central-de-atendimento-de-servicos-da-emlurb-156.

Wickham, H.; Grolemund, G. R for Data Science. O’Reilly Media.

Tukey, J. W. Exploratory Data Analysis. Addison-Wesley.