ProjetoFinal

Alexander Fábio da Silva

2025-11-19

Navegação

1. Introdução

Exemplo de título

2. Pacotes Requeridos

Os seguintes pacotes são necessários para a execução dos códigos presentes no projeto.


library(readr)
library(dplyr)
library(stringr)
library(tidyr)
library(lubridate)
library(ggplot2)
library(tidytext)

3. Preparação dos dados


3.1 Carregando os dados e renomeando as colunas


library(readr)
library(dplyr)
library(stringr)
library(tidyr)
library(lubridate)

# 1. Carregamento do Dataset
dados <- read_delim("ocorrencias2025.csv", 
                    delim = ";", 
                    locale = locale(encoding = "ISO-8859-1"),
                    col_names = FALSE) 

# 2. Renomeação das Colunas
dados <- dados %>%
  rename(
    DATA = X1,
    HORA = X2,
    MUNICIPIO = X3,
    BAIRRO = X4,
    ENDERECO = X5,
    LOCAL_OCORRENCIA = X6,
    TIPO_OCORRENCIA = X7,
    SUBTIPO_OCORRENCIA = X8,
    SEXO = X9,
    IDADE = X10,
    DESFECHO = X11, 
    OBSERVACAO = X12
  )

# 3. Visualização das 10 primeiras linhas após renomeação
print("Visualização das 10 primeiras linhas (amostra do dataset após renomeação):")
## [1] "Visualização das 10 primeiras linhas (amostra do dataset após renomeação):"
dados %>%
  head(5) %>% # 
  knitr::kable() # 
DATA HORA MUNICIPIO BAIRRO ENDERECO LOCAL_OCORRENCIA TIPO_OCORRENCIA SUBTIPO_OCORRENCIA SEXO IDADE DESFECHO OBSERVACAO
2025-01-01 00:00:45 RECIFE BOA VISTA AV DA BOA VISTA RESIDENCIAL DROGAS ALCOOLISMO MASCULINO 25 DESISTÊNCIA DA SOLICITAÇÃO SEM DESFECHO
2025-01-01 00:08:03 POMBOS ALTO DO FRADE R SARDINHA VIA PÚBLICA CAUSAS EXTERNAS ACIDENTE DE TRANSITO ENVOLVENDO MOTO MASCULINO 22 NA 1. OCORRÊNCIA CONCLUÍDA COM ÊXITO
2025-01-01 00:08:35 PAULISTA NOSSA SENHORA DO O AV CLAUDIO JOSE GUEIROS LEIT NOSSA.SENHORA.DO.O RESIDENCIAL CAUSAS EXTERNAS QUEDA DA PROPRIA ALTURA FEMININO 45 DESISTÊNCIA DA SOLICITAÇÃO SEM DESFECHO
2025-01-01 00:17:44 JABOATAO DOS GUARARAPES MARCOS FREIRE RUA DOMINGO FERNANDES N RESIDENCIAL DROGAS INTOXICACAO EXOGENA FEMININO 46 REMOVIDO ANTES DO ATENDIMENTO POR PARTICULARES SEM DESFECHO
2025-01-01 00:19:24 IGARASSU CRUZ DE REBOUCAS R JOCA RODRIGUES VIA PÚBLICA GASTROINTESTINAL DOR ABDOMINAL MASCULINO 65 REMOVIDO ANTES DO ATENDIMENTO POR PARTICULARES SEM DESFECHO


3.2 Tratamento de NA/Vazios


# 1. Converter strings vazias ("") para NA em todas as colunas de texto.
dados <- dados %>%
  mutate(across(where(is.character), ~na_if(., "")))

# 2. Tratamento de NA em colunas categóricas
dados <- dados %>%
  mutate(DESFECHO = replace_na(DESFECHO, "NAO INFORMADO")) %>%
  mutate(OBSERVACAO = replace_na(OBSERVACAO, "NAO INFORMADA")) %>%
  mutate(SEXO = replace_na(SEXO, "NAO INFORMADO"))

# 3. Remoção de NA em colunas críticas (ID, idade)
dados <- dados %>%
  filter(!is.na(IDADE))

