シミュレーションによる二チーム間の勝負

MikuHatsune2011-01-10

野球の続き。
今まで推移行列漸化式を使って、打者にある打撃確率を与えたらk点を確率的に何点取る、というのをやってきた。
ただ、これでは1チーム中に複数の打者がいるときの得点が出せない。いまのところいいやり方が思いついていないし。
例えば9人チームなら、あるイニングの先頭打者は9通りあって、その9通り考えたときの1イニングの得点の平均を、1イニングあたりに取りうる得点にしてしまう?
ただそれだと、1イニング3アウトで計9イニング試合として、先頭打者になる確率は9人一緒なの?
的な感じがしたのでちょっと保留。
まあ、初心に戻って(?)、シミュレーションでデータを生成しよう。
ルールとしては
・1チーム9人
・game回(ここでは1000回としておく)1チームだけでシミュレーションして、データを格納しておく
・Noutは3にしておこう
・格納したデータの1項目、2項目、…、game項目と比較する
・勝ち、分け、負けをカウントする
1試合の得点シミュレーションはこのリンクから。
リンクの下のほうに阪神のデータを入力してあった。これ使おう。

game<- 1000
D1<- rep(0,game)
D2<- rep(0,game)
batter<- matrix(c(0.7,0.1,0.1,0.05,0.05),9,5,byrow=T)
#batter<- matrix(c(colMeans(Tigars)),9,5,byrow=T)
for(i in 1:game){
  D1[i]<- one.game.score(batter,3)
}
library(MCMCpack)
#r<- rdirichlet(1,c(1,1,1,1))*0.3
#r
#batter<- matrix(c(0.7,r),9,5,byrow=T)
batter<- Tigars
for(i in 1:game){
  D2[i]<- one.game.score(batter,3)
}

par(mfcol=c(1,2))
hist(D1,breaks=0:max(D1),col=5,freq=F)
hist(D2,breaks=0:max(D2),col=5,freq=F)

勝分負の数値を手に入れたとして、どう評価しよう〜と思って、とりあえず勝敗の差を試合数(引き分けを除く)で割ってみようかと。
5%超えていたら勝ちやすい(負けやすい)傾向にある、とかにしてみようか。

wdl<- c(sum(D1>D2),sum(D1==D2),sum(D1<D2))
wdl<- c(wdl,(wdl[1]-wdl[3])/(game-wdl[2]))
names(wdl)<- c("win","draw","lose","win.prob")
wdl

で、何が勝敗を分けたか、的なものを、ここらあたりの数値で評価…できるのかなあ?

library(e1071)
analy<- function(vec){
  DATA<- rep(0,5)
  DATA[1]<- mean(vec)
  DATA[2]<- sd(vec)
  DATA[3]<- median(vec)
  DATA[4]<- skewness(vec)
  DATA[5]<- kurtosis(vec)
  names(DATA)<- c("mean","sd","median","skewness","kurtosis")
  return(DATA)
}
analy(D1)
analy(D2)

いろいろ用意したところで、プログラム実行。
D1は、みんな打撃確率が0.7,0.1,0.1,0.05,0.05(初項からアウト、シングル、…)
D2は、2010年終了時の阪神

wdl
win  draw  lose    win.prob 
691    75   234   0.4940541 
analy(D1)
     mean        sd     median  skewness  kurtosis 
5.4990000 3.3312304  5.0000000 0.7260805 0.5107385 
analy(D2)
     mean        sd     median  skewness  kurtosis 
 3.024000 2.545172    3.000000  1.075492  1.488678


数回遊んでみたが、たぶんmedianが重要そう…
続きは試験後。