Lahmanのデータベースを使って, 歴代の打者成績推移をplotlyで可視化します.
もともとはrChartsを使っていましたが, rChartsはCRANから消えたためplotlyに 載せ替えました. データも, 同梱していた2014年版のCSVから Lahmanパッケージに切り替えてあります. パッケージなら最新まで入っていて, 更新も追えます.
library(dplyr)
library(ggplot2)
library(plotly)
library(Lahman)
library(knitr)
legends <-
Batting |>
summarise(通算安打 = sum(H, na.rm = TRUE), .by = playerID) |>
filter(通算安打 >= 3000)
career <-
Batting |>
semi_join(legends, by = "playerID") |>
# シーズン中の移籍で行が分かれるので, 同じ年はまとめる
summarise(across(c(G, AB, H, HR, SO), \(x) sum(x, na.rm = TRUE)),
.by = c(playerID, yearID)) |>
arrange(playerID, yearID) |>
mutate(通算安打 = cumsum(H),
通算本塁打 = cumsum(HR),
通算三振 = cumsum(SO),
通算試合 = cumsum(G),
デビュー年 = min(yearID),
.by = playerID) |>
inner_join(People |> transmute(playerID, 選手 = paste(nameFirst, nameLast)),
by = "playerID")
該当するのは33人です.
もとの記事では28人でしたが, その後 Pujols, Cabrera, Beltré, Rodríguez, そしてイチローが到達しました.
career |>
summarise(デビュー = min(yearID), 最終年 = max(yearID),
安打 = max(通算安打), .by = 選手) |>
arrange(desc(安打)) |>
head(10) |>
kable()
| 選手 | デビュー | 最終年 | 安打 |
|---|---|---|---|
| Pete Rose | 1963 | 1986 | 4256 |
| Ty Cobb | 1905 | 1928 | 4189 |
| Hank Aaron | 1954 | 1976 | 3771 |
| Stan Musial | 1941 | 1963 | 3630 |
| Tris Speaker | 1907 | 1928 | 3514 |
| Derek Jeter | 1995 | 2014 | 3465 |
| Cap Anson | 1871 | 1897 | 3435 |
| Honus Wagner | 1897 | 1917 | 3420 |
| Carl Yastrzemski | 1961 | 1983 | 3419 |
| Albert Pujols | 2001 | 2022 | 3384 |
career_line <- function(d, ycol, title) {
plot_ly(d, x = ~yearID, y = as.formula(paste0("~", ycol)),
color = ~選手, type = "scatter", mode = "lines") |>
layout(title = title,
xaxis = list(title = "year"),
yaxis = list(title = ycol, rangemode = "tozero"))
}
career_line(career, "通算安打", "通算安打数")
19世紀からの選手が並ぶので線が混みます.
デビュー年で分けて見ます. 1970年以降にデビューした選手に絞ります.
recent <- career |> filter(デビュー年 >= 1970)
career_line(recent, "通算安打", "通算安打数 (1970年以降デビュー)")
17人です.
career_line(career, "通算本塁打", "通算本塁打数")
1920年代を境に傾きが変わります. 飛ぶボールの導入とスピットボール禁止で 本塁打が急増した時期です.
career_line(career, "通算三振", "通算三振数")
古い選手は線が途中から始まります. 三振の記録が残っていない年があるためです. 公式記録として整備されたのは後年で, それ以前は欠損しています. 0本だったわけではありません.
career |>
summarise(三振が記録されている年 = sum(!is.na(SO) & SO > 0),
在籍年数 = n(), .by = 選手) |>
filter(三振が記録されている年 < 在籍年数) |>
arrange(三振が記録されている年) |>
head(5) |>
kable()
| 選手 | 三振が記録されている年 | 在籍年数 |
|---|---|---|
| Paul Waner | 19 | 20 |
| Willie Mays | 22 | 23 |
| Eddie Collins | 23 | 25 |
最近の選手だけ見ます.
career_line(recent, "通算三振", "通算三振数 (1970年以降デビュー)")
三振の少なさが際立つのはTony Gwynnで, 打数9,288に対して三振434, 比は21.4です.
同じく安打を量産したAlex Rodriguezの 4.6と比べると, タイプの違いが分かります.
ratio |> select(選手, 打数 = AB, 三振 = SO, `打数/三振` = 比) |> head(5) |> kable(digits = 1)
| 選手 | 打数 | 三振 | 打数/三振 |
|---|---|---|---|
| Tony Gwynn | 9288 | 434 | 21.4 |
| Wade Boggs | 9180 | 745 | 12.3 |
| George Brett | 10349 | 908 | 11.4 |
| Ichiro Suzuki | 9934 | 1080 | 9.2 |
| Cal Ripken | 11551 | 1305 | 8.9 |