Solicitações de Atendimento Pré-Hospitalar (SAMU) em Pernambuco — 2025

O que 127 mil chamados de urgência revelam sobre quando, onde e para quem o socorro é acionado

Introdução

O problema

Os serviços de atendimento pré-hospitalar — articulados pelo SAMU e pelas centrais de regulação de urgências — são a primeira linha de resposta do sistema de saúde diante de situações de risco iminente à vida. Cada minuto de antecipação no socorro pode separar um desfecho favorável de um agravamento irreversível. Por isso, entender o padrão das solicitações não é um exercício estatístico abstrato: é insumo direto para dimensionar ambulâncias, equipes e bases regionais ao longo do tempo.

Em um estado populoso e com forte concentração metropolitana como Pernambuco, a demanda por urgência não é uniforme. Ela varia por mês, dia da semana, hora, município, perfil do paciente e natureza clínica da ocorrência. Compreender essa variação é o que permite sair de uma alocação de recursos “no escuro” para um planejamento orientado por evidência.

Por que isso interessa

A pergunta que orienta o trabalho é prática e direta:

Como a demanda por atendimento pré-hospitalar se distribui ao longo de 2025 em Pernambuco — e o que esse padrão revela sobre onde, quando e para quem o sistema precisa estar mais bem preparado?

Para um gestor de saúde, saber que tipo de ocorrência domina cada horário, quais municípios concentram a demanda e — sobretudo — quais categorias de chamado raramente se convertem em atendimento efetivo transforma diretamente a forma de escalar plantões e desenhar protocolos de regulação.

Abordagem

A estratégia percorre cinco etapas:

  1. Importação de uma base pública real, em CSV, com mais de 127 mil registros e 12 variáveis, cobrindo os primeiros oito meses de 2025.
  2. Limpeza e padronização — remoção de duplicatas, tratamento de ausentes, correção de idades implausíveis e criação de variáveis derivadas (mês, dia da semana, período do dia, faixa etária e indicador de desfecho).
  3. Análise exploratória organizada em eixos (temporal, geográfico, clínico, demográfico e operacional), com gráficos e tabelas interativas.
  4. Descobertas não-óbvias — cruzamentos que revelam padrões invisíveis numa leitura superficial.
  5. Síntese em recomendações acionáveis.

A aposta central é ir além do óbvio: não basta mostrar “há muitos atendimentos”. Buscamos o que os dados escondem — como o fato de que certas categorias de chamado quase nunca terminam em remoção efetiva, consumindo capacidade operacional sem desfecho clínico.

A quem se destina

Gestores de saúde pública, coordenadores de centrais de regulação (SAMU/CIODS), pesquisadores de saúde coletiva e profissionais de planejamento de serviços de emergência se beneficiam diretamente das descobertas aqui apresentadas.


Origem dos Dados

Fonte

Os dados foram obtidos no Portal de Dados Abertos do Governo de Pernambuco, que disponibiliza publicamente os registros operacionais das centrais de regulação de urgências.

Fonte: Portal de Dados Abertos de PernambucoSolicitações de Atendimento (2025).

Propósito original e contexto de coleta

A finalidade original da base é operacional, não científica: cada linha registra uma solicitação recebida pela central, com o objetivo de acompanhar o atendimento e gerar indicadores de gestão. Os dados foram coletados ao longo de 2025, cobrindo de 1º de janeiro a 31 de agosto (243 dias). Por terem origem administrativa, carregam as imperfeições típicas desse tipo de fonte — campos em branco, abreviações, inconsistências de digitação — exatamente o que torna a etapa de limpeza indispensável.

A base original contém 127.304 registros e 12 variáveis. Os valores ausentes vêm registrados como células vazias (""), e não como NA explícito.

Dicionário de variáveis

