Acidentes de trânsito em Recife

Qual rota, provalmente, não te leva a lugar nenhum?

Introdução

Com a nova alta de mortes ocasionadas por automóveis no Brasil acontecendo desde 2019, apontada no artigo da DW¹ em 2024, atualmente se mostra perceptível a falta de precauções quanto a rotas, horários e até tipo de automóvel mais seguro. Isso priva a população de possíveis armas na luta contra as possíveis fatalidades que todos estão expostos ao colocar o pé na estrada.

Visando viabilizar tais precauções em um escopo menor, mais especificamente para a população de Recife, este projeto irá abordar dados da CTTU², envolvendo análise exploratória desses dados, identificando para pontos de melhoria para a própria CTTU, como os pontos mais perigosos, que necessitam de uma melhora da sinalização, adição de radares de velocidade, entre outras, e também, dados que irão possibilitar que pessoas comuns evitem rotas perigosas em horários e temporadaras de pico de acidentes no seu dia a dia, por exemplo.

Pacotes Requeridos

Pacotes Para que serve?
rmarkdown Usado para criar documentos dinâmicos que combinam código R, texto, e visualizações em um único arquivo, que podem ser exportados em HTML, PDF, etc.
rmdformats Oferece temas e formatos customizados para documentos R Markdown, permitindo criar documentos com estilos visuais aprimorados
knitr Permite a execução de código R em documentos R Markdown e a inclusão dos resultados no documento final. Com ele, podemos injetar código R no meio do markdown e mostrar no documento o resultado do código ou mesmo o próprio código
dplyr Serve para manipulação de dados, ajudando a transformar e analisar dados de maneira eficiente e legível
readr Serve para manipulação avançada de arquivos csv, ótima para uso em grandes datasets.
reactable Utilizada para criação de tabelas dinâmicas no documento final.
ggplot2 Criar gráficos de forma customizável. Facilita a construção de visualizações dos dados.

Preparação dos dados

Os dados foram encontrados no portal de dados abertos da cidade de Recife. Lá, pode se obter uma grande variedade de dados dos mais diversos tipos, voltados ao município.

Especificamente, o dataset utilizado será o “acidentes de trânsito 2019”², que disponibiliza dados de todos os acidentes, fatais ou não fatais envolvendo veículos, catálogados pela CTTU (Autarquia de Trânsito e Transporte). Link dos dados.


Dados crus

Para carregar os dados, vamos utilizar a função read_delim da biblioteca readr que nos possibilita passar um tipo de delimitador específico, flexibilizando possíveis usos para a leitura de arquivos csv.

library(readr)
data <- read_delim("./acidentes-2019.csv", delim = ";")

Para uma pré-visualização dos dados, extraíremos as primeiras 5 linhas do dataset:


Como colunas importantes, foram consideradas:

  • DATA: Para levantar intervalos sobre épocas em que o trânsito se mostra mais perigoso
  • hora: Para levantar intervalos como, manhã, tarde e noite sobre pontos dentro da cidade
  • bairro: Para compor os pontos em que ocorrem acidentes
  • endereco: Para compor os pontos em que ocorrem acidentes
  • tipo: Para identificar os principais tipos de acidentes
  • auto: Para identificar os tipos de automóveis envolvidos em acidentes
  • moto: Para identificar os tipos de automóveis envolvidos em acidentes
  • ciclom: Para identificar os tipos de automóveis envolvidos em acidentes
  • ciclista: Para identificar os tipos de automóveis envolvidos em acidentes
  • pedestre: Para identificar os tipos de automóveis envolvidos em acidentes
  • onibus: Para identificar os tipos de automóveis envolvidos em acidentes
  • caminhao: Para identificar os tipos de automóveis envolvidos em acidentes
  • viatura: Para identificar os tipos de automóveis envolvidos em acidentes
  • outros: Para identificar os tipos de automóveis envolvidos em acidentes
  • vitimas: Para levantar dados de pessoas que foram lesadas de alguma forma em decorrência dos acidentes
  • vitimasfatais: Para levantar dados de pessoas que vieram a óbito em decorrência dos acidentes

Colunas não importantes serão removidas:

colunas_importantes <- c("DATA", "hora", "bairro", "endereco", "tipo", "auto", "moto", "ciclom", "ciclista", "pedestre", "onibus", "caminhao", "viatura", "outros", "vitimas", "vitimasfatais")
dados_reais <- data[, colunas_importantes]

Demonstração do novo DataSet:

Identificando e removendo NAs

