Et si la LNH avait un système de relégation?

Des fois je pense à des affaires bizarres. Mettons que la Ligue Nationale de Hockey (LNH) avait un système de promotion et relégation, comme au soccer européen. Quessé ça donne?

Étant fan d'histoire alternative et de programmation de trucs complètement débiles, fallait que j'explore l'idée, que j'écrive une simulation. Le pire, c'est que c'est entièrement faisable! Le code fait même pas 100 lignes de JavaScript!

En premier, faudra se mettre une couple de règles. Y'a beaucoup de possibilités, mais on va faire ça simple. Par exemple, on va partir la simulation en 1967. Pourquoi? C'est l'année où la LNH a passé de 6 à 12 équipes, et ils ont mis toutes les nouvelles équipes dans la même division Ouest.

Division Est Division Ouest
Blackhawks de Chicago Blues de St-Louis
Bruins de Boston Flyers de Philadelphia
Canadiens de Montréal Kings de Los Angeles
Maple Leafs de Toronto North Stars du Minnesota*
Rangers de New York Penguins de Pittsburgh
Red Wings de Detroit Seals de Oakland*
⚠️
Les North Stars du Minnesota sont aujourd'hui les Stars de Dallas, et les Seals ont déménagé à Cleveland avant de fusionner avec les North Stars.

Probablement une bonne année pour faire de la division Est notre division 1, et l'Ouest la division 2. Parce que ça avait pris un bout avant que les nouvelles équipes soient bonnes, ça aurait pu donner une nouvelle dimension aux stats. Également:

  • Chaque année, les deux pires équipes de division 1 sont relégués en division 2, et les deux meilleures de division 2 sont promus en division 1.
  • Seulement les matchs intradivision compteraient dans le calcul. Dans notre histoire alternative, il y aurait quand même des matchs interdivision mais qui compteraient seulement pour le format des playoffs, qu'on ne toucherait pas pour le moment.
  • Chaque nouvelle équipe est ajoutée en division 2, et au besoin, on relègue moins, voire aucune équipe, histoire de garder les deux divisions sensiblement de la même grosseur. Au besoin, on ferait un ajustement similaire à la suppression d'une équipe, mais c'est encore jamais arrivé: Cleveland était en division 2 lors de sa fusion, et le Utah HC a pu remplacer les Coyotes de l'Arizona également en division 2, comme une équipe déménagée qui pourra garder sa place dans la division de son prédécesseur.

Justement, les stats: la LNH a un beau site web fancy exprès juste pour ça. On peut aller chercher pratiquement n'importe quoi, du genre les statistiques des Canadiens contre toutes les autres équipes depuis la fondation de la ligue en 1917, ou encore la date où Connor McDavid a compté son 1000e point. Et, on va pas faire ça manuellement pour toutes les saisons depuis 1967, ils ont sûrement une API pour ça, non? Eh ben oui. Et c'est complètement gratuit, en plus.

Donc le but de l'exercice: aller chercher seulement les statistiques pour les matchs joués par deux équipes d'une même division en ignorant les autres matchs. Et c'est là que c'est le fun: on peut sortir ça en seulement une requête déjà triée. Voici un petit programme en JavaScript qui fait exactement ça:

var API = "https://api.nhle.com/stats/rest/fr/team/summary";

function query(q)
{
    var url = new URLSearchParams({
        "isAggregate": true,
        "isGame": true,
        "start": 0,
        "limit": -1,
        "sort": '[{"property":"pointPct","direction":"DESC"},{"property":"wins","direction":"DESC"},{"property":"losses","direction":"ASC"},{"property":"otLosses","direction":"DESC"},{"property":"ties","direction":"DESC"},{"property":"goalsFor","direction":"DESC"},{"property":"goalsAgainst","direction":"ASC"},{"property":"franchiseId","direction":"ASC"}]',
        "cayenneExp": q,
    });
    return fetch(API+"?"+url, {method: 'GET'})
        .then(res => res.json())
}

