どのイニングに誰が先頭打者になりやすいか

MikuHatsune2011-01-21

野球の続き。チームの人数を複数にしたとき、誰が先頭打者になって、そこから何人が打席に立つかで、1イニングに取る得点が変わるだろう、ということを考えた。
この日は、全イニングの平均を出したので、1番バッターが多いのは当たり前だね。
シミュレーション的に、各イニングで誰が先頭打者になっているか、1000000回試行してみよう。

#team<- rdirichlet(people,c(5,rep(1,Nbase)))
team<- matrix(c(1/2,rep(1/8,Nbase)),nr=people,nc=5,byrow=T)
hitp<- 1-colMeans(team)[1]
Vnum<- 100   
cut<- 0.99
Ninning<- 50
people<- 9
A<- rep(0,Vnum)
for(v in 1:Vnum){
  A[v]<- choose((v-1),(Nout-1))*(hitp)^(v-Nout)*(1-hitp)^(Nout-1)*(1-hitp)
}
bboxesprob<- head(A,min(which(cumsum(A)>cut)))/
             sum(head(A,min(which(cumsum(A)>cut))))
cut.off<- min(which(cumsum(A)>cut))
cut.off
Nbatter<- cut.off
countfunc<- function(vec){
  count1to.<- rep(0,people)
  for(result in 1:people){
    count1to.[result]<- length(which(vec==result))
  }
  return(count1to.)
}
N<- 10000
counter1<- matrix(0,N,Ninning)
dimnames(counter1)<- list(1:N,1:Ninning)
names(dimnames(counter1))<- c("cycles","Inning")
Bnum<- rep(1:people,Ninning*min(which(cumsum(A)>cut)))
for(I in 1:N){
  k<- sample(c(1:length(bboxesprob)),prob=bboxesprob,size=Ninning-1,replace=TRUE)
  counter1[I,]<- Bnum[c(1,cumsum(k)+1)]
}
Zz<- apply(counter1,2,countfunc)
Z<- Zz/N
Z

Zの行は打者順、列はイニング数を表わしている。要素は確率。
Zzは生データ。
ここから、先頭打者のなりやすさに違いがあるか、χ自乗検定を使ってみたい。
よくあるサイコロ問題で、問題のサイコロが精密にできているかな、というやつ。
オレみたいな暇人が、600回もサイコロを独りさみしく振ったらしい。
精密にサイコロが作られているとしたら、全部100回ずつ出る…んじゃないかな?
\begin{matrix}&1&2&3&4&5&6\\Observed&92&98&105&103&101&101\\Expected&100&100&100&100&100&100\end{matrix}
これらが、100回(確率100/600)に近いか、遠いか、的な。
計算はwikiの通り分散的なやり方でできて、これをχ自乗分布と有意水準との比較で、有意差があるかどうかみる。
これをするのに、chisq.testという関数があるようだ。
調べたいベクトルx
確率p
に対してχ自乗検定を行う。

x<- c(92,98,105,103,101,101)
p<- rep(100,6)
chisq.test(x,p=p)
以下にエラー chisq.test(x, p = p) :  確率の総和は 1 でなければなりません。

確率を指定しないとダ〜メ。

chisq.test(x,p=p,rescale.p=TRUE)   # p=p/sum(p) も可。

        Chi-squared test for given probabilities

data:  x 
X-squared = 1.04, df = 5, p-value = 0.9593

これらはようわからんので後で見ておく。ここで欲しいのはp値。

chisq.test(x,p=p,rescale.p=TRUE)[3]   # p=p/sum(p) も可。
$p.value
[1] 0.9592754

とすると、p値だけ取ってこれる。形式はlist。
p値はかなり1に近い。相等精密に作られているっぽいよ。
独りさみしくサイコロを延々と振った甲斐があったね。
 
さ、やり方がわかったところで
どのイニングから、等確率で先頭打者になりやすそうかな。

p<- rep(1/people,people)
p.value<- rep(0,Ninning)
for(r in 1:Ninning){
  p.value[r]<- chisq.test(Zz[,r],p=p)[3]  # pは確率でなくて頻度でもいい。
}                                           # そのときはrescale.p=TRUEを指定。
p.value<- unlist(p.value)
p.value

有意水準を0.001とかにしてみると

which(p.value<0.001)
[1] 1 2 3 4 5 6

6番目のイニングまでは、先頭打者になる確率は9人で等確率ではないようだ。
プロットしとくよ。

par(mfcol=c(1,3))
persp(Z,col=5,
      xlab="Batter.No",ylab="Inning.No",zlab="First batter probability",
      phi=20,theta=60)
plot(apply(Z,1,mean),type="o",xaxt="n",lwd=2,frame=F,
     xlab="No",ylab="First batter probability")
axis(1,1:people)
abline(h=1/people) 
plot(p.value,type="o",frame=F,ylim=c(0,1),xaxt="n",
     xlab="Ninning.No",ylab="p-value")
axis(1,1:Ninning)
axis(2)