Skip to content

Identification des formes remarquables dans la densité

Yanis Zeghal edited this page Dec 21, 2022 · 12 revisions

Structure

Le code est divisé en deux : algoStatCourse.ipynb et GraphAlgoStatCourse.ipynb Le premier est à utiliser comme bibliothèque dans le code de data-visualisation.

Objectifs

Cette partie du projet est intermédiaire entre le scrapping et la data-visualisation. Elle permet d'accomplir l'objectif du projet, qui est de proposer des possibilités de traitement de données nouvelles et permettre à la partie "data-visualisation" d'avoir plus de matière pour travailler.L'objectif est d'analyser la distribution des temps d'arrivée des coureurs sur les courses (scarppées par scraping.ipynb) et de fournir des fonctions à utiliser dans eda.ipynb .

Motivations

Il y a deux fonctionnalités essentielles : l'identification des "pics de performance", et l'identification des catégories de coureurs. Les catégories de coureurs sont données par la forme globale de la distribution. On fait le postulat que n "bosses" dans la distribution des temps d'arrivée correspondent à n catégorries de coureurs. Il arrive aussi de voir distinctement des 'pics' de temps d'arrivée, c'est à dire des amas de coureurs autour de temps bien précis. En remarquant que ces pics arrivent souvent sur des temps "ronds" (finir le marathon en 4h...), on considère que ces amas de coureurs correspondent à des personnes qui se sont fixés un même objectif de performance.

Il y a deux fonctionnalités dans la bibliothèque : repérer les pics de performance, et les catégories de coureurs. Dans les deux cas, la méthodologie est semblable : il faut trouver des maxima et minima locaux dans les distributions.

Méthodologie

J'ai préféré me concentrer sur l'étude de fonctions plutôt que sur du machine learning et du clustering. J'ai néanmoins implémenté une fonction skdensiteLissee qui permet d'obtenir une densité grâce à la librairie sklearn. J'en fais l'illustration dans le bloc 8 de GraphAlgoStatCourse. La denstié que nous utiliserons est celle donnée par une interpolation des valeurs données par un histogramme (fonctions dens pour l'histogramme puis lissage pour l'interpolation -polynomiale par morceaux-). Le choix de cette méthode plutôt que la kde (sickit learn) est expliqué en note 3.

Etapes

##1 séparer la densité en tendance et bruit. -La tendance ne contient pas les pics de performance mais seulement la forme globale des temps d'arrivée. On lira les catégories de coureurs sur cette tendance. -le bruit oscille autour de zéro, mais contient les pics de performance. On lira les pics dans ce bruit. ##2 trouver les maxima et minima locaux : pour ce faire, on interpole la tendance et le bruit (par une interpolation cubique -polynomiale par segment-), que l'on sait maximiser ou minimiser. ###2.1 une fois trouvés, il faut replacer les pics de performance à leur place réelle (l'interpolation a fait décaler des valeurs)

###2.2 une fois les variations de la tendance trouvées, on identifie les catégories de coureurs grâce aux "bosses". trier les valeurs par ordre d'importance, pour ne tracer que les meilleures. (les pics les plus distinctifs, ou les bosses les plus nettes -par leur courbure- ou simplement les bosses les plus "en avance" -pelotons de coureurs plus rapides que les autres-...).

Le tri est important. En effet, on peut détecter des catégories de moins de 0.1% des coureurs ou des pics dont on attribuerait la présence au hasard (les moins hauts). On choisira alors de ne garder que les n premiers lors des tracés.

Code

Le fichier algoStatCourse.ipynb contient les fonctions pour retourner les valeurs recherchées (limites des catégories, position des pics de performance) Le fichier algoStatCourse.ipynb contient des précisions sur la construction des fonctions, la méthodologie, avec du code illustré par des graphes.

Techniquement : -l'outil est sensible à deux variables : la qualité de la mesure de la densité, et le paramètre de filtrage (hp-filter). La densité est estimée à l'aide d'un histogramme, dont le nombre de batchs importe. Un nombre trop faible ne transcrira pas les variations intéressantes et un nombre trop élevé donnera des variations dues au hasard. La fonction idealBins sert à calculer un bon compromis en fonction du nombre de coureurs.

/!\ La fonction skdensiteLissee permettant d'obtenir une densité grâce à KernelDensity, mais la méthodologie pour trouver ses extrema ne s'applique pas dessus (elle n'est pas polynomiale)

/!\ la méthode de séparation des catégories n'utilise pas de clustering non supervisé. Comme j'avais déjà identifié un outil de séparation bruit/tendance, j'ai préféré le recycler pour trouver les catégories dans la tendance de la densité.

=> la version suivante du projet devra comporter un algorithme de clustering, c'est l'étape naturelle suivante.

-Le filtre hp sépare le signal du bruit, en accordant +/- d'importance au "lissage" avec un paramètre lambda. Il fait l'équilibre entre l'information que contient le bruit et l'information que contient la tendance. s'il est trop élevé,on compte comme "bruit" des variations de la tendance : on rate alors des catégories et on détecte des pics sans intérêt. S'il est trop faible, on risque de trouver des catégories de coureurs là où il n'y a qu'un pic, qui pourrait appartenir à une catégorie plus grande. une valeur de 1e-2 semble un bon compromis.

NB

1)

La méthodologie de séparation des catégories de coureurs n'A PAS DE FONDEMENT STATISTIQUE. Elle vise simplement à reproduire le jugé de l'oeil humain qui identifie les "bosses". on aurait pu faire le choix d'un modèle statistique qui serait une somme de n gaussiennes par exemple, mais la méthodologie retenue a permis de recycler les calculs d'optimisation.

2)

L'approximation par des polynômes pose deux problèmes : ils ont tendance à osciller plus que "nécessaire" lors de fortes variations ; de plus, il arrive que scipy rate tout simplement un minimum local. Dans ce cas, on ne comptera qu'une seule catégorie là où il y en a deux. Le code est donc soumis aux imprécisions du calcul scientifique (interpolation et minimisation) Il arrive qu'une partie des coureurs ne rentre dans aucune catégorie (pas de bosse), notamment lorsqu'il y a des queues convexes dans les distributions.

3)

La méthode de détermination de densité par la kernel density estimation n'est pas plus avantageuse que la méthode d'interpolation (à ce stade du projet) puisqu'elle a les mêmes limites (la sensibilité du paramètre batch pour l'histogramme, et bandwidth pour la kde). Je pensais pouvoir utiliser des paramètres qui trouveraient la bandwidth optimale automatiquement, mais ces paramètres (“scott”, “silverman”)ne marchent pas encore correctement, il n'y a donc pas d'avantage de ce côté-ci (illustré dernier bloc de GraphAlgostatCourse).

Le fait d'utiliser une interpolation permet en plus d'obtenir les extrema de la tendance ou du bruit de façon rapide puisqu'ils sont polynomiaux. Je pourrais choisir d'interpoler la densité trouvée pour trouver ces extrema mais ce serait accepter de dégrader l'information trouvée par la kde (perdre donc l'avantage qu'elle procure par rapport à l'histogramme simple).