Comment les divisions 2021 de la LNH réduiront les déplacements

Image par Ross Parmly de Unsplash

J’imagine que, tout comme moi, plusieurs parmi vous étiez particulièrement enthousiastes lorsque la Ligue Nationale de Hockey (LNH) a dévoilé les divisions qui seront utilisées tout au long de la présente saison. Ça fait des années que je rêvais secrètement d’une division canadienne, mais je n’avais jamais cru que mon rêve deviendrait réalité! On aura droit à du hockey électrisant et certaines rivalités passeront probablement à un niveau supérieur, mais qu’en est-il de l’impact sur le voyagement des équipes?

Cet article est le premier d’une série de plusieurs dans lesquels j’explorerai différentes fonctionnalités du package tidynhl, un projet personnel qui, lentement mais sûrement, prend forme. Le but de celui-ci est de faciliter l’accès aux données de la LNH en utilisant leur API ouvert de statistiques.

Calendrier 2021 des équipes

Pour commencer, on charge et on affiche un extrait du calendrier 2021 de la LNH à l’aide de la fonction tidy_schedules().

# Charger les packages
library(data.table)
library(tidynhl)

# Obtenir le calendrier 2021 de la LNH
nhl_schedule_2021 <- tidy_schedules(
  seasons_id = "20202021",
  playoffs = FALSE
)

# Afficher un extrait du calendrier
nhl_schedule_2021[]
#>      season_years season_type       game_datetime game_status             venue_name away_abbreviation away_score home_score home_abbreviation game_nbot game_shootout
#>   1:      2020-21     regular 2021-01-13 17:30:00       final     Wells Fargo Center               PIT          3          6               PHI         0         FALSE
#>   2:      2020-21     regular 2021-01-13 19:00:00       final       Scotiabank Arena               MTL          4          5               TOR         1         FALSE
#>   3:      2020-21     regular 2021-01-13 20:00:00       final           Amalie Arena               CHI          1          5               TBL         0         FALSE
#>   4:      2020-21     regular 2021-01-13 22:00:00       final           Rogers Place               VAN          5          3               EDM         0         FALSE
#>   5:      2020-21     regular 2021-01-13 22:30:00       final             Ball Arena               STL          4          1               COL         0         FALSE
#>  ---                                                                                                                                                                  
#> 864:      2020-21     regular 2021-05-08 22:00:00   scheduled           Rogers Arena               CGY         NA         NA               VAN        NA            NA
#> 865:      2020-21     regular 2021-05-08 22:00:00   scheduled         T-Mobile Arena               STL         NA         NA               VGK        NA            NA
#> 866:      2020-21     regular 2021-05-08 22:00:00   scheduled         STAPLES Center               COL         NA         NA               LAK        NA            NA
#> 867:      2020-21     regular 2021-05-08 22:30:00   scheduled SAP Center at San Jose               ARI         NA         NA               SJS        NA            NA
#> 868:      2020-21     regular 2021-05-10 19:00:00   scheduled           Amalie Arena               DAL         NA         NA               TBL        NA            NA

On fait ensuite une transformation des données pour garder les colonnes d’intérêt et dupliquer les lignes dans le but d’avoir une vue pour chaque équipe. Ces étapes seront traitées à l’intérieur d’une fonction qui pourra être réutilisée un peu plus loin dans l’article.

# Définir la fonction create_teams_schedule()
create_teams_schedule <- function(nhl_schedule) {
  
  teams_schedule <- rbindlist(list(
    nhl_schedule[, .(
      season = season_years,
      date = as.Date(game_datetime, tz = Sys.timezone()),
      status = "away",
      team = away_abbreviation,
      opponent = home_abbreviation
    )],
    nhl_schedule[, .(
      season = season_years,
      date = as.Date(game_datetime, tz = Sys.timezone()),
      status = "home",
      team = home_abbreviation,
      opponent = away_abbreviation
    )]
  ))
  
  teams_schedule[, venue := ifelse(status == "home", team, opponent)]
  
  setkey(teams_schedule, season, team, date)
  
  teams_schedule[]
  
}

