Course UltraChampsaure
En juillet 2022, j'ai couru une course de montagne d'environ ~30km / ~1500m de dénivelé. En raison de la pandémie, c'était ma première course depuis le 2019 octobre 2 1/2 années avant.


La course s'est bien déroulée. J'ai été devant mes équipiers pendant la majeure partie de la course jusqu'à ce que Pascal me rejoigne à 6 km de l'arrivée et que nous franchissions la ligne d'arrivée ensemble (d'ailleurs il m'a attendu dans les derniers kilomètres pour faire cette arrivée amicale, grâce à lui). Je me suis senti fatigué lors de la dernière montée (voir le sommet à gauche au km 20 plus bas) et de la descente qui constitue le dernier tiers de la course.

Importer des données
Pour comparer les performances, j'ai décidé de télécharger Chronosport données (fichier Excel) que j'ouvre avec JMP.

Pour une raison quelconque, l'heure à Piolit (colonne "Piolit 1") et l'heure à l'arrivée (colonne "Temps") n'étaient pas définies de la même manière sur le fichier excel et l'une d'elles était reconnue comme variable continue ("Temps" avec un triangle bleu) tandis que l'autre était reconnue comme variable catégorielle ("Piolit 1" avec barres rouges).
Ne vous inquiétez pas, c'était le moment idéal pour mettre en pratique les nouvelles leçons apprises dans le guide de script JMP que je suis en train de lire... N'ayez pas peur, je ne suis pas un geek, je lis des romans pendant mon temps libre et j'apprends le scénario pendant mes heures de travail.
Transformer les données : éditeur de formules de colonnes
Je voulais avoir le temps en minutes.
Transformer la variable continue "Temps = 2:32:43" (pas mon temps malheureusement car il m'a fallu 2h10 de plus pour terminer) en 153 minutes c'est simple avec cette formule.

En minutes() transforme un temps en minutes, la même transformation existe pendant des années, des mois, des semaines,… des secondes.
Transformer la variable catégorielle « Piolit 1 = 1:54:57 » (toujours pas mon temps mais celui du gagnant) en 115 minutes était une bonne opportunité d'utiliser Expression régulière() ce qui est une merveilleuse façon de traiter des variables catégorielles complexes (mon exemple est en fait assez simple).

L'essentiel est d'identifier les différents groupes composant votre contribution en utilisant
( Expression régulière ( :Polit 1, " (\d)(\W)(\d\d)(\W)(\d\d) ")).
:Piolit 1 est la variable colonne. Expression régulière() visent à identifier les groupes dans cette variable colonne, chaque paire de parenthèses étant un groupe. Nous recherchons ici 5 groupes :
- Groupe 1 = (\d) = les heures qui contiennent 1 seul chiffre
- Groupe 3 = (\d\d) = les minutes qui contiennent 2 chiffres
- Groupe 5 = (\d\d) = les secondes qui contiennent 2 chiffres
- Groupe 2 et Groupe 4 = (\W) = le séparateur « : » entre heure:minutes et minutes:secondes (le code (\W) reconnaît réellement les caractères non alphanumériques)
Une fois cela fait, nous réutilisons les Groupes 1, 3 & 5 :
- Groupe 1 pendant des heures : Numéro ( Expression régulière (:Polit 1," (\d)(\W)(\d\d)(\W)(\d\d) ","\1")) * 60
Vous remplacez :Piolit 1 (1:54:57 dans la ligne 1) par le Groupe 1 (c'est ce que signifie le « \1 ») le transformez en nombre (c'est ce que signifie le Numéro fait) et multipliez par 60 (c'est ce que fait le * 60).
- Groupe 3 pour les minutes : Numéro ( Expression régulière (:Polit 1," (\d)(\W)(\d\d)(\W)(\d\d) ","\3" ) )
Vous remplacez :Piolit 1 (1:54:57 dans la ligne 1) par le Groupe 3 (c'est ce que signifie le « \3 »), vous le transformez en nombre (c'est ce que signifie le Numéro fait).
- Groupe 5 pour les secondes : Numéro ( Expression régulière (:Polit 1," (\d)(\W)(\d\d)(\W)(\d\d) " ,"\5")) / 60
Vous remplacez :Piolit 1 (1:54:57 dans la ligne 1) par le Groupe 5 (c'est ce que signifie le « \5 »), vous le transformez en nombre (c'est ce que signifie le Numéro fait) et divisez par 60 (c'est ce que fait le / 60).
A la fin, vous additionnez les 3 composants et vous arrondissez (c'est ce que donne le Rond fait) pour obtenir les 115 minutes (toujours vainqueur j'en suis loin).
Rang à l'arrivée : générateur de graphes
Tout d'abord, j'ai évalué nos performances par rapport à.
a) tous les coureurs b) hommes uniquement c) notre catégorie (M3H = 50-55 ans)