# 4. Verificação final
print("Valores ausentes após o tratamento:")
## [1] "Valores ausentes após o tratamento:"
dados %>% 
  summarise_all(~sum(is.na(.))) %>% 
  knitr::kable()
DATA HORA MUNICIPIO BAIRRO ENDERECO LOCAL_OCORRENCIA TIPO_OCORRENCIA SUBTIPO_OCORRENCIA SEXO IDADE DESFECHO OBSERVACAO
0 0 0 0 7348 3 1 1875 0 0 0 0


3.3 Conversão de tipos e criaçao de variáveis


# 1. Conversão de Tipos de Dados
dados <- dados %>%
  mutate(DATA_HORA = paste(DATA, HORA, sep = " "),
         DATA_HORA = lubridate::ymd_hms(DATA_HORA))

# 2. Extração de novas variáveis temporais
dados <- dados %>%
  mutate(
    MES = lubridate::month(DATA_HORA, label = TRUE, abbr = TRUE),
    MES_NUMERO = lubridate::month(DATA_HORA),
    DIA_SEMANA = lubridate::wday(DATA_HORA, label = TRUE),
    HORA_DIA = lubridate::hour(DATA_HORA)
  )

# 3. Visualizar as novas colunas
print("Estrutura e novas colunas após Feature Engineering:")
## [1] "Estrutura e novas colunas após Feature Engineering:"
str(dados$DATA_HORA)
##  POSIXct[1:110457], format: "2025-01-01 00:00:45" "2025-01-01 00:08:03" "2025-01-01 00:08:35" ...
head(dados$MES)
## [1] jan jan jan jan jan jan
## 12 Levels: jan < fev < mar < abr < mai < jun < jul < ago < set < ... < dez


4. Análise exploratória dos dados


Tipos de ocorrência mais frequentes


library(ggplot2)

# 1. Contagem e ordenação dos Tipos de Ocorrência
top_tipos_ocorrencia <- dados %>%
  count(TIPO_OCORRENCIA, sort = TRUE, name = "CONTAGEM") %>%
  head(10) %>%
  mutate(TIPO_OCORRENCIA = factor(TIPO_OCORRENCIA, levels = TIPO_OCORRENCIA))

# 2. Geração do Gráfico de Barras
grafico_tipos <- ggplot(top_tipos_ocorrencia, aes(x = TIPO_OCORRENCIA, y = CONTAGEM)) +
  geom_bar(stat = "identity", fill = "#0072B2") + 
  geom_text(aes(label = CONTAGEM), vjust = -0.5, size = 3.5) + 
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
  labs(
    title = "Top 10 Tipos de Ocorrência Mais Frequentes",
    x = "Tipo de Ocorrência",
    y = "Número de Chamados",
    caption = "Fonte: Dataset Ocorrências SAMU 2025"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1), 
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

print(grafico_tipos)


Com o gráfico em mãos, é possível notar a alta quantia de ocorrências relacionadas a fatores mentais e psicológicos, com a soma das ocorrências dos tipos Psiquiátrica e Neurológica sendo igual a 23600, não muito distante de ocorrências mais gerais.


Porcentagem de ocorrências por faixa etária


# 1. Criação das Faixas Etárias
dados_faixa <- dados %>%
  mutate(
    FAIXA_ETARIA = case_when(
      IDADE >= 1 & IDADE <= 17 ~ "1-17 Anos (Menor de idade)",
      IDADE >= 18 & IDADE <= 29 ~ "18-29 Anos (Jovem Adulto)",
      IDADE >= 30 & IDADE <= 49 ~ "30-49 Anos (Adulto)",
      IDADE >= 50 & IDADE <= 68 ~ "50-68 Anos (Meia-Idade)",
      IDADE >= 69 ~ "69+ Anos (Idoso)",
      TRUE ~ "Outros/Idade Inválida"
    )
  )

# 2. Cálculo da Porcentagem
contagem_faixa <- dados_faixa %>%
  filter(FAIXA_ETARIA != "Outros/Idade Inválida") %>% 
  count(FAIXA_ETARIA, name = "CONTAGEM") %>%
  mutate(PERCENTUAL = CONTAGEM / sum(CONTAGEM),
         LABEL_GRAFICO = paste0(round(PERCENTUAL * 100, 1), "%"))


