Codeshare agreements between airlines are essential for expanding flight networks, offering more choices to passengers, and enabling airlines to share services like airport facilities. In this section, we analyze the codeshare agreements among airlines to determine which airlines have the most codeshare partnerships.

Load Required Packages

Load and Inspect Dataset

## Rows: 1124995 Columns: 15
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (11): origin_airport_iata, origin_airport_name, arr_terminal, arr_gate,...
## lgl   (1): is_cargo
## dttm  (2): scheduled_arr_utc, revised_arr_utc
## date  (1): extractedDate
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Rows: 2066 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (16): dest_airport_iata, dest_airport_name, dept_terminal, dept_gate, f...
## lgl   (1): is_cargo
## dttm  (4): scheduled_dept_utc, revised_dept_utc, scheduled_arr_utc, revised_...
## date  (1): date_local
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
##  origin_airport_iata origin_airport_name scheduled_arr_utc               
##  Length:1124995      Length:1124995      Min.   :2024-09-30 20:25:00.00  
##  Class :character    Class :character    1st Qu.:2024-10-23 01:29:00.00  
##  Mode  :character    Mode  :character    Median :2024-11-15 17:00:00.00  
##                                          Mean   :2024-11-15 17:16:48.33  
##                                          3rd Qu.:2024-12-08 22:30:00.00  
##                                          Max.   :2025-01-01 08:26:00.00  
##                                                                          
##  revised_arr_utc                  arr_terminal         arr_gate        
##  Min.   :2024-10-01 10:00:00.00   Length:1124995     Length:1124995    
##  1st Qu.:2024-10-23 01:57:00.00   Class :character   Class :character  
##  Median :2024-11-15 16:38:30.00   Mode  :character   Mode  :character  
##  Mean   :2024-11-15 17:47:43.18                                        
##  3rd Qu.:2024-12-08 23:14:00.00                                        
##  Max.   :2025-01-01 07:58:00.00                                        
##  NA's   :66481                                                         
##  flight_number       arr_status        codeshare_status    is_cargo      
##  Length:1124995     Length:1124995     Length:1124995     Mode :logical  
##  Class :character   Class :character   Class :character   FALSE:1116563  
##  Mode  :character   Mode  :character   Mode  :character   TRUE :8432     
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##  aircraft_model     airline_name       airline_iata       dest_airport_iata 
##  Length:1124995     Length:1124995     Length:1124995     Length:1124995    
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  extractedDate       
##  Min.   :2024-10-01  
##  1st Qu.:2024-10-22  
##  Median :2024-11-15  
##  Mean   :2024-11-14  
##  3rd Qu.:2024-12-08  
##  Max.   :2024-12-31  
## 

Data Cleaning

## Warning: There were 2 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `scheduled_arr_utc = ymd_hms(scheduled_arr_utc)`.
## Caused by warning:
## !  2985 failed to parse.
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
## Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1553 rows [2522, 5193,
## 6543, 6765, 8423, 11380, 17871, 19335, 19506, 19984, 19993, 24062, 26367,
## 28093, 40032, 40551, 41166, 44879, 46660, 49296, ...].

Handle Missing Values

Data Validation

Feature Engineering

Save Cleaned Data

Analysis: Which Airlines Have More Codeshares?

## # A tibble: 866 × 8
##    airline_name    total_flights codeshare_flights non_codeshare_flights
##    <chr>                   <int>             <int>                 <int>
##  1 United                 137935             15777                118443
##  2 American               126653             19199                 73560
##  3 Delta Air Lines         86753             15810                 70596
##  4 Air Canada              65154             20548                 44035
##  5 Southwest               51373                 0                 51249
##  6 Lufthansa               34572             13758                 20625
##  7 Alaska                  33736              2375                 31222
##  8 WestJet                 29406              2570                 26490
##  9 KLM                     28258              7687                 20569
## 10 Air France              27112              8204                 17616
## # ℹ 856 more rows
## # ℹ 4 more variables: unknown_status_flights <int>, flight_numbers <chr>,
## #   origin_airports <chr>, destination_airports <chr>

Flights Operating Through YYC