Variável Descrição Peculiaridades
data Data da solicitação Cobre jan–ago/2025
hora_minuto Horário (HH:MM:SS) Base para hora e período
municipio Município da ocorrência 73 municípios; 1 ausente
bairro Bairro da ocorrência Alta cardinalidade (~970)
endereco Endereço aproximado ~7,7 mil ausentes
origem_chamado Local de origem do chamado Residencial, via pública, etc.
tipo Categoria clínica 18 categorias válidas
subtipo Detalhamento clínico ~110 valores; ~2,6 mil ausentes
sexo Sexo do paciente ~2,1 mil ausentes
idade Idade declarada ~16,8 mil ausentes; contém erros (>110)
motivo_finalizacao Motivo de finalização da chamada Preenchido em minoria dos casos (~68% ausente)
motivo_desfecho Desfecho final Base do indicador de êxito

Pela altíssima taxa de ausência em motivo_finalizacao (cerca de dois terços vazios), essa variável é mantida na base, mas não é usada como eixo analítico principal — o desfecho é medido por motivo_desfecho, que está completo.


Pacotes Necessários

Todos os pacotes são carregados antecipadamente, para que a análise seja replicável sem surpresas.

library(dplyr)      # manipulação e transformação dos dados
library(tidyr)      # reorganização entre formatos largo e longo
library(stringr)    # padronização de texto
library(lubridate)  # datas, horas, dia da semana
library(janitor)    # padronização de nomes e tabelas
library(ggplot2)    # base dos gráficos
library(plotly)     # interatividade (tooltip, zoom)
library(DT)         # tabelas interativas
library(scales)     # formatação de eixos e percentuais
library(knitr)      # renderização de tabelas
library(kableExtra) # estilização de tabelas
Pacote Utilização
dplyr Filtragem, agregação e novas colunas
tidyr Pivotagem largo/longo
stringr Limpeza e normalização de campos textuais
lubridate Conversão de datas e extração de hora/dia da semana
janitor Padronização de nomes de colunas
ggplot2 Construção visual dos gráficos
plotly Versões interativas dos gráficos
DT Tabelas exploráveis pelo leitor
scales Percentuais e formatação de eixos
knitr / kableExtra Tabelas-resumo formatadas

Preparação dos Dados

Importação

A base usa ; como separador (padrão brasileiro) e aspas em todos os campos. Células vazias são lidas como NA, e os nomes de colunas são padronizados.

dados_brutos <- read.csv2(
  "dataSAMU_full.csv",
  stringsAsFactors = FALSE,
  na.strings = c("", "NA"),
  encoding = "UTF-8",
  check.names = TRUE
)

dados_brutos <- janitor::clean_names(dados_brutos)
dim(dados_brutos)
## [1] 127304     12

Limpeza, passo a passo

Cada decisão de limpeza é justificada — limpar sem explicar o critério compromete a reprodutibilidade.

Remoção de duplicatas

A base contém registros idênticos (mesma data, hora, local e desfecho), que representam o mesmo evento contado mais de uma vez. São removidos para não inflar contagens.

n_antes  <- nrow(dados_brutos)
dados    <- dados_brutos %>% distinct()
n_depois <- nrow(dados)
cat("Duplicatas removidas:", n_antes - n_depois)
## Duplicatas removidas: 136

Datas, hora e dia da semana

Convertemos data para Date e derivamos mês, dia da semana e hora cheia — dimensões centrais para a análise temporal de um ano inteiro.

Sys.setlocale("LC_TIME", "pt_BR.UTF-8")  # nomes de mês/dia em português (ignore se indisponível)
## [1] "pt_BR.UTF-8"
dados <- dados %>%
  mutate(
    data    = ymd(data),
    mes     = month(data, label = TRUE, abbr = TRUE),
    dia_sem = wday(data, label = TRUE, abbr = TRUE, week_start = 1),
    hora    = hour(hms(hora_minuto))
  )

Idade: correção de valores implausíveis

A inspeção revelou idades absurdas (máximo de 858 anos), claramente erros de digitação. Idades acima de 110 são convertidas em ausente.