var teams = [
    [1,5,6,10,11,12], // Division 1
    [13,14,15,16,17,18] // Division 2
];
var saison = "19671968"; // 1967-1968

for(var d = 0; d < 2; d++)
    query("gameTypeId=2 and franchiseId in ("+teams[d].join(",")+") and opponentFranchiseId in ("+teams[d].join(",")+") and seasonId="+saison)
    .then(res=>{
        console.table(res.data);
    });

Le seul truc à comprendre, c'est que c'est pas compliqué.

Et voici à peu près ce que ça donne pour la saison 1967-68:

Division 1

franchiseId franchiseName gamesPlayed wins losses ties goalsFor goalsAgainst points pointPct
0 1 'Canadiens de Montréal' 50 26 17 7 160 121 59 0.59
1 6 'Bruins de Boston' 50 23 18 9 174 148 55 0.55
2 5 'Maple Leafs de Toronto' 50 23 20 7 132 120 53 0.53
3 10 'Rangers de New York' 50 22 19 9 143 138 53 0.53
4 11 'Blackhawks de Chicago' 50 17 22 11 135 173 45 0.45
5 12 'Red Wings de Detroit' 50 13 28 9 147 191 35 0.35

Division 2

franchiseId franchiseName gamesPlayed wins losses ties goalsFor goalsAgainst points pointPct
0 16 'Flyers de Philadelphie' 50 23 17 10 118 108 56 0.56
1 18 'Blues de St. Louis' 50 22 18 10 119 108 54 0.54
2 17 'Penguins de Pittsburgh' 50 21 19 10 136 126 52 0.52
3 15 'Stars de Dallas' 50 20 19 11 142 140 51 0.51
4 14 'Kings de Los Angeles' 50 21 21 8 129 140 50 0.5
5 13 'Barons de Cleveland' 50 11 24 15 115 137 37 0.37
⚠️
Note: L'API de la LNH va retourner le nom de la franchise tel qu'elle s'appelle de nos jours, par exemple les Stars de Dallas pour les North Stars du Minnesota, ou les Barons de Cleveland pour les Seals de Oakland. C'est techniquement incorrect mais ça évite de dealer avec les déménagements de franchise plus tard dans le code.

Ensuite, pour la saison 1968-69, on pourra transférer les Flyers et les Blues dans la Division 1 et les Blackhawks et les Red Wings en seconde division, et on répète l'exercice.

franchiseId franchiseName gamesPlayed wins losses ties goalsFor goalsAgainst points pointPct
0 1 'Canadiens de Montréal' 36 19 12 5 117 94 43 0.59722
1 6 'Bruins de Boston' 36 17 11 8 131 109 42 0.58333
2 10 'Rangers de New York' 36 17 12 7 103 96 41 0.56944
3 5 'Maple Leafs de Toronto' 36 14 14 8 110 117 36 0.5
4 18 'Blues de St. Louis' 32 10 15 7 79 86 27 0.42187
5 16 'Flyers de Philadelphie' 32 6 19 7 61 99 19 0.29687
franchiseId franchiseName gamesPlayed wins losses ties goalsFor goalsAgainst points pointPct
0 12 'Red Wings de Detroit' 32 19 11 2 117 95 40 0.625
1 11 'Blackhawks de Chicago' 32 18 12 2 135 99 38 0.59375
2 13 'Barons de Cleveland' 36 17 13 6 124 114 40 0.55555
3 14 'Kings de Los Angeles' 36 13 17 6 100 127 32 0.44444
4 17 'Penguins de Pittsburgh' 36 13 20 3 105 118 29 0.40277
5 15 'Stars de Dallas' 36 12 19 5 103 131 29 0.40277
⚠️
C'est pour ça qu'on va trier par le pourcentage de points, à ce point les différentes équipes n'auront pas joué le même nombre de matchs, faudra donc les mettre au même niveau.

Et on répète pour chaque saison, en prenant bien soin de tenir en compte les additions et soustractions d'équipes, et, uh, la saison 2004-05...

💡
Ce qu'il s'est passé en 2004-2005 reste en 2004-2005.

...et on a un classement pour 2023-24, que voici:

💡
Pour le fun, on va mettre le classement officiel à côté, en deuxième colonne.
ranking franchiseId franchiseName gamesPlayed wins losses otLosses goalsFor goalsAgainst points pointPct
0 7 6 'Bruins de Boston' 39 21 10 8 123 112 50 0.64102
1 9 25 "Oilers d'Edmonton" 38 21 13 4 135 115 46 0.60526
2 8 27 'Avalanche du Colorado' 39 23 15 1 136 143 47 0.60256
3 5 35 'Jets de Winnipeg' 39 23 15 1 127 109 47 0.60256
4 13 31 'Lightning de Tampa Bay' 38 22 15 1 138 131 45 0.5921
5 11 34 'Predators de Nashville' 39 22 15 2 123 119 46 0.58974
6 4 33 'Panthers de la Floride' 38 21 15 2 122 99 44 0.57894
7 14 38 'Golden Knights de Vegas' 38 19 13 6 118 110 44 0.57894
8 18 24 'Capitals de Washington' 40 19 15 6 106 113 44 0.55
9 21 16 'Flyers de Philadelphie' 39 19 16 4 109 122 42 0.53846
10 24 21 'Flames de Calgary' 39 18 17 4 123 126 40 0.51282
11 16 18 'Blues de St. Louis' 39 18 18 3 111 119 39 0.5
12 19 17 'Penguins de Pittsburgh' 40 17 17 6 124 125 40 0.5
13 23 23 'Devils du New Jersey' 40 18 19 3 128 140 39 0.4875
14 15 22 'Islanders de New York' 40 16 18 6 109 133 38 0.475
15 20 37 'Wild du Minnesota' 41 16 20 5 121 137 37 0.45121
ranking franchiseId franchiseName gamesPlayed wins losses otLosses goalsFor goalsAgainst points pointPct
0 2 15 'Stars de Dallas' 38 31 7 0 145 94 62 0.81578
1 6 20 'Canucks de Vancouver' 39 26 8 5 135 100 57 0.73076
2 3 26 'Hurricanes de la Caroline' 38 27 10 1 136 91 55 0.72368
3 1 10 'Rangers de New York' 38 26 9 3 140 109 55 0.72368
4 12 14 'Kings de Los Angeles' 40 26 10 4 132 100 56 0.7
5 10 5 'Maple Leafs de Toronto' 39 22 12 5 142 126 49 0.6282
6 17 12 'Red Wings de Detroit' 40 20 15 5 131 138 45 0.5625
7 25 39 'Kraken de Seattle' 39 18 14 7 120 109 43 0.55128
8 22 19 'Sabres de Buffalo' 41 19 18 4 127 121 42 0.51219
9 27 28 "Coyotes de l'Arizona" 37 17 18 2 106 116 36 0.48648
10 28 1 'Canadiens de Montréal' 39 16 18 5 108 129 37 0.47435
11 26 30 "Sénateurs d'Ottawa" 40 18 21 1 128 136 37 0.4625
12 29 36 'Blue Jackets de Columbus' 39 13 18 8 124 146 34 0.43589
13 31 11 'Blackhawks de Chicago' 38 12 22 4 93 147 28 0.36842
14 30 32 "Ducks d'Anaheim" 40 13 24 3 97 134 29 0.3625
15 32 29 'Sharks de San Jose' 41 9 26 6 98 166 24 0.29268

Okay, je ne suis pas analyste, mais le résultat est absolument intéressant. Genre, le Canadien est pas dernier. On pourrait en jaser durant des heures, mais je vous laisse en faire votre propre idée. Cliquez sur le lien ci-dessous et dites-moi ce que vous en pensez.

Classement LNH mais dans un autre univers

En conclusion, j'espère que vous aimez l'idée, et si vous êtres bon en programmation et vous voulez changer les règles j'ai mis le code source ici 😃