B1 2020-21シーズンのNext Star賞を勝手に予想する

こんにちは、最近『統計学のための数学入門30講』に取り組んでいるらんそうるいです。この記事では、今シーズン最も成長した選手に贈られるNext Star賞の予想をしたいと思います。結論を先に書くと、メイヨ選手・晴山選手・森川選手の3名がNext Star賞の有力候補なのではないかと考えました。

分析の方針

選手の成長というのは抽象的で扱いにくいので、この記事では選手の成長を「今シーズンのスタッツと昨シーズンのスタッツの差」で近似したいと思います。

 問題はどのスタッツを使うかですが、一試合の平均得点・Point Per Possession (PPP)・出場時間の差を使います。ただ、これら3つの差だけでは、選手の攻撃への関与の大きさが分からないので、今シーズンの一試合の平均得点も使います。

 これら4つの変数(平均得点の差・PPPの差・出場時間の差・今シーズンの平均得点)を用いて、散布図を描写し、Next Star賞の有力候補を探したいと思います。

 平均得点と出場時間については説明は不要だと思いますので、PPPについて説明したいと思います。PPPについてすでにご存知の方は次の節は飛ばしていただいても大丈夫です。

Point Per Possessionについて

Point Per Possession (PPP)は、ある選手が終わらせたポゼッション1回につき何点取れるかを近似した指標です。PPPは次式で定義されます。

  • PPP = PTS / (FGA + 0.44 * FTA + TO)
  • *PTS=得点、FGA=フィールドゴール試投数、FTA=フリースロー試投数、TO=ターンオーバー数

 PPPは攻撃効率の指標として使われます。この記事では、今シーズンのPPPと昨シーズンのPPPの差をとることで、攻撃効率の観点から選手がどれくらい成長したのかを評価したいと思います。

データセット