n_erro <- sum(dados$idade > 110, na.rm = TRUE)
dados  <- dados %>% mutate(idade = ifelse(idade > 110, NA, idade))
cat("Idades implausíveis corrigidas:", n_erro)
## Idades implausíveis corrigidas: 22

Padronização do sexo

Os ~2,1 mil registros sem sexo são rotulados como "Não informado", preservando esses casos nas demais análises.

dados <- dados %>%
  mutate(
    sexo = case_when(
      str_detect(toupper(sexo), "^M") ~ "Masculino",
      str_detect(toupper(sexo), "^F") ~ "Feminino",
      TRUE ~ "Não informado"
    )
  )

Variáveis derivadas

Criamos as dimensões analíticas: faixa etária, período do dia e concluida_exito — indicador lógico de efetividade operacional (a ocorrência terminou com êxito ou não).

dados <- dados %>%
  mutate(
    faixa_etaria = case_when(
      is.na(idade)  ~ "Não informada",
      idade <= 12   ~ "Criança (0-12)",
      idade <= 18   ~ "Adolescente (13-18)",
      idade <= 40   ~ "Adulto Jovem (19-40)",
      idade <= 60   ~ "Adulto (41-60)",
      TRUE          ~ "Idoso (60+)"
    ),
    periodo = case_when(
      hora < 6  ~ "Madrugada",
      hora < 12 ~ "Manhã",
      hora < 18 ~ "Tarde",
      TRUE      ~ "Noite"
    ),
    concluida_exito = str_detect(toupper(motivo_desfecho), "XITO")  # capta "ÊXITO"
  ) %>%
  mutate(
    periodo = factor(periodo, levels = c("Madrugada","Manhã","Tarde","Noite")),
    faixa_etaria = factor(faixa_etaria, levels = c(
      "Criança (0-12)","Adolescente (13-18)","Adulto Jovem (19-40)",
      "Adulto (41-60)","Idoso (60+)","Não informada")),
    sexo = factor(sexo, levels = c("Masculino","Feminino","Não informado"))
  )

A base limpa

Em vez de despejar str() ou summary() cru, segue um resumo consolidado das variáveis de interesse:

Variável Valor
Registros (após limpeza) 127.168
Período coberto 01/01 a 31/08/2025
Dias distintos 243
Municípios 73
Categorias clínicas 19
Idade (mín–máx válida) 0 – 110
Idade ausente 16.843
Sexo ausente 2.124
Ocorrências com êxito 50.263 (39.5%)

Amostra condensada do conjunto final (8 primeiras linhas):

data hora_minuto municipio tipo subtipo sexo idade periodo motivo_desfecho
2025-01-01 00:00:45 RECIFE DROGAS ALCOOLISMO Masculino 25 Madrugada SEM DESFECHO
2025-01-01 00:08:03 POMBOS CAUSAS EXTERNAS ACIDENTE DE TRANSITO ENVOLVENDO MOTO Masculino 22 Madrugada
  1. OCORRÊNCIA CONCLUÍDA COM ÊXITO
2025-01-01 00:08:35 PAULISTA CAUSAS EXTERNAS QUEDA DA PROPRIA ALTURA Feminino 45 Madrugada SEM DESFECHO
2025-01-01 00:17:44 JABOATAO DOS GUARARAPES DROGAS INTOXICACAO EXOGENA Feminino 46 Madrugada SEM DESFECHO
2025-01-01 00:19:24 IGARASSU GASTROINTESTINAL DOR ABDOMINAL Masculino 65 Madrugada SEM DESFECHO
2025-01-01 00:20:55 ESCADA CAUSAS EXTERNAS ACIDENTE DE TRANSITO COM CARROS Masculino 57 Madrugada SEM DESFECHO
2025-01-01 00:21:11 JABOATAO DOS GUARARAPES NEUROLOGICA CONFUSAO MENTAL Masculino 56 Madrugada
  1. OCORRÊNCIA CONCLUÍDA COM ÊXITO
2025-01-01 00:22:49 SIRINHAEM GERAIS/OUTROS OUTROS Masculino NA Madrugada SEM DESFECHO

