Pourquoi on publie ça
On aurait pu ne rien dire. Afficher « 94,5 % de précision » en gros sur la page d'accueil et passer à autre chose.
Mais ce chiffre serait malhonnête. Il masque quelque chose d'important : le modèle sait mal prédire les pannes, précisément aux moments où tu en as le plus besoin.
Voilà ce qu'on a trouvé, comment on l'a mesuré, et ce qu'on va faire.
Comment fonctionne l'algorithme
PasDeVélib utilise une méthode appelée k-NN par journées analogues. L'idée : plutôt que de modéliser finement ce qui se passe station par station, on cherche dans l'historique les 7 journées passées qui ressemblent le plus à demain — même jour de semaine, même météo approximative, même période scolaire. On prend ce qui s'est passé ces jours-là, on en fait une moyenne, et c'est notre prédiction.
C'est une approche simple, interprétable, et qui tourne gratuitement sur GitHub Actions. Ses limites sont connues : elle ne voit pas les événements imprévus (grèves, concerts, accidents), et elle est aveugle à ce qui se passe en temps réel à l'instant T.
Ce qu'on a mesuré
On a rejoué l'algorithme sur les données réelles de mai–juin 2026 : pour chaque journée à prédire, on n'utilise que les données strictement antérieures (pas de triche), on prédit, et on compare avec ce qui s'est réellement passé.
25 672 prédictions. 1 510 stations. 4 journées complètes analysées sur les 24 visées.
Les chiffres bruts
| Métrique | Valeur |
|---|---|
| Decision accuracy (seuil 50 %) | 94,5 % |
| Brier score k-NN | 0,055 |
| Brier score baseline (climatologie) | 0,043 |
| Brier Skill Score | −0,28 |
| Faux positifs (prédit dispo, station vide) | 3,5 % |
| Faux négatifs (prédit vide, station ok) | 2,0 % |
| Biais global (prédit − réel) | +1,5 pts |
Le problème : le modèle est trop confiant
94,5 % de précision semble bon. Mais voici le contexte : 95,5 % des observations réelles ont « au moins un vélo disponible ». Un algorithme qui dirait toujours « oui, il y a des vélos » atteindrait déjà 95,5 % de précision sans rien calculer.
C'est exactement ce que confirme le Brier Skill Score à −0,28. Ce score mesure si on fait mieux qu'une baseline naïve — ici, le taux moyen de disponibilité par heure. Un score négatif signifie qu'on fait moins bien que la baseline. Notre algorithme est trop optimiste : la valeur médiane de proba_velib est 1,0, il prédit « 100 % de chance d'avoir un vélo » pour la majorité des cas.
Le problème devient concret aux heures de pointe :
| Heure | Brier score | Précision | Faux positifs |
|---|---|---|---|
| 7h | 0,048 | 95,2 % | 3,5 % |
| 9h | 0,061 | 93,9 % | 4,0 % |
| 16h | 0,094 | 90,6 % | 6,2 % |
| 17h | 0,103 | 89,7 % | 6,8 % |
À 17h, l'heure où le plus de gens cherchent un vélo pour rentrer, le modèle se trompe presque 1 fois sur 10, et l'essentiel de l'erreur est dans le sens « je t'ai dit qu'il y avait un vélo, mais la station était vide ».
Pourquoi ça arrive
La cause est structurelle. L'algorithme cherche ses analogues dans l'historique 2020–2021 (le seul disponible à grande échelle, avec plus de 4 millions de lignes). Ces données datent en partie du premier confinement : le réseau Vélib' était sous-utilisé, les stations rarement vides.
Quand on lui demande de prédire un mardi de mai 2026 en heure de pointe, il trouve des journées analogues de 2021 où les stations étaient confortablement remplies — et extrapole une probabilité trop haute.
L'historique 2026 s'accumule depuis mai, mais il faudra encore quelques mois avant d'avoir suffisamment de journées analogues récentes pour que le modèle apprenne la nouvelle réalité du réseau.
Ce qu'on va changer
Deux ajustements sont prévus.
Recalibration de la confidence. Plutôt que de sortir une proba_velib brute, on va la passer dans une fonction de calibration pour que « prédit 70 % » veuille vraiment dire « vide dans 30 % des cas similaires », pas 5 %.
Pondération temporelle des voisins. Donner plus de poids aux journées analogues récentes (2025–2026) qu'aux journées de 2020–2021. Simple à implémenter, probablement efficace pour corriger le biais.
Ces deux changements seront déployés dans la V2 de l'algorithme, dont l'évaluation est en cours.
Pourquoi seulement 4 journées analysées sur 24 ?
Le gap dans les données. L'historique hourly_history.parquet couvre novembre 2020 à avril 2021, puis reprend en mai 2026. Pour la majorité des journées de mai–juin 2026, les voisins analogues trouvés pointent vers des dates de 2022–2025 qui n'existent pas dans l'historique. Seules les 4 journées où les voisins appartenaient à la période 2020–2021 ont pu être analysées.
C'est un artefact du gap de données, pas un problème algorithmique. L'évaluation deviendra plus robuste à mesure que l'historique 2026 s'accumule.
Ce que ça change pour toi
En attendant la V2, quelques repères :
- Le matin (7h–9h) : les prédictions sont fiables. Le réseau se vide vite mais de façon prévisible.
- Le soir (17h–19h) : fais confiance aux pastilles orange plutôt qu'au chiffre exact. Le modèle est trop optimiste sur cette plage.
- Le week-end : meilleures prédictions globalement (Brier à 0,028 le dimanche vs 0,066 le samedi).
Et après ?
Cette analyse inaugure une série de carnets de bord où on documente ce qui fonctionne, ce qui ne fonctionne pas, et ce qu'on change. Dans les prochains :
- Les stations vampires : celles qui absorbent des vélos sans jamais en rendre
- L'impact de la météo : est-ce que la pluie change vraiment le comportement du réseau ?
- V2 en production : les résultats après recalibration
Le code de cette analyse est disponible sur le dépôt public du bot. Les données brutes sont en open data (Vélib' Métropole, licence ODbL).