Carrera UltraChampsaur
En julio de 2022, corrí una carrera de montaña de aproximadamente ~30 km / ~1500 m de desnivel de altura. Debido a la pandemia, esa fue mi primera carrera desde el 2019 de octubre de 2. 1/2 años antes.


La carrera fue bien. Estuve por delante de mis compañeros durante la mayor parte de la carrera hasta que Pascal se unió a mí a falta de 6 km y cruzamos la línea de meta juntos (de hecho, me esperó en los últimos kilómetros para hacer este final amistoso, gracias a él). Me sentí cansado durante la última subida (ver la cima a la izquierda en el km 20 más abajo) y la bajada que es el último tercio de la carrera.

Datos de importacion
Para comparar las actuaciones decidí descargar cronodeporte datos (archivo de Excel) que abro usando JMP.

Por alguna razón, la hora en Piolit (columna "Piolit 1") y la hora de llegada (columna "Temps") no estaban definidas de la misma manera en el archivo excel y una era reconocida como una variable continua ("Temps" con un triángulo azul) mientras que la otra fue reconocida como una variable categórica ("Piolit 1" con barras rojas).
No te preocupes, era el momento perfecto para poner en práctica las nuevas lecciones aprendidas en la guía de scripting JMP que estoy leyendo... No tengas miedo, no soy un geek, leo novelas en mi tiempo libre y aprendo guiones durante mis horas de trabajo.
Transformar datos: editor de fórmulas de columna
Quería tener tiempo en minutos.
Transformar la variable continua "Temps = 2:32:43" (desafortunadamente no es mi tiempo porque me tomó 2 horas 10 minutos más terminar) en 153 minutos es simple con esta fórmula.

En minutos() transforma un tiempo en minutos, la misma transformación existe durante años, meses, semanas,… segundos.
Transformar la variable categórica “Piolit 1 = 1:54:57” (todavía no es mi tiempo sino el del ganador) en 115 minutos fue una buena oportunidad para aprovechar expresión regular() que es una manera maravillosa de lidiar con variables categóricas complejas (mi ejemplo es bastante simple).

El punto principal es identificar los diversos grupos que componen su aporte utilizando
( expresión regular ( :Piolit 1, " (\d)(\W)(\d\d)(\W)(\d\d) ")).
:Piolit 1 es la variable de columna. expresión regular() El objetivo es identificar grupos en esta variable de columna, siendo cada par de paréntesis un grupo. Aquí buscamos 5 grupos:
- Grupo 1 = (\d) = las horas que contienen 1 dígito solamente
- Grupo 3 = (\d\d) = los minutos que contienen 2 dígitos
- Grupo 5 = (\d\d) = los segundos que contienen 2 dígitos
- Grupo 2 y Grupo 4 = (\W) = el separador “:” entre hora:minutos y minutos:segundos (el código (\W) realmente reconoce caracteres no alfanuméricos)
Una vez que hayamos hecho eso, reutilizaremos los Grupos 1, 3 y 5:
- Grupo 1 por horas: número ( expresión regular (:Piolit 1," (\d)(\W)(\d\d)(\W)(\d\d) ","\1")) * 60
Reemplazas :Piolit 1 (1:54:57 en la fila 1) por el Grupo 1 (eso es lo que significa “\1”) y lo transformas en un número (eso es lo que significa número hace) y multiplicar por 60 (eso es lo que hace el * 60).
- Grupo 3 por minutos: número ( expresión regular (:Piolit 1," (\d)(\W)(\d\d)(\W)(\d\d) ","\3" ) )
Reemplazas :Piolit 1 (1:54:57 en la fila 1) por el Grupo 3 (eso es lo que significa “\3”) y lo transformas en un número (eso es lo que significa número hace).
- Grupo 5 por segundos: número ( expresión regular (:Piolit 1," (\d)(\W)(\d\d)(\W)(\d\d) " ,"\5")) / 60
Reemplazas :Piolit 1 (1:54:57 en la fila 1) por el Grupo 5 (eso es lo que significa "\5") y lo transformas en un número (eso es lo que significa número hace) y divide por 60 (eso es lo que hace / 60).
Al final sumas los 3 componentes y lo redondeas (eso es lo que Redondo hace) para conseguir los 115 minutos (sigue siendo el ganador, estoy lejos de serlo).
Clasificación al llegar: generador de gráficos
En primer lugar evalué nuestro desempeño vs.
a) todos los corredores b) solo hombres c) nuestra categoría (M3H = 50-55 años)


