仕事に疲れたので、休憩用に遊んでいたものをそのまま記事にするだけのやつ*1
車輪の再発明ってやつですね。
Motivation:コナカ先生の知的な試み
先日、グラぽでとても興味深い記事が出ていた。
grapo.net
出場時間がどれだけ特定の選手に集中しているのかを指標化していて、非常に面白い試みであった。
記事が長くなると思って入れませんでしたが,「出場時間集中係数」の元ネタはジニ係数です.サッカー固有の「最も資源が集中している状況」をアレンジして作りました.https://t.co/BJetyw36y0
— konakalab (小中研究室/名城大) (@konakalab) 2020年10月16日
元ネタはジニ係数とのことであるので、結果の再現や計算プログラムは簡単に作れるのではないかと考えた。
また、以下のTwitterのように、計算方法が分からないとつぶやいているかたもおられた。
記事の考え方で、先日の大会でのうちのチームの状況を整理してみた。
— TWU🌈⚽️ (@TWU20180401) 2020年10月22日
24分×8人×3試合=576分の各選手への配分状況。
超文系脳&直感型なので、出場時間集中係数の出し方がどーしてもわからんちんですが笑
選手たちにはたくさん試合に出てもらいたいので、できるだけ青のグラフに近づけてあげたいですね😊 https://t.co/AO5W4G7P3K pic.twitter.com/N6NZvvv18O
そこで、小中先生は(本人もおっしゃっている通り紙幅の都合上で)計算方法は直接語っていないので、計算プログラムや計算結果を再現できないか考えてみる。
ジニ係数(オリジナル)の計算方法について
ジニ係数の計算の方法は色々あるが、スマート*2なのは、Jacques Silberが紹介しているG-Matrixを用いた方法である。
G-Matirxとは、対角成分が0, 非対角成分の右上部分が1, 非対角成分の左下部分が-1の正方行列である。
ジニ係数を計算するには、所得シェアを昇順にならべたベクトルを 、対応する人数シェアをとし、G-Matrixをとすると
という計算を行えばよい(は転置)。
それ自体は、以下のような簡単なプログラムで実装できる。
#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時点までの名古屋や川崎のデータをとってくる。
試した結果は以下の通りである。無事グラぽの記事の値と一致している。
アレンジに関する推定も正しかったようだ。
小中係数は、出場時間を元にジニ係数の計算式を適用して出た数値を、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:実際の出場時間(降順)と極限集中状態の出場時間を横に並べて記載する
まず上の画像のように、実際の出場時間(一行目)と完全独占を仮定した場合の出場時間(二行目)をExcelに書き込んでいく
ここではExcelのF列を左端とし、2行目を見出し、3行目を実際の出場時間、4行目を独占状態の場合の出場時間としている。
Step2:G-Matrixを作成する。
次に、上の画像のようにG-Matrixを作成する。
このとき、行列の一番左上がちょうどシートの対角線上にくるようにする(上の画像だとF列6行目)と、
以下のような数式を書いてコピペするだけでG-Matrixができる
Step3:行列計算をおこなって集中係数を算出。
実はExcelではmmult()関数を使って行列計算ができる(自分も今初めて知りました)。
これを使うと、非常に簡単に行列計算ができるので、それを使って小中係数を計算する
まず、さきほど書いたG-Matrixの下側で同じ列数だけセルを選択する
(画像の下側、緑のワクのところ)
次に、数式バーに=MMULT( 実際の選手の出場時間を書いた範囲、G-Matrixの範囲)を入力する
数式が入力できたら、(Enterではなく)Ctrlキー+Shiftキー+Enterキーを押下すると、選択した範囲に行列の計算結果が反映されている。
そして、完全独占状態についても同じように行列計算を行う(Ctrl + Shift + Enterキーの同時押しを忘れずに)
すると、以下のように完全状態についての行列計算の結果が出力される
あとは、(一行目の和)/(二行目の和)を計算すると小中係数になっている*3。
今回の仮想ケースの場合は、0.738095が小中係数であるようだ。川崎フロンターレよりもさらに出場機会がバラけている。
以上、Excelでも小中係数を計算する方法を示した。
Enjoy!