# Appliquer la fonction au calendrier 2021
teams_schedule_2021 <- create_teams_schedule(nhl_schedule_2021)

# Afficher un aperçu
teams_schedule_2021[]
#>        season       date status team opponent venue
#>    1: 2020-21 2021-01-14   away  ANA      VGK   VGK
#>    2: 2020-21 2021-01-16   away  ANA      VGK   VGK
#>    3: 2020-21 2021-01-18   home  ANA      MIN   ANA
#>    4: 2020-21 2021-01-20   home  ANA      MIN   ANA
#>    5: 2020-21 2021-01-22   home  ANA      COL   ANA
#>   ---                                              
#> 1732: 2020-21 2021-05-01   home  WSH      PIT   WSH
#> 1733: 2020-21 2021-05-03   away  WSH      NYR   NYR
#> 1734: 2020-21 2021-05-05   away  WSH      NYR   NYR
#> 1735: 2020-21 2021-05-07   home  WSH      PHI   WSH
#> 1736: 2020-21 2021-05-08   home  WSH      PHI   WSH

Transformation des données

L’objectif de cette section est de mettre en relation les matchs successifs des équipes. On définit donc une fonction qui créera de nouvelles colonnes dans lesquelles on va indiquer la date et l’endroit du dernier match. On crée cette fonction et on l’applique à nos données dans le bloc ci-dessous.

# Définir la fonction add_last_game()
add_last_game <- function(teams_schedule) {
  
  teams_schedule[, `:=`(
    last_date = c(as.Date(NA), date[-.N]),
    last_venue = c(team, venue[-.N])
  ), .(season, team)]
  
}

# Appliquer la fonction au calendrier 2021
add_last_game(teams_schedule_2021)

# Afficher un aperçu
teams_schedule_2021[]
#>        season       date status team opponent venue  last_date last_venue
#>    1: 2020-21 2021-01-14   away  ANA      VGK   VGK       <NA>        ANA
#>    2: 2020-21 2021-01-16   away  ANA      VGK   VGK 2021-01-14        VGK
#>    3: 2020-21 2021-01-18   home  ANA      MIN   ANA 2021-01-16        VGK
#>    4: 2020-21 2021-01-20   home  ANA      MIN   ANA 2021-01-18        ANA
#>    5: 2020-21 2021-01-22   home  ANA      COL   ANA 2021-01-20        ANA
#>   ---                                                                    
#> 1732: 2020-21 2021-05-01   home  WSH      PIT   WSH 2021-04-29        WSH
#> 1733: 2020-21 2021-05-03   away  WSH      NYR   NYR 2021-05-01        WSH
#> 1734: 2020-21 2021-05-05   away  WSH      NYR   NYR 2021-05-03        NYR
#> 1735: 2020-21 2021-05-07   home  WSH      PHI   WSH 2021-05-05        NYR
#> 1736: 2020-21 2021-05-08   home  WSH      PHI   WSH 2021-05-07        WSH

On crée ensuite une autre table dans laquelle on viendra calculer les distances entre le domicile des différentes équipes. À des fins de simplicité, on pose l’hypothèse que toutes les distances sont calculées à vol d’oiseau entre ceux-ci. Pour ce faire, on va utiliser la fonction distm() du package geosphere.

On commence donc par charger différentes informations sur chaque équipe (dont l’emplacement de leur amphithéâtre et leur division respective) à l’aide de la fonction tidy_teams_meta(). On calculera ensuite une matrice des distances qu’on transformera en table pour en faciliter l’interrogation.

# Charger le package
library(geosphere)

# Charger les informations des équipes
teams_meta <- tidy_teams_meta()

