Análise Exploratória de Atrasos e Cancelamentos de Voos Comerciais

1 Introdução

1.1 Declaração do Problema

O transporte aéreo desempenha papel fundamental na mobilidade de pessoas e mercadorias. Entretanto, atrasos e cancelamentos de voos representam desafios operacionais que afetam passageiros, companhias aéreas e aeroportos.

O problema central investigado neste projeto é:

Quais fatores estão mais associados aos atrasos e cancelamentos de voos comerciais?

Compreender esses padrões pode auxiliar companhias aéreas e gestores aeroportuários na identificação de gargalos operacionais e na melhoria da eficiência operacional.

1.2 Abordagem Adotada

Para responder a essa questão será utilizado o conjunto de dados Flight Delays Dataset, disponível publicamente na plataforma Kaggle.

O projeto utiliza três conjuntos de dados:

  • flights.csv
  • airlines.csv
  • airports.csv

A metodologia empregada será composta por:

  1. Preparação dos dados;
  2. Integração das tabelas;
  3. Análise exploratória;
  4. Extração de insights.

1.3 Técnica Proposta

A análise será conduzida inteiramente em R utilizando o ecossistema tidyverse.

Serão empregadas as seguintes técnicas:

  • Análise univariada;
  • Análise bivariada;
  • Criação de variáveis derivadas;
  • Integração de múltiplas tabelas;
  • Visualizações gráficas e interativas.

1.4 Utilidade para os Clientes

Os resultados desta análise poderão auxiliar:

  • Companhias aéreas;
  • Administradores aeroportuários;
  • Passageiros;
  • Pesquisadores da área de transporte.

2 Pacotes Requeridos

Os pacotes utilizados neste projeto foram selecionados para atender às diferentes etapas do processo de Ciência de Dados, desde a importação e limpeza dos dados até a construção das visualizações e análises exploratórias.

O pacote tidyverse foi utilizado como principal conjunto de ferramentas para manipulação de dados. O pacote readr foi empregado para a importação dos arquivos CSV, enquanto o dplyr foi utilizado para filtragem, agrupamento e transformação dos dados. O ggplot2 foi utilizado para a construção dos gráficos estáticos.

O pacote lubridate foi incluído para auxiliar no tratamento de informações temporais. O plotly possibilita a criação de gráficos interativos, enquanto o DT permite a construção de tabelas interativas para exploração dos resultados.

Os pacotes janitor e naniar auxiliam na limpeza e identificação de inconsistências e valores ausentes. O pacote skimr permite gerar resumos estatísticos dos conjuntos de dados. Por fim, os pacotes knitr e kableExtra foram utilizados para formatação do relatório e construção de tabelas com melhor apresentação visual.

library(tidyverse)
library(readr)
library(dplyr)
library(ggplot2)
library(lubridate)
library(plotly)
library(DT)
library(janitor)
library(skimr)
library(knitr)
library(kableExtra)
library(naniar)

3 Preparação dos Dados

3.1 Fonte dos Dados

O conjunto de dados utilizado neste projeto é o Flight Delays Dataset, disponível publicamente na plataforma Kaggle:

https://www.kaggle.com/datasets/usdot/flight-delays

O conjunto é composto por três arquivos:

  • flights.csv
  • airlines.csv
  • airports.csv

3.2 Descrição dos Dados Originais

O conjunto de dados possui informações reais sobre voos comerciais realizados nos Estados Unidos.

As tabelas utilizadas possuem as seguintes finalidades:

flights.csv

Contém informações sobre os voos realizados, incluindo horários, atrasos, cancelamentos, aeroportos de origem e destino e companhia aérea.

airlines.csv

Contém os códigos e nomes das companhias aéreas.

airports.csv

Contém informações dos aeroportos utilizados nos voos.

Algumas peculiaridades importantes identificadas:

  • Os dados estão distribuídos em múltiplas tabelas.
  • Existem códigos IATA que precisam ser traduzidos.
  • Existem valores ausentes relacionados a atrasos e cancelamentos.
  • Datas e horários estão separados em múltiplas colunas.
  • Será necessária a criação de variáveis derivadas para facilitar as análises.

3.3 Importação dos Dados

airlines <- read_csv("airlines.csv", show_col_types = FALSE)

airports <- read_csv("airports.csv", show_col_types = FALSE)

flights <- read_csv("flights.csv", n_max = 100000, show_col_types = FALSE)

Os três conjuntos de dados foram importados com sucesso para o ambiente R. A tabela flights.csv representa a base principal do projeto, enquanto airlines.csv e airports.csv serão utilizadas para complementar as análises por meio da integração dos dados.

Devido ao tamanho elevado da base original, que possui 5.819.079 registros, foi utilizado um recorte inicial de 100.000 voos para viabilizar o processamento no RMarkdown. Esse recorte mantém a estrutura da base original e permite realizar análises exploratórias sobre atrasos, cancelamentos, companhias aéreas e aeroportos, sem comprometer o desempenho computacional necessário para a execução do projeto.

dim(airlines)
## [1] 14  2
dim(airports)
## [1] 322   7
dim(flights)
## [1] 100000     31

3.4 Estrutura dos Dados

glimpse(airlines)
## Rows: 14
## Columns: 2
## $ IATA_CODE <chr> "UA", "AA", "US", "F9", "B6", "OO", "AS", "NK", "WN", "DL", …
## $ AIRLINE   <chr> "United Air Lines Inc.", "American Airlines Inc.", "US Airwa…
glimpse(airports)
## Rows: 322
## Columns: 7
## $ IATA_CODE <chr> "ABE", "ABI", "ABQ", "ABR", "ABY", "ACK", "ACT", "ACV", "ACY…
## $ AIRPORT   <chr> "Lehigh Valley International Airport", "Abilene Regional Air…
## $ CITY      <chr> "Allentown", "Abilene", "Albuquerque", "Aberdeen", "Albany",…
## $ STATE     <chr> "PA", "TX", "NM", "SD", "GA", "MA", "TX", "CA", "NJ", "AK", …
## $ COUNTRY   <chr> "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA…
## $ LATITUDE  <dbl> 40.65236, 32.41132, 35.04022, 45.44906, 31.53552, 41.25305, …
## $ LONGITUDE <dbl> -75.44040, -99.68190, -106.60919, -98.42183, -84.19447, -70.…
glimpse(flights)
## Rows: 100,000
## Columns: 31
## $ YEAR                <dbl> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 20…
## $ MONTH               <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ DAY                 <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ DAY_OF_WEEK         <dbl> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,…
## $ AIRLINE             <chr> "AS", "AA", "US", "AA", "AS", "DL", "NK", "US", "A…
## $ FLIGHT_NUMBER       <dbl> 98, 2336, 840, 258, 135, 806, 612, 2013, 1112, 117…
## $ TAIL_NUMBER         <chr> "N407AS", "N3KUAA", "N171US", "N3HYAA", "N527AS", …
## $ ORIGIN_AIRPORT      <chr> "ANC", "LAX", "SFO", "LAX", "SEA", "SFO", "LAS", "…
## $ DESTINATION_AIRPORT <chr> "SEA", "PBI", "CLT", "MIA", "ANC", "MSP", "MSP", "…
## $ SCHEDULED_DEPARTURE <chr> "0005", "0010", "0020", "0020", "0025", "0025", "0…
## $ DEPARTURE_TIME      <chr> "2354", "0002", "0018", "0015", "0024", "0020", "0…
## $ DEPARTURE_DELAY     <dbl> -11, -8, -2, -5, -1, -5, -6, 14, -11, 3, -6, -8, 0…
## $ TAXI_OUT            <dbl> 21, 12, 16, 15, 11, 18, 11, 13, 17, 12, 12, 21, 18…
## $ WHEELS_OFF          <chr> "0015", "0014", "0034", "0030", "0035", "0038", "0…
## $ SCHEDULED_TIME      <dbl> 205, 280, 286, 285, 235, 217, 181, 273, 195, 221, …
## $ ELAPSED_TIME        <dbl> 194, 279, 293, 281, 215, 230, 170, 249, 193, 203, …
## $ AIR_TIME            <dbl> 169, 263, 266, 258, 199, 206, 154, 228, 173, 186, …
## $ DISTANCE            <dbl> 1448, 2330, 2296, 2342, 1448, 1589, 1299, 2125, 14…
## $ WHEELS_ON           <chr> "0404", "0737", "0800", "0748", "0254", "0604", "0…
## $ TAXI_IN             <dbl> 4, 4, 11, 8, 5, 6, 5, 8, 3, 5, 4, 7, 4, 5, 4, 4, 4…
## $ SCHEDULED_ARRIVAL   <chr> "0430", "0750", "0806", "0805", "0320", "0602", "0…
## $ ARRIVAL_TIME        <chr> "0408", "0741", "0811", "0756", "0259", "0610", "0…
## $ ARRIVAL_DELAY       <dbl> -22, -9, 5, -9, -21, 8, -17, -10, -13, -15, -30, -…
## $ DIVERTED            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ CANCELLED           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ CANCELLATION_REASON <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ AIR_SYSTEM_DELAY    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ SECURITY_DELAY      <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ AIRLINE_DELAY       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ LATE_AIRCRAFT_DELAY <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ WEATHER_DELAY       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…

