Excelの一機能、Power Query(パワークエリ)は競馬データの分析に便利、という話①

導入

 ご無沙汰しております、御尻山教授です。
 Excelの「Power query」なる機能を使ってみたところ、競馬のデータ収集・分析に結構便利だったので当記事で共有しておきます。
 ちなみに、プログラミングをちょっと齧った程度かつパワークエリを使って2週間程度のペーペーなので、英会話教室に通い始めたての会社員程度のレベルだと思って見て頂けると幸いです。よろしくお願いします。

必要なもの

・Excel(2013以降)

 当然ですけど、Excelを使う必要があります。一応似たような感じの「Power BI」なるツールもあるらしいのですが、今回は永久ライセンスを買ったはいいけど機会が無いので塩漬けされていたExcelを使う、という僕の堅い意志があったため全く触っていません。触ったことがある方は教えて下さい。

・(必要に応じて)各種データ

 データ分析のために必要なデータは各自用意してください。
 当記事では、JRA公式サイトからデータを引っ張ってくるために必要な、URLのリストとレース結果データを用いたいと思います。

実践

使用するデータ

今回は、12月3日(土)の中山ダート1200m計3レースのデータから、傾向を探るために、

①1着馬との上がりの差がどうだったか
②4角1番手にいた馬との上がり差がどうだったか

このデータを収集していきたいと思います。

土曜中山ダート1200mのレース数、階級と公式ページのURL一覧です

ちなみにウェブページからデータを収集する行為を「スクレイピング」というのですが、注意点として沢山のデータを間隔開けずにどんどん収集するとサーバーに負担をかけるので規約をきちんと確認しておくこと(データ収集を禁止している場合もあります。)。あとは大量にページを読み込みしないこと(読み込みごとのタイムラグを作る)。これは守りましょう。

本題に戻ります。この各データを取得するために、まずはウェブページの各データを使えるように処理していきます。

Excelのメニューから[データ]タブの[データの取得と変換]から[Webから]をクリックします。

Webからをクリック。


まずは1ページ目のURLを入力。

このウインドウが出たら、まずは1Rの未勝利戦のデータがあるページを入力してみます。

どうやってページに接続するかを指定します。

匿名で接続します。ユーザーIDやpassが必要な場合は[基本]から入力すれば接続できると思います。

するとこの画面に移動します。HTMLからデータを引っ張りたい場合も素直にテーブルを選んでおきましょう。

ここから、「2022年12月3日(土曜) 5回中山1日 発走時刻:9時50分 (以下略)」のテーブルを選択して、「データの変換」をクリックします。すると、ウェブページからテーブルを引っ張ってきてくれます。

こんな画面が出てきます。HTMLからデータを取得したい場合は右の[ソース]横の歯車からテキストファイルに変換するようにしてあげるとHTMLが表示されます。


元ページがこんな感じです。

ここからデータを弄って、欲しいデータを作成していきます。


とりあえず分かりやすいように一部の列を消して並べ替えておきました。


タイムを扱いやすく10進数にします。「列の追加」タブから「カスタム列」をクリック。
力技でタイムの頭「#:#」部分を変換しています。こうしないとタイムの表記では数字として扱ってくれないので、計算をするときエラーが出てしまいます。


タイム列を消去(元データを消していないので問題ないです)し、新しい列[時計]を並び替えて10進数に変換した図。
次にコーナー通過順位を使いやすいように処理。[変換]タブ→[列の分割]→[区切り記号による分割]をクリック


この画面に。OKを押します。


分割した列をそれぞれ「3角」「4角」に名前変更。これでデータとして扱いやすくなりました。

ちなみに、途中で処理を戻したいときは右側「クエリの設定」部分から「適用したステップ」をクリックすると巻き戻して確認できます。

ここまでの経過が全てリスト化されています。

ここまでがデータの下処理です。データベース化するのであればこのままでもよいですが、今回は更にデータを加工して、欲しいデータを作っていきます。

まずは①1着馬との上がり差から。「列の追加」から再度「カスタム列」をクリック


式を入力します。「今の状態【名前が変更された列】から、[推定上り]セルから1列目を引いた数字を出力する」式を入力しました。すでに着順で並び替えられたテーブルだったので、1着馬との上がりの差がこれで比較できます。
更に今度は②4角先頭にいた馬との上がりの差を調べていきます。[4角]列を昇順で並べ替えます。


この状態で先程のように式を書きます。これで、4角通過順で並び替えた状態での1列目、つまり4角先頭の馬との比較ができます。


あとは「列の追加」→「丸め」→「四捨五入」で計算結果を小数点1桁に成形して、
これでデータ完成です。

完成したデータを見てみると、4角通過1,2番手がそのまま上がり上位でゴールしており、2頭以外で勝負になりそうだったのは3着で1着馬に3F0.5秒タイムを詰めて全体時計も0.1秒差まで詰め寄ったダークンストーミーだけだったとデータでは判断することもできます。


ここから残りの2レースの分析も行えるようにしたかったのですが、疲れたので次回。
次回は最初に作ったテーブルから、他レースの分析が行えるように今までの処理を関数化(内部で処理してくれるパーツ化させる)してみようと思います。

この記事が気に入ったらサポートをしてみませんか?