# Filter codeshare flights at YYC
yyc_codeshare_flights <- cleaned_data %>%
  filter((origin_airport_iata == "YYC" | dest_airport_iata == "YYC") & codeshare_status == "Codeshare") %>%
  select(flight_number, airline_name, origin_airport_iata, dest_airport_iata, scheduled_arr_utc, revised_arr_utc)

print(yyc_codeshare_flights)
## # A tibble: 3,813 × 6
##    flight_number airline_name origin_airport_iata dest_airport_iata
##    <chr>         <chr>        <chr>               <chr>            
##  1 LX 9315       SWISS        YYC                 FRA              
##  2 OS 8466       Austrian     YYC                 FRA              
##  3 LH 4405       Lufthansa    YYC                 FRA              
##  4 SN 5673       Brussels     YYC                 FRA              
##  5 AC 7393       Air Canada   YYC                 FRA              
##  6 LX 9315       SWISS        YYC                 FRA              
##  7 OS 8466       Austrian     YYC                 FRA              
##  8 AC 7393       Air Canada   YYC                 FRA              
##  9 SN 5673       Brussels     YYC                 FRA              
## 10 LH 4405       Lufthansa    YYC                 FRA              
## # ℹ 3,803 more rows
## # ℹ 2 more variables: scheduled_arr_utc <dttm>, revised_arr_utc <dttm>

Top 10 Flights by Airline and Codeshare Status

Our analysis reveals that larger, international carriers tend to have more codeshare agreements compared to regional or smaller airlines. Specifically, airlines like Air Canada, American Airlines, and Lufthansa were found to have the highest number of codeshare agreements. These airlines often partner with other international and domestic carriers, expanding their reach and allowing passengers to book flights on connecting routes operated by different airlines under the same flight code.

In terms of data, we examined a dataset that included airline routes and codeshare information. Using this data, we found that Air Canada, for example, had partnerships with more than 15 international airlines, as well as several regional carriers, providing extensive coverage across North America and Europe.

# Filter and select top codeshare flights
top_codeshare_flights <- airline_flight_details %>%
  select(airline_name, codeshare_flights) %>%
  arrange(desc(codeshare_flights)) %>%
  head(10)  # Adjust the number of top airlines you want to display

# Create a bar chart for top codeshare flights by airline
p <- ggplot(top_codeshare_flights, aes(x = reorder(airline_name, -codeshare_flights), y = codeshare_flights, fill = airline_name)) +
  geom_bar(stat = "identity") +
  labs(title = "Top Codeshare Flights by Airline",
       x = "Airline",
       y = "Number of Codeshare Flights",
       fill = "Airline") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(p)

Description: A bar plot comparing the total number of codeshare agreements for major airlines (e.g., Air Canada, American Airlines, Lufthansa, etc.).

filter flights where YYC is either the origin or destination and then selects the top 10 flights by airline and codeshare status.

We filtered the dataset to include only flights where YYC (Calgary International Airport) is either the origin or the destination. From this subset, we then identified the top 10 airlines based on the number of flights, differentiating between codeshare and non-codeshare flights. This analysis helps us understand the volume of flights from Calgary operated by various airlines, as well as the extent of codeshare agreements each airline has.

## # A tibble: 10 × 3
##    airline_name    codeshare_status total_flights
##    <chr>           <chr>                    <int>
##  1 WestJet         Operator                 14518
##  2 Air Canada      Operator                  3832
##  3 Flair           Operator                   854
##  4 Porter          Operator                   769
##  5 United          Operator                   742
##  6 Delta Air Lines Operator                   456
##  7 Delta Air Lines Codeshare                  382
##  8 Air Transat     Codeshare                  358
##  9 Austrian        Codeshare                  332
## 10 Air France      Codeshare                  263

One noticeable observation in the dataset is that WestJet shows a high number of non-codeshare flights (14,518) in the dataset but no codeshare flights. This discrepancy likely arises from data categorization issues, where codeshare flights with international partners like Delta and American Airlines may not be properly labeled as codeshares, instead being recorded under the partner airline’s name. Additionally, WestJet’s direct flights could be overrepresented under the “IsOperator” category, while codeshare flights might be excluded or categorized differently.