Análise Exploratória

A análise está organizada em abas, cada uma respondendo a uma pergunta. Navegue pelos eixos abaixo.

Quando acontece

Por mês

A demanda é alta e relativamente estável ao longo do ano, oscilando em torno de 15–16 mil chamados mensais — sinal de que urgência não tira férias e o serviço opera sob pressão constante.

g_mes <- dados %>%
  count(mes) %>%
  ggplot(aes(x = mes, y = n, group = 1)) +
  geom_area(fill = cor_principal, alpha = 0.20) +
  geom_line(color = cor_secundaria, linewidth = 1.1) +
  geom_point(color = cor_secundaria, size = 2) +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Solicitações por mês (2025)", x = NULL, y = "Nº de solicitações") +
  theme_minimal(base_size = 13)
ggplotly(g_mes)

Por dia da semana

Os fins de semana concentram mais ocorrências, coerente com lazer, trânsito e consumo de álcool — informação direta para escalar plantões.

g_dow <- dados %>%
  count(dia_sem) %>%
  ggplot(aes(x = dia_sem, y = n, fill = n)) +
  geom_col() +
  scale_fill_gradient(low = "#C084FC", high = cor_secundaria) +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Solicitações por dia da semana", x = NULL, y = "Nº de solicitações") +
  theme_minimal(base_size = 13) + theme(legend.position = "none")
ggplotly(g_dow)

Por hora

A curva hora a hora mostra vale na madrugada e platô elevado durante todo o dia, com pico no fim de tarde — padrão clássico de demanda urbana.

g_hora <- dados %>%
  count(hora) %>%
  ggplot(aes(x = hora, y = n)) +
  geom_area(fill = cor_principal, alpha = 0.25) +
  geom_line(color = cor_secundaria, linewidth = 1) +
  geom_point(color = cor_secundaria, size = 1.4) +
  scale_x_continuous(breaks = seq(0, 23, 2)) +
  scale_y_continuous(labels = label_number(big.mark = ".")) +
  labs(title = "Distribuição ao longo do dia", x = "Hora", y = "Nº de solicitações") +
  theme_minimal(base_size = 13)
ggplotly(g_hora)

Onde acontece

Municípios

A demanda é fortemente concentrada na Região Metropolitana: Recife sozinho responde por quase 40% dos chamados, e os cinco primeiros municípios somam a maioria absoluta. O reforço de recursos deve ser geograficamente seletivo.

top_mun <- dados %>% count(municipio, sort = TRUE) %>% slice_head(n = 10)
g_mun <- ggplot(top_mun, aes(x = reorder(municipio, n), y = n)) +
  geom_col(fill = cor_principal) +
  geom_text(aes(label = format(n, big.mark=".")), hjust = -0.1, size = 3) +
  coord_flip() +
  scale_y_continuous(labels = label_number(big.mark="."), expand = expansion(mult = c(0,.15))) +
  labs(title = "Top 10 municípios", x = NULL, y = "Nº de solicitações") +
  theme_minimal(base_size = 12)
ggplotly(g_mun)

Origem do chamado

A maioria parte de residências, seguida de via pública — esta última, onde se acumulam acidentes e agressões.

g_orig <- dados %>%
  filter(!is.na(origem_chamado)) %>%
  count(origem_chamado, sort = TRUE) %>% slice_head(n = 6) %>%
  ggplot(aes(x = reorder(origem_chamado, n), y = n)) +
  geom_col(fill = cor_secundaria) +
  geom_text(aes(label = format(n, big.mark=".")), hjust = -0.1, size = 3) +
  coord_flip() +
  scale_y_continuous(labels = label_number(big.mark="."), expand = expansion(mult = c(0,.15))) +
  labs(title = "Origem dos chamados", x = NULL, y = "Nº de solicitações") +
  theme_minimal(base_size = 12)
ggplotly(g_orig)

O que acontece

Tipos de ocorrência

