シーズン100安打に何試合で到達したか, を数えます.
data/ に置いた retrosheet の全打席結果
(all<年>.csv) を使います. 用意のしかたは data/README.md を見てください.
library(data.table)
library(dplyr)
library(ggplot2)
library(xtable)
col_names <- fread("../../data/reference/retrosheet-columns.csv", header = FALSE)[[1]]
use <- match(c("GAME_ID", "BAT_ID", "H_FL"), col_names)
files <- list.files("../../data", pattern = "^all[0-9]{4}\\.csv$", full.names = TRUE)
if (!length(files)) stop("../../data に all<年>.csv がありません")
seasons <- as.integer(sub(".*all([0-9]{4})\\.csv$", "\\1", files))
76 シーズン (1938-2013) ぶんのデータがあります.
打者ごとに, その打者が出場した試合を日付順に並べ, 安打を積み上げて 100本に到達した試合が何試合目かを見ます.
ここで注意が要るのが並び順です. GAME_ID は
ANA201304090 のように
ホームチームの略称から始まるので,
そのまま文字列として並べると チーム名のアルファベット順になってしまい,
日付順になりません. 4文字目以降 (20130409 +
ダブルヘッダーの番号) で並べます.
実際, 2013年で比べると 172人中161人の到達試合数が変わり, 最速も74試合と70試合で食い違いました.
games_to_100 <- function(path) {
d <- fread(path, header = FALSE, select = use, showProgress = FALSE)
setnames(d, c("GAME_ID", "BAT_ID", "H_FL"))
# 1試合あたりの安打数 (H_FL は 1=単打 .. 4=本塁打, 0=安打でない)
g <- d[, .(hits = sum(H_FL > 0)), by = .(BAT_ID, GAME_ID)]
g[, gdate := substr(GAME_ID, 4, 12)] # YYYYMMDD + ダブルヘッダー番号
setorder(g, BAT_ID, gdate)
g[, `:=`(game_no = seq_len(.N), cum = cumsum(hits)), by = BAT_ID]
res <- g[cum >= 100, .(games = min(game_no)), by = BAT_ID]
res[, year := as.integer(sub(".*all([0-9]{4})\\.csv$", "\\1", path))][]
}
records <- rbindlist(lapply(files, games_to_100))
fullname <- fread("../../data/derived/player-names.csv") # retroID -> name
records <- merge(records, fullname, by.x = "BAT_ID", by.y = "retroID", all.x = TRUE)
100安打に到達したのは延べ 10,639 人 (打者×シーズン) でした.
records %>%
arrange(games) %>%
select(name, year, games) %>%
head(20) %>%
as.data.frame() %>%
xtable() %>% print(type = "html")
| name | year | games | |
|---|---|---|---|
| 1 | Darin Erstad | 2000 | 60 |
| 2 | Hank Aaron | 1959 | 61 |
| 3 | Ralph Garr | 1974 | 62 |
| 4 | Stan Musial | 1948 | 62 |
| 5 | Ichiro Suzuki | 2001 | 62 |
| 6 | Dave Winfield | 1984 | 62 |
| 7 | Matty Alou | 1969 | 63 |
| 8 | Rod Carew | 1983 | 63 |
| 9 | Andres Galarraga | 1993 | 63 |
| 10 | Tony Gwynn | 1997 | 63 |
| 11 | Tommy Holmes | 1945 | 63 |
| 12 | Ichiro Suzuki | 2009 | 63 |
| 13 | Rod Carew | 1974 | 64 |
| 14 | Rod Carew | 1977 | 64 |
| 15 | Kirby Puckett | 1986 | 64 |
| 16 | Ichiro Suzuki | 2006 | 64 |
| 17 | Cecil Travis | 1941 | 64 |
| 18 | Larry Walker | 1997 | 64 |
| 19 | Melky Cabrera | 2012 | 66 |
| 20 | Lenny Dykstra | 1990 | 66 |
いちばん速いのは Darin Erstad の 2000 年で, 60 試合でした.
records %>%
ggplot(aes(x = year, y = games)) +
geom_point(alpha = 0.25) +
geom_smooth(method = "loess", formula = y ~ x) +
ylab("100安打到達までの試合数") +
ggtitle("100安打到達の速さ")

records %>%
ggplot(aes(x = games)) +
geom_histogram(binwidth = 2) +
xlab("100安打到達までの試合数") +
ggtitle("到達試合数の分布")

data/README.md
参照).