Fabriquons un bot 𝕏
Cette semaine, je vous détaille ma démarche pour automatiser la création de statistiques afin d'alimenter un bot dédié à la Ligue 1.
Mon activité sur 𝕏 (ex-twitter) est devenue intermittente, faute d’avoir trouvé le ton ou la bonne façon de m’y investir. Peut-on essayer de rattraper le coup en transformant mon compte en un bot qui dispense régulièrement des statistiques sur la Ligue 1 ?
Explorer de fond en comble le site FBRef à la recherche de chiffres atypiques apparaît comme trop fastidieux. A contratio, automatiser entièrement le processus me semble inaccessible, au moins dans un premier temps. Essayons de trouver un compromis entre ces deux approches.
Moissonage de données fraîches
La récupération des données est la partie la plus facilement automatisable. De fait, c’est déjà le cas puisque mes robots aspirent chaque semaine les données des matchs de Ligue 1 sur plusieurs sites, dont FBRef, une pratique tolérée dans la mesure du raisonnable1. Le tout est ensuite stocké dans des buckets google sous la forme de fichiers parquet2. De quoi constituer un data warehouse léger et peu cher grâce à duckdb et python.
Dans l’ère du data overflow
Comme souvent dans le data journalisme actuel, la problématique n’est pas tant de trouver des données exploitables que d’en extraire les informations pertinentes (ici des statistiques remarquables). En effet, le site FBRef est un déluge de statistiques diverses. Les données y sont agrégées par match ou par saison dans une succession presque infinie de menus.
On va border le périmètre sur lesquel se concentrer :
Statistiques individuelles
Statistiques par équipe
La période :
Sur toute la saison
Sur les 5 dernières rencontres (pour avoir un contexte «chaud»)
La méthode d’agrégation :
Par 90 minutes (essentiel pour comparer les joueurs)
Globalement
À cela, on peut ajouter le calcul de séries (victoire, nul, défaite, sans prendre de but, en marquant au moins une fois, …) et de l’enrichissement : s’agissant des équipes, il faut notamment incorporer les données des adversaires afin de pouvoir exprimer des ratios par match (possession, …). On veut également pouvoir générer des statistiques dérivées.
Une fois un grand nettoyage effectué, on aboutit à près de 200 indicateurs individuels et 900 par équipe. Afin de déterminer quelles sont les performances les plus saillantes, on s’appuie sur les z-scores, soit l’écart à la moyenne exprimée en déviation standard.
Visualiser pour mieux éditorialiser
Il nous faut maintenant une interface pour afficher tout cela. Tout mon travail d’exploration et de visualisation des données s’effectue au sein d’un projet Next.js, avec des Jupyter notebooks pour l’analyse et la génération d’assets puis Typescript / React / d3 pour visualiser ces assets. Une architecture qui va me permettre de générer des tableaux où lire clairement ce déluge de chiffres.
Voici quelques statistiques sur les équipes. On voit clairement que toutes ne sont pas pertinentes, mais on peut capturer l’essentiel de l’information rapidement et décider si une information est intéressante à poster.
Le pendant pour les joueurs :
Et après ?
Il reste encore beaucoup d’améliorations. En premier lieu sur les données générées, où ne sont pas encore incorporées les séries et les mesures sur les 5 dernières rencontres.
J’aimerais également être en mesure de rédiger le tweet automatiquement, sans doute en sollicitant un LLM. Dernière sophistication, générer une illustration plus engageante qu’un simple tweet textuel.
Rendez-vous d’ici une semaine ou deux pour voir le résultat.
Bot/Scraping/Crawler Traffic on Sports-Reference.com Sites, 26 octobre 2022
Éric Mauvière, Parquet devrait remplacer le format CSV, Icem7, 29 décembre 2022