Causas externas (acidentes, quedas, agressões) e gerais/outros lideram, seguidas de neurológicas e psiquiátricas — estas duas últimas, surpreendentemente, à frente de cardiológicas e respiratórias.

g_tipo <- dados %>%
  filter(!is.na(tipo)) %>%
  count(tipo, sort = TRUE) %>%
  ggplot(aes(x = reorder(tipo, n), y = n)) +
  geom_col(fill = cor_principal) +
  coord_flip() +
  scale_y_continuous(labels = label_number(big.mark=".")) +
  labs(title = "Solicitações por categoria clínica", x = NULL, y = "Nº de solicitações") +
  theme_minimal(base_size = 11)
ggplotly(g_tipo)

Subtipos mais frequentes

No detalhe, acidentes de moto, quedas, agressividade e convulsões lideram — um retrato do que de fato mobiliza o socorro.

g_sub <- dados %>%
  filter(!is.na(subtipo), subtipo != "OUTROS") %>%
  count(subtipo, sort = TRUE) %>% slice_head(n = 12) %>%
  ggplot(aes(x = reorder(subtipo, n), y = n)) +
  geom_col(fill = cor_secundaria) +
  coord_flip() +
  scale_y_continuous(labels = label_number(big.mark=".")) +
  labs(title = "Top 12 subtipos (excluindo 'Outros')", x = NULL, y = "Nº de solicitações") +
  theme_minimal(base_size = 10)
ggplotly(g_sub)

Quem é atendido

Sexo

Predomínio masculino, padrão esperado num cenário com forte peso de causas externas e violência.

g_sexo <- dados %>%
  count(sexo) %>%
  ggplot(aes(x = sexo, y = n, fill = sexo)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = format(n, big.mark=".")), vjust = -0.4, fontface = "bold") +
  scale_fill_manual(values = c(cor_secundaria, cor_destaque, cor_neutra)) +
  scale_y_continuous(labels = label_number(big.mark="."), expand = expansion(mult=c(0,.12))) +
  labs(title = "Solicitações por sexo", x = NULL, y = "Nº de solicitações") +
  theme_minimal(base_size = 13) + theme(legend.position = "none")
ggplotly(g_sexo)

Faixa etária

O adulto jovem (19–40) e o idoso (60+) são os grupos mais atendidos — dois perfis de risco distintos: o primeiro por causas externas, o segundo por agravos clínicos.

g_faixa <- dados %>%
  filter(faixa_etaria != "Não informada") %>%
  count(faixa_etaria) %>%
  ggplot(aes(x = faixa_etaria, y = n, fill = faixa_etaria)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = format(n, big.mark=".")), vjust = -0.4, size = 3) +
  scale_fill_manual(values = paleta_seq) +
  scale_y_continuous(labels = label_number(big.mark="."), expand = expansion(mult=c(0,.12))) +
  labs(title = "Solicitações por faixa etária", x = NULL, y = "Nº de solicitações") +
  theme_minimal(base_size = 11) +
  theme(legend.position = "none", axis.text.x = element_text(angle = 20, hjust = 1))
ggplotly(g_faixa)

Faixa etária por sexo

Combinando as dimensões, vê-se a concentração masculina entre adultos jovens e o equilíbrio (ou inversão) nas faixas mais velhas.

g_pir <- dados %>%
  filter(faixa_etaria != "Não informada", sexo != "Não informado") %>%
  count(faixa_etaria, sexo) %>%
  ggplot(aes(x = faixa_etaria, y = n, fill = sexo)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c(cor_secundaria, cor_destaque)) +
  scale_y_continuous(labels = label_number(big.mark=".")) +
  coord_flip() +
  labs(title = "Faixa etária por sexo", x = NULL, y = "Nº de solicitações", fill = "Sexo") +
  theme_minimal(base_size = 11)
ggplotly(g_pir)

Descobertas não-óbvias

O coração analítico do relatório: cruzamentos que não saltam aos olhos.

Efetividade por categoria