Foram identificados NAs em todas as colunas importantes, exceto nas coluna tipo e DATA.

# Quantifica o número de nas em cada coluna
colSums(is.na(dados_reais))
##          DATA          hora        bairro      endereco          tipo 
##             0            16           148            53             0 
##          auto          moto        ciclom      ciclista      pedestre 
##           922          9158         12014         11838         11807 
##        onibus      caminhao       viatura        outros       vitimas 
##         10251         10838         11940         11852            27 
## vitimasfatais 
##         12037

Precisaremos cuidar de uma parte dos dados removendo a linha em que se encontram os NAs. São elas:

Se faz necessário remover os NAs presentes nas colunas importantes para a análise:

  • bairro
  • hora
  • endereco
### Removendo NAS de tais colunas

data_sem_na <- dados_reais[!is.na(dados_reais$bairro),]
data_sem_na <- data_sem_na[!is.na(data_sem_na$endereco),]
data_sem_na <- data_sem_na[!is.na(data_sem_na$hora), ]

Substituindo NAs restantes

Para o restante, iremos apenas substituir seus valores por 0, dado que os NAs representam esse valor neste dataset. Serão substítuíos os NAs das seguintes tabelas:

  • auto
  • moto
  • ciclom
  • ciclista
  • pedestre
  • onibus
  • caminhao
  • viatura
  • outros
  • vitimas
  • vitimasfatais
library(dplyr)

dados_finais <- data_sem_na %>% 
  mutate(across(c(auto, moto, ciclom, ciclista, pedestre, onibus, caminhao, viatura, outros, vitimas, vitimasfatais), ~ if_else(is.na(.), 0, .)))

Normalizando nome de ruas

Foi percebido que alguns endereços estão variando entre minúsculo e maiúsculo. Com isso, surge a necessidade de normalizar tais dados.

normaliza_endereco <- function(endereco) {
  endereco %>%
    toupper()            # Converter para maiusculas
}

dados_finais <- dados_finais %>%
  mutate(endereco = normaliza_endereco(endereco))

Com isso, o dataset foi diminuido ao ponto em que pode ser usado para a análise:

Preview do dataSet após a preparação dos dados

Análise exploratória dos dados

Para as anáslises, levaremos em conta tudo que poderia conscientizar pessoas, além de levantar pontos importantes sobre o trânsito no Recife.

Períodos do dia mais perigosos

Para esta análise, iremos levantar quais horários do dia ocorrem mais acidentes, dividindo o dia em manhã, tarde, noite e madrugada.

Os intervalos que irão definir cada horário serão:

  • Manhã: 06:00 - 11:59
  • Tarde: 12:00 - 17:59
  • Noite: 18:00 - 23:59
  • Madrugada: 00:00 - 05:59

Agora, uma nova coluna será adicionada ao dataset, identificando o horário de cada acidente baseado na hora de cada acidente, disponibilizado na coluna de mesmo nome.

## Adicionando coluna com a hora do acidente em formato inteiro 
dados_finais <- dados_finais %>%
  mutate(hora_inteiro = as.numeric(substr(hora, 1, 2)))

## Criação da coluna periodo_dia
dados_finais <- dados_finais %>%
  mutate(periodo_dia = case_when(
    hora_inteiro >= 0 & hora_inteiro < 6  ~ "Madrugada",
    hora_inteiro >= 6 & hora_inteiro < 12 ~ "Manhã",
    hora_inteiro >= 12 & hora_inteiro < 18 ~ "Tarde",
    hora_inteiro >= 18 & hora_inteiro <= 23 ~ "Noite"
  ))

Em sequência, os dados serão analizados com os períodos devidamente identificados.

library(ggplot2)

# Contando número de acidentes por período
acidentes_por_periodo <- dados_finais %>%
  group_by(periodo_dia) %>%
  summarise(total_acidentes = n())

ggplot(acidentes_por_periodo, aes(x = periodo_dia, y = total_acidentes, fill = periodo_dia)) +
  geom_bar(stat = "identity") +
  labs(title = "Total de Acidentes por Período do Dia", x = "Período do Dia", y = "Total de Acidentes") + theme_minimal()

Com base nos dados, identificamos a tarde como o período em que ocorrem mais acidentes no Recife. Isso pode claramente estar relacionado ao fluxo de veículos nas ruas durante tais horários, mas funciona com um indicativo para trabalhar formas de inibição dos riscos entre pessoas que costumam transitar nesse horário.

Pode-se ainda, analisar de forma mais profunda sobre qual périodo ocorrem a maioria dos acidentes fatais.