# Afficher un aperçu
teams_meta[]
#>     team_abbreviation team_place      team_name        team_fullname team_shortname season_first_years conference_active_abbreviation conference_active_name division_active_abbreviation division_active_name venue_active_name venue_active_country venue_active_stateprovince venue_active_city     venue_active_tz venue_active_lat venue_active_long                                       logo_last_url
#>  1:               ANA    Anaheim          Ducks        Anaheim Ducks        Anaheim            1993-94                              W                Western                          WST           Honda West      Honda Center                  USA                         CA           Anaheim America/Los_Angeles         33.80778        -117.87667 https://assets.nhle.com/logos/nhl/svg/ANA_light.svg
#>  2:               ARI    Arizona        Coyotes      Arizona Coyotes        Arizona            2014-15                              W                Western                          WST           Honda West  Gila River Arena                  USA                         AZ          Glendale     America/Phoenix         33.53194        -112.26111 https://assets.nhle.com/logos/nhl/svg/ARI_light.svg
#>  3:               BOS     Boston         Bruins        Boston Bruins         Boston            1924-25                              E                Eastern                          EST      MassMutual East         TD Garden                  USA                         MA            Boston    America/New_York         42.36630         -71.06223 https://assets.nhle.com/logos/nhl/svg/BOS_light.svg
#>  4:               BUF    Buffalo         Sabres       Buffalo Sabres        Buffalo            1970-71                              E                Eastern                          EST      MassMutual East    KeyBank Center                  USA                         NY           Buffalo    America/New_York         42.87500         -78.87639 https://assets.nhle.com/logos/nhl/svg/BUF_light.svg
#>  5:               CAR   Carolina     Hurricanes  Carolina Hurricanes       Carolina            1997-98                              E                Eastern                          CEN     Discover Central         PNC Arena                  USA                         NC           Raleigh    America/New_York         35.80333         -78.72194 https://assets.nhle.com/logos/nhl/svg/CAR_light.svg
#> ---                                                                                                                                                                                                                                                                                                                                                                                                          
#> 27:               TOR    Toronto    Maple Leafs  Toronto Maple Leafs        Toronto            1926-27                              E                Eastern                          NTH         Scotia North  Scotiabank Arena               Canada                         ON           Toronto     America/Toronto         43.64333         -79.37917 https://assets.nhle.com/logos/nhl/svg/TOR_light.svg
#> 28:               VAN  Vancouver        Canucks    Vancouver Canucks      Vancouver            1970-71                              W                Western                          NTH         Scotia North      Rogers Arena               Canada                         BC         Vancouver   America/Vancouver         49.27778        -123.10889 https://assets.nhle.com/logos/nhl/svg/VAN_light.svg
#> 29:               VGK      Vegas Golden Knights Vegas Golden Knights          Vegas            2017-18                              W                Western                          WST           Honda West    T-Mobile Arena                  USA                         NV         Las Vegas America/Los_Angeles         36.10278        -115.17833 https://assets.nhle.com/logos/nhl/svg/VGK_light.svg
#> 30:               WPG   Winnipeg           Jets        Winnipeg Jets       Winnipeg            2011-12                              W                Western                          NTH         Scotia North    Bell MTS Place               Canada                         MB          Winnipeg    America/Winnipeg         49.89278         -97.14361 https://assets.nhle.com/logos/nhl/svg/WPG_light.svg
#> 31:               WSH Washington       Capitals  Washington Capitals     Washington            1974-75                              E                Eastern                          EST      MassMutual East Capital One Arena                  USA                         DC        Washington    America/New_York         38.89806         -77.02083 https://assets.nhle.com/logos/nhl/svg/WSH_light.svg

# Calculer une matrice des distances en km
venues_matrix <- round(distm(teams_meta[, .(venue_active_long, venue_active_lat)]) / 1000L)

# Convertir sous la forme d'une table
teams_distances <- setDT(
  expand.grid(team = teams_meta[, team_abbreviation], opponent = teams_meta[, team_abbreviation])
)[, distance := as.integer(venues_matrix)]

