見出し画像

シーズン序盤の3Pスタッツから最終的な3P%を予測します

こんにちは
前にtwitterでこんな話を紹介しました。

選手の本来の成績を予測できると、観客目線で見て楽しくなるだけでなく、チーム編成にも活用できそうです。
そして、上記の記事では単純に序盤の成績だけから判断するだけでなく、リーグ全体の数値を用いることで、極端な成績(8/16で3P%が50%など)の極端さを補正しています。
とても面白いアプローチなのですが欠点もあって、それは予測する値が常に1つになってしまい、その値の確からしさが分からないという点です。
例えばあるシミュレーションをして、この選手のRS終了時の3P%は35%になると予測されました!となった場合も、100%の確率で35%になるわけではありません。もしかしたら34%や36%になるかもしれません。
そうすると気になるのは何%の確率で35%になるのか、もしくは34%や36%になるのかですが、上記の方法ではそこに答えられません。

そこで今回は異なる手法を使って上記の欠点を解消しつつ、シーズン序盤の成績から最終的な3P%を予測しようと思います。

使う手法

今回使う手法はベイズ推定です。

ベイズ推定の考え方は下記になります(引用)。

ベイズ推定とは「過去の経験」「新たに得たデータ」をもとに不確実な事象を予測する手法である。

※概要は上記記事を御覧ください。

なぜベイズ推定を選択したかですが、その理由は大きく2つあります

・これまでのデータや知見を使えることで妥当な予測ができる(紹介記事と同じ)
予測する値に確率的な幅を持たせることができる(x%の確率でa~bの間に値が収まると言える)

特に2点目が大きなメリットで、、単一の予測値しか出さないという紹介記事の欠点を解消することができます。
ただ、これだけではあまりイメージが湧かないと思うので、選手を一人取り上げて、実際に予測する流れを把握してもらえればと思います。

手法の一連の流れ

ここでは、選手を一人取り上げてベイズ推定の流れを説明します。
取り上げる選手は2018-19シーズンの安藤周人選手とします(以下安藤)。
安藤選手は最終的に3PAが404本、3PMが165本で3P%が40.8%でしたが、序盤10試合では3PAが67本、3PMが34本で3P%が50.7%となっていました。
こういった場合に、最終的にはx%の確率でa~bの間に収まると言いたいのですが、どのように進めていくべきでしょうか。

まずは「過去の経験」について整理します。
安藤選手は3Pシューターだけど、2018-19シーズンの3P%はどうなるかについて、シーズン開始前には分かりません(始まってないので)。
ただ、これまでのシーズンの3Pシューターの成功率がどのように分布しているかを見ると、大体この幅に収まるんじゃないかというのが見えてきます。これが、ベイズ推定で言うところの「過去の経験」になります。
実際に過去2シーズン合算で3PA上位40人の3P%の分布を見ると下図のようになります。35~36%に山があり、そこから両脇に向けて下がっていく感じです。

画像1

シーズン開始前に分かっていることは安藤選手は3Pシューターであること、3Pシューターの3P%の分布が上記のグラフの形であることです。
なので、過去の経験だけを踏まえると、安藤選手の3P%は大体35%前後になりそうだねと言えます。

しかし、ここで「新たに得たデータ」が入ってきます。具体的には序盤10試合の3Pスタッツです。
34/67 ≒ 50.7%という情報が新たに加わることで、実は安藤選手の3P%ってもっと高いんじゃないか?と考えることができます。

逆に言えば、50.7%ってあるけど、3Pシューターの3P%って大体35%前後に落ち着くから、50.7%って出来すぎじゃない?と考えることもできます

これらの情報を踏まえて、色々条件設定した上で(詳細はAppendix参照)安藤選手の3P%の取りうる確率を予測してみると下記のようなグラフになります。

画像2

41%あたりを頂点に山の形をしています。つまり、大体41%前後に落ち着きそうで、そこから外れた値(3P%)を取る確率は小さいと言えそうです。

実際に予測結果として、安藤選手の3P%は50%の確率で37.9%~42.2%の間に収まると出ており、このシミュレーションでは実際の確率は予測された値の範囲内に収まっていました。

ここまでが予測の一連の流れです。
幅を踏まえて3P%を予測できることがイメージできたかと思います。

次は、これをいろいろな選手に当てはめて、実際にどの程度予測できているのかを見てみましょう。

2018-19シーズンの予測結果と精度

ここでは、2018-19シーズンの序盤10試合で3PA上位39名に同じ予測を行ってその結果を見てみましょう。
(同率の兼ね合いで中途半端な人数になってしまいました)

予測値と実際の値の関係は下記の表になります。
(濃い青が50%範囲の予測値が当たったもの、薄い青が50%範囲では外したが80%範囲で当たったもの)
(分位点は、予測された値の中で下からx%の位置にある3P%の値を示しています。例えば安藤の10%分位点である35.8%は、予測された数千件の値を小さい順に並べたときに最初の10%のところに出てくる値です)

画像3

ただ、めちゃくちゃ見づらいので文言にすると、39人の中で実際の3P%の値が80%範囲に入っていた人は33人(84.6%)、50%範囲に入っていた人は23人(59.0%)となっていました。
若干幅を広めに取っているように見えますが、まずますな予測結果かなと思います(幅を広く取りすぎて正解率を上げても意味がないので)。
また、50%範囲の3P%の予測幅は大体5%前後、80%範囲の場合は9%前後となっています。
この幅が実用的な面でどこまで意義のある小ささかは分かりませんが、ほぼ確実に言えることを見つけるには問題なさそうかなと思っています。
(例えば安藤選手は90%の確率で3P%が35.8%を上回ると言えるので、それなら今シーズンは3P%を計算に入れてもいいだろうと考えるなど)

結果としては、予測モデルとして使えないことはなさそうレベルの精度が出ていると思うので、次は2021-22シーズンの予測もしようと思います。

今シーズン(2021-22)の予測結果

今シーズンのある時点(11試合終了時点)までの3PA上位15人を対象に予測をしてみます。

画像4

もちろん、レギュラーシーズンが終わらないと結果は分からないですが、この数字を見ながらヤンヤヤンヤ語り合ってみるのはいかがでしょうか?

ということで今回は以上です。
ご質問・ご指摘などありましたらコメントいただければと思います。


投稿主のTwitterアカウント

今回のコードの格納場所

Appendix(分析の詳細な設定)

stanコード

data {
 int N;
 int Y[N];
 real prior_mean;
 real prior_sd;
}

parameters {
 real<lower=0.2,upper=0.5> p;
}

model {
 p ~ normal(prior_mean, prior_sd);
 for (n in 1:N)
   Y[n] ~ bernoulli(p);
}

3P成功率pの事前分布は正規分布を仮定して、予測したいシーズンの過去2シーズンにおいて3PA上位40人までの選手の3P%の算術平均と標準偏差をパラメータにしています(「手法の一連の流れ」の添付グラフから、とりあえず正規分布でいいだろうとしています)。
また、そもそも3P成功率pの取る値は0.2~0.5という設定もしています。
(これまでの3P%の実績から判断)
R側のchainsやiterなどのパラメータ設定はすべてデフォルトの設定です。

余談ですが、ドメイン知識を生かしてパラメータを設定できるのはベイズの醍醐味でとても楽しいなと実感しました。今後も色々やっていきたいですね。

ちなみに、事前の分析として色々単純集計もしていて、Tweetもしているので是非こちらもご覧ください。


この記事が参加している募集

Bリーグ

サポートしていただけるとありがたいですが、 SNS等で広めていただけるともっとありがたいです。 一緒にバスケを盛り上げていきましょう!