PER を計算する
そう言えば以前「PER の計算は実は簡単」みたいな話をしたので、計算式の中身などの解説です。
目次
はじめに
先に書いておきますが、実際に計算する場合は Excel では難しいと思います。
手順を追っていただくと分かりますが、
- 一度選手全員の uPER を計算した後に
- チームの当該試合 Pace に合わせた aPER を計算
- aPER の全選手平均を出してから
- 各選手の PER を再計算する
という 4 ステップを踏まなくてはなりません。
uPER までなら Excel でも可能かもしれませんが、その後のステップの構築の難度が非常に高く、選手人数分を計算しなければならないのも厄介。その意味で PER を計算する敷居は高いと言えるかもしれません。
ですが理論としての計算式は言うほど複雑ではないので、なるべく柔らかく噛み砕いて解説していこうと思います。
謝辞
より計算式を引用します。
考え方
PER の概要としては、EFF に eFG% などの考え方を取り入れたものと考えると分かりやすいです。
EFF はスタッツのプラス評価やマイナス評価を単純に足し引きして、プレイヤーの当該試合への貢献度を測るもの。計算は単純ですが、Rating としてニアイコールの値が出るので簡易指標として優秀と言われています。
eFG% はバスケットボールの評価指標 four-factors のうち、FG(フィールドゴール)の実質的な利得を計算するものです。例えば 3P は 2P の 1.5 倍の価値があるなどを加味します。そもそも PER は The Player Efficiency Rating の略で、プレイヤーの実質的効率の Rating を表したものです。
つまり PER とは、EFF のように各スタッツから計算して当該試合に対する個人の Rating を出す際に eFG% のようにスタッツに対する重みを加えたもの、と考えるとよいかと思います。
uPER
計算式
uPER は unadjusted PER、アジャストしてない PER のことです(そのままですが、たぶんバスケに親しい人はこの書き方の方が分かりやすい)。
uPER = (1 / MP) *
[ 3P
+ (2/3) * AST
+ {2 - factor * (team_AST / team_FG)} * FG
+ (FT *0.5 * (1 + {1 - (team_AST / team_FG)} + (2/3) * (team_AST / team_FG) ) )
- VOP * TOV
- VOP * DRB% * (FGA - FG)
- VOP * 0.44 * {0.44 + (0.56 * DRB%) } * (FTA - FT)
+ VOP * (1 - DRB%) * (TRB - ORB)
+ VOP * DRB% * ORB
+ VOP * STL
+ VOP * DRB% * BLK
- PF * { (lg_FT / lg_PF) - 0.44 * (lg_FTA / lg_PF) * VOP} ]
ただし、
factor = (2 / 3) - {0.5 * (lg_AST / lg_FG)} / {2 * (lg_FG / lg_FT)}
VOP = lg_PTS / (lg_FGA - lg_ORB + lg_TOV + 0.44 * lg_FTA)
DRB% = (lg_TRB - lg_ORB) / lg_TRB
準備
まず下段の値を先に計算しましょう。
factor = (2 / 3) - {0.5 * (lg_AST / lg_FG)} / {2 * (lg_FG / lg_FT)}
なぜ決定数とするかというと別の計算式の中に FGA や FTA が書かれており、アテンプトではないことが明確なためです。
リーグスタッツの期間や範囲をどこまでにするかの考え方は幾つかあると思います。
- 今季のみに限定する(or 全ての期間を対象とする)
- B1を計算する時はB2を除外する(or B1+B2を対象とする)
などが代表的なところかと思います。
母数が多くなればなるほど外れ値の影響が少なくなるので、私は過去シーズンの全期間/B1B2全チームを対象に計算しています。*1
この話は後ほど PER の計算のところでも触れます。
話を戻して、この時、factor = 0.5999294308158484 です。
面倒であれば、およそ 0.6 として計算して構わないかと。*2
VOP は リーグの Value of possession の略です。1 ポゼッションあたり何点取れるかの期待値。得点を攻撃回数で割ります。
攻撃回数(ポゼッション)の考え方は four-factors の TOV% の計算と同様です。フリースローアテンプトに 0.44 をかけるあたりは共通しており、1 回の攻撃で打つ可能性のあるフリースローは1~3本までのブレがあるので 0.44 で調整するというわけです。ただし物によってはオフェンスリバウンドを攻撃回数から減算しない場合と、減算してポゼッションとする場合があります。ここではオフェンスリバウンドを攻撃継続として考えて(攻撃回数から減算して)います。
上記と同様の期間では VOP = 1.039325701825564。
参照したページでは "equal to 1"、つまり 1 に近づくと予想されています。
DRB% = (lg_TRB - lg_ORB) / lg_TRB
- lg_TRB:リーグトータルリバウンド
ディフェンスリバウンドレイトは、four-factors の ORB%(オフェンスリバウンドレイト)のディフェンス版です。ディフェンスリバウンド数が既に分かっている場合は、子数に直接入れても同じです。
同じく、DRB% = 0.712810038504388、"equal to 0.7" と表記されていますのでおよそ 0.7 です。
最後に、後ほど lg_FT と lg_FTA、リーグのファウル数の値が必要になるので準備しておきましょう。
計算が面倒な方向け
- factor = 0.6
- VOP = 1
- DRB% = 0.7
uPER の導出
これより以下は試合ごとのスタッツを使用し uPER を計算します。
uPER = (1 / MP) *
[ 3P
+ (2/3) * AST
+ {2 - factor * (team_AST / team_FG)} * FG
+ (FT *0.5 * (1 + {1 - (team_AST / team_FG)} + (2/3) * (team_AST / team_FG) ) )
- VOP * TOV
- VOP * DRB% * (FGA - FG)
- VOP * 0.44 * {0.44 + (0.56 * DRB%) } * (FTA - FT)
+ VOP * (1 - DRB%) * (TRB - ORB)
+ VOP * DRB% * ORB
+ VOP * STL
+ VOP * DRB% * BLK
- PF * { (lg_FT / lg_PF) - 0.44 * (lg_FTA / lg_PF) * VOP} ]
上の式は大まかに分類すると以下の図のようになります。
各スタッツを点数化して足し合わせたものを出場時間で割るだけ。
「ね、簡単でしょ?」
と心の中のボブ・ロスが語りかけてくるのでこれで解説せずに終わりにしたくなりますが、私はもう少し親切なので(笑)もう少し詳細を追っていくこととします。
最初に、計算上のためですが、チームのフィールドゴール成功数に占めるアシストの比率というのがよく出てくるので先に計算しておきます。(この項目はこの記事内のみの便宜的な指標です)
ASSIST_FG_RATIO = teamASSIST/teamFieldGoal
続いて、uPER の項目を順番に見ていきます。
uPER = (1 / MP) * [ (スタッツ計算式) ]
uPER は以降の数字を全部足し合わせた後、最後に MP:ミニッツプレイ:出場時間(分) で割ります。つまり uPER とはざっくり、出場時間当たりの効率のことです。
それでは [ ] の中の個人の各スタッツ項目です。
+ 3P
3P:3P 成功数
注意すべき点としてここで表されるのは 3P による得点ではなく、2P との差分にあたる 3P 分の価値を足しています。four-factors の eFG% を計算したことがあると納得しやすいのですが、別途 2P も 3P も両方含んだ FG の加点をするので、ここでは 2P と 3P の差である純粋な 1 点分を加点しています。
+ (2/3) * AST
AST:アシスト
アシストは 2/3 点分の価値。
+ (2 - factor * ASSIST_FG_RATIO) * FG
factor:上の方で準備した factor:約 0.6
FG:フィールドゴール成功数
アシストによって成功したフィールドゴール分の価値分を 2 点から引いて、フィールドゴールの価値とします。3P 分の積み上げは 2 つ上で別途加点しています。つまり「2P の価値は2点、3Pの価値は3点」ではなく、「2P の価値は2点弱、3Pの価値は2点弱+1点」となるので 3P の価値は 2P の 1.5 倍以上と評価されます。
+ FT *0.5 * (1 + (1 - ASSIST_FG_RATIO) + (2/3) * ASSIST_FG_RATIO)
FT:フリースロー成功数
フリースローの価値ですが、まだ若干分かりづらいので変形します。
+ FreeThrow * (1 - ASSIST_FG_RATIO/6)
フリースローの価値は、アシストによって成功したフィールドゴール分の 1/6 にあたる値を 1 点から引いたものです。元々の計算式が長くなっているのは、1 から引いたり、2/3 という定数に何か意味があるためだと思いますが、ここでは深く追求せず割愛。
- VOP * TOV
VOP:上の方で準備したポゼッションあたりの得点期待値:約 1
TOV:ターンオーバー数
ネガティブスタッツのターンオーバーでは、本来得るべきだった期待値 VOP を失ったとみなしてそのまま減算。
- VOP * DRB% * (FGA - FG)
DRB%:上の方で準備したディフェンスリバウンドレイト:約 0.7
フィールドゴール試投数から成功数を引いた数、すなわちシュートを外した数分の減点。外したうちディフェンスリバウンドを取られる確率が約 0.7 なので、その分の期待値 VOP を減算。
- VOP * 0.44 * {0.44 + (0.56 * DRB%)} * (FTA - FT)
同じくフリースロー試投数から成功数を引いた数、すなわちフリースローを外した数分の減点。フリースロー関連ではよく出てくるマジックナンバー 0.44 ですが、ここでは得点期待値 VOP そのものが 0.44 掛けの小さなものになっているのと、ディフェンスリバウンドが発生しない場合はその分がそのままの値が、最後の試投(例:2投中2本目)はディフェンスリバウンドを考慮した値が減点されます。*3
+ VOP * (1 - DRB%) * (TRB - ORB)
TRB - ORB:トータルリバウンド - オフェンスリバウンド = ディフェンスリバウンド
ディフェンスリバウンドの価値は得点期待値 VOP から平均リバウンド取得率を引いた分。言い換えると、ディフェンスリバウンドにより相手のオフェンスリバウンドを潰して相手の得点期待値を奪った分が価値として加算されます。およそ 0.3。
+ VOP * DRB% * ORB
オフェンスリバウンドの価値はその逆。オフェンスリバウンドにより相手のディフェンスリバウンドを潰して相手の得点期待値を奪った分。およそ 0.7。
+ VOP * STL
スティールは期待値 VOP を相手から奪った分を加算。ターンオーバーの逆。
+ VOP * DRB% * BLK
BLK:ブロック
ブロックはなぜかディフェンスリバウンドレイト分の得点期待値を加算。オフェンスリバウンドと等価値。
- PF * {(lg_FT / lg_PF) - 0.44 * (lg_FTA / lg_PF) * VOP}
PF:ファウル数
lg_PF:リーグファウル数
lg_FT:リーグフリースロー成功数
ファウルは相手にフリースローを成功された分だけ価値を減算します。ただし、与えるフリースロー数にバラツキがあるので調整分の 0.44 は許されるような計算式となっています。
各スタッツの価値
2021/1/6 時点の B1 スタッツを対象に計算すると、ASSIST_FG_RATIO 平均値は 0.681631909 なのでこの値で各スタッツの価値を便宜的に出してみます。*4
ASSIST_FG_RATIO の幅はかなりあるので一概にこれが正しいわけではありませんが、一つの目安としては面白いのではないでしょうか。
個人的な指標では 3P の試投自体にも + 価値をつけているので、uPER では FG を外すと -0.7 とかなりシビアな減点となるのが興味深い。
PER
ここまで個人の基底値である uPER は算出できました。
"はじめに" でも記載した通り、PER を計算するための第1段階が完了しました。
- 一度選手全員の uPER を計算した後に
- チームの当該試合 Pace に合わせた aPER を計算
- aPER の全選手平均を出してから
- 各選手の PER を再計算する
あと 3Step が必要となります。
準備
PER を導出する前にも幾つか用意しておく数字があります。
ポゼッション
uPER のところでリーグの平均ポゼッション(攻撃回数)を出しましたが、計算したい試合の両チームのポゼッションを出しておきます。計算式は以下の通り。
Possetion = teamFieldGoal_A + 0.44*teamFreeThrow_A + teamTurnOver - teamOffenceRebound
一連のチームの攻撃は、基本的にフィールドゴールの試投かフリースローの獲得かターンオーバーで終わります。
先述の通り、獲得するフリースローは 1~3本までの幅があるため 0.44 の定数をかけて調整します。
また、オフェンスリバウンドを取った場合は攻撃継続と見做しフィールドゴールの試投をなかったことにします。こちらも先述の通り、継続とする場合と別の攻撃とする場合がありますが、uPER の計算の中で継続としているためここでも合わせています。
ペース
ポゼッションを計算することで、その試合のペースを計算できます。*6
TeamPace = 40 * (TeamPossetion + OppPossetion) / (2 * TeamMinutesPlay/5)
40:試合時間(分)
TeamPossetion:自チームのポゼッション
OppPossetion:相手チームのポゼッション
TeamMinutesPlay:チームの総出場時間
チームの総出場時間をコートに立つ 5 人で割ると該当試合の試合時間が分かります。2 チームの攻撃回数を足したものを 2 で割って攻撃回数平均を出し、上の該当試合の試合時間で更に割ると "1 分あたりの攻撃回数" が出ます。更に試合時間 40 分 をかけることで、オーバータイムを 4q 平均に丸め込んだ攻撃回数が計算できます。これがこの試合におけるペースとなります。
ちなみに、詳しい方だったら PER を RealGM などで参照されている方もいるかもしれません。
実は私の計算する PER と RealGM の PER は一致しません。おそらくこのペースの計算を NBA ベースの 48 分間で計算しているためと思われますが詳細は不明。
実際の試合時間に合わせるべきというのは解説サイトにも書かれていて、
Note: 40 minutes is used in the calculation for the WNBA.
WNBA の場合 40 分で計算するという脚注がありますので B リーグも同様に 40 分で計算すべきでしょう。
aPER
aPER = (pace adjustment) * uPER
ただし、
pace adjustment = lg_Pace / team_Pace
リーグの平均ペースをチームのペースで割ることで試合の攻撃回数を平均化します。つまり、当該試合での uPER は攻撃回数が多かったために高くなったり、攻撃回数が少ないために低かったりする可能性があるので、リーグの平均ペースに合わせることで uPER をアジャストさせた値が aPER です。
PER
PER = aPER * (15 / lg_aPER)
上記の aPER のリーグ平均を取り、更にそれが 15 となるように調整した aPER が PER です。aPER ではペースをリーグ平均にあわせましたが、ここではスタッツから出た値そのものに対しても平均 15 となるように調整されます。これにより、異なるシーズンにおいても相対的なスタッツの価値が測れるようになっています。
The step above sets the league average to 15 for all seasons.
この視点に立てば uPER や PER で使用するリーグの値は該当シーズンのみで計算すべきだと言えます。特にリーグの成長スピードが速ければ速いほど過去の平均スタッツは用を為さないことになります。
逆の視点では、サンプル数が少ない状態でリーグの値を出すと異常値が出やすいとも考えられます。そのため試合ごとの PER 値の上下動が激しくなり平均 PER に影響が出ます。
この対策としては、
- 該当シーズンの中で最大母数で計算する(試合消化するたびに過去の試合に対して再計算する)
- リーグ全体で大きな成長はないと見做して過去シーズンを含む大きなデータで平均値を取る
などが考えられます。私は現在のところ 2 を採用していますが、DB 化を行う際にロジックを変更することを検討予定。*7
PER の課題
最後に PER の課題を書いておきます。
PER とは時間あたりのパフォーマンスである
uPER が導出される時からの課題ですが、スタッツの積算価値を出場時間で割るため、出場時間が長い選手は不利になりますし出場時間がかなり短い選手は外れ値が出ることもあります。2020.10.24 の試合で仙台の臼井選手が出場時間 8 秒で 2 点を取った PER 813 が最も高い値と思いますが、仮に 40 分出場した選手はこの 300 倍となる 600 点取った場合も値が同じ。要するに PER は 1 試合で 2 点取った選手と 600 点取った選手の価値が同じとなる値が出ます。
そのまま使用すると PER 個人平均値を大きく引き上げてしまうので、出場時間での足切りは必要と感じます。その指標は解説サイトにはないので、妥当な値をどれくらいに持ってくるかの検討が必要。
PER とは ペースを平均化した値である
選手に平等となるようにペースを平均化していますが、これがペースの遅いチームにとっては有利にペースの早いチームにとって不利に働きます。ポゼッションの切り替わりが早く体力を消耗する試合は低く評価され、1 ポゼッションの質を高めるチームが高く評価されます。ローペースのチームに所属する選手がハイペースのチームに移籍した時に全く同じパフォーマンスをハイスピードでこなせるかどうかは検討すべきでしょう。
まとめ
個人的にはランキングに関しても総スタッツで評価すべきだと思っているので、なるべく平均化せずに算出したほうが実態に則すのではないかと考えたりもします。
そんな中でも PER を追っているのは、
- 業界標準となる数字を読むことで裏にある考え方自体を取り込む
- 課題を検討して適用できる場所/できない場所を理解する
- 長期間において観察し値の推移を検討する
ことに価値があると思うからです。
今回の検討の中でも、ペース/ポゼッションの考え方や、フィールドゴールに占めるアシスト比、マジックナンバー 0.44、VOP ≒ 1 など興味深い示唆が幾つも得られました。これからも面白い数値を見つけたら解説を書こうと思います。
お楽しみに!
*1:
余談ですが「0.5を2で割る」など固定値の計算が表れるので、私は計算式を以下のように改変しています。
factor = 2/3 - (LEAGUE_ASSIST * LEAGUE_FreeThrow) / (4 * LEAGUE_FieldGoal**2)
(**2 は 2 乗)
この場合でも計算結果が変わらないことを検算済みです。
*2:ただし、今のところ factor が何を示したいのかは理解できていません。FG に占めるアシストの半分とFGに占めるフリースローの半分をかけて 2/3 から引く計算が表す意味とは?
*3:ただ個人的には、FG での DRB% と フリースローの DRB% は大きく違うと思うのだけど。
*4:ちなみに最大値は 1.136363636、最小値は 0.3125。
最大値が 1 を超えているのは、アシストのつけ方が以前変わったため、1FG に対して 1以上のアシストが記録されることがあるためです。
*5:ファウルで必要な数値の昨年までの実績は以下の通り。
ファウル | 146,296 |
FTM | 99,378 |
FTA | 139,455 |
*6:私はこの計算式を変形して
teamPace =(100 * (TeamPossetion + OppPossetion) / TeamMinutesPlay)
としています。(検算済み)
*7:予定は未定。