Bリーグ2020-21シーズンのボックススコアを公開されているrintaromasuda様(https://github.com/rintaromasuda/bleaguer/tree/master/inst/extdata)のデータを用いました。使用したデータは「games_boxscore_201920.csv」「games_boxscore_202021.csv」と「teams.csv」です。これらのデータを連結してデータセットとしました。

データセットの加工

今シーズンと昨シーズンのボックススコアから、B1のデータのみを抽出し、選手の名前でgroupbyして一試合の平均スタッツを得ました。さらにここからPPPの定義式に沿ってPPPを算出しました。

 今シーズンの平均得点、PPP、出場時間について、昨シーズンのこれらとの差をとり、成長の指標としました。これらの変数が0より大きければ、スタッツが昨シーズンより向上していると読むことができます。

 平均得点・PPP・出場時間の差だけでは、その選手がどれくらい攻撃に関与していたかを評価することができません。これらの差が大きくても、一試合の平均得点そのものは小さい可能性があります。そこで、攻撃への関与の大きさを表すために、今シーズンの平均得点そのものも分析に使います。

結果

縦軸に今シーズンと昨シーズンの平均得点の差、横軸にPPPの差をとって散布図を描写しました。さらに出場時間の差をマーカの色で、今シーズンの平均得点をマーカの大きさで表現しました。この散布図は右上に行けば行くほど平均得点・PPPが大きく向上していると読めます。マーカが濃い赤になるほど出場時間が長くなっており、濃い青になるほど出場時間が短くなっていると読みます。マーカが大きいほど今シーズンの平均得点が多いことを表しています。

 散布図を見ると、ニック・メイヨ選手、晴山ケビン選手、森川正明選手が上方に位置しており、昨シーズンより平均得点が向上していることが読み取れます。また、マーカが濃い赤色であることから、昨シーズンより出場時間が伸びていることも読み取れます。散布図上で最も右側にプロットされた点、つまりPPPが最も向上した選手は松脇圭志選手です。しかし彼は新人王の資格を持っているので、今回のNext Star賞の予想では考慮に入れないことにしました。

 メイヨ選手・晴山選手・森川選手の特徴を述べます。まず、この3選手は全員移籍組です。そのため、成長したというよりは、移籍によって役割が変わり、スタッツが伸びた可能性があります。メイヨ選手の特徴は昨シーズンの時点で平均得点が高く (14.550点)、今シーズンはさらに平均得点が伸びたことが挙げられます。晴山選手は平均得点が向上していますが、PPPも向上していることが特徴です。森川選手は平均得点・出場時間の両方が大きく伸びていますが、PPPは下がっているという点が特徴だと思います。

 今回の分析では、メイヨ選手・晴山選手・森川選手をNext Star賞の有力候補であると結論づけたいと思います。

終わりに

この記事では、平均得点・Point Per Possession・出場時間について今シーズンと昨シーズンの差をとり、これら3つの差を成長の指標として、Next Star賞の有力候補を探しました。その結果、ニック・メイヨ選手、晴山ケビン選手、森川正明選手の3人が有力候補であると予想しました。しかし、これら3選手は全員移籍組であるため、成長したというよりは、チーム内での役割が変わったからスタッツが伸びたという解釈も可能です。

 個人賞の中でも、私は最も成長した選手に贈られるMIP賞が好きなので、Bリーグで今シーズンからNext Star賞が創設されたのはとても嬉しいです。みなさんはNext Star賞の候補として誰を推していますか?Twitterやこの記事へのコメントで教えていただけると嬉しいです。

著者のTwitterアカウント:https://twitter.com/rnsr0371

宣伝

バスケットボールのデータ分析を勉強したくて、Twitterでバスケのデータ分析をされる方のリストを作っています。ご興味のある方はぜひリストのフォローをお願いします。メンバーの自薦・他薦も募集しています。

分析に使ったコード(Python)

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

data202021=pd.read_csv("games_boxscore_202021.csv",encoding="utf-8")
data201920=pd.read_csv("games_boxscore_201920.csv",encoding="utf-8")
teams=pd.read_csv("teams.csv",encoding="utf-8")

teams202021=teams[teams["Season"]=="2020-21"]
teams201920=teams[teams["Season"]=="2019-20"]

teams202021_B1=teams202021[teams202021["League"]=="B1"]
teams201920_B1=teams201920[teams201920["League"]=="B1"]

data202021=data202021.merge(teams202021_B1,on="TeamId")
data201920=data201920.merge(teams201920_B1,on="TeamId")

data202021=data202021.groupby("Player").mean()
data201920=data201920.groupby("Player").mean()

data=data202021.merge(data201920,on="Player",suffixes=["_202021","_201920"])

pd.set_option("display.max_columns",100)

data=data.reset_index()

#pppを計算する
ppp=[]
for PTS,FGA,FTA,TO in zip(data["PTS_202021"],data["FGA_202021"],data["FTA_202021"],data["TO_202021"]):
    if FGA+0.44*FTA+TO==0:
        ppp.append(np.nan)
    else:
        ppp.append(PTS/(FGA+0.44*FTA+TO))
data["PPP_202021"]=pd.DataFrame(ppp)

#pppを計算する
ppp=[]
for PTS,FGA,FTA,TO in zip(data["PTS_201920"],data["FGA_201920"],data["FTA_201920"],data["TO_201920"]):
    if FGA+0.44*FTA+TO==0:
        ppp.append(np.nan)
    else:
        ppp.append(PTS/(FGA+0.44*FTA+TO))
data["PPP_201920"]=pd.DataFrame(ppp)

data=data.dropna()
data=data.reset_index()

data=data.loc[:,["Player","PTS_202021","PTS_201920","PPP_202021","PPP_201920","MIN_202021","MIN_201920"]]

#それぞれの変数の差をとる
#PTSから
pts=[]
for pts_202021,pts_201920 in zip(data["PTS_202021"],data["PTS_201920"]):
    pts.append(pts_202021-pts_201920)
data["PTS_diff"]=pd.DataFrame(pts)

ppp=[]
for ppp_202021,ppp_201920 in zip(data["PPP_202021"],data["PPP_201920"]):
    ppp.append(ppp_202021-ppp_201920)
data["PPP_diff"]=pd.DataFrame(ppp)

MIN=[]
for min_202021,min_201920 in zip(data["MIN_202021"],data["MIN_201920"]):
    MIN.append(min_202021-min_201920)
data["MIN_diff"]=pd.DataFrame(MIN)

plt.figure(figsize=[10,10])
cm=plt.cm.get_cmap("seismic")
plt.scatter(data["PPP_diff"],data["PTS_diff"],marker="o",s=data["PTS_202021"]*10,c=data["MIN_diff"],vmin=-20,vmax=20,cmap=cm)
plt.axvline(x=0,color="black")
plt.axhline(y=0,color="black")
plt.ylabel("PTS_diff")
plt.xlabel("PPP_diff")
plt.xlim([-1.5,1.5])
plt.colorbar()
plt.show()

Follow me!

コメントを残す

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

CAPTCHA