Desde a popularização do transporte aéreo, no século XX, os aviões causam sentimentos conflitantes aos seres humanos. Há uma mística criada por décadas de uso restrito à parcela mais rica da sociedade: utilizar um avião tornou-se um “símbolo de conquista” e manutenção de status social, visto que outros meios de transporte, como carros e motos, são amplamente acessíveis para todos os níveis socioeconômicos. Entretanto, de forma contraditória, ao mesmo tempo que este é possivelmente o meio de transporte mais cobiçado, também é um dos que mais causam medo e apreensão.
É comum ligar a televisão, ou acessar as redes sociais, e nos deparar com notícias sobre acidentes de moto ou carro com eventuais fatalidades. Pelas ruas, vemos dezenas de carros e motos, e a possibilidade de algum acidente acontecer parece uma conclusão óbvia, apesar de lamentável — mas raramente nos surpreende. O avião, por outro lado, é um transporte que a maioria das pessoas mal vê de perto, o que amplifica qualquer percepção de risco.
Logo, a ocorrência de um acidente aéreo é sempre vista como uma potencial tragédia. Casos com centenas de mortos — como a queda do Voo American Airlines 191 (1979), com 271 vítimas — ou extremamente midiáticos — como o acidente aéreo que matou todos os integrantes de Mamonas Assassinas em 1996 — contribuíram para consolidar no imaginário popular a ideia da alta periculosidade dos aviões.
Dessa forma, várias conclusões surgem dessa ideação popular:
Para responder a essas questões, esta análise utiliza o dataset
Historical Plane Crash Data (Kaggle), com registros de
acidentes aéreos de 1918 a 2022, aplicando técnicas de
análise exploratória de dados em R. A abordagem adotada consiste em
decompor o problema em oito perguntas específicas —
cada uma voltada a desmistificar uma crença popular — e respondê-las com
visualizações interativas e tabelas construídas a partir dos dados. As
etapas envolvem importação, limpeza e transformação dos dados com
dplyr e tidyr, seguidas de visualizações
estáticas e interativas com ggplot2 e
plotly.
Os resultados desta análise destinam-se a dois públicos principais. Para passageiros com medo de voar, os dados oferecem uma base concreta para reavaliar percepções de risco construídas mais pela cobertura midiática do que pela evidência histórica. Para operadores, reguladores e profissionais do setor, a análise aponta onde concentrar esforços de segurança — evidenciando, por exemplo, o peso do fator humano como causa dominante e as fases críticas do voo onde os acidentes mais ocorrem.
Os pacotes utilizados nesta análise são:
select()), renomear variáveis
(rename()), filtrar registros inválidos
(filter()), criar novas variáveis derivadas
(mutate()), agrupar observações (group_by()) e
calcular estatísticas resumidas (summarise()). Todas as
tabelas utilizadas para construir os gráficos foram geradas com esse
pacote.pivot_longer() foi
empregada para transformar os resultados da contagem de valores
faltantes em um formato tabular mais adequado para visualização e
interpretação.ggplot2 em versões interativas através da
função ggplotly(). Além disso, foi empregado diretamente na
construção dos gráficos de pizza referentes à distribuição dos acidentes
por fase do voo e à proporção de acidentes com sobreviventes.install.packages(c("dplyr", "tidyr", "ggplot2", "plotly", "DT", "maps"))
O dataset escolhido (Historical Plane Crash Data) reúne dados de acidentes aéreos de 1918 a 2022 e foi disponibilizado gratuitamente na plataforma Kaggle por Abe Ceasar Perez. Ele foi construído por meio de web scraping para extrair informações do The Bureau of Aircraft Accidents Archives (B3A), organização independente sediada em Genebra que cataloga acidentes aéreos ao redor do mundo desde 1918, reunindo dados de fontes governamentais, relatórios de investigação e imprensa especializada.
O dataset contém 28.536 linhas e 24 colunas,
abrangendo variáveis como data, aeronave, operador, fase do voo, causa
do acidente e contagens de vítimas. Uma peculiaridade importante é que
valores ausentes aparecem de duas formas no dataset
original: "NA" e "Unknown", o que exige
tratamento unificado na etapa de limpeza — já que o R não os reconhece
automaticamente como valores faltantes. Além disso, nomes de países e
operadores não seguem um padrão único — variações ortográficas e
denominações históricas estão presentes, demandando harmonização manual
nas análises geográficas.
| Coluna | Tipo | Descrição |
|---|---|---|
| Date | character | Data do acidente |
| Time | character | Hora do acidente |
| Aircraft | character | Modelo da aeronave |
| Operator | character | Operador ou companhia aérea |
| Registration | character | Matrícula operacional da aeronave |
| Flight phase | character | Fase do voo em que ocorreu o acidente |
| Flight type | character | Tipo de voo (comercial, militar, etc.) |
| Survivors | character | Indica se houve sobreviventes |
| Crash site | character | Local da queda (tipo de terreno ou ambiente) |
| Schedule | character | Rota do voo (origem - destino) |
| MSN | character | Número de Série do Fabricante |
| YOM | integer | Ano de fabricação da aeronave |
| Flight no. | integer | Número do voo |
| Crash location | character | Localização geográfica específica da queda |
| Country | character | País onde ocorreu o acidente |
| Region | character | Região do mundo |
| Crew on board | integer | Número de tripulantes a bordo |
| Crew fatalities | integer | Número de mortes entre a tripulação |
| Pax on board | integer | Número de passageiros a bordo |
| PAX fatalities | integer | Número de mortes entre os passageiros |
| Other fatalities | integer | Mortes de pessoas externas ao voo |
| Total fatalities | integer | Total de mortes no acidente |
| Circumstances | character | Circunstâncias do acidente |
| Crash cause | character | Causa do acidente |
A importação foi realizada com a função read.csv(), que
lê o arquivo diretamente do disco. É importante observar que o
read.csv() converte automaticamente espaços nos
nomes das colunas em pontos — por exemplo,
Flight phase torna-se Flight.phase e
Flight no. torna-se Flight.no..
## Importação do dataset bruto
dados <- read.csv("Plane Crashes.csv",
stringsAsFactors = FALSE)
Abaixo está uma amostra com as primeiras 6 linhas do dataset bruto:
DT::datatable(head(dados), options = list(scrollX = TRUE, scrollY = "250px", dom = 't'))
Com os dados importados, o próximo passo foi realizar a limpeza e padronização antes de qualquer análise.
Remoção de colunas irrelevantes: Dezessete colunas
foram removidas por não terem valor analítico para os objetivos deste
trabalho. São elas: Registration (matrícula da aeronave),
Aircraft (modelo da aeronave), Schedule (rota
do voo), MSN (número de série do fabricante),
Flight.no. (número do voo), Crash.location
(localização geográfica específica), Time (horário da
queda), Flight.type (tipo de voo), Crash.site
(local da queda), Crew.on.board (tripulantes a bordo),
Crew.fatalities (mortes da tripulação),
Pax.on.board (passageiros a bordo),
PAX.fatalities (mortes de passageiros),
Other.fatalities (outras mortes),
Total.fatalities (total de mortes),
Circumstances (circunstâncias do acidente) e
Region (região do mundo) — todas sem uso em nenhuma das
análises realizadas.
Renomeação das colunas: Os nomes das colunas mantidas foram traduzidos para o português e padronizados, eliminando pontos e tornando o código mais legível ao longo da análise.
## Remove colunas sem valor analítico e renomeia as demais para português
dados_limpos <- dados %>%
select(-Registration, -Schedule, -MSN, -Flight.no., -Crash.location, -Time,
-Flight.type, -Crash.site, -Crew.on.board, -Crew.fatalities,
-Pax.on.board, -PAX.fatalities, -Other.fatalities, -Circumstances,
-Region, -Total.fatalities, -Aircraft) %>%
rename(
Data = Date,
Operador = Operator,
Fase_Voo = Flight.phase,
Sobreviventes = Survivors,
Ano_Fabricacao = YOM,
Pais = Country,
Causa = Crash.cause
)
Abaixo está uma amostra com as primeiras 6 linhas do dataset limpo:
DT::datatable(head(dados_limpos), options = list(scrollX = TRUE, scrollY = "250px", dom = 't'))
Tratamento de valores ausentes: Nenhuma linha foi
removida do dataset, pois há colunas que nunca possuem valores vazios —
como Data — e que agregam grande valor à análise. Remover
uma linha por causa de valores ausentes em outras colunas seria
analiticamente prejudicial. Em vez disso, os valores ausentes são
tratados localmente em cada análise, filtrando apenas os registros com
informação válida para a variável em questão.
A tabela a seguir contabiliza as colunas com maior volume de valores não informados:
## Contagem unificada de todas as formas de valor ausente por coluna
nas_por_coluna <- dados_limpos %>%
summarise(across(everything(), ~ sum(is.na(.) | . == "" | . == "<NA>" | . == "Unknown" | . == "N/A" | . == "-" | . == "None" | . == " "))) %>%
tidyr::pivot_longer(everything(), names_to = "Coluna", values_to = "Qtd_NAs") %>%
filter(Qtd_NAs > 0) %>%
mutate(Percentual = paste0(round(Qtd_NAs / nrow(dados_limpos) * 100, 1), "%")) %>%
arrange(desc(Qtd_NAs))
DT::datatable(nas_por_coluna, options = list(scrollX = TRUE, scrollY = "300px", dom = 't'))
## Extrai o ano a partir da coluna Data e conta acidentes por ano
dados_limpos$Ano <- as.integer(substr(dados_limpos$Data, 1, 4))
acidentes_ano <- dados_limpos %>%
filter(!is.na(Ano)) %>%
group_by(Ano) %>%
summarise(Total = n())
p1 <- ggplot(acidentes_ano, aes(x = Ano, y = Total)) +
geom_line(color = "#2c7bb6", linewidth = 0.8) +
geom_smooth(method = "loess", se = FALSE, color = "#d7191c", linetype = "dashed") +
labs(title = "Acidentes aéreos por ano", x = "Ano", y = "Nº de acidentes") +
theme_minimal()
ggplotly(p1, width = NULL, height = NULL) %>%
layout(autosize = TRUE, margin = list(l = 0, r = 0, t = 40, b = 0)) %>%
config(responsive = TRUE)
## `geom_smooth()` using formula = 'y ~ x'
O gráfico revela um pico expressivo próximo a 1945, coincidindo com o fim da Segunda Guerra Mundial — período em que o volume de voos militares atingiu seu ápice histórico. Após esse pico, observa-se uma tendência consistente de queda, especialmente a partir da década de 1970, reflexo do amadurecimento da aviação comercial e da crescente demanda por segurança operacional. Nos anos mais recentes, o número de acidentes atingiu os menores patamares desde o início do registro, evidenciando que o transporte aéreo se tornou progressivamente mais seguro — um argumento direto contra o medo exagerado que muitos passageiros ainda carregam.
## Conta acidentes por país e seleciona os 15 com maior volume
top_paises <- dados_limpos %>%
filter(!is.na(Pais) & Pais != "" & Pais != "Unknown") %>%
group_by(Pais) %>%
summarise(Total = n()) %>%
arrange(desc(Total)) %>%
slice_head(n = 15)
p2 <- ggplot(top_paises, aes(x = reorder(Pais, Total), y = Total)) +
geom_col(fill = "#2c7bb6") +
coord_flip() +
labs(title = "Top 15 países com mais acidentes", x = NULL, y = "Nº de acidentes") +
theme_minimal()
ggplotly(p2, width = NULL, height = NULL) %>%
layout(autosize = TRUE, margin = list(l = 0, r = 0, t = 40, b = 0)) %>%
config(responsive = TRUE)
Os Estados Unidos lideram com folga, com mais de 6.000 registros — muito acima do segundo colocado, o Reino Unido. Essa disparidade reflete o protagonismo histórico norte-americano na aviação, tanto militar quanto comercial. Rússia e Canadá aparecem em seguida, ambos com extensos territórios e histórico de operações em condições climáticas adversas. O Brasil figura na sexta posição, o que, dado seu tamanho continental e a dependência histórica do transporte aéreo para conectar regiões remotas, não surpreende. Vale ressaltar: a presença no ranking não indica que voar nesses países seja mais perigoso — países com mais voos naturalmente acumulam mais registros absolutos.
## Agrupa fases de voo em categorias e calcula proporções
fase <- dados_limpos %>%
filter(!is.na(Fase_Voo) & Fase_Voo != "" & Fase_Voo != "Unknown") %>%
mutate(Grupo = case_when(
grepl("Takeoff|Take-off|Take off", Fase_Voo, ignore.case = TRUE) ~ "Decolagem",
grepl("Landing|Approach|Descent", Fase_Voo, ignore.case = TRUE) ~ "Pouso/Aproximação",
grepl("Flight|Cruise|En route", Fase_Voo, ignore.case = TRUE) ~ "Em Voo",
TRUE ~ "Outras"
)) %>%
group_by(Grupo) %>%
summarise(Total = n()) %>%
mutate(Percentual = round(Total / sum(Total) * 100, 1),
Label = paste0(Percentual, "%"))
p3 <- plot_ly(fase,
labels = ~Grupo,
values = ~Total,
type = "pie",
textinfo = "label+percent",
hoverinfo = "label+value+percent",
marker = list(colors = c("#d7191c", "#fdae61", "#aaaaaa", "#cccccc")),
textfont = list(size = 13)) %>%
layout(title = "Proporção de acidentes por fase do voo",
legend = list(orientation = "h"))
p3
Contrariando a percepção popular, os dados mostram que decolagem e pouso concentram juntos cerca de 57,6% dos acidentes — sendo o pouso a fase isoladamente mais crítica (35,9%). Ambas as fases exigem atenção extrema dos pilotos, envolvem velocidades e altitudes variáveis e maior proximidade com o solo. A fase em voo, embora represente a maior parte do tempo de qualquer trajeto, responde por apenas 41,1% dos acidentes — proporcionalmente menos perigosa. A implicação prática: a sensação de alívio após a decolagem é prematura, pois o pouso ainda está por vir.
## Seleciona as 10 causas mais frequentes
causas <- dados_limpos %>%
filter(!is.na(Causa) & Causa != "" & Causa != "Unknown") %>%
group_by(Causa) %>%
summarise(Total = n()) %>%
arrange(desc(Total)) %>%
slice_head(n = 10)
p5 <- ggplot(causas, aes(x = reorder(Causa, Total), y = Total)) +
geom_col(fill = "#d7191c") +
coord_flip() +
labs(title = "Top 10 causas de acidentes", x = NULL, y = "Nº de acidentes") +
theme_minimal()
ggplotly(p5, width = NULL, height = NULL) %>%
layout(autosize = TRUE, margin = list(l = 0, r = 0, t = 40, b = 0)) %>%
config(responsive = TRUE)
O fator humano é, de longe, a principal causa dos acidentes aéreos, respondendo por aproximadamente 10.000 registros — quase o dobro da segunda causa mais frequente. De acordo com a Federal Aviation Administration (FAA), cerca de 80% dos acidentes de aviação envolvem fatores humanos, o que reforça a importância de treinamento, gestão de fadiga e comunicação entre tripulação e controle de tráfego aéreo (FAA, 2024). A falha técnica aparece em segundo lugar, com cerca de 6.500 casos, e frequentemente também está relacionada ao fator humano — por manutenção inadequada ou falha nos processos de inspeção. Em síntese, o maior risco na aviação está nas decisões humanas, o que paradoxalmente também significa que o risco é mais controlável do que se imagina.
## Calcula a proporção de acidentes com e sem sobreviventes
sobrev <- dados_limpos %>%
filter(!is.na(Sobreviventes) & Sobreviventes != "" & Sobreviventes != "Unknown") %>%
group_by(Sobreviventes) %>%
summarise(Total = n()) %>%
mutate(Percentual = round(Total / sum(Total) * 100, 1))
p6 <- plot_ly(sobrev, labels = ~Sobreviventes, values = ~Total, type = "pie",
textinfo = "label+percent",
marker = list(colors = c("#2c7bb6", "#d7191c"))) %>%
layout(title = "Proporção de acidentes com e sem sobreviventes")
p6
Este é possivelmente o achado mais surpreendente: 57% dos acidentes aéreos registrados tiveram ao menos um sobrevivente — a maioria dos acidentes não resulta em tragédia total. Esse dado contrasta fortemente com a imagem construída pelo noticiário, onde acidentes com zero sobreviventes dominam as manchetes justamente por seu impacto emocional. O dataset inclui uma grande variedade de ocorrências, desde incidentes menores com poucos ocupantes até colisões catastróficas — e mesmo assim, a proporção de acidentes com sobreviventes é majoritária. Na prática, sobreviver a um acidente aéreo é mais comum do que o imaginário popular sugere.
## Seleciona os 15 operadores com maior número de acidentes registrados
top_operadores <- dados_limpos %>%
filter(!is.na(Operador) & Operador != "" & Operador != "Unknown") %>%
group_by(Operador) %>%
summarise(Total = n()) %>%
arrange(desc(Total)) %>%
slice_head(n = 15)
p7 <- ggplot(top_operadores, aes(x = reorder(Operador, Total), y = Total)) +
geom_col(fill = "#756bb1") +
coord_flip() +
labs(title = "Top 15 operadores com mais acidentes", x = NULL, y = "Nº de acidentes") +
theme_minimal()
ggplotly(p7, width = NULL, height = NULL) %>%
layout(autosize = TRUE, margin = list(l = 0, r = 0, t = 40, b = 0)) %>%
config(responsive = TRUE)
A Royal Air Force (RAF) britânica lidera o ranking, seguida pela United States Air Force (USAF) e pela Aeroflot. A presença dominante de forças aéreas militares entre os primeiros colocados reflete o volume extraordinário de voos realizados durante as guerras mundiais, em condições de alto risco e com tripulações em treinamento acelerado. A Aeroflot merece atenção especial: foi durante décadas a maior companhia aérea do mundo, cobrindo um território continental com condições climáticas extremas. Entre as operadoras civis, Air France e Deutsche Lufthansa são as únicas a figurar no top 15. Novamente, contagens absolutas não equivalem a operações menos seguras — companhias com décadas de operação intensa naturalmente acumulam mais registros.
## Harmoniza nomes de países entre o dataset e o mapa e exibe distribuição geográfica
library(maps)
acidentes_pais <- dados_limpos %>%
filter(!is.na(Pais) & Pais != "" & Pais != "Unknown") %>%
mutate(Pais = case_when(
Pais == "United States of America" ~ "USA",
Pais == "United Kingdom" ~ "UK",
Pais == "Democratic Republic of Congo" ~ "Democratic Republic of the Congo",
Pais == "Congo" ~ "Republic of Congo",
Pais == "Trinidad and Tobago" ~ "Trinidad",
Pais == "Cabo Verde" ~ "Cape Verde",
Pais == "Comoros Islands" ~ "Comoros",
Pais == "Fiji Islands" ~ "Fiji",
Pais == "French Guyana" ~ "French Guiana",
Pais == "Guinea Bissau" ~ "Guinea-Bissau",
Pais == "Guam Island" ~ "Guam",
Pais == "La Reunion" ~ "Reunion",
Pais == "Macedonia" ~ "North Macedonia",
Pais == "Maldivian Islands" ~ "Maldives",
Pais == "Salvador" ~ "El Salvador",
Pais == "Samoa Islands (Western Samoa)" ~ "Samoa",
Pais == "São Tomé and Principe" ~ "Sao Tome and Principe",
Pais == "Saint-Barthélemy" ~ "Saint Barthelemy",
Pais == "Saint Kitts and Nevis" ~ "Saint Kitts",
Pais == "Saint Vincent and Grenadines" ~ "Saint Vincent",
Pais == "Timor Leste" ~ "Timor-Leste",
Pais == "Federated States of Micronesia" ~ "Micronesia",
TRUE ~ Pais
)) %>%
group_by(Pais) %>%
summarise(Total = n())
mapa_mundo <- map_data("world") %>%
left_join(acidentes_pais, by = c("region" = "Pais"))
p8 <- ggplot(mapa_mundo, aes(x = long, y = lat, group = group, fill = Total,
text = paste(region, "<br>Acidentes:", Total))) +
geom_polygon(color = "white", linewidth = 0.1) +
scale_fill_gradient(low = "#fee8c8", high = "#b30000", na.value = "#d9d9d9",
name = "Nº de acidentes") +
coord_fixed(1.3) +
labs(title = "Acidentes aéreos por país", x = NULL, y = NULL) +
theme_void() +
theme(plot.margin = margin(0, 0, 0, 0))
ggplotly(p8, tooltip = "text", width = NULL, height = 500) %>%
layout(autosize = TRUE, margin = list(l = 0, r = 0, t = 40, b = 0)) %>%
config(responsive = TRUE)
O mapa evidencia a concentração massiva de acidentes nos Estados Unidos, que se destaca em vermelho escuro em contraste com o restante do mundo. A Europa Ocidental e a Rússia também apresentam densidades relevantes, reflexo de seu protagonismo histórico tanto na aviação militar quanto na comercial. O restante do mundo aparece em tons muito mais claros — o que tem duas explicações complementares: países menos desenvolvidos realizaram historicamente menos voos, e há um componente relevante de subnotificação em regiões com infraestrutura de registro menos desenvolvida, o que constitui uma limitação importante do dataset.
Este trabalho investigou se os medos mais comuns relacionados ao transporte aéreo são sustentados pelos dados históricos de acidentes. Para isso, foi utilizado o dataset Historical Plane Crash Data, contendo 28.536 registros de acidentes ocorridos entre 1918 e 2022. Após a importação, limpeza e tratamento dos dados, foram realizadas análises exploratórias em R por meio de tabelas e gráficos que permitiram examinar aspectos como evolução temporal dos acidentes, distribuição geográfica, fases do voo, idade das aeronaves, causas dos acidentes, sobrevivência e operadores envolvidos.
Os resultados mostraram que diversas percepções populares não são totalmente confirmadas pelos dados. Observou-se uma redução gradual do número de acidentes ao longo das últimas décadas, concentração de ocorrências nas fases de decolagem e pouso, predominância do fator humano como principal causa registrada e uma proporção de acidentes com sobreviventes maior do que normalmente se imagina. Além disso, a idade da aeronave, analisada isoladamente, não se mostrou um indicador suficiente para explicar o risco de acidentes.
Esses achados podem ajudar passageiros a compreender melhor os riscos reais da aviação e fornecer informações úteis para operadores e órgãos reguladores direcionarem esforços de prevenção, especialmente em treinamento, manutenção e procedimentos operacionais.
Como limitações, o conjunto de dados apresenta valores ausentes em algumas variáveis e possíveis diferenças na qualidade dos registros entre países e períodos históricos. Além disso, a análise utiliza números absolutos de acidentes, sem considerar o volume total de voos realizados. Como trabalhos futuros, seria interessante incorporar dados de tráfego aéreo para calcular taxas de acidentes e aplicar técnicas estatísticas mais avançadas para aprofundar a investigação dos fatores associados ao risco de ocorrência.