# Afficher un aperçu
teams_distances[]
#>      team opponent distance
#>   1:  ANA      ANA        0
#>   2:  ARI      ANA      522
#>   3:  BOS      ANA     4161
#>   4:  BUF      ANA     3520
#>   5:  CAR      ANA     3566
#>  ---                       
#> 957:  TOR      WSH      563
#> 958:  VAN      WSH     3801
#> 959:  VGK      WSH     3364
#> 960:  WPG      WSH     2005
#> 961:  WSH      WSH        0

Analyse des déplacements

Afin d’être en mesure de faire notre analyse, on doit tout d’abord poser d’autres hypothèses, cette fois par rapport à la fréquence de déplacement des équipes. Évidemment, celles-ci ne sont pas nécessairement exactes, mais j’ai essayé de construite un algorithme balancé entre simplicité et réalité.

On pose donc les hypothèses suivantes :

  • Chaque équipe est basée à son domicile en début de saison;
  • Les déplacements à l’étranger sont effectués selon l’algorithme présenté ci-dessous.

On peut faire un exemple concret en appliquant ces hypothèses au début de saison des Canadiens de Montréal pour bien comprendre. On obtient alors, pour les deux premières semaines de leur calendrier, les voyages suivants :

Match du 13 janvier 2021 (MTL @ TOR)

  • L’équipe est basée à MTL en début de saison

⇒ Verdict : Voyage de MTL vers TOR ✈️


Match du 16 janvier 2021 (MTL @ EDM)

  • L’équipe joue 2 matchs consécutifs sur la route (13 et 16 janvier)
  • Ces deux matchs ne sont pas contre le même adversaire (TOR et EDM)
  • L’adversaire le plus près (TOR) n’est pas à plus de 2000 km de MTL
  • L’équipe n’a pas 3 jours de congé entre les matchs (seulement les 14 et 15 janvier)

⇒ Verdict : Voyage de TOR vers EDM ✈️


Match du 18 janvier 2021 (MTL @ EDM)

  • L’équipe joue 2 matchs consécutifs sur la route (16 et 18 janvier)
  • Ces deux matchs sont contre le même adversaire (EDM)

⇒ Verdict : Aucun voyage 🏨


Match du 20 janvier 2021 (MTL @ VAN)

  • L’équipe joue 2 matchs consécutifs sur la route (18 et 20 janvier)
  • Ces deux matchs ne sont pas contre le même adversaire (EDM et VAN)
  • L’adversaire le plus près (EDM) est à plus de 2000 km de MTL
  • L’équipe n’a pas 5 jours de congé entre les matchs (seulement le 19 janvier)

⇒ Verdict : Voyage de EDM vers VAN ✈️


Match du 21 janvier 2021 (MTL @ VAN)

  • L’équipe joue 2 matchs consécutifs sur la route (20 et 21 janvier)
  • Ces deux matchs sont contre le même adversaire (VAN)

⇒ Verdict : Aucun voyage 🏨


Match du 23 janvier 2021 (MTL @ VAN)

  • L’équipe joue 2 matchs consécutifs sur la route (21 et 23 janvier)
  • Ces deux matchs sont contre le même adversaire (VAN)

⇒ Verdict : Aucun voyage 🏨


Match du 28 janvier 2021 (CGY @ MTL)

  • L’équipe ne joue pas 2 matchs consécutifs sur la route

⇒ Verdict : Voyage de VAN vers MTL ✈️

On crée maintenant une fonction implantant cet algorithme et on l’applique à l’ensemble des équipes pour leur calendrier 2021.

