Bリーグ版TS%を作りたい!【追記あり】

追記 2021/04/02:バスケットカウントで得たフリースローの機会を計算に含めていなかったので、バスカンで得たフリースローの機会を0として、計算し直した結果を追記しました。この0という数字は英語版WikipediaのTrue Shooting Percentageの記事に書いてあったものなのですが、要出典扱いとなっているので、バスカンで得たフリースローの機会を計算に含めない結果も一応残しておきます。

追記 2021/04/06:係数の計算方法が間違っている可能性が高いので、続編を書きました。正しい計算方法で計算を行ったところ、0.433という数字が得られました。よろしければごらんください。『Bリーグ版TS%を作りたい! 2』(https://rnsr0371.boy.jp/2021/04/05/true_shooting_percentage_b1/)

こんにちは、らんそうるいです。バスケのデータにご関心のある方ならTrue Shooting %(TS%)というアドバンスドスタッツをご存知の方が多いと思います。TS%はプレイヤーの攻撃の効率を評価するスタッツの一つで、NBAでも使われています。TS%の定義式は次のようなものです。

  • TS%={得点/2(フィールドゴール試投数+0.44*フリースロー試投数)}*100

 TS%はシュートで終わったポゼッションについて、シュートがすべて2Pだった仮定した上で、得点との比をとったものです。これが高いほど選手の攻撃効率が高いと解釈されます。

 ここで今回のテーマにしたいのが、分母に現れる0.44という定数です。この定数の正確な出典は分からないのですが、どうやらNBAの2002-03シーズンから2005-06シーズンのデータを用いて計算された「ポゼッションを終わらせるフリースロー(posession ending free throw)」の割合らしいです(Kubatko et al., 2007)。ポゼッションを終わらせるフリースローとは、フリースローが2投与えられたときの2投目やバスケットカウントで獲得したフリースローのことを指しています。

 この0.44という定数は広く使われていますが、NBAの過去のデータに基づいたものになっており、Bリーグのデータを用いて算出した場合と、数値が異なる可能性があります。そこで、この記事ではBリーグ2020-21シーズンのデータから、TS%の定数を計算したいと思います。

 先に結論を書くと、0.49 0.38くらいがTS%のFTAの係数として適切だと考えられました。

 (*今回Pythonで記述したコードにはスクレイピング・クローリングが使われているので、公開は控えます。お声がけいただければコードはお渡ししますので、お気軽にどうぞ)

TS%に関する国内の記事

TS%の入門としては以下の記事がオススメです。

 もう少し詳しい説明としては、同じブログの以下の記事がオススメです。

 TS%の定数0.44に関わる記事としては、以下の先行研究があります。

分析の方針

紹介した記事の中には、0.44という定数が膨大なデータに基づいたものである、と書かれています。しかし、膨大なデータを集めるのは面倒くさい個人では難しいので、膨大なデータの様子を推測するために、ランダムサンプリングで小規模なデータセットを作り、定数を求めたいと思います。ランダムサンプリングでデータセットを作ったことは、今回の分析の強みの一つです。

データの収集・加工

BリーグのPlayByPlayのURLは例えば、https://www.bleague.jp/game_detail/?ScheduleKey=6337のようにScheduleKeyをクエリパラメータに持っています。このクエリパラメータをランダムに生成することで、ランダムサンプリングを行いました。具体的には、5854~6814の間の整数をランダムに50個生成しました。この数字の範囲はBリーグ2020-21シーズンのボックススコアを公開されているrintaromasuda様(https://github.com/rintaromasuda/bleaguer/tree/master/inst/extdata)のデータで、ScheduleKeyの最小値が5854、最大値が6814だったため、採用しました。ScheduleKeyの規則性は分からないのですが、おそらく2020-21シーズンのB1、B2のゲームのPlayByPlayを抽出できたはずです。もちろん、まだ行われていない未来のゲームのURLが含まれていましたが、これらは欠損値として扱いました。

 シードを固定して乱数を発生させ、50個のPlayByPlayのURLを生成しましたが、データを取得できたのは41試合分でした。系統だって欠損値が発生しているとは考えにくいため、この欠損が定数の計算に影響を与えた可能性は低いと思います。

 生成したURLの先で、PlayByPlayから各クォータの残り時間とプレーをスクレイピングしました。こうして得られたPlayByPlayから、「『フリースロー』を含み、かつ『ファウル』を含まない」行に数字の1を割り当て、それ以外の行には0を割り当てました。以下のようなデータセットを作りました。

そのうえで、各クォータの残り時間(e.g., 3:00)でデータをgroup byして、数字の合計を算出しました。この加工によって、バスカンでフリースローが与えられた場合には0が、フリースローが2投与えられた場合には2が、3投与えられた場合には3が割り当てられました。ただし、各クォータの残り時間が一致している状態でフリースローが与えられた場合(e.g., 1Qの3:00と2Qの3:00の両方でフリースローが放たれている場合)には、これらをクォータごとに区別せずにgroup byしているため、4や5といった数字が割り当てられたことになります。以下のようなデータセットを作りました。

 以上の処理でフリースローを1投獲得した場合には1、2投獲得した場合には2、3投獲得した場合には3が割り当てられたデータセットができました。このデータセットについて、数字の1が割り当てられた行に0、数字の2が割り当てられた行に0.5、3が割り当てられた行に0.33を振り、平均をとって、あるゲームにおけるポゼッションを終わらせたフリースローの割合を算出しました。

 このポゼッションを終わらせたフリースローの割合の平均値を、データが取得できた41試合すべてで算出し、さらに平均をとり、最終的な結果としました。

結果

ランダムサンプリングによって、B1・B2の2020−21シーズンの試合41個を抽出しました。その結果、バスカンで得たフリースローを計算に含めない場合、ポゼッションを終わらせたフリースローの割合の平均値は0.49、標準偏差は0.01となりました。

 一方、2Pのシューティングファウルで得たフリースローの機会に0.5、3Pの場合は0.33、バスカンのボーナススローの場合に0を振ったデータセットで計算したところ、ポゼッションを終わらせるフリースローの割合の平均値は0.38、標準偏差は0.05となりました。

終わりに

この記事では、B1, B2の2020-21シーズンのゲームから41試合をランダムサンプリングによって抽出し、TS%のFTAの係数(ポゼッションを終わらせたフリースローの割合)を計算しました。その結果、0.49と0.38という数字を得ました。

 この分析には問題点があります。たとえば、B1だけでなくB2からもデータをランダムサンプリングしていることや、データセットのサンプル数が41と小さいこと、各クォータで残り時間が同じ時にFTAをまとめてしまっていることなどです。なので、0.49と0.38という値は参考程度に留めた方がよいと思います。

 しかし、ポゼッションを終わらせたフリースローの割合の計算方法をここまで詳しく説明している記事は日本語ではまだないと思います。また、ランダムサンプリングを使った分析もなされていないと思います。今回の記事で、係数を求める大まかな手順を確立できたのではないでしょうか? 今後、POSSやTS%を算出するときの参考にしていだければ、これ以上に嬉しいことはありません。

 今回の分析にあたって、Twitterのフォロワー様から有益なアドバイスをいただきました。ありがとうございました。

引用文献

Kubatko, Justin; Oliver, Dean; Pelton, Kevin; and Rosenbaum, Dan T. (2007) “A Starting Point for Analyzing Basketball Statistics,” Journal of Quantitative Analysis in Sports: Vol. 3: Iss. 3, Article 1.

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA