Trafic aérien commercial mensuel par paire d’aéroports (série PAP) - trafic-aerien-paires-aeroports

Données - DGAC

Source : DGAC, data.gouv.fr. Liaisons point à point (départs et arrivées confondus) entre deux aéroports (codes OACI AAAA_BBBB). Pour respecter le secret statistique, seules les liaisons avec au moins trois opérateurs, dont aucun ne dépasse 85 % du trafic, sont publiées : les grandes liaisons nationales sont donc bien couvertes, une partie du trafic de compagnies en situation de monopole ne l’est pas.

Principales liaisons

Les 15 premières liaisons en 2025

Code
`trafic-aerien-paires-aeroports` |>
  filter(year(date) == 2025) |>
  group_by(PAP, PAP1_LABEL, PAP2_LABEL) |>
  summarise(pax = sum(PAP_PAX, na.rm = TRUE) / 1e6, .groups = "drop") |>
  slice_max(pax, n = 15) |>
  mutate(liaison = fct_reorder(paste(str_to_title(PAP1_LABEL), "-", str_to_title(PAP2_LABEL)), pax)) |>
  ggplot(aes(x = liaison, y = pax)) +
  geom_col(fill = "#08519c") + coord_flip() + theme_minimal() +
  xlab("") + ylab("Millions de passagers (aller + retour)")

Principales liaisons intérieures, passagers par an (depuis 2010)

Code
nationales <- `trafic-aerien-paires-aeroports` |>
  filter(str_sub(PAP, 1, 2) == "LF", str_sub(PAP, 6, 7) == "LF") |>
  mutate(annee = year(date))
top_nat <- nationales |> filter(annee == 2019) |>
  group_by(PAP) |> summarise(pax = sum(PAP_PAX, na.rm = TRUE)) |> slice_max(pax, n = 8) |> pull(PAP)
nationales |>
  filter(PAP %in% top_nat, annee >= 2010) |>
  group_by(annee, PAP, PAP1_LABEL, PAP2_LABEL) |>
  summarise(pax = sum(PAP_PAX, na.rm = TRUE) / 1e6, .groups = "drop") |>
  mutate(date = as.Date(paste0(annee, "-01-01")),
         liaison = paste(str_to_title(PAP1_LABEL), "-", str_to_title(PAP2_LABEL))) |>
  ggplot(aes(x = date, y = pax, color = liaison)) +
  geom_line() + theme_minimal() + xlab("") + ylab("Millions de passagers") +
  scale_x_date(date_breaks = "5 years", labels = date_format("%Y")) +
  theme(legend.position = "bottom", legend.title = element_blank()) +
  guides(color = guide_legend(ncol = 2))

Liaisons intérieures en 2025 par rapport à 2019

Code
nationales |>
  filter(annee %in% c(2019, 2025), PAP %in% top_nat) |>
  group_by(annee, PAP, PAP1_LABEL, PAP2_LABEL) |>
  summarise(pax = sum(PAP_PAX, na.rm = TRUE), .groups = "drop") |>
  pivot_wider(names_from = annee, values_from = pax, names_prefix = "a") |>
  mutate(variation = a2025 / a2019 - 1) |>
  filter(is.finite(variation)) |>
  mutate(liaison = fct_reorder(paste(str_to_title(PAP1_LABEL), "-", str_to_title(PAP2_LABEL)), variation)) |>
  ggplot(aes(x = liaison, y = variation, fill = variation > 0)) +
  geom_col() + coord_flip() + theme_minimal() + xlab("") +
  ylab("Passagers 2025 par rapport à 2019") +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  scale_fill_manual(values = c("#b2182b", "#2166ac")) +
  theme(legend.position = "none")

Distance

Distance et trafic des liaisons, 2025

Code
`trafic-aerien-paires-aeroports` |>
  filter(year(date) == 2025) |>
  group_by(PAP, PAP1_LABEL, PAP2_LABEL, PAP_DIST) |>
  summarise(pax = sum(PAP_PAX, na.rm = TRUE), .groups = "drop") |>
  filter(pax > 0, !is.na(PAP_DIST)) |>
  ggplot(aes(x = PAP_DIST, y = pax)) +
  geom_point(alpha = 0.5, color = "#08519c") + theme_minimal() +
  scale_x_log10(labels = fr) + scale_y_log10(labels = fr) +
  xlab("Distance (km, échelle log)") + ylab("Passagers en 2025 (échelle log)")

Nombre de liaisons publiées par an

Code
`trafic-aerien-paires-aeroports` |>
  mutate(annee = year(date)) |>
  group_by(annee) |>
  summarise(liaisons = n_distinct(PAP)) |>
  mutate(date = as.Date(paste0(annee, "-01-01"))) |>
  ggplot(aes(x = date, y = liaisons)) +
  geom_line() + geom_point(size = 0.8) + theme_minimal() + xlab("") + ylab("Nombre de liaisons") +
  scale_x_date(date_breaks = "5 years", labels = date_format("%Y"))