# Définir la fonction create_teams_travels()
create_teams_travels <- function(teams_schedule) {
  
  teams_travels <- teams_schedule[, rbindlist(mapply(
    FUN = function(team, venue, last_venue, off_days) {
    
      # Empêcher les collisions
      TEAM <- team
      
      # Aucun voyage
      if (venue == last_venue) {
        return(NULL)
      }
      
      # Direction prochain match
      if (is.na(off_days) | off_days < 3L | team %in% c(venue, last_venue)) {
        return(list(
          from = last_venue,
          to = venue
        ))
      }
      
      # Distance minimale du domicile
      distance <- teams_distances[team == TEAM & opponent %in% c(venue, last_venue), min(distance)]
      
      # Direction domicile + Direction prochain match
      if (off_days >= 5L | (off_days >= 3L & distance <= 2000L)) {
        return(list(
          from = c(last_venue, team),
          to = c(team, venue)
        ))
      }
      
      # Direction prochain match
      list(
        from = last_venue,
        to = venue
      )
    
    },
    team = team,
    venue = venue,
    last_venue = last_venue,
    off_days = date - last_date - 1L,
    SIMPLIFY = FALSE
  )), .(season, team)]
  
  # Ajouter la distance des voyages
  teams_travels[teams_distances, distance := distance, on = c(from = "team", to = "opponent")]
  
  # Appeler la valeur de sortie
  teams_travels[]

}

# Appliquer la fonction au calendrier 2021 des équipes
teams_travels_2021 <- create_teams_travels(teams_schedule_2021)

# Afficher un aperçu
teams_travels_2021[]
#>       season team from  to distance
#>   1: 2020-21  ANA  ANA VGK      354
#>   2: 2020-21  ANA  VGK ANA      354
#>   3: 2020-21  ANA  ANA ARI      522
#>   4: 2020-21  ANA  ARI ANA      522
#>   5: 2020-21  ANA  ANA LAK       45
#>  ---                               
#> 744: 2020-21  WSH  BOS NYI      279
#> 745: 2020-21  WSH  NYI PHI      162
#> 746: 2020-21  WSH  PHI WSH      194
#> 747: 2020-21  WSH  WSH NYR      331
#> 748: 2020-21  WSH  NYR WSH      331

On peut facilement valider que notre exemple pour le début de saison des Canadiens est bien représenté par l’algorithme.

teams_travels_2021[team == "MTL"][1:4]
#>     season team from  to distance
#> 1: 2020-21  MTL  MTL TOR      505
#> 2: 2020-21  MTL  TOR EDM     2714
#> 3: 2020-21  MTL  EDM VAN      819
#> 4: 2020-21  MTL  VAN MTL     3696

On crée ensuite un sommaire par équipe indiquant la distance totale qui sera parcourue au cours de la saison 2021 auquel on vient ajouter la division actuelle de chaque équipe.

# Définir la fonction create_teams_travel_summary()
create_teams_travel_summary <- function(teams_travels, nhl_schedule) {
  
  # Créer un tableau sommaire
  teams_travel_summary <- teams_travels[, .(
    nb = .N,
    km = sum(distance)
  ), .(season, team)]
  
  # Ajout du nombre de km par jour de saison
  nhl_season_days <- nhl_schedule[, .(
    season_years = season_years,
    game_date = as.Date(game_datetime, tz = Sys.timezone())
  )][, .(days = as.integer(max(game_date) - min(game_date) + 1L)), season_years]
  teams_travel_summary[nhl_season_days, days := days, on = c(season = "season_years")]
  teams_travel_summary[, km_per_day := km / days]
  
  # Ajout des divisions
  teams_travel_summary[teams_meta, division := division_active_name, on = c(team = "team_abbreviation")]
  
  # Appeler la valeur de sortie
  teams_travel_summary[]
  
}

# Appliquer la fonction aux voyages 2021 des équipes
teams_travel_summary_2021 <- create_teams_travel_summary(teams_travels_2021, nhl_schedule_2021)

# Afficher un aperçu
teams_travel_summary_2021[]
#>      season team nb    km days km_per_day         division
#>  1: 2020-21  ANA 23 17275  118  146.39831       Honda West
#>  2: 2020-21  ARI 19 19110  118  161.94915       Honda West
#>  3: 2020-21  BOS 25  9012  118   76.37288  MassMutual East
#>  4: 2020-21  BUF 26 10483  118   88.83898  MassMutual East
#>  5: 2020-21  CAR 22 20457  118  173.36441 Discover Central
#> ---                                                       
#> 27: 2020-21  TOR 29 31852  118  269.93220     Scotia North
#> 28: 2020-21  VAN 22 33415  118  283.17797     Scotia North
#> 29: 2020-21  VGK 24 23275  118  197.24576       Honda West
#> 30: 2020-21  WPG 23 27515  118  233.17797     Scotia North
#> 31: 2020-21  WSH 25  7191  118   60.94068  MassMutual East

