La NBA a beaucoup changé ces dernières années. Plus de tirs à 3 points, un rythme de jeu plus élevé, des stats individuelles qui s'envolent... Ce projet est né d'une question simple : est-ce qu'on peut comprendre ces évolutions, et s'en servir pour prédire des performances ?
Il se découpe en deux parties distinctes, mais liées.
EDA_NBA_Evolution.ipynb·extraction_seasons.ipynb
Avant de modéliser quoi que ce soit, j'ai voulu prendre du recul sur ce qu'est devenue la NBA ces dernières années. Cette partie est une analyse exploratoire des grandes tendances de la ligue depuis une dizaine de saisons.
Ce qu'on y explore :
- L'explosion du volume de tirs à 3 points et son impact sur le jeu
- L'évolution du rythme (possessions par match, pace)
- L'inflation des stats individuelles (points, assists, etc.)
- Les différences entre équipes, conférences, époques
C'est une partie essentiellement analytique, appuyée par des visuels explicites. L'objectif est de construire une intuition sur le contexte dans lequel les joueurs évoluent — ce qui sera utile pour interpréter les prédictions ensuite.
glbbref.ipynb·daily_update.py·modelisation_proto.ipynb
Cette partie s'appuie sur les données collectées pour alimenter un pipeline de prédiction de scores fantasy. Le principe du jeu est simple : il faut sélectionner un joueur chaque soir et l'on marque autant de points que sa performance du match. La contrainte principale est qu'un joueur ne peut être utilisé qu'une seule fois dans le mois — ce qui rend le choix quotidien particulièrement stratégique.
Cette partie du projet est un pipeline end-to-end qui tourne au quotidien.
Scraping de +146 000 box scores joueurs (saisons 2020-21 à 2025-26) depuis Basketball Reference, avec gestion du rate limiting et du contournement Cloudflare.
Toutes les features sont construites sans data leakage (uniquement à partir d'informations disponibles avant le match) :
- Forme récente du joueur (moyennes glissantes L5 / L10 / L20)
- Historique du joueur face à l'adversaire du soir
- Profil défensif de l'équipe adverse
- Contexte du match (domicile/extérieur, jours de repos, back-to-back, win streak)
- Profil saison, explosivité, momentum
- Baseline naïve (moyenne glissante) comme point de comparaison
- LightGBM (GPU) avec early stopping
- Optimisation des hyperparamètres (GridSearchCV + TimeSeriesSplit)
- Métriques : MAE, RMSE, R², analyse des erreurs par profil joueur
- Feature importance pour comprendre ce qui a de l'importance dans les prédictions
Chaque matin : scraping automatique des matchs de la veille → recalcul des features → prédiction des scores fantasy pour les matchs du soir.
Python · pandas · LightGBM · scikit-learn · cloudscraper · matplotlib · seaborn
notebooks/
├── EDA_NBA_Evolution.ipynb Analyse exploratoire des tendances NBA
├── extraction_seasons.ipynb Extraction des stats équipes par saison
├── glbbref.ipynb Scraping + feature engineering
└── modelisation_proto.ipynb Entraînement, évaluation, prédictions
scripts/
└── daily_update.py Mise à jour quotidienne (données + features)
data/
├── bbref_player_gamelogs_2021_2026.csv Données brutes (box scores)
├── bbref_gamelogs_featured.csv Dataset enrichi avec les 118 features
├── bbref_gamelogs_partial.csv Données partielles intermédiaires
└── nba_team_stats_2000_2025.csv Stats équipes par saison
models/
├── ttfl_model_lgbm.joblib Modèle LightGBM entraîné
└── ttfl_model_meta.joblib Métadonnées du modèle
plots/
└── plot_*.png Visualisations issues de l'EDA
Projet réalisé dans le cadre d'un portfolio data scientist junior.