Upon checking WestJet’s website, it was found that the airline does have multiple codeshare agreements with major international carriers (WestJet, n.d.). This highlights the importance of understanding potential limitations in data reporting when analyzing codeshare agreements.

## Total flights at YYC: 25961
## Total codeshare flights at YYC: 3813
## Percentage of flights that are codeshared: 14.68742 %

Description: A bar plot with airlines on the x-axis, the number of flights on the y-axis, and two colors representing non-codeshare and codeshare flights.

To filter for Canadian Airlines: Air Canada, WestJet, Flair, Air Transat, Sunwing Airlines, and Porter Airlines

## # A tibble: 7 × 3
##   airline_name   codeshare_status total_flights
##   <chr>          <chr>                    <int>
## 1 WestJet        IsOperator               14518
## 2 Air Canada     IsOperator                3832
## 3 Air Transat    IsCodeshared               358
## 4 Air Canada     IsCodeshared                96
## 5 WestJet        Unknown                      2
## 6 Air Canada     Unknown                      1
## 7 Flair Airlines IsOperator                   1

Follow-up Q1: Do codeshares increase for international US domestic flights?

Objective:

Analyze flights arriving at Calgary International Airport (YYC) by categorizing them into US Domestic vs. International flights and examining the relationship between codeshare and non-codeshare flights using statistical tests.

Steps:

  1. Categorize the flights (International vs. US Domestic)
  2. Create a contingency table comparing codeshare vs. non-codeshare flights by flight type
  3. Perform a Chi-square test to check if there is a significant association
  4. If expected counts are small (<5 in any cell), use Fisher’s Exact Test
## 
##  Pearson's Chi-squared test
## 
## data:  codeshare_matrix
## X-squared = 96142, df = 2, p-value < 0.00000000000000022

The first follow-up question we looked at was: Do codeshares increase for international vs. domestic flights? To investigate the relationship between codeshare agreements and flight types (US Domestic vs. International), a Pearson’s Chi-squared test was performed on the data. The Chi-squared test was chosen because it allows us to examine the association between two categorical variables: codeshare status and flight type. The results revealed a statistically significant association between codeshare agreements and flight types, with a p-value of < 0.00000000000000022. This indicates that codeshare agreements are not equally distributed between US Domestic and International flights, with international flights showing a higher concentration of codeshare arrangements. In real-world terms, this suggests that airlines are more likely to establish codeshare agreements for international flights, likely due to the complexity and demand for global connectivity on long-haul routes.

For Calgary-based airlines, this finding presents a strategic opportunity to enhance international connectivity by expanding codeshare partnerships. Such an expansion could improve access to global destinations, increase passenger traffic, and foster economic growth by boosting tourism and trade. Airlines can leverage this insight to focus their efforts on enhancing international routes and strengthening their competitive position in the global airline network.

Interpretation and Business Insights for Calgary:

Significant Association Between Codeshares and Flight Types: The Pearson’s Chi-squared test results show a statistically significant association between codeshare agreements and flight types (US Domestic vs. International), with a p-value of < 0.00000000000000022. This indicates that codeshare agreements are strongly related to the distribution of US Domestic and International flights at Calgary International Airport (YYC), suggesting that codeshare flights are not equally distributed across these two categories.

Strategic Opportunity for Growth: Given the significant relationship between codeshare status and flight type, Calgary-based airlines have an opportunity to strategically enhance their international connectivity by expanding their codeshare partnerships. This could be particularly valuable in improving access to international destinations, which could benefit both the airline industry and local businesses by broadening market reach and improving passenger traffic to international destinations.

Follow-up Question 2: Which routes from Calgary are most impacted by codeshare agreements?

###Objective:

Identify which routes from Calgary are most impacted by codeshare agreements. Are certain destinations benefiting more from codeshare agreements?

## `summarise()` has grouped output by 'origin_airport_iata'. You can override
## using the `.groups` argument.

Figure: Top Codeshare Routes from Calgary (YYC) – showing the number of codeshare flights per destination

YYC → YYZ: Calgary International Airport (YYC) to Toronto Pearson International Airport (YYZ) (Domestic, Canada) = 2888