On affiche maintenant un graphique permettant de visualiser cette information pour l’ensemble des équipes de la ligue. On utilise respectivement les packages ggplot2 et scales pour créer le graphique et en modifier le formatage.

# Charger les packages
library(ggplot2)
library(scales)

# Créer le graphique
ggplot(
  data = teams_travel_summary_2021,
  mapping = aes(
    x = km,
    y = reorder(as.factor(team), km),
    fill = division
  )
) +
  geom_col() +
  scale_x_continuous(
    labels = label_number(),
    expand = expansion(mult = c(0, 0.05))
  ) +
  scale_fill_brewer(palette = "Set1") +
  labs(
    title = "Distance totale à parcourir par équipe",
    subtitle = "Saison 2021 de la LNH",
    x = "Distance (km)"
  )

Comme on pouvait s’y en attendre, les équipes près de la région métropolitaine de New York sont celles qui auront la plus petite distance à parcourir. On voit clairement que les équipes de la division canadienne sont celles qui, en moyenne, parcoureront le plus de kilomètres pendant la saison. Cependant, la distribution à l’intérieur de cette division est assez uniforme, ce qui n’est pas le cas pour la division ouest. Alors que les Ducks n’auront qu’un peu plus de 17 000 km à parcourir pendant la saison, les Blues en parcoureront près de 35 000 (plus du double 😱!) pendant la même période. Reste à voir si ce sera assez pour permettre aux Ducks de compenser pour leur manque de talent offensif…

Une chose est certaine, si la fatigue accumulée générée en raison du voyagement pendant la saison s’avère être un bon indicateur de la performance des joueurs en séries, la division est partira avec un avantage considérable sur ses adversaires au printemps prochain.

Comparaison avec les saisons précédentes

Bien que la statistique absolue du nombre de kilomètres à parcourir pour chaque équipe lors de la saison 2021 soit intéressante, on pourrait aussi s’intéresser au changement relatif qu’apportent ces nouvelles divisions et ce nouveau calendrier à chaque équipe. Pour ce faire, on comparera la saison 2021 aux saisons entre 2013-14 (dernier remaniement de divisions avant 2021) et 2019-20 inclusivement.

On applique donc les fonctions créées dans la section précédente une à la suite de l’autre. Ensuite, on calcule la moyenne de certaines métriques d’intérêt sur ces 7 saisons.

# Obtenir les calendriers 2013-14 à 2019-20 de la LNH
nhl_schedule_20132020 <- tidy_schedules(
  seasons_id = paste0(2013:2019, 2014:2020),
  playoffs = FALSE
)

# Remplacer PHX par ARI
nhl_schedule_20132020[away_abbreviation == "PHX", away_abbreviation := "ARI"]
nhl_schedule_20132020[home_abbreviation == "PHX", home_abbreviation := "ARI"]

# Créer une vue par équipe
teams_schedule_20132020 <- create_teams_schedule(nhl_schedule_20132020)

# Transformation des données
add_last_game(teams_schedule_20132020)

# Créer une vue des déplacements
teams_travels_20132020 <- create_teams_travels(teams_schedule_20132020)

# Créer le sommaire des déplacements par équipe par saison
teams_travel_summary_20132020 <- create_teams_travel_summary(teams_travels_20132020, nhl_schedule_20132020)

# Créer le sommaire des déplacements par équipe
teams_travel_summary_20132020 <- teams_travel_summary_20132020[, .(
  season = "2013-20",
  km_avg = mean(km),
  km_per_day_avg = sum(km) / sum(days)
), .(team, division)]

