須通り
Sudo Masaaki official site
For the reinstatement of
population ecology.

枠内はR(統計ソフト)での計算手順なので、専門家以外は読み飛ばせばOKです。

     

ホーム | 統計 Top | (応用)全日本吹奏楽コンクールの新審査内規に基づく金賞比率の前後半差異を、Rを用いたモンテカルロ法で予測する

目次

導入:吹奏楽コンクールの審査内規改定について

以下が、新しい審査内規の議案である。

全日本吹奏楽連盟会報「すいそうがく」194号より

///////////ここから引用(著作権法第32条に基づく研究目的での引用)

第3号議案
2013年度全国大会審査の件

(1) 全日本吹奏楽コンクール・アンサンブルコンテスト・小学校バンドフェスティバル・マーチングコンテストの審査内規改定に伴い、審査員に付けてもらう「A・B・C」の個数について、下記Iの改訂内容を確認の上、IIのとおりに定める。

I. 審査内規の改定の確認

1. すべての事業の審査は総合的に評価し「A(金)・B(銀)・C(銅)」の3段階で行う。「A・B・C」の個数については審査説明会で示し、審査員に厳守してもらう。なお、点数化は行なわない。

2. 賞は、審査員の過半数以上がA評価...金賞
                 過半数以上がC評価...銅賞
                          それ以外...銀賞

3. 審査結果が次の場合も認める。
・ある賞が、「ゼロおよび1」となった場合。
・部門および前後半での「賞の数がアンバランス」となった場合。


II. 上記を受けて、審査員に付けてもらう各事業のA・B・Cの個数は次のとおりとする。

原則 
3で割り切れる団体数の場合は、A・B・C同数とする。
3で割った場合に端数が1出る場合は、Aを+1とする。
3で割った場合に端数が2出る場合は、AとBを各+1とする。

(例)コンクール中学・高校の部
前半の部は15団体なので、A:B:Cは5:5:5
後半の部は14団体なので、A:B:Cは5:5:4

//////////  ここまで引用

実のところ現行の(古い)審査内規や、改定に至る議論の経緯について、著者は詳しく知らない。だがここで問題としたいのは、本制度の下では前半と後半とで、金賞受賞率が有意に変化するのではないか?という疑問である。というのも、全国大会において後半は前半よりもC評価が1つ少ないから、そもそも銅賞になるリスクが低いはずなのだ。

これは今のところ直感的な疑問であるが、統計学的に示すことは可能だろうか。本項では、Rを用いた簡単なモンテカルロ・シミュレーションを組み、上記の審査内規に基づく金賞・銀賞・銅賞の比率を、前後半について予想してみる。
その際、審査過程に潜む不確実性を考慮する。すなわち、出場団体が潜在的に有している「真の実力」が、各審査員によって完璧に審査(序列化)されるのではなく、ここに多少のランダム性が介在するものと考える。

アルゴリズム

各出場団体の「実力」を「(評価)順位」に変換する処理

たとえば各団体(前半15団体、後半14団体)が「真の実力値」を有しており、これらが平均0、標準偏差1の正規分布に従うものと定義する。

このとき、前後半それぞれの団体の真の実力値を、以下のように得ることができる。
ただし、出場団体の前後半割当および、その中での出演順は予めランダムに割り振られているものとする。

realpoint.am <- rnorm( 15, mean = 0, sd=1 )
realpoint.pm <- rnorm( 14, mean = 0, sd=1 )

ここで得られたrealpoint.amおよびrealpoint.pmは、それぞれ前半15団体および後半14団体の「真の実力値」を、擬似乱数を用いて生成し、出場順に繋いだベクトルデータとしたもの。

さらに、「評価の不確実性」を加味する。方法としては「真の実力値(上で求めたrealpoint)」に、「審査過程での不確実性を表すパラメータ(以下で説明:これも正規分布に従う乱数とする)」を足し合わせる。

(原理)平均0、標準偏差xの正規分布に従って、各団体の実力がランダムに、審査員によってoverestimate(ないしunderestimate)される。

このとき変数xで定義されている正規分布の標準偏差が、評価の不確実性の強さを表す。
各団体の真の実力値を審査員が完璧に計れるなら、標準偏差はゼロにできるだろうし、非常に評価が割れやすいならば標準偏差は大きな値を取るだろう(つまり審査結果は完全なランダムに近くなる)。

estimated.am <- realpoint.am + rnorm(15, mean=0, sd=x)
estimated.pm <- realpoint.pm + rnorm(14, mean=0, sd=x)

