■ネタ元
Visualizing Eliud Kichoge's new marathon recordを参考に、データだけ変えてみました。
■パッケージの読み込み
library(tidyverse) library(rvest) library(janitor) library(lubridate) library(ggimage) library(hrbrthemes)
■データの読み込み
元記事では、WikipediaのMarathon world record progressionからスクレイピングしてデータを収集していますが、ここでは、JRA-VANとTARGET frontier JVを使い、東京競馬場のレコードタイムを、過去の変遷を含めて取得し、CSVファイルに出力したものを使います。
なお、JRA-VANのデータは1986年以降に限定されるので、それ以前のレコードタイムは含まれていません。また、有償のデータベースなので、出力したデータ全体は、この記事には含んでいません。
df <- read_csv("./tokyo_record.csv") head(df)
## # A tibble: 6 x 49 ## M 日付 開催 R レース名 馬名 C 性別 年齢 ## <lgl> <chr> <chr> <dbl> <chr> <chr> <lgl> <chr> <dbl> ## 1 NA 191116 5東5 11 東京スポG3 コントレイル NA 牡 2 ## 2 NA 191116 5東5 2 未勝利* サトノフラッグ NA 牡 2 ## 3 NA 191102 5東1 11 京王杯2G2 タイセイビジョン NA 牡 2 ## 4 NA 191026 4東8 2 未勝利* マイネルデステリョ NA 牡 2 ## 5 NA 191005 4東1 11 サウジアG3 サリオス NA 牡 2 ## 6 NA 190526 2東C 12 目黒記念HG2 ルックトゥワイス NA 牡 6 ## 騎手 斤量 頭数 馬番 馬印 馬印2 馬印3 馬印4 レース印1 人気 着順 ## <chr> <chr> <dbl> <dbl> <lgl> <lgl> <lgl> <lgl> <lgl> <dbl> <chr> ## 1 ムーア 55 8 6 NA NA NA NA NA 1 1 ## 2 マーフィ 55 16 8 NA NA NA NA NA 1 1 ## 3 ルメール 55 10 4 NA NA NA NA NA 1 1 ## 4 津村明秀 55 9 2 NA NA NA NA NA 5 1 ## 5 石橋脩 55 9 3 NA NA NA NA NA 1 1 ## 6 レーン 55 13 10 NA NA NA NA NA 3 1 ## `芝・ダ` 距離 コース区分 馬場状態 賞金 多頭出し 所属 調教師 走破タイム ## <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <chr> <dbl> ## 1 芝 1800 C 良 3300 <NA> (栗) 矢作芳人 1445 ## 2 芝 2000 C 良 500 <NA> (美) 国枝栄 1595 ## 3 芝 1400 B 良 3800 <NA> (栗) 西村真幸 1208 ## 4 芝 2000 B 稍 500 <NA> (美) 畠山吉宏 1598 ## 5 芝 1600 A 良 3300 <NA> (美) 堀宣行 1327 ## 6 芝 2500 C 良 5700 <NA> (栗) 藤原英昭 2282 ## 着差 `2角` `3角` `4角` 上り3F PCI 好走 PCI3 RPCI 上3F地点差 馬体重 ## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> ## 1 -0.8 5 5 5 33.1 57.9 * 55.5 54.1 0.8 456 ## 2 -0.5 8 6 7 34.5 55.6 * 55.3 53.5 0.5 492 ## 3 -0.3 NA 6 6 33.5 55.9 * 53.6 52.7 0.6 460 ## 4 -0.4 3 3 3 35.4 52.2 * 53.5 48.6 0.9 444 ## 5 -0.2 NA 3 3 33.1 58 * 56.7 56 0.4 540 ## 6 -0.2 12 11 10 34.3 54.9 * 53.3 49.1 1.5 444 ## 馬体重増減 ブリンカー 単勝配当 複勝配当 枠連 馬連 馬単 3連複 3連単 ## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 0 <NA> 250 110 NA 360 640 330 1330 ## 2 -2 <NA> 370 190 3250 3010 4330 154080 415640 ## 3 4 <NA> 210 110 540 560 860 990 3660 ## 4 -2 <NA> 1920 230 6440 5730 12730 1450 27190 ## 5 6 <NA> 150 110 320 320 430 430 1080 ## 6 2 <NA> 730 240 690 4490 7500 18420 90500
データは、東京競馬場のすべてのコース、距離についてのレコードタイムの推移です。今回は日本ダービーやジャパンカップが行われる、芝2400mに限定してグラフ化します。距離 == 2400 および 芝・ダ == "芝" として、データを抽出します。また、データには馬場状態や騎手、配当なども含まれていますが、ここでは日付と馬名、タイムだけを選択します。
df_2400 <- filter(df, 距離 == 2400, `芝・ダ` == "芝") %>% select(日付, 馬名, 走破タイム) kable(df_2400, row.names = TRUE)

