Estimation du kilomètre-effort à partir de données de courses

a marqué ce sujet comme résolu.

Salut à tous,

Il m’est venu aujourd’hui la question suivante : que vaut l’estimation commune du "kilomètre-effort" d’une course ?

C’est un concept primitif pour estimer la difficulté d’une course à pied. Le but est d’avoir une mesure qui prend en compte le dénivelé positif, pour avoir quelque chose de plus représentatif que simplement le nombre de kilomètres.

On prend kmkm la longueur du parcours en kilomètres et D+D\texttt{+} son dénivelé positif en mètres, et on estime :

kme=km+D+100kme = km + \frac{D\texttt{+}}{100}

En gros, on estime que 100m de D+ vaut 1km. C’est vraiment pratique comme estimation, mais c’est proche de la réalité au moins ?


J’ai eu une démarche pour calculer ça, et j’ai obtenu un résultat. Je partage ici pour avoir des retours sur la démarche. Vous voyez des erreurs ? Vous auriez pris des raccourcis ?

Voici donc la démarche :


Le problème est que kmkm est une mauvaise estimation de l’effort à fournir. Le but est de trouver une meilleure approximation à base de D+D\texttt{+}.

D’abord, il faudrait savoir ce qu’est "un effort" pour pouvoir le quantifier et y comparer différentes estimations. Le temps semble être pas mal. Si c’est facile, on va plus vite ce qui montre que l’effort est moindre. Sinon, on ralenti et on réparti notre effort sur une plus longue période. L’avantage, c’est que c’est une donnée facilement obtenable des courses.

Donc, en supposant qu’on obtient plein de triplets (km,D+,t)(km, D\texttt{+}, t), avec tt le temps passé, on en fait quoi ?

On cherche une meilleure estimation de l’effort que kmekme, mais la forme qu’il a semble logique :

kme=km+αD+100kme' = km + \frac{\alpha D\texttt{+}}{100}

On se demande si α=1\alpha = 1 est la meilleure solution. Donc, on suppose que kme×β=tkme' \times \beta = t, càd qu’ils grandissent ensemble de manière linéaire.

Pour ça, je me dis qu’on peut faire une estimation linéaire entre tt et kmekme' pour différentes valeurs de α\alpha. L’estimation qui aura la plus petite erreur sera la plus adaptée.

Donc maintenant, on passe au concret. On télécharge des données de courses du site de l'UTMB, qui recense beaucoup de course (34505 courses).

Pour chaque course, on extrait uniquement (1) la distance, (2) le D+ et (3) le temps médian. Pour ce dernier, je n’ai pas de bonne justification. Il me fallait un temps, et le médian m’a semblé le plus adapté (surtout pour éviter les extrêmes). J’ignore les courses :

  • avec moins de 50 temps,
  • de moins d’une heure,
  • de plus de 4 heures,
  • avec du D+ de moins de 10m (soucis de saisie de données).

Ensuite, pour les valeurs de α\alpha entre 0 et 1.5 avec un pas de 0.01, on fait ça :

x = data[:,2]  # t
y = (data[:,0] + (data[:,1] * alpha / 100))  # km + (dplus * alpha / 100)
_, a, _, _, _ = np.polyfit(x, y, 1, full=True)
error = a[0]

On utilise la "méthode des moindres carrés" avec un degré 1 pour viser une droite. On récupère ce que la documentation NumPy appelle "residuals – sum of squared residuals of the least squares fit".

(Une autre technique si on n’a pas un nombre décimal représentant l’erreur est de diviser y par le temps. Comme ça, on vise à minimiser le polynôme de degré 1 parce qu’on sait que l’estimation qu’on désire est une droite parallèle à l’axe des abscisse.)

Le résultat obtenu est … 0.37. L’estimation serait donc que 100m de D+ équivaut à 370m.

Voici les 25411 courses que j’ai utilisé, avec kmkm, D+D\texttt{+} et tt (heures), trié par D+D\texttt{+}. Je peux fournir plus de données et scripts au besoin. Deux bouts de Python pour jouer avec les données :

De quoi charger les données dans la variable data comme au dessus :

data = []
with open('race-stats.txt') as f:
	for line in f:
		km, dplus, h = line.split()
		km, dplus, h = float(km), float(dplus), float(h)
		if h > 1 and h < 4:
			data.append((km, dplus, h))
data = np.array(data)

Et une fonction pour dessiner un kmekme' et son estimation avec matplotlib :