Esta é a descoberta mais importante. Medindo a proporção de ocorrências concluídas com êxito por categoria, surge um padrão revelador: chamados psiquiátricos (~21%) e de drogas (~25%) têm taxa de êxito drasticamente baixa — não por falha clínica, mas porque terminam majoritariamente em desistência, recusa de remoção ou evasão do paciente. No outro extremo, ocorrências oncológicas, respiratórias e obstétricas superam 50%.

Implicação: uma fração relevante da capacidade operacional é mobilizada para chamados que não se convertem em atendimento efetivo. Isso aponta para a necessidade de protocolos específicos de regulação para casos psiquiátricos e de álcool/drogas.

efetiv <- dados %>%
  filter(!is.na(tipo)) %>%
  group_by(tipo) %>%
  summarise(total = n(), taxa = round(100 * mean(concluida_exito), 1), .groups = "drop") %>%
  filter(total >= 500) %>% arrange(taxa)

g_ef <- ggplot(efetiv, aes(x = reorder(tipo, taxa), y = taxa, fill = taxa)) +
  geom_col() +
  geom_text(aes(label = paste0(taxa, "%")), hjust = -0.1, size = 3) +
  scale_fill_gradient(low = cor_destaque, high = cor_principal) +
  coord_flip(ylim = c(0, 70)) +
  labs(title = "Taxa de conclusão com êxito por categoria",
       subtitle = "Categorias com ≥ 500 ocorrências",
       x = NULL, y = "% concluída com êxito") +
  theme_minimal(base_size = 11) + theme(legend.position = "none")
ggplotly(g_ef)

Tipo × período (heatmap)

Cruzando categoria e período, vê-se onde cada tipo se concentra no dia. Causas externas crescem à tarde/noite; psiquiátricas e drogas pesam mais na madrugada.

heat <- dados %>%
  filter(!is.na(tipo)) %>%
  count(tipo, periodo) %>%
  group_by(tipo) %>% mutate(total = sum(n)) %>% ungroup() %>%
  filter(total >= 2000)

g_heat <- ggplot(heat, aes(x = periodo, y = reorder(tipo, total), fill = n)) +
  geom_tile(color = "white") +
  geom_text(aes(label = format(n, big.mark=".")), size = 2.6, color = "white", fontface = "bold") +
  scale_fill_gradient(low = "#C084FC", high = cor_secundaria, name = "Nº",
                      labels = label_number(big.mark=".")) +
  labs(title = "Categoria clínica × período do dia",
       subtitle = "Categorias com ≥ 2.000 ocorrências", x = NULL, y = NULL) +
  theme_minimal(base_size = 11)
ggplotly(g_heat)

Sazonalidade do tipo principal

Acompanhando as três maiores categorias mês a mês, é possível ver se alguma tem comportamento sazonal distinto ao longo do ano.

top3 <- dados %>% filter(!is.na(tipo)) %>% count(tipo, sort = TRUE) %>% slice_head(n = 3) %>% pull(tipo)
g_saz <- dados %>%
  filter(tipo %in% top3) %>%
  count(mes, tipo) %>%
  ggplot(aes(x = mes, y = n, color = tipo, group = tipo)) +
  geom_line(linewidth = 1) + geom_point(size = 1.8) +
  scale_color_manual(values = c(cor_destaque, cor_principal, cor_neutra)) +
  scale_y_continuous(labels = label_number(big.mark=".")) +
  labs(title = "Evolução mensal das 3 maiores categorias",
       x = NULL, y = "Nº de solicitações", color = "Categoria") +
  theme_minimal(base_size = 12)
ggplotly(g_saz)

Tabela cruzada interativa

Explore livremente o cruzamento tipo × período, com busca e ordenação.

cruz <- dados %>%
  filter(!is.na(tipo)) %>%
  count(tipo, periodo) %>%
  pivot_wider(names_from = periodo, values_from = n, values_fill = 0) %>%
  mutate(Total = Madrugada + Manhã + Tarde + Noite) %>%
  arrange(desc(Total))

