ウルトラチャンピオンレース
2022年7月、標高約30km/高さ約1500mの山岳レースを走りました。 パンデミックの影響で2019年10月2日以来のレースとなった1/2何年も前。


レースはうまくいきました。 残り6キロでパスカルが合流し、一緒にゴールラインを越えるまで、レースのほとんどで私はチームメイトより先を走っていました(実際、パスカルは最後の数キロで私を待っていて、このフレンドリーなフィニッシュを達成できました、おかげで)。 最後の登り(以下の20キロ地点にある左側の頂上を参照)とレースの最後の3分の1の下りで疲れを感じました。

データのインポート
パフォーマンスのベンチマークを行うためにダウンロードすることにしましたクロノスポーツJMPを使用して開いたデータ(Excelファイル)。

何らかの理由で、ピオリットでの時刻 (列 "Piolit 1") と到着時刻 (列 "Temps") が Excel ファイル上で同じように定義されておらず、一方が連続変数 ("Temps" と認識される) として認識されました。青い三角形)、もう 1 つはカテゴリ変数 (赤いバーの「Piolit 1」) として認識されました。
心配しないでください。今読んでいる JMP スクリプト ガイドで学んだ新しい教訓を実践するのに最適な時期でした。 心配しないでください。私はオタクではありません。空いた時間に小説を読み、勤務時間中にスクリプトを学習します。
データの変換 : 列式エディター
数分で時間が欲しかった。
この式を使用すると、連続変数「Temps = 2:32:43」(残念ながら終了までに 2 時間 10 分以上かかったので、私の時間ではありませんでした) を 153 分に変換するのは簡単です。

数分で()時間を分単位で変換すると、同じ変換が年、月、週、…秒にわたって存在します。
カテゴリ変数「Piolit 1 = 1:54:57」(まだ私のタイムではありませんが、勝者のタイム)を 115 分で変換することは、正規表現()これは、複雑なカテゴリ変数を扱う素晴らしい方法です (私の例は実際には非常に単純です)。

重要な点は、次を使用して入力を構成するさまざまなグループを特定することです。
(正規表現( :ピオリット1、" (\d)(\W)(\d\d)(\W)(\d\d) "))。
:Piolit 1 は列変数です。 正規表現()この列変数内のグループを識別することを目的としています。括弧の各ペアがグループです。 今回は5つのグループを募集します。
- グループ 1 = (\d) = 1桁のみを含む時間
- グループ 3 = (\d\d) = 2 桁の分
- グループ 5 = (\d\d) = 2桁を含む秒
- グループ 2 とグループ 4 = (\W) = 時:分と分:秒の間の「:」区切り文字 (コード(\W)実際には英数字以外の文字も認識されます)
それが完了したら、グループ 1、3、および 5 を再利用します。
- グループ 1 の時間:番号(正規表現(:ピオリット1、" (\d)(\W)(\d\d)(\W)(\d\d) ","\1")) * 60
:Piolit 1 (行 1 の 1:54:57) をグループ 1 (これは「\1」の略です) に置き換え、それを数値として変換します (これが番号します)そして 60 を掛けます(これが * 60 の動作です)。
- グループ 3 の分:番号(正規表現(:ピオリット1、" (\d)(\W)(\d\d)(\W)(\d\d) ","\3" ) )
:Piolit 1 (行 1 の 1:54:57) をグループ 3 (これは「\3」の略です) に置き換え、それを数値として変換します (これが番号します)。
- グループ 5 を数秒間:番号(正規表現(:ピオリット1、" (\d)(\W)(\d\d)(\W)(\d\d) " ,"\5")) / 60
:Piolit 1 (行 1 の 1:54:57) をグループ 5 (これは「\5」の略です) に置き換え、それを数値として変換します (これが番号します)そして 60 で割ります(これが / 60 の動作です)。
最後に、3 つの成分を合計して切り上げます (これが、ラウンドする)115分を達成するために(まだ勝者には程遠いですが)。
到着時のランク:グラフビルダー
まず最初に、私たちのパフォーマンスと
a) すべてのランナー b) 男性のみ c) 私たちのカテゴリー (M3H = 50-55 歳)


絶対数ではなくパーセンテージとして計算したので、割り算しました。
- を使用して到着時刻に基づいて計算されたランクコルランク(:"到着(分)"n)
- 同じ列内のイベントの数 (「到着 (分)」) を使用して列番号(:「到着分)」n)。
サブカテゴリには「変数による」を追加し、別の変数のレベルをインスタンスとして考慮して列内で計算が行われるようにしました。
- b) 「Sx」 = 「男性」または「女性」
- c) 性別と年齢に応じて、「Cat」 = 「SEF」、「SHE」、…「M6F」、「M8H」。
利点は、複数の数式計算や複雑な if/then ステートメントが必要ないこと、そしてさらに重要なことに、行レベルを考慮して列ごとに計算が行われるため、エラーのリスクがないことです。
カテゴリで強調表示されている以下のグラフは、詳細な分析のために選択された 2 人のランク % を示しています。

最終的に、% は私たちの立場を反映しています。
- 全ランナーに対して 52% なので、「平均的な」ランナーです
- 男性ランナー全体に対して 60% なので、パフォーマンスの高い男性ランナーよりも劣ります
- 50~55歳の男性ランナーと比較すると40%。これは、私たちのパフォーマンスが同年代の男性ランナーよりわずかに優れていることを意味します。
中間パフォーマンス (Piolit サミットで) 対到着: グラフ ビルダー
これで、散布図の視覚化を行ったときと同じ形式 (Piolit と Arrival の両方の時間は分単位) でデータが得られました。

これら 2 つの変数の間には対角関係があり、レースの最後の 3 分の 1 にわたって個人が大きな変化なくほぼ一定を保っていることを示しています。
データ上に適合線を引き (外れ値のように見える最後の走者を除外した後)、予測式と残差を保存して、最後の 3 分の 1 でパフォーマンスが低かったかどうか (これが私の感覚でした) かどうか、および/またはパスカルがパフォーマンスを下回ったかどうかを判断します。パフォーマンスが高すぎます(私はそう思っていました)。

興味深いのは、私は残差 = -0.2 の「平均的な」人間であり、これは私のパフォーマンスが「普通」であることを意味しますが、パスカルの残差はマイナス (-4.4 分) であり、これは比較にかかる時間が短いことを意味します。最後の3分の1で他のランナーに。 「彼はまだ足元に余裕があった」(英語で適切な表現かどうかはわからないが、誰もが理解できると思う)そして最後の3分の1の間、彼が私を待ってくれたことを覚えているので、実際にはもっと良い仕事をするべきだった。
また、追加の列式を使用してランクの違いを評価しました。

そして、他のランナーと比較して得た順位、または失った順位を評価しました。

当然のことながら、パスカルは 10 ランク上がりました。
さらに驚いたことに6ランクも上がりました。 この意味は
- 世界的に見て、全体的な適合線の残差に基づいて、私は「平均的な」男性です
- しかし、地元では(私が走っていた/競争していた数人のランナーと比較して)最後の3分の1でまともな仕事をしました。
このブログ投稿が、単純なものからより複雑なものまで、JMP で使用できる数式エディター機能のいくつかを理解するのに役立つことを願っています (使い始めると正規表現 ()素晴らしいことを行うことができます) だけでなく、いくつかのデータの視覚化/分析も可能です。
正直に言うと、私は普段自分の「パフォーマンス」を過度に分析することはありませんが、これは非産業データを使用して JMP の利点の一部を活用し、より楽しむには良い使用例だと思いました。