YYC → SFO: Calgary International Airport (YYC) to San Francisco International Airport (SFO) (International, Canada → USA) = 564

YYC → LHR: Calgary International Airport (YYC) to London Heathrow Airport (LHR) (International, Canada → United Kingdom) = 156

Summarizing the Airline Codeshare Details:

Here is a table showing the codeshare flights and the number of unique airlines operating on each route from Calgary (YYC):

## `summarise()` has grouped output by 'origin_airport_iata'. You can override
## using the `.groups` argument.

The second follow-up question that we explored was to determine which routes from Calgary International Airport (YYC) are most impacted by codeshare agreements. An analysis was conducted by filtering flights that operate under a codeshare arrangement. The objective was to identify the destinations with the highest number of codeshare flights and assess whether certain routes benefit more from these agreements. The results indicate that the most affected route is between Calgary (YYC) and Toronto Pearson International Airport (YYZ), with 2,888 codeshare flights operated by 22 different airlines. Other highly impacted routes include Calgary to San Francisco (SFO) with 564 flights and Calgary to London-Heathrow (LHR) with 156 flights.

These findings highlight that major domestic and international hubs are the primary beneficiaries of codeshare agreements, as they provide increased connectivity and access to a broader network of flights. In real-world terms, this suggests that passengers traveling from Calgary to major business and travel destinations—such as Toronto, San Francisco, and London—have greater flexibility in airline choices due to codeshare agreements.

## `summarise()` has grouped output by 'origin_airport_iata'. You can override
## using the `.groups` argument.

Top routes with codeshare flights

Additionally, a geographical analysis of the top codeshare routes provides a spatial understanding of how these agreements enhance Calgary’s flight connectivity. The map visualization below illustrates the most impacted routes, highlighting the reach of YYC’s codeshare network.

Top Codeshare Routes from Calgary – displaying flight paths and frequency

From a business perspective, this presents an opportunity for Calgary-based airlines to strengthen their partnerships with global carriers to further enhance route connectivity. Expanding codeshare agreements on existing high-traffic routes and identifying additional international destinations for similar partnerships could improve passenger convenience, increase airline market share, and support economic growth through enhanced trade and tourism.

Descriptive Statistics for Flight Delays and Codehsared Flights

1. Overview of Delay Statistics

After identifying the top codeshare routes from Calgary International Airport (YYC), we now examine how codesharing affects flight delays. Specifically, we analyze whether flights operating under codeshare agreements experience more frequent or longer delays compared to non-codeshare flights.

We start by summarizing the delay statistics for codeshare, operator, and unknown codeshare status flights.

## # A tibble: 3 × 4
##   codeshare_status mean_delay median_delay sd_delay
##   <chr>                 <dbl>        <dbl>    <dbl>
## 1 Codeshare              8.03           -2     47.6
## 2 Operator               3.30           -7     48.9
## 3 Unknown               10.2             0     52.6

Interpretation:

Codeshare flights have a mean delay of 8.03 minutes, which is higher than both Operator flights (3.30 minutes) and Unknown flights (10.18 minutes). This indicates that, on average, Codeshare flights experience a slightly smaller delay compared to Unknown flights but are more delayed than Operator flights.

Codeshare flights have a median delay of -2 minutes, indicating that for half of the Codeshare flights, the delay is less than -2 minutes (meaning the flights arrived earlier than scheduled). Operator flights have a median delay of -7 minutes, which is also early on average, but slightly more negative than the Codeshare median. Unknown flights have a median delay of 0 minutes, suggesting that the delays for Unknown flights are closer to on-time (with half of the flights being on time or early).

The standard deviation of delays is highest for Unknown flights (52.62 minutes), indicating significant variability in delay times for these flights. The Codeshare and Operator flights also show relatively high variability in delays, with Codeshare flights having a standard deviation of 47.59 minutes and Operator flights having 48.86 minutes.

Insights:

1.  Flight Delay Trends:
•   Codeshare flights are, on average, delayed more than Operator flights, but their median delays suggest that many Codeshare flights might even arrive earlier than scheduled.
•   Unknown flights seem to be more unpredictable, with larger delays observed in the mean delay, but their median indicates that these flights are close to on time for half of the observations.
2.  Variability in Delays:
•   Unknown flights have the highest variability in delays, which may point to irregular scheduling or other factors that contribute to more significant delays for these flights. This high variability could be due to inconsistent handling of flight schedules or unforeseen issues related to those flights.
3.  Potential Operational Insights:
•   Airlines operating Codeshare flights might want to focus on ensuring consistency in scheduling and minimizing delays. Despite having a slight increase in average delays compared to Operator flights, the negative median delays might reflect proactive scheduling or early arrivals.
•   For Unknown flights, further investigation into the causes of significant delays could be necessary. These flights may need more careful analysis or improved operational management to reduce variability and improve punctuality.

2. Airline-wise Delay Comparison

We now compare delays by airline and codeshare status. The following plot shows the average delay for codeshare and non-codeshare flights by airline.

## `summarise()` has grouped output by 'airline_name'. You can override using the
## `.groups` argument.
## `summarise()` has grouped output by 'airline_name'. You can override using the
## `.groups` argument.
## Warning: There were 72 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `max_delay = max(arrival_delay, na.rm = TRUE)`.
## ℹ In group 17: `airline_name = "AJet"` and `codeshare_status = "Unknown"`.
## Caused by warning in `max()`:
## ! no non-missing arguments to max; returning -Inf
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 71 remaining warnings.
## `summarise()` has grouped output by 'airline_name'. You can override using the
## `.groups` argument.

3. Delay by Route and Codeshare Status

Next, we compare delays across different routes that have codeshare agreements.

The analysis of flight delays highlights significant discrepancies between different routes, particularly for long-haul international flights. The bar chart illustrating average delays for both codeshare and non-codeshare flights by route reveals that the longest delays are observed on flights from Lagos (LOS) to Amsterdam (AMS), with a mean delay of 2,241 minutes. Other routes experiencing substantial delays include Kuala Lumpur (KUL) to Amsterdam (1,849 minutes) and Bengaluru (BLR) to Amsterdam (1,782 minutes). These delays indicate potential operational challenges affecting flights on these specific routes.

Furthermore, delays on routes such as Kuala Lumpur (KUL) to Amsterdam (AMS), Christchurch (CHC) to San Francisco (SFO), and Johannesburg (JNB) to London Heathrow (LHR) show similar patterns for both codeshare and operator flights. This suggests that common operational factors, such as congestion at destination airports, scheduling inefficiencies, or airline coordination challenges, may contribute to prolonged delays.

## `summarise()` has grouped output by 'origin_airport_iata', 'dest_airport_iata'.
## You can override using the `.groups` argument.
top_routes

Delay by Route and Codeshare Status

Key Findings:

•   LOS → AMS: Lagos, Nigeria (Murtala Muhammed International Airport) → Amsterdam, Netherlands (Amsterdam Schiphol Airport)  mean delay:2241 minutes
•   KUL → AMS: Kuala Lumpur, Malaysia (Kuala Lumpur International Airport) → Amsterdam, Netherlands (Amsterdam Schiphol Airport) mean delay: 1849
•   BLR → AMS: Bengaluru, India (Kempegowda International Airport) → Amsterdam, Netherlands (Amsterdam Schiphol Airport) mean delay: 1782

4. Does the arrival delay differ significantly between codeshare and non-codeshare flights?

We want to assess whether there is a statistically significant difference in the arrival delays between codeshare and non-codeshare flights. This can be done using an independent two-sample t-test to compare the means of arrival_delay between the two groups. First, we will filter out any flights where the codeshare_status is unknown, as this does not contribute to the comparison. Then, we will perform the t-test to evaluate if the difference in mean delays is statistically significant.

Null Hypothesis \((H₀)\) : There is no significant difference in the arrival delay between codeshare and non-codeshare flights. (i.e., the mean arrival delay for both groups is equal.)

$ H₀: {} = {} $

Alternative Hypothesis \((H₁)\): There is a significant difference in the arrival delay between codeshare and non-codeshare flights.

$ H₁: {} {} $