import matplotlib.pyplot as plt
def draw(x, y):
	plt.figure()
	plt.xlabel('h')
	plt.ylabel('kme')
	plt.scatter(x, y)
	z = np.polyfit(x, y, 1)
	p = np.poly1d(z)
	plt.plot(x, p(x), "r--")
	plt.title("y=%.6fx+%.6f" % (z[0],z[1]))
	plt.show()

Remarques et questions :

  • Je ne sais pas réellement comment vérifier mon résultat. Je me dis que je pourrais appliquer ma formule et voir que ça donne un meilleur résultat que α=1\alpha = 1 par exemple. Mais ça reviendrai à faire exactement la même chose !

  • Vous pensez à d’autres démarches potentielles ?
    Je me dis par exemple qu’on pourrait par exemple mesurer la consommation d’énergie d’un corps humain pour des efforts qui incluent, ou non, du dénivelé. Ça a probablement déjà été fait (?).

  • Est-ce que vous voyez des méthodes pour exploiter les données individuels de coureurs ? Ça permettrait de voir si α\alpha change en fonction du niveau ou l’expérience par exemple.

  • Votre ressenti de coureur ? :-)

    Le mien : je trouve 0.37 plus réaliste que 1.0, mais je m’attendais à une valeur entre 0.5 et 0.7.

Merci, et bonne soirée !

Marrant comme sujet d’analyse ! J’ai toujours aussi été étonné du KM effort comme mesure sur les courses. Il faudrait peut être aussi se dire que d’un point de vue physiologique la répartition du dénivelé à aussi son importance : 100m de D+ sur 1Km d’un 10K et 100m de D+ repartis linéairement sur un 10K ça ne donne peut être pas le même résultat (section difficile dans le premier cas vs "faux-plat" dans le deuxième).

Aussi tu ne prends pas en compte le D- alors que je pense que ça pourrait avoir un impact. Pour une course où on revient à son point de départ c’est la même quantité que le D+ mais ce n’est pas toujours le cas. Il y a par exemple des marathons qui sont considérés comme plus roulants car comportant uniquement du D- (200m de D- sur un marathon par exemple).

Pour mon ressenti de coureur je dirais que pour moi, 100m de D+ ça doit être plutôt équivalent à 700m de plat en impact (faudrait que je recreuse certaines courses passées), donc plus proche de ta valeur d’intuition.

Après l’expérience de coureur doit énormément impacter aussi, je cours toujours uniquement sur du plat, donc forcément pas une très bonne capacité a monter ;)

La méthode des moindres carrés a un gros défaut. Quand la corrélation est faible, elle donne une pente faible.

J’explique.

Tu as un jeu de données (x,y), tu cherches un couple de réels (a,b), de telle sorte que la droite y=ax+b approche le mieux le nuage de points. Tu trouves un certain couple (a,b)

A partir du même jeu de données, on peut chercher aussi un autre couple (c,d), de telle sorte que la droite x=cy+d approche le mieux le nuage de points. Tu vas trouver un autre couple, et donc une autre droite.

La bonne droite, celle qui représente le mieux le nuage de points, c’est la bissectrice entre les 2 droites obtenues (l’une des 2 bissectrices… l’autre serait perpendiculaire à la première.

Application ici.

Tu as un jeu de données avec des triplets (t, km, D)

Tu cherches a et b tels que la droite t=a km + b D soit une bonne approximation du nuage de points. Tu as donc cherché a et b, t/km = a + b D/km soit une bonne approximation.

Tu peux aussi chercher c et d, tels que la droite D/km = c + d t/km soit une bonne approximation du nuage.

Tu vas trouver une autre droite. Et c’est la bissectrice de nos 2 droites qu’il faudra retenir.

C’est un sujet intéressant !

Il existe la formule de Naismith, qui reprend la même idée, mais avec un facteur de 0.72. Si je saisis tout, c’est pour de la randonnée, et ça ne m’étonnerait pas du tout qu’il soit plus bas pour de la course.

Ton résultat de 0.37 me semble bas aussi, mais sur les courses de l’UTMB, en général, c’est des gens très habitués, donc il y a un biais certain.

Bonjour 😁 De mon expérience je dirais que la relation entre dénivelé et effort n’est pas linéaire.

5 montée-descente de 100m, ce n’est pas pour moi le même effort qu’une montée decente de 500m

Et comme il a été dis plus haut, l’effort va également dépendre de l’inclinaison de/des montées.
Au delà de 10% d’inclinaison l’effort augmente significativement.

Le rythme aussi. À temps égal, si je cours régulièrement entre montée et descente VS je marche dans la montée et je cours dans la descente

Marrant comme sujet d’analyse ! J’ai toujours aussi été étonné du KM effort comme mesure sur les courses. Il faudrait peut être aussi se dire que d’un point de vue physiologique la répartition du dénivelé à aussi son importance : 100m de D+ sur 1Km d’un 10K et 100m de D+ repartis linéairement sur un 10K ça ne donne peut être pas le même résultat (section difficile dans le premier cas vs "faux-plat" dans le deuxième).

Hum, peut-être. Et encore, est-ce si important ? Peut-être que tes deux exemples entraînent la même augmentation de temps versus les courses avec la même distance et sans dénivelé.

Aussi tu ne prends pas en compte le D- alors que je pense que ça pourrait avoir un impact. Pour une course où on revient à son point de départ c’est la même quantité que le D+ mais ce n’est pas toujours le cas. Il y a par exemple des marathons qui sont considérés comme plus roulants car comportant uniquement du D- (200m de D- sur un marathon par exemple).

En trail, le D+ et D- sont souvent proches. Ici on essaie d’améliorer l’estimation vague utilisée au quotidien, pas de prédire un temps de course ! Le but étant de garder le calcul faisable de tête.

Pour mon ressenti de coureur je dirais que pour moi, 100m de D+ ça doit être plutôt équivalent à 700m de plat en impact (faudrait que je recreuse certaines courses passées), donc plus proche de ta valeur d’intuition.

Comment est-ce que tu estimes ça ?

Après l’expérience de coureur doit énormément impacter aussi, je cours toujours uniquement sur du plat, donc forcément pas une très bonne capacité a monter ;)