3.5 Principais Desafios dos Dados

Durante a análise preliminar foram identificados alguns desafios importantes:

  • Integração entre três tabelas distintas;
  • Presença de códigos IATA que exigem tradução para nomes de aeroportos e companhias aéreas;
  • Existência de valores ausentes em variáveis relacionadas aos atrasos;
  • Necessidade de conversão de horários armazenados como texto;
  • Criação de variáveis derivadas para análises temporais;
  • Volume elevado de dados, superior a cinco milhões de registros.

3.6 Limpeza dos Dados

Antes da realização das análises exploratórias foi necessário executar algumas etapas de preparação dos dados.

Inicialmente, os três conjuntos de dados foram importados para o ambiente R. Como a base original possui mais de 5,8 milhões de registros, foi utilizado um recorte inicial de 100.000 observações para viabilizar o processamento do relatório sem comprometer a representatividade dos dados.

Também foi identificado que as informações encontram-se distribuídas em três tabelas distintas, exigindo integração posterior por meio dos códigos IATA das companhias aéreas e aeroportos.

Durante a inspeção inicial foram identificados valores ausentes nas variáveis relacionadas às causas dos atrasos e cancelamentos, além de horários armazenados em formato textual. Essas características exigirão transformações adicionais para análises futuras mais detalhadas.

As etapas de limpeza tiveram como objetivo organizar os dados em um formato adequado para exploração, reduzindo problemas de inconsistência e facilitando a interpretação dos resultados.

4 Análise Exploratória dos Dados

4.1 Atraso Médio por Companhia Aérea

Com o objetivo de identificar quais companhias apresentam maior tendência a atrasos, foi calculado o atraso médio de chegada para cada companhia aérea presente na amostra analisada.

atraso_companhia <- flights %>%
  group_by(AIRLINE) %>%
  summarise(
    atraso_medio = mean(ARRIVAL_DELAY, na.rm = TRUE)
  ) %>%
  arrange(desc(atraso_medio))

atraso_companhia %>%
  slice_max(atraso_medio, n = 10) %>%
  ggplot(aes(x = reorder(AIRLINE, atraso_medio),
             y = atraso_medio)) +
  geom_col(fill = "steelblue") +
  coord_flip() +
  labs(
    title = "Top 10 Companhias com Maior Atraso Médio",
    x = "Companhia Aérea",
    y = "Atraso Médio (minutos)"
  )

Os resultados preliminares indicam diferenças significativas entre as empresas. As companhias MQ, F9 e NK apresentaram os maiores atrasos médios observados, sugerindo possíveis diferenças operacionais, logísticas ou estruturais que influenciam a pontualidade dos voos.