このestimated.amないしestimated.pmが、不確実性の加味された審査結果である。これを、数値が大きい順ないし小さい順に1から15(14)まで番号を割り振ることにより、各団体の「順位」に換算できる。

rank.am <- rank(estimated.am) 
rank.ap <- rank(estimated.pm) 

##なおRのrank()関数の定義により、値が小さいほうから順に順位が付けられる。実用上は逆でも一向に構わないけど。

各団体の「順位」から「ABC評定」への変換

このとき、各審査員が付けるであろうABC評定は、各団体の順位に応じて割り振りを行えば良い。

たとえば、中学ないし高校の部では審査員は9人いる。各審査員は順位に応じて、自分が持っている規定数のABCを各演奏団体に配分し、この集計結果に応じて賞が決定する。上下カットについては新しい内規の案に記載がないため、行われないものと仮定する。

(各審査員が付ける評価)
午前だとrankが1–5でC、6–10でB、11–15でAとなる。
午後だとrankが1–4でC、5–9でB、10–14でAとなる。

このABC評定処理を、以下のようにRの関数として定義しておく。

#午前の部
gozen <- function (x) { 
  if ( x <= 5 ) { 
    return( as.character("C") ) } else if ( x <= 10 ) {
    return( as.character("B") ) } else { return( as.character("A") ) }
  }

#午後の部
gogo <- function (x) { 
  if ( x <= 4 ) { 
    x <- as.character("C") } else if ( x <= 9 ) {
    x <- as.character("B") } else { x <- as.character("A") }
  }

ABC評定から賞を決定する処理

2. 賞は、審査員の過半数以上がA評価...金賞
                 過半数以上がC評価...銅賞
                          それ以外...銀賞

#これも関数として定義しておく

hantei <- function (x) {
  if ( length( grep("A", x ) ) * 2 > length(x) ) {
    return( as.character("gold") ) } else if  ( length( grep("C", x ) ) * 2 > length(x) ) {
    return( as.character("copper") ) } else { return( as.character("silver") ) }
}

ただし、「過半数」を「より多い」と解釈。幸い審査員は奇数なので問題ないのだが、もし欠席等で偶数になった場合を危惧すると、この内規は曖昧である。

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

ここまで説明してきた手順を繋いでみよう。以下のコードでシミュレーションを実行できる。なお、すぐ上にある gozen, gogo, hantei の3つの関数を予め定義しておくこと。追加パッケージは必要ないはず。

※以下の手順をコピペすればRでシミュレーションを実行できますが、計算に時間が掛かります。具体的には2.5 GHz Core i5搭載のマシンで20~30秒程度を要します。

# x=0 , 繰り返し回数10000として

#
x = 0
replicate <- 10000
awardset.gozen <- matrix( rep(NA, 15*replicate), nrow =replicate, byrow=T  )
awardset.gogo <- matrix( rep(NA, 14*replicate), nrow =replicate, byrow=T  )
#
for ( p in 1:replicate ) {
#午前
realpoint.am <- rnorm( 15, mean = 0, sd=1 )
mat.am <- matrix( rep(realpoint.am, 9), nrow =9, byrow=T )
estimated.am <- mat.am + matrix( rnorm( 15*9, mean = 0, sd = x ), nrow=9, byrow=T )
rank.am <- apply( estimated.am, MARGIN=1, rank ) 
#賞を判定
abc.am <- apply( rank.am, MARGIN = c(1,2), gozen )
award.am <- apply( abc.am, MARGIN =1, hantei )
awardset.gozen[p,] <- award.am
#
#午後
realpoint.pm <- rnorm( 14, mean = 0, sd=1 )
mat.pm <- matrix( rep(realpoint.pm, 9), nrow =9, byrow=T )
estimated.pm <- mat.pm + matrix( rnorm( 14*9, mean = 0, sd = x ), nrow=9, byrow=T )
rank.pm <- apply( estimated.pm, MARGIN=1, rank ) 
abc.pm <- apply( rank.pm, MARGIN = c(1,2), gogo )
#賞を判定
abc.pm <- apply( rank.pm, MARGIN = c(1,2), gogo )
award.pm <- apply( abc.pm, MARGIN =1, hantei )
awardset.gogo[p,] <- award.pm
}
##ここまで繰り返し

##午前の部における金賞、銀賞、銅賞の数と賞の総数
c( length(grep("gold",awardset.gozen)) , length(grep("silver",awardset.gozen)) , length(grep("copper",awardset.gozen)) , length( awardset.gozen) )

