競馬 過去データcsvをnetkeibaから無料で入手する方法

R

ディープラーニングなどの機械学習をするにしても、まず、データを集める必要があります。JRA-VANでもお試し期間の1ヶ月のみであれば無料でデータを入手できますが、データ分析を継続して行うには、どうしても自前でデータ収集する必要があります。このページでは競馬予想AIを作る上での大元となるデータを無料で収集する方法(netkeibaからのスクレイピング方法)や取得したデータをcsv 形式で保存する方法について記述しています。

ここではスクレイピングにRを使う方法を紹介します。

Rとは?

Rはデータ分析などに使われることが多い無料のソフトです。caretやkerasなどのパッケージを導入することで、比較的簡単に機械学習やディープラーニングを行なったりすることもできます。

R言語とは?Rでできること。現役Rユーザーが語る。
R言語は、データ分析、統計解析に特化した言語であるとよく言われます。しかし「データ分析」「統計解析」しかできないと考えてしまっては損をしています。C/C++のような汎用のプログラミング言語同様の制御構造を備えていますし、CRANで公開されているパッケージを利用すれば、はるかに簡単に望みの機能を実装することができる言語です。

 

Rでnetkeibaをスクレイピング

無料で利用できるデータ解析ツールRを使って、無料でアクセスできるnetkeibaから競馬データのスクレイピングを行ってみました。

JRA-VANデータラボの会員になれば、公式データをcsv形式でダウンロードすることができるのですが、いかんせん有料。利用料金は月額2,090円(2022年1月現在)。1年使ったら約24,000円がデータを入手するだけで吹っ飛ぶ。JRA銀行からの引き落とし手数料が24,000円なんて高過ぎますからね。ぜひトライしてみてください。

スクレイピングのための準備

netkeibaからスクレイピングするにあたり、どのようなデータを取り出すのか、そのデータにどうやってアクセスするのかを整理します。

取り出すデータ

まず、取り出すデータについて。
下の図は2021年のダービーのレース結果です。

ここに示すようにいくつかの表が示されているのですが、このページから以下の3種類のデータを取り出すことにします。

①レースの条件
②レース結果(各馬の着順、タイム等)
③払い戻し情報

まず、このページへのアクセス方法について。このページのURLは以下のようになっています。

URL:
https://db.netkeiba.com/race/202105021211/

この「202105021211」の部分(この部分をrace_idと呼ぶことにします)が2021年2回東京12日目11R(すなわちダービー)のレースを表しています。このページにアクセスして、データを取得するためには、入手したい過去のレースについて、race_idを入手してから、データを入手するというのが今回やりたいことになります。

(参考)

過去のデータをスクレイピングしてみてわかったことですが、race_id = 「202105021211」は、「2021 05 02 12 11」に分解されて、それぞれ、以下のような意味になっているようです。今回のスクレイピングではこの情報は使いませんが、とりあえず、参考までにどういう意味なのか載せておきます。

2021:年
05:競馬場コード(05は東京)
02:回
12:日目
11:レース

競馬場コード
01:札幌 02:函館 03:福島 04:新潟
05:東京 06:中山 07:中京 08:京都
09:阪神 10:小倉

race_idを調べる

前項の参考の部分にrace_idの意味は載せましたが、毎年開催回数が同じではない等の理由から、race_idを自動的に作成することはできません。従って、過去のレースについてのrace_idを調べる必要があります。

netkeibaには、以下のように競馬開催日のレース一覧をまとめたページがあります。2021年の日本ダービーが開催された日(5月30日)であれば、URLは以下のようになっています。赤字の部分が開催日になっています。

URL:
https://race.netkeiba.com/top/race_list.html?kaisai_date=20210530

 

このページの各レース名にはリンクが設けられており、レース名をクリックすると先ほどのようなレース結果にページが移動します。つまり、競馬が開催された日を調べて、その日付に対応したレース一覧のページにアクセスすれば、レース名部分のリンク先のURLにrace_idが埋め込まれているので、これを抽出するコードを書けばrace_idを取得することができるということです。

日本ダービーのレース結果URL:
https://race.netkeiba.com/race/result.html?race_id=202105021211&rf=race_list
赤字部分がrace_id)

(参考)

タイプ①

開催レース一覧URL:
https://db.netkeiba.com/?pid=race_kaisai&syusai=10&date=20210530

レース結果URL:
https://db.netkeiba.com/race/202105021211/

 

タイプ②:

開催レース一覧URL:
https://race.netkeiba.com/top/race_list.html?kaisai_date=20210530

レース結果URL:
https://race.netkeiba.com/race/result.html?race_id=202105021211&rf=race_list

 

race_idを入手するページ、レース結果を入手するページを、タイプ①またはタイプ②で統一する方が自然なのかもしれませんが、今回のスクレイピングでは、タイプ①、タイプ②が混在する形のスクレイピングになっています。

race_idの入手 = タイプ②の開催日ページ
レース結果の入手 = タイプ①のレース結果ページ

このやり方になっていることに必然性はありません。netkeibaを調べながらコードを書いていたところ、こういう形でスクレイピングを実現できたというだけです。

開催日を調べる

では、開催日はどうやって入手するか?
基本的には土日のみとはいえ、年始の金杯のように日付が機会的にはわからない場合もありますので、開催日もきちんと調べる必要があります、netkeibaには開催一覧のカレンダーのページがあります。開催一覧のページのURLは以下のようになっており、、「year=」「month=」の部分を書き換えれば、対応する年、月のページにアクセスできます。