# Afficher un aperçu
teams_travel_summary_20132020[]
#>     team         division  season   km_avg km_per_day_avg
#>  1:  ANA       Honda West 2013-20 71663.71       390.9945
#>  2:  ARI       Honda West 2013-20 77372.29       422.1403
#>  3:  BOS  MassMutual East 2013-20 63927.00       348.7833
#>  4:  BUF  MassMutual East 2013-20 55257.86       301.4848
#>  5:  CAR Discover Central 2013-20 62885.29       343.0998
#> ---                                                      
#> 27:  TOR     Scotia North 2013-20 56366.86       307.5355
#> 28:  VAN     Scotia North 2013-20 72433.43       395.1941
#> 29:  WPG     Scotia North 2013-20 71265.57       388.8223
#> 30:  WSH  MassMutual East 2013-20 57520.14       313.8277
#> 31:  VGK       Honda West 2013-20 69383.00       389.0636

Afin de comparer des pommes avec des pommes, on utilisera cette fois-ci la métrique de kilomètres parcourus en moyenne par jour pendant la saison. Cette métrique normalisera donc les saisons écourtées de 2019-20 et 2021 à un niveau comparable aux autres.

On affiche donc un graphique illustrant la réduction des déplacements quotidiens moyens par équipe pour la saison 2021 comparativement à la période de référence. Les résultats sont triés en ordre de diminution relative.

# Créer le sommaire comparatif
teams_travel_summary <- copy(teams_travel_summary_2021[, .(team, division, km_per_day_2021 = km_per_day)])
teams_travel_summary[teams_travel_summary_20132020, km_per_day_201320 := km_per_day_avg, on = .(team)]
teams_travel_summary[, km_per_day_cut := (km_per_day_2021 / km_per_day_201320) - 1]

# Créer le graphique
ggplot(
  data = teams_travel_summary,
  mapping = aes(
    y = reorder(as.factor(team), km_per_day_cut),
    fill = division
  )
) +
  geom_col(aes(x = km_per_day_2021), alpha = 1) +
  geom_col(aes(x = km_per_day_201320), alpha = 0.5) +
  geom_text(
    mapping = aes(
      x = km_per_day_2021,
      label = percent(km_per_day_cut, 1)
    ),
    nudge_x = 2,
    hjust = 0
  ) +
  scale_x_continuous(
    labels = label_number(),
    expand = expansion(mult = c(0, 0.05))
  ) +
  scale_fill_brewer(palette = "Set1") +
  labs(
    title = "Réduction des déplacements par équipe",
    subtitle = "Saisons 2021 vs 2013-14 à 2019-20 de la LNH",
    x = "Déplacement moyen (km) par jour"
  )

Sans surprise, on voit que le fait de disputer plusieurs matchs consécutifs contre le même adversaire réduit les déplacements globaux pour l’ensemble des équipes. Les grands gagnants de ce remaniement sont les équipes de la division est et ceux en retirant les bénéfices les moins importants (quoi que tout de même significatifs) sont principalement les équipes canadiennes. Ceci étant dit, mon coeur de partisan des Canadiens est toujours satisfait de voir les Leafs en dernière position d’un classement quel qu’il soit 😁.

Conclusion

Bien que cet article mette en lumière l’asymétrie réelle qu’amènent ces nouvelles divisions au niveau du voyagement des équipes, il demeure très difficile de prédire si cela aura un effet quelconque sur leurs performances sur la glace. Une tonne d’impondérables se manifesteront au courant de la saison et ceux-ci risquent d’avoir encore plus de poids dans la balance. De plus, n’oublions pas que le calendrier présenté dans l’article est à jour en date d’aujourd’hui mais qu’il risque fortement d’évoluer en cours de route lorsque des éclosions de COVID-19 surviendront. Bref, soyons patients et apprécions le spectacle!

J.P. Le Cavalier
J.P. Le Cavalier
Scientifique de données / Actuaire

Je me considère un modèle hybride entre un actuaire et un scientifique de données. J’adore prendre le temps de bien faire les choses.