Anto59290

Ah clairement, l’expérience joue beaucoup ! Ici on parle de la médiane des temps sur trails enregistrés au prêt de utmb.world, entre 1h et 4h. La médiane de D+ est de 880m (min=21, max=2330), la distance médiane est 21km (min=3, max=38.4). Personne n’attaque ces courses sans entraînement spécifique ; je parle en connaissance de cause, les deux courses que j’ai fait ces deux dernières années rentrent dans les critères. :-)


La méthode des moindres carrés a un gros défaut. Quand la corrélation est faible, elle donne une pente faible.

elegance

Je pense avoir plutôt bien compris l’explication. Par contre, je me demande si ça a une importance dans mon cas ? Je ne cherche pas réellement à trouver une droite fiable approximant mon nuage de point. J’utilise la méthode pour benchmarker différentes solutions.

J’ai l’impression qu’en utilisant ta méthode, j’obtiendrai une meilleure approximation du nuage de point à chaque valeur de α\alpha, mais que la valeur obtenant l’erreur la plus basse sera toujours la même. C’est vrai ?

Et quelle valeur d’erreur utiliser ? La somme des deux approximations ? Une estimation basée sur la droite résultante ?

D’ailleurs, tu dis "Quand la corrélation est faible, elle donne une pente faible". Ça ne pourrait d’ailleurs pas faire que la méthode est d’autant plus adapté pour trouver le nuage de point avec le PLUS de corrélation ? L’erreur sera d’autant plus minimisé.


Il existe la formule de Naismith, qui reprend la même idée, mais avec un facteur de 0.72. Si je saisis tout, c’est pour de la randonnée, et ça ne m’étonnerait pas du tout qu’il soit plus bas pour de la course.

Intéressant !

Tu dis 0.72, mais je vois 0.792, càd "Naismith’s number" divisé par 10. J’imagine que c’est une typo.

Je ne pense pas que ça soit réellement comparable. La formule de Naismith cherche à quantifier le temps passé en randonnée. La différence avec le trail est qu’on ne régule pas sa vitesse de la même manière. En train, on peut aller 4 fois plus vite en descente si le terrain le permet. Autrement dit, en randonnée on perd du temps en montée et on n’en gagne que peu en descente (par rapport à du plat). La randonnée limite plus sur cet aspect. Il y a aussi les contraintes de l’altitude qui apparaissent plus souvent en randonnée.

Aussi, il est bien plus fréquent en randonnée de faire de la montée sur une journée sans faire de descente. En trail, on descends ce qu’on monte, donc on gagne du temps un moment.

Ton résultat de 0.37 me semble bas aussi, mais sur les courses de l’UTMB, en général, c’est des gens très habitués, donc il y a un biais certain.

Rockaround

Attention, ce ne sont pas les courses organisées par l’entreprise UTMB, mais les courses dont les résultats sont recensés sur utmb.world. Les organisateurs peuvent faire la demande puis fournir leurs résultats. L’UTMB utilise ça par la suite pour autoriser l’inscription à ses courses en fonction des antécédants des coureurs.

Ça ne change pas que ceux qui font ça s’entrainent, oui. :-)

