論理の流刑地

地獄の底を、爆笑しながら闊歩する

グラぽで掲載されていた出場時間集中係数の計算プログラム&分析結果再現をこころみる

仕事に疲れたので、休憩用に遊んでいたものをそのまま記事にするだけのやつ*1
車輪の再発明ってやつですね。

Motivation:コナカ先生の知的な試み

先日、グラぽでとても興味深い記事が出ていた。
grapo.net

出場時間がどれだけ特定の選手に集中しているのかを指標化していて、非常に面白い試みであった。

元ネタはジニ係数とのことであるので、結果の再現や計算プログラムは簡単に作れるのではないかと考えた。


また、以下のTwitterのように、計算方法が分からないとつぶやいているかたもおられた。

そこで、小中先生は(本人もおっしゃっている通り紙幅の都合上で)計算方法は直接語っていないので、計算プログラムや計算結果を再現できないか考えてみる。

ジニ係数(オリジナル)の計算方法について

ジニ係数の計算の方法は色々あるが、スマート*2なのは、Jacques Silberが紹介しているG-Matrixを用いた方法である。
G-Matirxとは、対角成分が0, 非対角成分の右上部分が1, 非対角成分の左下部分が-1の正方行列である。

ジニ係数を計算するには、所得シェアを昇順にならべたベクトルをI 、対応する人数シェアをPとし、G-MatrixをGとすると
Gini= P' GI
という計算を行えばよい('は転置)。

それ自体は、以下のような簡単なプログラムで実装できる。

#Gini係数の計算
gini_calc <- function(x){
  x_s <- sort(x) 
  p <-  rep( 1, length(x_s)) / length(x_s)#人数シェア
  incm <- x_s / sum(x_s) #所得シェア
  g_mat <- make_gmat(length(x)) #G-Matrix
  g_index <- t(matrix( p)) %*% g_mat %*% (matrix( incm))
  return(g_index)
} #
#G-matrixの作成関数
make_gmat <- function(n){
  n_mat <- matrix( 0 , nrow=n , ncol=n)
  n_mat[col(n_mat) > row(n_mat)] <- 1
  n_mat[col(n_mat) < row(n_mat)] <- -1
  return(n_mat)
} #G-Matrix

集中係数へのアレンジ

さて、件の指標はもちろんジニ係数に着想を得ただけであって、そのものではない。
なぜなら不平等指標としてのジニ係数の完全不平等状態は「1人」が金や資産を独占した場合を想定しているが
サッカーにおける独占は「11人」がフル出場している場合だからだ。

そのため、1人が独占している場合でなく11人が独占している場合を完全不平等状態=1としなければならない

よって、出場時間を元にジニ係数の計算式を適用して出た数値を、11人が独占した場合のジニ係数で除するという補正を行っているのではないかと推測した。

そのようなアレンジ(推定)を加えて、以下のような関数をつくる

gini_konaka <- function(x){
  #30人に足りない場合は30人にする 
  add_n <- 30- length( x)
  x <- c( x , rep( 0, add_n))
  #11人による独占状態のベクトルをつくる
  total_min <- sum(x)
  dokusen_min <- c( rep(0,19), rep(total_min/11 , 11))
  
  #独占状態のGiniを計算する
  dokusen_gini <- gini_calc(dokusen_min)
  club_gini <- gini_calc(x)
  return(round( as.numeric( club_gini/dokusen_gini) ,3))
}

再現できたかの検証

さて、グラポに掲載されていた出場時間集中係数は、名古屋=0.891, 川崎=0.763であった。

手元のデータ(取得方法は過去記事参照)から、10/15時点までの名古屋や川崎のデータをとってくる。

f:id:ronri_rukeichi:20201022225210p:plain
川崎の出場時間データ(10/15時点)

試した結果は以下の通りである。無事グラぽの記事の値と一致している。

f:id:ronri_rukeichi:20201022225358p:plain
自作関数による集中係数の計算結果

アレンジに関する推定も正しかったようだ。
小中係数は、出場時間を元にジニ係数の計算式を適用して出た数値を、11人が独占した場合のジニ係数で除することによって求められていたようだ。

めでたし、めでたし。

Enjoy!!

追記:Excelでやるには

この記事を書いたあと、上で引用させていただいたTWUさんから直接Feedbackをいただいた。

冷静に考えて、いや確かにこれ読んでも分かる人にしか分からんし不親切かもしれないと思ったのでExcelでやる方法を追記する。
TWUさんの例(おそらく8人制の少年サッカー?)をもとに解説する。

24分×8人×3試合=576分をどう15人に分配するか?という状況を考えよう。
仮想的に、15人の出場時間が、降順に72分×3、58分、55分、52分、51分、32分、31分、20分、15分、14分、13分、10分、9分である状況を考える

Step1:実際の出場時間(降順)と極限集中状態の出場時間を横に並べて記載する

f:id:ronri_rukeichi:20201023060005p:plain
実出場時間と、完全独占の場合(仮想)の出場時間

まず上の画像のように、実際の出場時間(一行目)と完全独占を仮定した場合の出場時間(二行目)をExcelに書き込んでいく
ここではExcelのF列を左端とし、2行目を見出し、3行目を実際の出場時間、4行目を独占状態の場合の出場時間としている。

Step2:G-Matrixを作成する。

f:id:ronri_rukeichi:20201023061913p:plain
G-Matrix@Excel

次に、上の画像のようにG-Matrixを作成する。

このとき、行列の一番左上がちょうどシートの対角線上にくるようにする(上の画像だとF列6行目)と、
以下のような数式を書いてコピペするだけでG-Matrixができる

f:id:ronri_rukeichi:20201023060907p:plain

Step3:行列計算をおこなって集中係数を算出。

実はExcelではmmult()関数を使って行列計算ができる(自分も今初めて知りました)。
これを使うと、非常に簡単に行列計算ができるので、それを使って小中係数を計算する

まず、さきほど書いたG-Matrixの下側で同じ列数だけセルを選択する

f:id:ronri_rukeichi:20201023063129p:plain
(画像の下側、緑のワクのところ)


次に、数式バーに=MMULT( 実際の選手の出場時間を書いた範囲、G-Matrixの範囲)を入力する

f:id:ronri_rukeichi:20201023063352p:plain
入力する数式
f:id:ronri_rukeichi:20201023065139p:plain
数式詳細

数式が入力できたら、(Enterではなく)Ctrlキー+Shiftキー+Enterキーを押下すると、選択した範囲に行列の計算結果が反映されている。

f:id:ronri_rukeichi:20201023063737p:plain

そして、完全独占状態についても同じように行列計算を行う(Ctrl + Shift + Enterキーの同時押しを忘れずに)

f:id:ronri_rukeichi:20201023063928p:plain

すると、以下のように完全状態についての行列計算の結果が出力される
f:id:ronri_rukeichi:20201023064132p:plain

あとは、(一行目の和)/(二行目の和)を計算すると小中係数になっている*3

f:id:ronri_rukeichi:20201023064624p:plain

f:id:ronri_rukeichi:20201023064658p:plain


今回の仮想ケースの場合は、0.738095が小中係数であるようだ。川崎フロンターレよりもさらに出場機会がバラけている。


以上、Excelでも小中係数を計算する方法を示した。

Enjoy!

*1:こういう遊びに走るから仕事ができない

*2:というか他の分離指標などとも結び付きがあって美しい

*3:実は上述のGini-Indexの計算方法から割愛してもよい部分を抜いているが、そこまでは説明しない