Et l'équipe la plus chanceuse du championnat est...
Aujourd’hui, on vous explique comment fonctionnent les expected points en football, l'occasion d'examiner les différentes informations qu'on peut en tirer.
Cette newsletter est de plus en plus irrégulière, je dois en convenir. La faute en revient en partie à des atermoiements quant à la stack technique. Sans rentrer dans les détails relatifs à la récupération des données (qui pourraient donner lieu à un article intéressant), j’utilise Jupyter notebook côté calcul et Next.js, React et d3 pour le rendu visuel. Même en essayant de factoriser et ré-utiliser mes composants, je dois reconnaître que le temps dédié à rédiger un article et surtout à créer les visualisations qui l’accompagnent est trop important.
Utiliser python pour générer les charts me limiterait trop (au vu de mes compétences en la matière), et ce malgré l’arrivée de librairies qui commencent à s’approcher de ggplot, notamment lets-plot ou la nouvelle interface de seaborn.
D’où mon choix d’utiliser Observable Framework, qui combine des data loaders agnostiques et une plateforme front bâtie autour d’Observable Plot, la surcouche de d3 pour faire de l’exploration de données, que j’ai souvent considéré sans jamais m’y plonger. Les débuts sont difficiles, mais c’est toujours le cas lorsqu’on prend le risque de perdre ses repères en s’éloignant de sa zone de confiance. Fin de la parenthèse.
Les xG, encore et encore
Une nouvelle fois, nous allons nous tourner vers les expected goals (xG). Une des nombreuses utilisations qu’on peut en faire consiste à calculer les expected points. Ces dérivés des xG représentent le nombre de points attendus d’une équipe à l’issue d’une rencontre. Pour ce faire, il convient de disposer de la liste des xG associés à chaque tir des deux équipes, information récupérable sur understat ou FBRef.
Prenons comme exemple le match Marseille-Reims, qui s’est achevé sur le score de 2-2, avec 2,94 xG pour l’OM contre seulement 1,01 pour Reims. À partir des xG par tir et de la loi Poisson binomiale, on peut déterminer, pour chaque équipe, la probabilité associée à un nombre de buts marqués.
Le nombre de buts le plus probable (le mode) est de 3 pour l’OM, contre 1 pour Reims. On peut dire ici que Reims s’en est tiré à bon compte.
Mais ce n’est pas fini. Si l’on veut déterminer les xPoints de ce match, il nous faut croiser ces deux listes de probabilités dans une matrice puis calculer la probabilité agrégée des 3 scénarios possibles : victoire de l’OM, match nul, défaite de l’OM.
On associe ensuite ces 3 probabilités au nombre de points qu’elles rapportent pour l’OM, respectivement 3, 1 et 0 points, et l’on obtient les xPoints pour l’OM, soit 2,55 points, contre seulement 0,32 pour Reims.
Évaluer la réussite d’une équipe
Malchanceuse sur le coup, l’équipe olympienne n’a pourtant pas à se plaindre sur le reste de la saison. À l’échelle du championnat, elle figure actuellement à la 2e place du « classement de la chance », obtenu en calculant la différence entre les points et les xPoints. Les Phocéens sont juste derrière leurs adversaires d’un soir.
À l’autre bout, on trouve le TFC, avec une spectaculaire différence de 7 points entre ses xPoints (12) et ses vrais points (5). Actuellement 16e, l’équipe devrait pointer à la 5e place au vu de ses xPoints, devançant Reims et Marseille. À ce niveau d’infortune, la question de la finition doit commencer à se poser du côté du staff toulousain.