À noter que si au lieu du temps médian on prend le 75th percentile (Q3), on obtient 0.3, et non un score plus élevé. L’impact du D+ semble donc moins important. Peut-être que l’écart entre vitesse à plat, en montée et en descente est plus faible, et donc le D+ a moins d’impact sur le temps de course ?

Ça semble montrer une limite de prendre le temps de course comme estimation de l’effort fourni : un débutant à plus tendance à sentir passer (càd souffrir) du D+ qu’une personne plus expérimentée.

Autrement dit, on ne peut sûrement pas conclure "100m de D+ vaut 370m de distance en volume d’effort" mais plutôt "en course de trail, faire 100m de D+ rajoute l’équivalent de 370m de distance niveau temps" qui n’est pas pareil !


De mon expérience je dirais que la relation entre dénivelé et effort n’est pas linéaire.

5 montée-descente de 100m, ce n’est pas pour moi le même effort qu’une montée decente de 500m

À bon, dans quel sens ? Tu prends effort dans le sens "temps passé" ou dans le sens effort physique qui se ressent sur le corps (le lendemain surtout…) ?

Et comme il a été dis plus haut, l’effort va également dépendre de l’inclinaison de/des montées.
Au delà de 10% d’inclinaison l’effort augmente significativement.

Oui, mais tu franchis le D+ plus rapidement aussi. C’est normal que l’effort augmente. Est-ce que la difficulté augmente plus vite que la quantité de dénivelé que tu franchis ?

Au dessus de 10%, tu franchis 100m de D+ tous les km. C’est beaucoup. Il n’y a pas beaucoup de courses qui ont ça pendant de long tronçons. Et tu auras la descente qui va arriver après.

Le rythme aussi. À temps égal, si je cours régulièrement entre montée et descente VS je marche dans la montée et je cours dans la descente

Drulac

Là on rentre dans de la stratégie de course ! En course je n’hésite pas à marcher dès que la question se pose. Par contre, il faut alonger sur la descente qui arrive. :-)

Après, encore une fois, la question initiale n’est pas là. On veut juste une valeur à la louche km+D+×?km + D\texttt{+} \times ? qui nous dit comment on va galérer.


Content que le sujet plaise. :D

Pour moi c’est un problème d’analyse de données — tu as plein de données de courses et tu ne sais pas, à priori, quel est le bon modèle pour prédire le temps passé pour la course.

(Je me demande au passage si le temps médian est la bonne estimation; c’est assez sensible au choix du "public" pour la course, est-ce que le meilleur temps ou la médiane des 10 meilleurs temps ne serait pas moins bruitée ? Quelle est la sensibilité de ton résultat à ce choix de "temps" pour une course ?)

Ta démarche dans ce post c’est de critiquer un choix de paramètre pour un modèle fixé (une régression linéaire), et d’essayer de le reparamétrer avec les données. On part du modèle et on le teste avec les données. Est-ce qu’il ne serait pas intéressant d’essayer de visualiser ces données avant, pour essayer de voir plus de choses et peut-être de penser à des modèles différents ou d’isoler des régions plus significatives ?

À quoi ressemble le nuage 3D des points que tu as collecté ? Y a-t-il des clusters qui se détachent ? Question plus élémentaire, quelle est la distribution des dénivelés dans tes données ? (j’imagine: beaucoup de courses assez plates, un peu de courses avec des dénivelés moyens, et un petit nombre de course avec un plus fort dénivelé). Si on fait des groupes/clusters par dénivelés différents, est-ce que le modèle prédit des paramètres proches sur chaque groupe ou au contraire des paramètres très différents ?

+1 -0

Salut,

Je me dis par exemple qu’on pourrait par exemple mesurer la consommation d’énergie d’un corps humain pour des efforts qui incluent, ou non, du dénivelé. Ça a probablement déjà été fait (?).

tleb

Oui ! Google Scholar m’a tout de suite amené sur ces papier (mots-clés : energy expenditure estimation running elevation) : Estimating Energy Expenditure during Level, Uphill, and Downhill Walking, Validated Caloric Expenditure Estimation using a Single Body-Worn Sensor. La méthode utilisée ici (si j’ai bien compris) est de la "calorimétrie indirecte" par mesure de la quantité de CO2 expiré. Des formules sont données pour prédire la consommation d’énergie (en puissance rapportée à la masse) en fonction de la vitesse de course et de la pente. On s’éloigne un peu du kmekme mais ça doit être possible d’y retomber sous quelques hypothèses.

D’autres papiers s’intéressent à la consommation d’énergie totale sur une course, après j’ai l’impression que les données sont pas simples à décortiquer.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte