日本のプロ野球選手の誕生日に偏りはあるのか, を見ます.
メジャーリーガーでは8月生まれが多いことが 分かっています. 米国の少年野球の学年区切りが7月31日で, 8月生まれが学年で最年長になるためです.
日本の学年の区切りは4月2日です. だとすれば, ピークは4月に来るはずです.
library(data.table)
library(dplyr)
library(ggplot2)
library(knitr)
dat <-
fread("../../data/derived/npb-players.csv") |>
as_tibble() |>
mutate(BIRTH = as.Date(birth))
データはプロ野球データFreakから
scrape-npb-players.R で取ってきます (12球団の選手一覧).
同じ選手が支配下と育成で二重に載ることがあるので,
選手単位にまとめてから数えます.
players <-
dat |>
distinct(name, BIRTH) |>
filter(!is.na(BIRTH)) |>
mutate(月 = as.integer(format(BIRTH, "%m")),
生年 = as.integer(format(BIRTH, "%Y")))
1,068人, 生年は1980年から2007年までです.
2月は28日しかないので, 月ごとの人数をそのまま比べてはいけません. 1日あたりの人数に直し, 全体平均を100とした指数にします.
days_in_month <- c(31, 28.25, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
idx <-
players |>
count(月, name = "人数") |>
arrange(月) |>
mutate(日数 = days_in_month,
一日あたり = 人数 / 日数,
指数 = 一日あたり / mean(一日あたり) * 100)
idx |> select(月, 人数, 一日あたり, 指数) |> kable(digits = 2)
| 月 | 人数 | 一日あたり | 指数 |
|---|---|---|---|
| 1 | 69 | 2.23 | 76.14 |
| 2 | 63 | 2.23 | 76.29 |
| 3 | 68 | 2.19 | 75.04 |
| 4 | 106 | 3.53 | 120.87 |
| 5 | 105 | 3.39 | 115.87 |
| 6 | 107 | 3.57 | 122.01 |
| 7 | 97 | 3.13 | 107.04 |
| 8 | 117 | 3.77 | 129.11 |
| 9 | 100 | 3.33 | 114.03 |
| 10 | 74 | 2.39 | 81.66 |
| 11 | 86 | 2.87 | 98.07 |
| 12 | 76 | 2.45 | 83.87 |
8月が最も多く (指数129), 3月が最も少ない (指数75) でした.
idx |>
ggplot(aes(x = factor(月), y = 指数, fill = 月 %in% 4:7)) +
geom_col() +
geom_hline(yintercept = 100, linetype = "dashed") +
scale_fill_manual(values = c("grey60", "tomato"),
labels = c("その他", "学年の前半 (4-7月)"), name = NULL) +
xlab("誕生月") + ylab("1日あたりの人数 (平均=100)") +
ggtitle("日本のプロ野球選手の誕生月")

ピークちょうど4月ではありませんでした. 最も多いのは8月です.
ただし形は予想と合っています. 4月から7月が揃って高く, 1月から3月が低い. とくに3月は指数75で, 最大の月の58%しかありません.
日本の学年は4月2日から翌年4月1日までなので, 3月生まれは学年でいちばん年下です. そこが最も少ないというのは, 相対年齢効果の予測どおりです.
4月ではなく8月がピークになった理由は, このデータからは分かりません. 1,068人なので月あたり89人ほどしかなく, 4月 (121) と 8月 (129) の差はこの規模のばらつきに埋もれます.
4月2日を起点にして, 学年の中で何番目の月かで並べ直します.
idx |>
mutate(学年内の月順 = (月 - 4) %% 12) |>
ggplot(aes(x = 学年内の月順, y = 指数)) +
geom_col(fill = "grey60") +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, colour = "tomato") +
geom_hline(yintercept = 100, linetype = "dashed") +
scale_x_continuous(breaks = 0:11,
labels = c("4月", "5月", "6月", "7月", "8月", "9月",
"10月", "11月", "12月", "1月", "2月", "3月")) +
xlab("学年の区切り(4月2日)からの月数") + ylab("指数") +
ggtitle("学年内で年上なほど多い")

fit <- lm(指数 ~ I((月 - 4) %% 12), data = idx)
summary(fit)$coefficients |> round(3)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 127.362 5.647 22.555 0
## I((月 - 4)%%12) -4.975 0.870 -5.721 0
学年の中で1か月遅く生まれるごとに指数が5.0下がります.
chisq.test(idx$人数, p = days_in_month / sum(days_in_month))
##
## Chi-squared test for given probabilities
##
## data: idx$人数
## X-squared = 41.081, df = 11, p-value = 2.334e-05
「日数に比例して一様」とは言えません.
月ごとの指数は89人程度で計算しているので, どの月がピークかは標本を変えると簡単に入れ替わります. 学年の前半 (4-9月) と後半 (10-3月) に分けた比率のほうが安定します.
first <- sum(idx$人数[4:9])
second <- sum(idx$人数[c(10:12, 1:3)])
expected_first <- sum(days_in_month[4:9]) / sum(days_in_month)
prop.test(first, first + second, p = expected_first)
##
## 1-sample proportions test with continuity correction
##
## data: first out of first + second, null probability expected_first
## X-squared = 34.808, df = 1, p-value = 3.639e-09
## alternative hypothesis: true p is not equal to 0.5010267
## 95 percent confidence interval:
## 0.5615331 0.6213193
## sample estimates:
## p
## 0.5917603
日数どおりなら50.1%のはずが, 実際は59.2%でした.
この記事はもともと2009-2014年の名鑑1,549人ぶんで書いていました. そのときの前半比率は59.0%で, 今回の59.2%と ほぼ一致します. データを取り直しても同じ数字が出る一方, ピークの月は6月から8月へ動きました. どちらを結論として書くべきかが はっきりします.
| 学年の区切り | 最も多い月 | 最も少ない月 | 最大/最小 | |
|---|---|---|---|---|
| 日本のプロ野球 | 4月2日 | 8月 | 3月 | 1.72 |
| メジャーリーグ (米国生まれ) | 7月31日 | 8月 | 6月 | 1.30 |
どちらも「学年でいちばん年下になる月」が最も少なくなっています. 日本は3月, 米国は7月です. 区切りが違えば谷の位置もずれる, という形で相対年齢効果が確認できました.
最も多い月のほうは, 米国では区切り直後の8月がきれいに立っていますが, 日本では4月ちょうどではありません. 人数が少ないぶん揺れているのだと思います.
偏りの大きさは日本のほうが目立ちます (1.72倍 対 1.30倍). ただし日本のデータは1,068人と少なく, この比自体もかなりばらつきます. 「日本のほうが強い」と言い切るには足りません.