Hice el cálculo como un porcentaje en lugar de un número absoluto, así que dividí
- el rango calculado en el momento de la llegada utilizando Rango de columna (:"Llegada (min)"n)
- por el número de evento dentro de la misma columna (“Llegada (min)”) usando Número de columna (:"Llegada min)"n).
Para las subcategorías agregué un “por variable” para que el cálculo se realice dentro de la columna considerando el nivel de otra variable como instancia
- b) “Sx” = “Hombre” o “Mujer”
- c) “Cat” = “SEF”, “SHE”, … “M6F”, “M8H” según sexo y edad.
El beneficio es que no necesita cálculos de fórmulas múltiples ni declaraciones complejas si/entonces y, lo que es más importante, no hay riesgo de error ya que el cálculo se realiza por columnas considerando el nivel de filas.
El siguiente gráfico resaltado en nuestra categoría ilustra el porcentaje de clasificación con nosotros dos seleccionados para un análisis detallado:

En última instancia, el % refleja nuestra posición:
- 52% vs. todos los corredores, por lo que somos corredores “promedio”
- 60% frente a todos los corredores masculinos, por lo que tenemos un rendimiento inferior al masculino
- un 40% respecto a los corredores masculinos de entre 50 y 55 años, lo que significa que nuestro rendimiento es ligeramente mejor que el de los hombres de nuestra edad
Rendimiento intermedio (en la cumbre de Piolit) frente a llegada: generador de gráficos
Ahora que tengo mis datos en el mismo formato (tiempo en minutos tanto para Piolit como para Llegada) hice una visualización de diagrama de dispersión:

Existe una relación diagonal entre estas dos variables, lo que indica que los individuos se han mantenido más o menos constantes durante el último tercio de la carrera sin cambios importantes.
Dibujo una línea de ajuste (después de excluir al último corredor que parece un valor atípico) en los datos y guardo la fórmula de predicción, así como los residuos, para determinar si tuve un rendimiento inferior durante el último tercio (esa era mi sensación) y/o si Pascal superado (sospechaba).

Es interesante notar que soy el hombre "promedio" con un residual = -0,2, lo que significa que mi desempeño es "normal", mientras que Pascal tiene un residual negativo (-4,4 minutos), lo que significa que tomó menos tiempo en comparación. a los demás corredores en el último tercio. “Todavía tenía algunos bajo los pies” (no estoy seguro de que sea la expresión correcta en inglés, pero creo que todos pueden entenderla) y recuerda que me esperó durante el último tercio, así que debería haber hecho un trabajo aún mejor.
También evalué la diferencia de clasificación con una fórmula de columna adicional:

y evaluamos el rango que ganamos o perdimos en comparación con los otros corredores:

No es sorprendente que Pascal subiera 10 puestos.
Lo más sorprendente es que obtuve 6 rangos. Esto significa que
- globalmente, según los residuos de la línea general de ajuste, soy el hombre "promedio"
- PERO localmente (en comparación con los pocos corredores con los que corría/competiba) hice un trabajo decente durante el último tercio.
Espero que esta publicación de blog te ayude a comprender algunas de las funciones del editor de fórmulas disponibles en JMP, desde las más simples hasta las más complejas (una vez que comiences a usar expresión regular () puedes hacer grandes cosas), así como algunas visualizaciones/análisis de datos.
Para ser honesto, no suelo analizar demasiado mi "rendimiento", pero pensé que este era un buen caso de uso para ejercer algunos de los beneficios de JMP utilizando datos no industriales para divertirme más.