# 3. Geração do Gráfico de Pizza 
grafico_pizza <- ggplot(contagem_faixa, aes(x = "", y = PERCENTUAL, fill = FAIXA_ETARIA)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) + 
  geom_text(aes(label = LABEL_GRAFICO), 
            position = position_stack(vjust = 0.5), 
            color = "black", size = 3.5) +
  labs(
    title = "Porcentagem de Ocorrências por Faixa Etária",
    fill = "Faixa Etária",
    caption = "Fonte: Dataset Ocorrências SAMU 2025"
  ) +
  theme_void() + #
  scale_fill_brewer(palette = "Paired") + 
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

print(grafico_pizza)


Ao analisar os resultados, percebe-se que cerca de 28% das ocorrências foram realizadas para pessoas de idade mais avançada (69+), apesar de apenas 10,2% da população Pernambucana ter 65 anos ou mais (fonte: senso IBGE 2022). Isso acende um alerta acerca da infraestrutura necessária para comportar as demandas de saúde dessa parcela da população, que está em pleno crescimento.


Número de ocorrências por mês


# 1. Contagem de Ocorrências por Mês
contagem_mensal <- dados %>%
  count(MES, name = "CONTAGEM") %>%
  filter(!is.na(MES))

# 2. Geração do Gráfico de Linha
grafico_linha <- ggplot(contagem_mensal, aes(x = MES, y = CONTAGEM, group = 1)) + 
  geom_line(color = "#D55E00", size = 1) + 
  geom_point(color = "#D55E00", size = 3) + 
  geom_text(aes(label = CONTAGEM), vjust = -1, size = 3.5) + 
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
  labs(
    title = "Número de Ocorrências do SAMU por Mês em 2025",
    x = "Mês",
    y = "Número de Chamados",
    caption = "Fonte: Dataset Ocorrências SAMU 2025. Dados até o mês de Agosto." 
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

print(grafico_linha)


Bairros do Recife com maior frequência de acidentes de trânsito


# 1. Filtragem e Contagem
top_bairros_acidentes <- dados %>%
  filter(MUNICIPIO == "RECIFE") %>%
  filter(str_detect(SUBTIPO_OCORRENCIA, "ACIDENTE DE TRANSITO")) %>%
  count(BAIRRO, sort = TRUE, name = "CONTAGEM") %>%
  head(10) %>% 
  mutate(BAIRRO = factor(BAIRRO, levels = BAIRRO))

# 2. Geração do Gráfico de Barras
grafico_acidentes <- ggplot(top_bairros_acidentes, aes(x = BAIRRO, y = CONTAGEM)) +
  geom_bar(stat = "identity", fill = "#E69F00") +
  geom_text(aes(label = CONTAGEM), vjust = -0.5, size = 3.5) +
  labs(
    title = "Top 10 Bairros do Recife com Maior Frequência de Acidentes de Trânsito",
    x = "Bairro",
    y = "Número de Ocorrências (Acidentes de Trânsito)",
    caption = "Fonte: Dataset Ocorrências SAMU 2025"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

print(grafico_acidentes)


Com base nos resultados, obtemos a informação que os bairros de Boa Viagem, Ibura e Santo Amaro são os que apresentaram o maior número de acidentes de trânsito até o mês de agosto desse ano. Isso pode se dar à presença de vias movimentadas nesses bairros, com Boa Viagem apresentando três avenidas principais (Domingos Ferreira, Conselheiro Aguiar e Boa Viagem, além da via expressa Via Mangue), Ibura uma rodovia federal com tráfego de veículos pesados (BR-101) e Santo Amaro uma avenida larga com transporte de massa (Cruz Cabugá) que serve para ligar o centro do Recife aos municípios mais ao norte como Olinda e Paulista.


Bairros do Recife com maior frequência de ocorrências relacionadas a drogas


# 1. Filtragem e Contagem
top_bairros_drogas <- dados %>%
  filter(MUNICIPIO == "RECIFE") %>%
  filter(TIPO_OCORRENCIA == "DROGAS") %>%
  count(BAIRRO, sort = TRUE, name = "CONTAGEM") %>%
  head(10) %>% 
  mutate(BAIRRO = factor(BAIRRO, levels = BAIRRO))

# 2. Geração do Gráfico de Barras
grafico_drogas <- ggplot(top_bairros_drogas, aes(x = BAIRRO, y = CONTAGEM)) +
  geom_bar(stat = "identity", fill = "#0072B2") + 
  geom_text(aes(label = CONTAGEM), vjust = -0.5, size = 3.5) +
  labs(
    title = "Top 10 Bairros do Recife com Maior Frequência de Ocorrências 'Drogas'",
    x = "Bairro",
    y = "Número de Ocorrências (Drogas)",
    caption = "Fonte: Dataset Ocorrências SAMU 2025"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

print(grafico_drogas)


O objetivo desta análise foi criar uma conexão entre o uso crítico de drogas (overdose) e a situação sócio-financeira da população. A expectativa era de que bairros do centro expandido (Boa Vista, Santo Antônio, São José, etc) estariam no topo da lista, pela maior presença de pessoas em situação de rua. Entretanto, os dados mostraram que bairros de classe média baixa e de perfil residencial apresentaram uma maior frequência de ocorrências relacionadas ao uso de drogas, apenas com exceções pontuais a esta lógica (Boa Viagem, Santo Amaro…)


Ocorrências mais frequentes na RMR e no interior do estado


library(ggplot2)
library(tidytext)

# 1. Definição da Região Metropolitana do Recife 
municipios_rmr <- c("RECIFE", "OLINDA", "JABOATAO DOS GUARARAPES", "CAMARAGIBE", "PAULISTA", 
                    "ABREU E LIMA", "IGARASSU", "ITAPISSUMA", "ILHA DE ITAMARACA", "ARACOIABA", 
                    "SAO LOURENCO DA MATA", "MORENO", "CABO DE SANTO AGOSTINHO", "IPOJUCA")

# 2. Criação da Variável REGIAO 
dados_regiao <- dados %>%
  mutate(
    REGIAO = ifelse(MUNICIPIO %in% municipios_rmr, "RMR", "INTERIOR")
  )

# 3. Contagem dos Top 10 Tipos de Ocorrência por Região
top_ocorrencias_regiao <- dados_regiao %>%
  count(REGIAO, TIPO_OCORRENCIA, sort = TRUE, name = "CONTAGEM") %>%
  group_by(REGIAO) %>%
  slice_max(order_by = CONTAGEM, n = 10) %>%
  ungroup()

# 4. Geração do Gráfico de Barras
grafico_regiao <- ggplot(top_ocorrencias_regiao, 
                         aes(x = CONTAGEM, y = reorder_within(TIPO_OCORRENCIA, CONTAGEM, REGIAO), fill = REGIAO)) +
  
  geom_bar(stat = "identity") +
  
  scale_y_reordered() +
  
  # Facetamento 
  facet_wrap(~REGIAO, scales = "free_y") +
  labs(
    title = "Top 10 Tipos de Ocorrência: RMR vs Interior de Pernambuco",
    x = "Número de Chamados",
    y = "Tipo de Ocorrência", 
    caption = "Fonte: Dataset Ocorrências SAMU 2025"
  ) +
  theme_minimal() +
  scale_fill_manual(values = c("RMR" = "#009E73", "INTERIOR" = "#CC79A7")) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    legend.position = "none",
    aspect.ratio = 2 
  )

print(grafico_regiao)


Como é possível observar nos gráficos, as top 10 ocorrências tanto na RMR quanto no Interior do estado são semelhantes, apenas com destaque para o alto número de ocorrências relacionadas ao uso de drogas na RMR. Também deve-se observar a discrepância no número total de ocorrências em cada sub-região, apesar da RMR conter apenas 40% da população de Pernambuco, a área registrou mais que o triplo de ocorrências em relação ao interior do estado.


5. Conclusão