URL:
https://race.netkeiba.com/top/calendar.html?year=2021&month=5

 

このカレンダー部分から、リンク先情報を全て抽出して、文字列処理を行えば、開催日の情報(2021年5月の場合であれば、20210501, 20210502, 20210508, 20210509, 20210515, 20210516, 20210522, 20210523, 20210529, 20210530)を入手することができます。

スクレイピングのためのソースコード

スクレイピングを始める前に

Rでスクレイピングをするならrvestパッケージを使うのが簡単です。また、スクレイピングをするためにはHTML/CSSの理解も必要。とりあえず、これだけ知っていればスクレイピングは始められます。

Rでスクレイピングするならrvest 表もリンクもテキストも
Rでスクレイピングをするならrvestパッケージを使うのがベスト。表データ、リンク先URL、テキストなどのデータを簡単に入手できます。netkeibaのレース結果を題材にrvestパッケージの使い方をまとめています。
スクレイピングに必要な最低限のHTML/CSSの知識
スクレイピングでデータを収集するためには、HTMLで書かれたWebページの文書構造を理解し、どこに目的のデータが記載されているかをコンピュータに教えてやる必要があります。このページではスクレイピングに最低限必要なHTML/CSSの知識をまとめています。

スクレイピングの手順とソースコード

これで、netkeibaからスクレイピングするための手順が決まりました。手順としては以下のようになります。

step1: 入手したい日付(年、月)のカレンダーのページから開催日を調べる

Rで競馬データをスクレイピング :step1コード
netkeibaのサイトから競馬開催日をスクレイピングするためのコードです。

step2: 開催日のページからrace_idを調べる

Rで競馬データをスクレイピング :step2コード
指定した開催日に行われた競馬のrace_idをスクレイピングするためのコードです。

step3: race_idに対応したページからデータを抽出する

Rで競馬データをスクレイピング :step3コード
race_idに対応したレース条件、レース結果、払い戻し情報をスクレイピングするためのコードです。

スクレイピング実行結果

5年分のデータ取得に7時間くらいかかりました。夜、実行しておくと朝には欲しいデータが入手できているという感じです。2回実行して計10年分、34,540レース、延べ491964頭分のレースデータを入手できました。

レース情報

レース結果

払い戻し情報

(参考)処理時間の短縮について

step2の部分でSeleniumを利用しているのですが、ここが処理を遅くしています。netkeibaには、同じような内容が記載されてるページがいくつかあり、今回利用したページとは違うページを利用すれば、Seleniumを使わずにスクレイピングができそうです。こちらを参照ください。

競馬予想AIの作り方 〜 Rで出馬表をWebスクレイピング
前回の記事でせっかくスピード指数をスクレイピングしてデータベースを作ったのだから、次のレースの検討に活かしたい‼️そうすれば、きっと…(笑)。というわけで、今週末開催されるレースの出走テーブルをnetkeibaさんからスクレイピングさせてもらうことにしました。

csv形式での保存

データの使い方によっては、csvファイルの形式で保存したい場合もあるかと思います。入手したデータはdata.frame形式になっていますので、write.csv()関数などを使えば、簡単にcsv形式で保存することができます。

# df : データほ保持しているdata.frame型の変数名
# filename : 保存したいファイル名
# row.names = FALSEのオプションは行番号をつけないようにするため

write.csv(df, filename, row.names = FALSE)

まとめ

netkeibaからスクレイピングするための手順は以下の通り。

  1. 入手したい日付(年、月)のカレンダーのページから開催日を調べる
  2. 開催日のページからrace_idを調べる
  3. race_idに対応したページからデータを抽出する

まずはstep1から

Rで競馬データをスクレイピング :step1コード
netkeibaのサイトから競馬開催日をスクレイピングするためのコードです。

そして、netkeibaの走破タイムだけでなく、スピード指数もスクレイピングしたい場合はこちら

競馬予想AIの作り方 〜 Rでスピード指数をスクレイピング
スピード指数データは「無料」「スピード指数」で検索して、トップに出てくる下記のサイトからを入手させていただくことにしました。 競馬新聞&スピード指数(無料)

スピード指数を作る過程を公開中

競馬スピード指数の作り方 〜 作成過程を公開(1)
競馬データの分析の目的は、競走馬の能力を適切に把握すること。そのための1つの方法として馬の能力の指数化、いわゆる、スピード指数化というものがあります。スピード指数の計算は距離、馬場等に対して、さまざまな補正がなされています。「さまざまな補正」に自分の考え方を盛り込みたい、という人はどうしても自分で指数を作る必要があります。その指数を作っていく過程をまとめています。

データを入手したら、競馬予想AIを作ってみたくなりますよね?

競馬予想AIの作り方 無料ツールのみで作成する方法
競馬AIを作る方法について説明しています。競馬AIを作るために使える無料ツール「R」と「RStudio」、そして競馬AI作成の中核となる「データ収集」「AIモデルの作成」といった作業についても具体的に紹介しています。

スクレイピングをしてデータを入手できるようになれば、あまり公表されていないような分析も自分で行うこともできるようになります。

競馬 単勝オッズと着順の統計。あなたが選んだ馬は何着になる?
「単勝オッズが〇〇倍だったら、1着になる確率は△△%」「単勝オッズが■■%を超えると1着になる確率よりも2着になる確率の方が高くなる」なんて情報知ってたら、もっと競馬を楽しめるようになるはず。単勝オッズと着順の関係を整理してみました。