# criando novo dataset com as vítimas fatais somadas por período
vitimas_fatais_periodo <- dados_finais %>%
  group_by(periodo_dia) %>%
  summarise(total_vitimas_fatais = sum(vitimasfatais))

# Plotar o gráfico de barras para vítimas fatais
ggplot(vitimas_fatais_periodo, aes(x = periodo_dia, y = total_vitimas_fatais, fill = periodo_dia)) +
  geom_bar(stat = "identity") +
  labs(title = "Total de Vítimas Fatais por Período do Dia", x = "Período do Dia", y = "Total de Vítimas Fatais") +
  theme_minimal()

Com isso, mesmo identicando a tarde como o período que mais ocorrem acidentes, o número de acidentes fatais ainda é menor do que no período noturno.

É bom salientar que não podemos ignorar o fato de que vítimas podem vir a óbito em hospitais após o acidente, e que a CTTU pode não levar isso em conta.

Localidades mais perigosas

Agora, iremos avaliar qual localidade tem maior ocorrência de acidentes. Com isso, pessoas com tendência a maior locomoção durante o dia pode ficar atento ao passar por bairros e ruas com alto indíce de acidentes.

Analisando bairros

## Novo dataset com a quantidade total de acidentes por bairro, ordenado em ordem decrescente (maior para o menor)
acidentes_por_bairro <- dados_finais %>%
  group_by(bairro) %>%
  summarise(total_acidentes = n()) %>%
  arrange(desc(total_acidentes))

top_bairros <- acidentes_por_bairro %>%
  top_n(30, total_acidentes)