datatable(cruz, rownames = FALSE,
          options = list(pageLength = 10, dom = 'tip'),
          caption = "Solicitações por categoria clínica e período do dia") %>%
  formatStyle("Total", fontWeight = "bold")

Amostra explorável da base

A base completa tem mais de 127 mil linhas — exibir tudo seria impraticável. Abaixo, uma amostra aleatória de 500 registros da base limpa, com busca, filtro e ordenação:

set.seed(42)
dados %>%
  sample_n(500) %>%
  select(Data = data, Hora = hora_minuto, Município = municipio, Bairro = bairro,
         Tipo = tipo, Subtipo = subtipo, Sexo = sexo, Idade = idade,
         Período = periodo, Desfecho = motivo_desfecho) %>%
  datatable(rownames = FALSE, filter = "top",
            options = list(pageLength = 10, scrollX = TRUE,
                           language = list(search = "Buscar:")))

Conclusões

O problema, revisitado

Partimos da pergunta de como a demanda por atendimento pré-hospitalar se distribui ao longo de 2025 em Pernambuco. A base de 127 mil chamados em oito meses permitiu mapear esse comportamento em cinco dimensões: tempo, espaço, natureza clínica, perfil do paciente e desfecho operacional.

Como abordamos

Importamos uma base pública real, tratamos suas imperfeições (136 duplicatas, idades absurdas de até 858 anos, milhares de ausências em sexo e idade) e criamos variáveis derivadas — mês, dia da semana, período, faixa etária e, sobretudo, um indicador de êxito operacional que abriu a análise mais reveladora.

Principais descobertas

  1. Demanda alta e constante: 15–16 mil chamados/mês, sem alívio sazonal expressivo — o serviço opera sob pressão o ano todo, com leve concentração em fins de semana e pico no fim de tarde.
  2. Concentração geográfica extrema: Recife responde por quase 40% dos chamados; a Região Metropolitana absorve a esmagadora maioria.
  3. Perfil bimodal: homens adultos jovens (causas externas) e idosos (agravos clínicos) são os grupos mais atendidos.
  4. Descoberta central: categorias psiquiátricas (~21%) e de drogas (~25%) têm taxa de conclusão com êxito muito baixa, pois terminam em desistência ou recusa — consumindo capacidade operacional sem atendimento efetivo, ao contrário de oncológicas e respiratórias (>50%).

Implicações para os clientes da análise

Para gestores e centrais de regulação, os achados sugerem: (a) escala dimensionada por dia da semana e hora, reforçando fins de semana e o fim de tarde; (b) posicionamento preferencial de viaturas na RMR, sobretudo Recife; e (c) protocolos de regulação específicos para chamados psiquiátricos e de álcool/drogas, reduzindo deslocamentos que não resultam em remoção.

Limitações

A base cobre apenas jan–ago de 2025, impedindo conclusões sobre o ano completo (faltam os meses de festas de fim de ano). Campos como motivo_finalizacao têm ~68% de ausência, e a idade não informada (~13%) limita parte das análises demográficas. Os dados são autodeclarados na central, sujeitos a erro de preenchimento.

Trabalhos futuros

Estender a análise a uma série anual completa e a múltiplos anos permitiria isolar sazonalidades (Carnaval, São João, Réveillon) e construir um modelo preditivo de demanda por região e horário. Cruzar com dados de população e malha viária possibilitaria um índice de risco georreferenciado para alocação dinâmica de ambulâncias.


Referências

  • Portal de Dados Abertos de Pernambuco — Solicitações de Atendimento (2025). Disponível em: http://dados.pe.gov.br/
  • Wickham, H. et al. (2024). R for Data Science. O’Reilly.
  • R Core Team (2025). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing.
  • Xie, Y. (2024). Dynamic Documents with R and knitr.
  • Barré-Sinoussi, J. rmdformats: templates de documentos R Markdown. Disponível em: https://github.com/juba/rmdformats