1986年以降、8回のレコード更新がなされ、現在のレコードは、2018年のジャパンカップでアーモンドアイがマークした、2分20秒6であることがわかります。なお、東京競馬場は2003年にリニューアル工事が行われ、直線がさらに長くなるなど、コース形態も変わりました。そのため、それ以前のレコード (ホーリックスの2分22秒2) はいったんリセットされています。
しかし、居並ぶ歴史的名馬 (他はすべてGI馬) に混じった、ダンツランニングが異彩を放ちますね...。とはいえ、その後重賞で好走するなど、「順調だったら」という馬でした。
■データの加工
ファイルから読み込んだ段階では、日付とタイムが扱いづらい形式になっているので、加工します。
はじめに、日付をdatetime型に変換します。lubridateパッケージの ymd() 関数を使います。
df_2400[["日付"]] <- ymd(df_2400[["日付"]]) kable(df_2400, row.names = TRUE)

次に、タイムをPeriod型に変換します。lubridateパッケージの ms() 関数を使います。ただ、"2206" (競馬ファンはこれで2分20秒6と理解できますが) といった文字列のままでは変換できないので、stringrパッケージの str_replace() 関数を使い、分と秒の区切り文字 (:) および、10分の1秒の前にドットを挿入します。
df_2400[["走破タイム"]] <- str_replace(df_2400[["走破タイム"]], "(^.)", "\\1:") df_2400[["走破タイム"]] <- str_replace(df_2400[["走破タイム"]], "(.$)", ".\\1") df_2400[["走破タイム"]] <- ms(df_2400[["走破タイム"]]) kable(df_2400, row.names = TRUE)

■データフレームへの画像情報の付与
今回は、グラフ内の要素を画像で表現したいので、あらかじめダウンロードした「競馬っぽい」画像のファイル名を、データフレームに付与します。画像はシルエットACから入手しました。現在のレコードタイム (2018年、アーモンドアイ) だけ、別の写真を使ってみます。
df_2400 <- df_2400 %>% mutate(image = "horse.png") df_2400[1, "image"] <- "almond_eye.jpg" kable(df_2400, row.names = TRUE)

■グラフの描画
では、グラフを描いてみましょう。ggimageパッケージの geom_image() 関数を使うと、データポイントを任意の画像で表示できます。
g <- ggplot(df_2400, aes(x = 日付, y = 走破タイム)) + geom_line(colour = "pink", size = 3) + geom_image(aes(image = image), size = 0.12)+ annotate("text", x = as.Date("2003-04-26"), y = ms("02:24.5"), label = "改装", size = 6) + annotate("text", x = as.Date("2018-11-25"), y = ms("02:21.5"), label = "2018ジャパンカップ\nアーモンドアイ", size = 6) + scale_x_date(limits = c(ymd("1985-01-01"), ymd("2022-12-31"))) + scale_y_time(limits = c(ms("02:19.0"), ms("02:26.0"))) + theme_ipsum_rc() + labs(title = "東京競馬場 芝2400mのレコードタイム推移", subtitle = "2003年に改装されたため、それまでのレコードはいちどリセットされている。") + theme( panel.grid.minor = element_blank(), panel.grid.major = element_line(colour = "gray75", size = 0.3, linetype = "dashed"), plot.title = element_text(size = 16), plot.subtitle = element_text(size = 12) ) g ggsave("tokyo_record.jpg", g, width = 12, height = 8)
