読者です 読者をやめる 読者になる 読者になる

生物物理計算化学者の雛

主に科学に関する諸々を書き留めています。

15打席連続出塁を達成する確率をシミュレートしてみた

R

4/26の広島―中日戦で広島の廣瀬純選手15打席連続出塁の日本記録更新を行いました。
http://blog.livedoor.jp/yakiusoku/archives/53936692.html

この記録がどの程度達成困難な偉業であるかを統計解析プログラム「R」によってシミュレートして確認してみました。

シミュレートに用いたRのソースコードはこの記事の最後に書いておきます。

全盛期のバリー・ボンズなら8年に1度、全盛期の落合博光なら164年に1度、去年の阿部慎之助なら1000年に1度

Rによるシミュレーションを以下の条件で行いました。

  • シーズン打席数 600
  • 全打席の出塁判定は、入力パラメータとして与える出塁率で固定
    • 相手ピッチャーによる出塁率変化は考えない

入力する出塁率のパラメータとして

メジャーリーグのシーズン記録 2004年 バリーボンズ 0.609
日本プロ野球のシーズン記録 1986年 落合博光 0.487
去年の日本プロ野球の最高出塁率 2012年 阿部慎之助 0.429

を使いました。
(引用元:wikipedia出塁率

結果を以下に示します。

> simulateConsecutiveOnBase(100000, 600, 0.609, 15)
出塁率 60.90%、打席数 600 のシーズンで 15 打席以上連続出塁を達成する確率は 12.70% 
> simulateConsecutiveOnBase(100000, 600, 0.487, 15)
出塁率 48.70%、打席数 600 のシーズンで 15 打席以上連続出塁を達成する確率は 0.61% 
> simulateConsecutiveOnBase(100000, 600, 0.429, 15)
出塁率 42.90%、打席数 600 のシーズンで 15 打席以上連続出塁を達成する確率は 0.10% 
バッター 出塁率 15打席連続出塁達成率 何年に一度
2004年 バリーボンズ 0.609 12.70% 7.9年に一度
1986年 落合博光 0.487 0.61% 163.9年に一度
2012年 阿部慎之助 0.429 0.10% 1000年に一度

(何年に一度であるのかは連続出塁達成率の逆数として簡略に見積もった)

化け物のような出塁率0.609を達成したバリー・ボンズであっても、15打席連続出塁を達成できるのは8年に一度です。
落合博光の日本記録0.487であっても164年に一度、去年の阿部慎之助の最高出塁率0.429では1000年に一度となってしまいます。

いかに廣瀬選手の記録達成が困難な偉業であるのかがわかります。


全盛期の落合博光のシーズン最大連続出塁数の分布


Rのシミュレーションソースコード

以下のソースコードをRにコピーペーストすればシミュレーションを実行できます。

シミュレーションの試行回数は10万回となっており、シミュレーション実行に数分かかります。
マシンが遅い人は試行回数を減らして実行してください。

# {0,1}のリスト(list)を受け取って1が最大何回連続して出現したのかを得る
getMaxConsecutive <- function(list){
  consecutive <- 0
  maxConsecutive <- 0
  for (i in 1:length(list) ) {
    if(list[i] == 1){
      consecutive <- consecutive + 1
    } else {
      if(maxConsecutive < consecutive){
        maxConsecutive <- consecutive
      }
      consecutive <- 0
    } 
  }
  if(maxConsecutive < consecutive){
    maxConsecutive <- consecutive
  }
  return(maxConsecutive)
}

# シーズン打席数(PANum)、出塁率(onBasePercentage)からシーズン最大連続出塁数を得る
getSeasonConsecutive <- function(PANum, onBasePercentage){
  # sampleコマンドにより0,1の乱数列を得る(Rクックブック p.122参照)
  onBaseList <- sample(c(1,0), PANum , replace=TRUE, prob=c(onBasePercentage, 1-onBasePercentage))
  return(getMaxConsecutive(onBaseList))
}

# 配列 list に対し、threshold 以上の引数に対する和を得る
sumMoreThanOrEqual <- function(list, threshold){
  sum <- 0
  for(i in threshold:length(list)){
    sum <- sum + list[i]
  }
  return(sum)
}

# 連続出塁シミュレーションを実行する
#   sampleNum        : シミュレーションの施行回数(何シーズンのシミュレートを行うか)
#   PAPerYear        : シーズン打席数(PA = 打席数の英語 plate appearances, PA)
#   onBasePercentage : 出塁率
#   threshold        : 何打席以上連続出塁の確率を計算するか
simulateConsecutiveOnBase <- function(sampleNum, PAPerYear, onBasePercentage, threshold){
  # サイズsampleNumの配列を用意
  consecutiveList  <- 1:sampleNum
  for(i in 1:sampleNum){
    consecutiveList[i] <- getSeasonConsecutive(PAPerYear, onBasePercentage)
  }
  # ヒストグラムの作成
  h = hist(consecutiveList, breaks=0:max(consecutiveList))
  # threshold以上の連続出塁の確率を計算
  achieve15Percent <- sumMoreThanOrEqual(h$counts, threshold) / sampleNum
  cat( sprintf("出塁率 %.2f%%、打席数 %d のシーズンで %d 打席以上連続出塁を達成する確率は %.2f%% \n", 
               onBasePercentage*100, PAPerYear, threshold, achieve15Percent*100) ) 
}

simulateConsecutiveOnBase(100000, 600, 0.609, 15)

simulateConsecutiveOnBase(100000, 600, 0.487, 15)

simulateConsecutiveOnBase(100000, 600, 0.429, 15)

Rクックブック

Rクックブック

采配

采配