## 
##  Welch Two Sample t-test
## 
## data:  arrival_delay by codeshare_status
## t = 48.689, df = 830735, p-value < 0.00000000000000022
## alternative hypothesis: true difference in means between group Codeshare and group Operator is not equal to 0
## 95 percent confidence interval:
##  4.537741 4.918394
## sample estimates:
## mean in group Codeshare  mean in group Operator 
##                8.027711                3.299643
## The difference in arrival delays between codeshare and non-codeshare flights is statistically significant (p-value < 0.05).

Interpretation:

The t-test results indicate a p-value < 2.2e-16, which is far below the 0.05 significance level. This leads to the rejection of the null hypothesis, confirming that the difference in arrival delays is statistically significant. Additionally, the 95% confidence interval (4.54, 4.92) does not include zero, further supporting this conclusion. The test statistic (t = 48.689) is notably large, reinforcing the strong difference between the groups.

From these findings, it is evident that codeshare flights experience a higher mean arrival delay (8.03 minutes) compared to non-codeshare flights (3.30 minutes). This suggests that codesharing may introduce operational inefficiencies or scheduling challenges, contributing to longer delays.

Conclusion:

Based on the results of the Welch Two Sample t-test, we reject the null hypothesis and conclude that there is a statistically significant difference in the arrival delays between codeshare and non-codeshare flights. Specifically, codeshare flights have a higher mean arrival delay (8.03 minutes) compared to non-codeshare flights (3.30 minutes).

To address these issues, further investigation is needed to identify the root causes of extreme delays on high-delay routes. Airlines should optimize scheduling, enhance coordination between codeshare partners, and implement operational improvements to minimize delays. Reducing wait times and enhancing punctuality will not only improve passenger satisfaction but also strengthen the reliability of codeshare agreements. By mitigating these delays, airlines and airports can enhance overall travel efficiency and maintain competitiveness in the global aviation market.

map

## Warning in left_join(., selected_airports_arrivals, by = c(dest_airport_iata = "origin_airport_iata")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 1 of `x` matches multiple rows in `y`.
## ℹ Row 2951 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
## # A tibble: 27,831,687 × 21
##    origin_airport_iata dest_airport_iata flight_number.x airline_name.x
##    <chr>               <chr>             <chr>           <chr>         
##  1 YYC                 YVR               WS 113          WestJet       
##  2 YYC                 YVR               WS 113          WestJet       
##  3 YYC                 YVR               WS 113          WestJet       
##  4 YYC                 YVR               WS 113          WestJet       
##  5 YYC                 YVR               WS 113          WestJet       
##  6 YYC                 YVR               WS 113          WestJet       
##  7 YYC                 YVR               WS 113          WestJet       
##  8 YYC                 YVR               WS 113          WestJet       
##  9 YYC                 YVR               WS 113          WestJet       
## 10 YYC                 YVR               WS 113          WestJet       
## # ℹ 27,831,677 more rows
## # ℹ 17 more variables: scheduled_dept_utc <dttm>, revised_dept_utc <dttm>,
## #   status <chr>, arrival_airport_name <chr>, scheduled_arrival <dttm>,
## #   revised_arrival <dttm>, arr_terminal <chr>, arr_gate <chr>,
## #   flight_number.y <chr>, arr_status <chr>, codeshare_status <chr>,
## #   is_cargo <lgl>, aircraft_model <chr>, airline_name.y <chr>,
## #   airline_iata <chr>, dest_airport_iata.y <chr>, extractedDate <date>

Top 10 codeshare routes from Calgary (YYC) along with their flight counts and the number of unique airlines operating them.

## ℹ Google's Terms of Service: <https://mapsplatform.google.com>
##   Stadia Maps' Terms of Service: <https://stadiamaps.com/terms-of-service/>
##   OpenStreetMap's Tile Usage Policy: <https://operations.osmfoundation.org/policies/tiles/>
## ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
## 
## Attaching package: 'ggmap'
## 
## 
## The following object is masked from 'package:plotly':
## 
##     wind
## 
## 
## Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE

References

WestJet. (n.d.). Airline partners. https://www.westjet.com/en-ca/who-we-are/airline-partners