J'ai fait le calcul en pourcentage plutôt qu'en nombre absolu donc j'ai divisé
- le rang calculé sur l'heure d'arrivée à l'aide Rang du colonel (:"Arrivée (min)"n)
- par le nombre d'événements dans la même colonne (« Arrivée (min) ») en utilisant Numéro de colonne (:"Arrivée min)"n).
Pour les sous-catégories j'ai ajouté un « par variable » afin que le calcul se fasse dans la colonne en considérant le niveau d'une autre variable comme exemple
- b) « Sx » = « Homme » ou « Femme »
- c) « Chat » = « SEF », « ELLE », … « M6F », « M8H » selon le sexe et l'âge.
L'avantage est que vous n'avez pas besoin de plusieurs calculs de formule ou d'instructions if/then complexes et, plus important encore, il n'y a aucun risque d'erreur car le calcul est effectué par colonne en tenant compte du niveau par ligne.
Le graphique ci-dessous mis en évidence sur notre catégorie illustre le pourcentage de classement avec nous deux sélectionnés pour une analyse détaillée :

En fin de compte, les % reflètent notre position :
- 52% contre tous les coureurs donc nous sommes des coureurs « moyens »
- 60 % contre tous les coureurs masculins, nous sommes donc en dessous des hommes performants
- 40% par rapport aux coureurs masculins entre 50 et 55 ans, ce qui signifie que nos performances sont légèrement meilleures que celles des hommes de notre âge
Performance intermédiaire (au sommet Piolit) vs. Arrivée : générateur de graphiques
Maintenant, j'ai mes données dans le même format (durée en minutes pour Piolit et Arrival). J'ai fait une visualisation par nuage de points :

Il existe une relation diagonale entre ces deux variables, indiquant que les individus sont restés à peu près constants au cours du dernier tiers de la course, sans changement majeur.
Je trace une ligne d'ajustement (après avoir exclu le dernier coureur qui ressemble à une valeur aberrante) sur les données et sauvegarde la formule de prédiction ainsi que les résidus pour déterminer si j'ai sous-performé au cours du dernier tiers (c'était mon sentiment) et/ou si Pascal surperformé (je m'en doutais).

Il est intéressant de noter que je suis l'homme "moyen" avec un résidu = -0,2, ce qui signifie que ma performance est "normale", alors que Pascal a un résidu négatif (-4,4 minutes), ce qui signifie qu'il a mis moins de temps par rapport à aux autres coureurs sur le dernier tiers. « Il en avait encore sous les pieds » (pas sûr que ce soit la bonne expression en anglais mais je pense que tout le monde peut comprendre) et rappelez-vous qu'il m'a attendu pendant le dernier tiers donc il aurait dû faire encore mieux.
J'ai également évalué la différence de rang avec une formule de colonne supplémentaire :

et évalué le rang que nous avons gagné ou perdu par rapport aux autres coureurs :

Sans surprise, Pascal a gagné 10 rangs.
Plus surprenant, j'ai gagné 6 rangs. Cela signifie que
- globalement, sur la base des résidus de la ligne d'ajustement globale, je suis l'homme « moyen »
- MAIS localement (par rapport aux quelques coureurs avec lesquels je courais/concourais), j'ai fait un travail décent pendant le dernier tiers.
J'espère que cet article de blog vous aidera à comprendre certaines des fonctions de l'éditeur de formules disponibles dans JMP, des plus simples aux plus complexes (une fois que vous aurez commencé à utiliser Expression régulière () vous pouvez faire de grandes choses) ainsi que quelques visualisations/analyses de données.
Pour être honnête, je n'ai pas l'habitude de sur-analyser mes "performances", mais j'ai pensé que c'était un bon cas d'utilisation pour profiter de certains des avantages de JMP en utilisant des données non industrielles pour m'amuser davantage.