← 記事一覧へ

シーズン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_IDANA201304090 のように ホームチームの略称から始まるので, そのまま文字列として並べると チーム名のアルファベット順になってしまい, 日付順になりません. 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("到達試合数の分布")

注意

  • retrosheet の収録試合は今も増えています. 古いシーズンほど当時より 試合数が多くなっており, 手元のデータに入っていない試合がある年では 「その打者が出場した試合」を数え落とします. 古い年の記録は 実際より遅く出ている可能性があります (data/README.md 参照).
  • ここでの「試合数」はその打者に打席が記録された試合の数です. 代走や守備のみでの出場は含みません.
  • 100安打に届かなかった打者は表に出てきません.