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