##午後の部における金賞、銀賞、銅賞の数と賞の総数
c( length(grep("gold",awardset.gogo)) , length(grep("silver",awardset.gogo)) , length(grep("copper",awardset.gogo)) , length( awardset.gogo) )

シミュレーション本番

さっそく、繰り返し回数10000回としてシミュレーションを回す。つまり、この審査内規に従って吹奏楽コンクールを1万年間やり続けた結果ですね。

シミュレーション 1(審査の不確実性がゼロのとき)

まず審査の不確実性がゼロ、つまり真の実力がそのまま、前後半それぞれの出場団体の評価順位に反映される場合をシミュレートする。

(手順は上記)
結果

> c( length(grep("gold",awardset.gozen)) , length(grep("silver",awardset.gozen)) , length(grep("copper",awardset.gozen)) , length( awardset.gozen) )
[1]  50000  50000  50000 150000
> 
> c( length(grep("gold",awardset.gogo)) , length(grep("silver",awardset.gogo)) , length(grep("copper",awardset.gogo)) , length( awardset.gogo) )
[1]  50000  50000  40000 140000

つまり、審査の不確実性がゼロのとき、金銀銅の比率は
午前( 33.3%, 33.3%, 33.3% )
午後( 35.7%, 35.7%, 28.6% )

シミュレーション 2(審査に若干の不確実性があるとき)

次に x=0.1 , 繰り返し回数10000として

(手順省略)
結果

> c( length(grep("gold",awardset.gozen)) , length(grep("silver",awardset.gozen)) , length(grep("copper",awardset.gozen)) , length( awardset.gozen) )
[1]  49797  50393  49810 150000
>
> c( length(grep("gold",awardset.gogo)) , length(grep("silver",awardset.gogo)) , length(grep("copper",awardset.gogo)) , length( awardset.gogo) )
[1]  49866  50288  39846 140000

つまり、審査に若干の不確実性があるとき、金銀銅の比率は
午前( 33.2%, 33.6%, 33.2% )
午後( 35.6%, 35.9%, 28.5% )

シミュレーション 3(審査にある程度の不確実性があるとき)

さらに x=1 , 繰り返し回数10000として

(手順省略)
結果

> c( length(grep("gold",awardset.gozen)) , length(grep("silver",awardset.gozen)) , length(grep("copper",awardset.gozen)) , length( awardset.gozen) )
[1]  42584  64808  42608 150000
> 
> c( length(grep("gold",awardset.gogo)) , length(grep("silver",awardset.gogo)) , length(grep("copper",awardset.gogo)) , length( awardset.gogo) )
[1]  43873  64515  31612 140000

つまり、審査にある程度の不確実性があるとき、金銀銅の比率は
午前( 28.4%, 43.2%, 28.4% )
午後( 31.3%, 46.1%, 22.6% )

シミュレーション 4(審査に大きな不確実性があるとき)

最後に x=10 , 繰り返し回数10000としたときの結果を示す。これは、審査過程で生じるばらつきが、各団体の実力のばらつきの10倍も大きい状態であり、すなわち審査員がアトランダムにABCを付けているような場合を意味する。

(手順省略)
結果

> c( length(grep("gold",awardset.gozen)) , length(grep("silver",awardset.gozen)) , length(grep("copper",awardset.gozen)) , length( awardset.gozen) )
[1]  22661 104512  22827 150000
> 
> c( length(grep("gold",awardset.gogo)) , length(grep("silver",awardset.gogo)) , length(grep("copper",awardset.gogo)) , length( awardset.gogo) )
[1]  26509 101220  12271 140000

つまり、審査に大きな不確実性があるとき、金銀銅の比率は
午前( 15.1%, 70.0%, 15.2% )
午後( 18.9%, 72.3%, 8.77% )

シミュレーション結果の解釈

  • 午前の部では金賞と銅賞の比率は同じである。
  • 午後の部では金賞のほうが銅賞よりも出やすくなる。具体的には、金賞が全体に占める割合は、銅賞が全体に占める割合よりも10%ほど高くなる。
  • 審査に不確実性がなく、審査員が完璧に団体の序列を反映した評価を行った場合には、銀賞比率が全体のおよそ3分の1となり、金賞と同比率である。
  • 審査の不確実性が増し、審査員間での評価が割れるほど、金賞および銅賞受賞率が低くなり、銀賞が増える。

結論

金賞を取りたければ、(少なくとも審査方法だけを考えると)後半出場団体が有利である。銅賞回避の観点からは、後半出場団体がさらに有利である。