Por outro lado, outras companhias apresentaram atrasos médios menores, indicando maior regularidade operacional durante o período analisado.

Esses resultados sugerem que a companhia aérea é um fator relevante para compreender os padrões de atraso observados no conjunto de dados, podendo influenciar diretamente a experiência dos passageiros e a eficiência operacional do transporte aéreo.

4.2 Cancelamentos por Companhia Aérea

cancelamentos <- flights %>%
  group_by(AIRLINE) %>%
  summarise(
    cancelamentos = sum(CANCELLED, na.rm = TRUE)
  ) %>%
  arrange(desc(cancelamentos))

cancelamentos %>%
  slice_max(cancelamentos, n = 10) %>%
  ggplot(aes(x = reorder(AIRLINE, cancelamentos),
             y = cancelamentos)) +
  geom_col(fill = "darkred") +
  coord_flip() +
  labs(
    title = "Top 10 Companhias com Mais Cancelamentos",
    x = "Companhia Aérea",
    y = "Quantidade de Cancelamentos"
  )

A Figura 2 apresenta as companhias aéreas com maior quantidade de cancelamentos na amostra analisada. Observa-se que a companhia MQ registrou o maior número de cancelamentos, seguida pelas companhias EV e OO.

Os cancelamentos representam um impacto mais severo para passageiros e companhias aéreas do que os atrasos, pois impedem totalmente a realização do voo. Dessa forma, companhias com maior quantidade de cancelamentos podem estar mais sujeitas a fatores operacionais, climáticos ou logísticos que afetam a execução das viagens.

Os resultados observados reforçam que tanto os atrasos quanto os cancelamentos constituem indicadores importantes para avaliação da qualidade operacional das companhias aéreas.

4.3 Distribuição dos Atrasos

ggplot(flights,
       aes(x = ARRIVAL_DELAY)) +
  geom_histogram(
    bins = 40,
    fill = "steelblue",
    color = "white"
  ) +
  labs(
    title = "Distribuição dos Atrasos de Chegada",
    x = "Atraso (minutos)",
    y = "Quantidade de Voos"
  )
## Warning: Removed 2613 rows containing non-finite outside the scale range
## (`stat_bin()`).

A Figura 3 apresenta a distribuição dos atrasos de chegada observados na amostra analisada. Nota-se que a maior concentração de voos está localizada próxima de zero minuto de atraso, indicando que grande parte das viagens ocorreu dentro de um intervalo relativamente próximo ao horário previsto.

Também é possível observar a presença de valores negativos, que representam voos que chegaram antes do horário programado. Por outro lado, a distribuição apresenta uma cauda à direita, evidenciando a existência de alguns voos com atrasos muito elevados.

Esse comportamento indica que, embora atrasos extremos ocorram com menor frequência, eles podem exercer impacto significativo na experiência dos passageiros e na eficiência operacional das companhias aéreas.

5 Conclusão

O presente trabalho teve como objetivo investigar fatores associados aos atrasos e cancelamentos de voos comerciais utilizando dados reais do conjunto Flight Delays Dataset.

Durante a etapa de preparação dos dados foi possível identificar desafios importantes, como a distribuição das informações em múltiplas tabelas, a presença de códigos IATA, valores ausentes e a necessidade de integração dos dados para ampliar a capacidade analítica do conjunto.

A análise exploratória permitiu identificar diferenças significativas entre as companhias aéreas. Algumas empresas apresentaram atrasos médios substancialmente superiores às demais, enquanto determinadas companhias concentraram maior quantidade de cancelamentos.

Os resultados sugerem que a companhia aérea constitui um fator relevante para compreender padrões de atraso e cancelamento, influenciando diretamente a experiência dos passageiros e a eficiência operacional do transporte aéreo.

Como trabalho futuro, recomenda-se ampliar a análise utilizando a base completa de mais de cinco milhões de registros, bem como investigar a influência de aeroportos, condições climáticas e períodos do ano sobre os indicadores de desempenho dos voos.