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.
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.
## 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
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
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 xCom 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.