# Gráfico de barras invertido para melhor visualização
ggplot(top_bairros, aes(x = reorder(bairro, total_acidentes), y = total_acidentes, fill = bairro)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  guides(fill = "none") +
  labs(title = "Top 30 Bairros com Mais Acidentes", x = "Bairro", y = "Total de Acidentes") +
  theme_minimal()

E aqui temos a lista com todos os bairros:

Analisando ruas

Na sequência, iremos analisar quais as ruas mais perigosas de Recife. Isso nos dá a ideia de que, seria ótimo se aplicativos de gps como Waze, pudesse nos proporcionar a rota mais segura até a nossa casa, seguindo por ruas menos perigosas em números de acidentes.

Seguindo com as ruas:

## Novo dataset com ruas agrupadas pelo total de acidentes
acidentes_por_rua <- dados_finais %>%
  group_by(endereco, bairro) %>%
  summarise(total_acidentes = n(), .groups = 'drop') %>%
  arrange(desc(total_acidentes))

Tabela com Dados

Com a tabela, pode-se observar que a rua mais perigosa é a AV MARECHAL MASCARENHAS DE MORAES, e essa não fica no bairro mais perigoso (Boa Viagem), e sim no bairro Imbiribeira.

Porém, as duas ruas seguintes com maior índice de acidentes são a AV ENGENHEIRO DOMINGOS FERREIRA e a AV CONSELHEIRO AGUIAR, ambas no bairro de Boa Viagem, dando consistência ao resultado de bairro mais perigoso que leva Boa Viagem.

Tipos de acidente

Os acidentes podem ser dos mais diversos tipos, desde uma colisões com objeto fixo, até colisões frontais.

Dentre os diversos tipos, qual deles é mais frenquente?

Antes de adentrarmos no gráfico ilustrando a informação, devemos ser munidos sobre o que são os principais tipos de acidentes. Podemos entender melhor observando a imagem abaixo:

Devidamente informados, seguimos para a análise.

acidentes_por_tipo <- dados_finais %>%
  group_by(tipo) %>%
  summarise(total_acidentes = n(), .groups = 'drop') %>%
  arrange(desc(total_acidentes))

# Reordena a coluna 'tipo' como fator com base na contagem de acidentes. Isso ajuda na ordenação das legendas do gráfico.
acidentes_por_tipo$tipo <- factor(acidentes_por_tipo$tipo, levels = acidentes_por_tipo$tipo)


ggplot(acidentes_por_tipo, aes(x = tipo, y = total_acidentes, fill = tipo)) +
  geom_bar(stat = "identity") +
  labs(title = "Tipo de Acidente Mais Frequente", x = "Tipo de Acidente", y = "Número de Acidentes") +
  theme(axis.text.x = element_blank())  # Remove indicação no eixo x

Com os dados devidamente análisados, percebemos que o tipo de acidemente mais comum é o abalroamento longitudinal, acidente este que tem um potencial de causar mortes bem baixo.

Para embasar a informação sobre a incidência de mortes em relação ao tipo de acidentes, podemos analisar e descobrir.

# Filtra apenas os dados com vitimas fatais
dados_fatais <- dados_finais %>%
  filter(!is.na(vitimasfatais) & vitimasfatais > 0)

# Agrupando os dados por tipo de acidente e o número de vítimas fatais
acidente_mortal <- dados_fatais %>%
  group_by(tipo) %>%
  summarise(total_vitimas_fatais = sum(vitimasfatais, na.rm = TRUE)) %>%
  mutate(percentual = total_vitimas_fatais / sum(total_vitimas_fatais) * 100) %>%
  arrange(desc(percentual)) %>%
  mutate(tipo = factor(tipo, levels = tipo))

# Criando gráfico de pizza
ggplot(acidente_mortal, aes(x = "", y = percentual, fill = tipo)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar("y", start = 0) +
  labs(title = "Distribuição Percentual dos Tipos de Acidente com Vítimas Fatais",
       x = NULL, y = NULL) +
  theme_void() +
  theme(legend.title = element_blank(),
        legend.position = "right") +
  geom_text(aes(label = paste0(round(percentual, 1), "%")),
            position = position_stack(vjust = 0.5),
            color = "white",
            size = 4)

Com isso, observamos que colisão com ciclista acaba sendo o acidente com mais fatalidades dentre todos os tipos, sendo o acidente por abalroamento longitudinal, ainda que sendo o tipo com maior incidência, ocupa apenas 8% do total de acidentes fatais.

Veículos mais perigosos

Por último, mas com certeza o não menos importante, vamos levantar dados para responder a pergunta:

Qual o veículo que mais se envolve em acidentes?

Essa resposta pode orientar pessoas mais conservadoras a se orientar quanto a uma compra de veículo ou sobre como se portar dirigindo tais veículos.

# Criar uma lista de tipos de veículos
tipos_veiculos <- c("auto", "moto", "ciclom", "onibus", "caminhao", "viatura", "outros")

# Inicializa um dataframe vazio
resultado <- data.frame(tipo_veiculo = character(), total_vitimas_fatais = numeric())

# Vamos somar o número de vítimas fatais associadas
for (veiculo in tipos_veiculos) {
  total_vitimas <- sum(dados_finais$vitimasfatais[dados_finais[[veiculo]] > 0], na.rm = TRUE)
  
  # Adicionar os resultados ao dataframe
  resultado <- rbind(resultado, data.frame(tipo_veiculo = veiculo, total_vitimas_fatais = total_vitimas))
}

# Filtrando veículos com vítimas fatais
resultado <- resultado[resultado$total_vitimas_fatais > 0, ]

# Calcular os percentuais
resultado$percentual <- round((resultado$total_vitimas_fatais / sum(resultado$total_vitimas_fatais)) * 100, 1)

# Criar gráfico de pizza com percentuais
ggplot(resultado, aes(x = "", y = total_vitimas_fatais, fill = tipo_veiculo)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar("y", start = 0) +
  labs(title = "Distribuição de Vítimas Fatais por Tipo de Veículo",
       fill = "Tipo de Veículo") +
  theme_void() +  # Remove o fundo e os eixos
  geom_text(aes(label = paste0(percentual, "%")), 
            position = position_stack(vjust = 0.5), color = "white")

Observado os veículos, nota-se que automóveis (carros) são os mais mortais dentre todos, seguido por motos e ônibus.

Conclusões

Com esse projeto, foi possível analizar profundamente dados da CTTU sobre os acidentes de trânsito no Recife.

Após o resultado das análises, pode-se ter uma maior noção sobre o ambiente rodoviário urbano do Recife, como período do dia mais perigoso, Bairros e ruas com maior incidência de acidentes, principais tipos de acidentes e veículos mais frequentemente relacionados.

É esperado que os dados sirvam, de alguma forma, para que pessoas possa entender o ambiente em que estão situadas e além disso, induza motoristas e pedestres quanto aos perigos que rondam o trânsito.

Ainda, é possível melhorar os dados levando em consideração intervalos da década mencionada no artigo da DW, para entender em que ponto houveram mais acidentes no Brasil, e se recife estaria entre as principais cidades.

Com isso, viabilizaríamos dados sobre os principais problemas e assim, poderíamos encontrar a melhor forma de resolver e aplicá-la como regras em todo o Brasil.

Isso poderá ser feito em futuras versões do projeto.