Flights Related Questions

DATA 412/612 · Week 5 · Source (.qmd)

library(tidyverse)
library(nycflights13)

Question 1 — Flight Volume and Arrival Delays

Using the flights dataset, investigate whether the number of flights an airline operates on a given day is related to its average arrival delay that day. Restrict your analysis to airline-days with at least 20 flights and exclude flights with missing arrival-delay information.

Create an appropriate visualization showing this relationship for the different airlines.

flights %>%
  
  # Remove flights with missing arrival delay values
  filter(!is.na(arr_delay)) %>%
  
  # Group flights by airline and calendar day
  group_by(carrier, month, day) %>%
  
  # Calculate the number of flights and average arrival delay
  # for each airline on each day
  summarise(
    n_flights = n(),
    ave_arr_delay = mean(arr_delay),
    .groups = "drop"
  ) %>%
  
  # Keep only airline-days with at least 20 flights
  filter(n_flights >= 20) %>%
  
  # Sort from highest to lowest average arrival delay
  arrange(desc(ave_arr_delay)) %>%
  
  # Plot number of flights against average arrival delay
  ggplot(aes(
    x = n_flights,
    y = ave_arr_delay,
    colour = carrier
  )) +
  
  # Add scatter plot points with some transparency
  geom_point(alpha = 0.5) +
  
  # Add axis labels and a title
  xlab("Number of Flights") +
  ylab("Average Arrival Delay") +
  ggtitle("Number of Flights vs. Average Arrival Delay by Carrier") +
  
  # Create a separate panel for each airline
  facet_wrap(~ carrier)

Question 2 — Worst Month for Each Airline

Using the flights dataset, determine the worst month for each airline based on departure delays. Define an airline’s worst month as the month having its highest average departure delay. Exclude flights with missing departure-delay information.

Create a bar chart comparing the airlines, where the height of each bar represents the maximum monthly average departure delay and the color identifies the corresponding worst month.

flights %>%
  
  # Remove flights with missing departure delay values
  filter(!is.na(dep_delay)) %>%
  
  # Group flights by airline and month
  group_by(carrier, month) %>%
  
  # Calculate the average departure delay for each
  # airline in each month
  summarise(
    avg_dep_delay = mean(dep_delay),
    .groups = "drop"
  ) %>%
  
  # Group the monthly averages by airline
  group_by(carrier) %>%
  
  # Find the maximum monthly average departure delay
  # for each airline
  mutate(
    max_avg_dep_delay = max(avg_dep_delay)
  ) %>%
  
  # Keep only the month with the maximum average
  # departure delay for each airline
  filter(avg_dep_delay == max_avg_dep_delay) %>%
  
  # Remove the grouping
  ungroup() %>%
  
  # Create a bar plot of the worst monthly delay
  # for each airline
  ggplot(aes(
    x = carrier,
    y = max_avg_dep_delay,
    fill = factor(month)
  )) +
  
  # Create one bar for each airline
  geom_col() +
  
  # Add axis labels, legend title, and plot title
  labs(
    x = "Carrier",
    y = "Maximum Monthly Average Departure Delay (minutes)",
    fill = "Worst Month",
    title = "Worst Month for Each Airline Based on Departure Delay"
  ) +
  
  # Apply a minimal theme
  theme_minimal()

Question 3 — What Is the Worst Working Day to Fly with Each Airline?

Using the flights dataset, determine the worst working day of the week to fly with each airline based on departure delays. Consider only Monday through Friday, and exclude flights for which departure-delay information is missing.

Define the worst working day for an airline as the weekday with the highest average departure delay for that airline.

Create a bar chart comparing the airlines, where the height of each bar represents the maximum average departure delay across the five working days, and the color of the bar identifies the corresponding worst weekday.

flights %>%
  filter(!is.na(dep_delay)) %>%
  
  # Create date and weekday
  mutate(
    date = make_date(year, month, day),
    weekday = wday(date, label = TRUE, abbr = FALSE)
  ) %>%
  
  # Keep Monday through Friday
  filter(weekday %in% c(
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"
  )) %>%
  
  # Average delay for each airline and weekday
  group_by(carrier, weekday) %>%
  summarise(
    avg_dep_delay = mean(dep_delay),
    .groups = "drop"
  ) %>%
  
  # Maximum weekday average for each airline
  group_by(carrier) %>%
  mutate(
    max_avg_dep_delay = max(avg_dep_delay)
  ) %>%
  
  # Keep the worst weekday
  filter(avg_dep_delay == max_avg_dep_delay) %>%
  ungroup() %>%
  
  # Plot
  ggplot(aes(
    x = carrier,
    y = max_avg_dep_delay,
    fill = weekday
  )) +
  geom_col() +
  labs(
    x = "Carrier",
    y = "Maximum Average Departure Delay (minutes)",
    fill = "Worst Weekday",
    title = "Worst Working Day to Fly for Each Airline"
  ) +
  theme_minimal()