Bリーグの成績を分析したら有名選手は凄かった

## 背景
2023年の男子バスケットボールワールドカップ日本代表はパリオリンピック出場権を自力で獲得しました。
試合結果をニュースで知るだけでなく、試合観戦に関心が沸いた方も増え、日本バスケットボールは更なる盛り上がりを見せております。
このようなことを踏まえ、B1リーグの成績詳細より、スタッツを一括取得し、
どの選手がすごいかデータ分析というアプローチで把握するというのがこの記事のゴールとなります。

## 前提
以下条件で、取得します。
* B1リーグの成績詳細サイトから取得（※とても参考になりました…感謝を申し上げます）
（参考：https://note.com/wabisuke94/n/nabc9bc89ec84）
* 取得結果をデータベース（SQLite3）に保存
* pythonモジュールであるdjangoとmatplotlib、Pandasを使用
* 実行環境はgoogle colaboratoryを利用

## やること
以下のスタッツを取得します。
* bリーグの公式戦成績(2020～2024現在までの試合結果※CSは除外とします。)
* 得点、アシスト成功数、3ポイント成功数、ターンオーバ数、スティール数の観点で確認します。

## 実装方針

* スクレイピング方法はこちらを参考にしております。
参考：https://note.com/wabisuke94/n/nabc9bc89ec84

* 通算成績を出すため、年、チーム毎のURLが必要のため、配列定義します。
    ```
    years = [2020, 2021, 2022, 2023]
    
    clubs2020 = [696, 704, 728, 726, 700, 727, 706, 701, 729, 703, 699, 720, 698, 693, 695, 721, 702, 697, 694, 716]
    clubs2021 = [727, 704, 729, 720, 701, 713, 728, 696, 706, 721, 702, 698, 703, 712, 726, 693, 700, 716, 697, 694, 699, 695]
    clubs2022 = [704, 729, 721, 720, 726, 727, 694, 713, 701, 702, 712, 696, 697, 693, 728, 700, 706, 699, 698, 695, 716, 703, 717, 692]
    clubs2023 = [702, 692, 693, 712, 703, 713, 704, 706, 726, 727, 694, 696, 716, 697, 728, 717, 729, 699, 700, 720, 721, 1638, 2488, 701]
    ```
* google colaboratoryで実行します。
* 注意点として、実行時は高頻度に接続すると、サーバーへの高負荷を避けるため、`parse_stats(html_doc)`の実行頻度を数秒間隔（sleep 5秒くらい）にします。
* 実行時間がとてもかかるので、その間は他の事をしておくといいでしょう。
（※実際のスクリプトの紹介は差し控えさせていただきます。）

## 実行結果

----

### B1リーグ 2022-2023 得点ランキング
まず2022-2023シーズンの得点数では、
ペリン・ビュフォード選手、ダバンテ・ガードナー選手がランクイン。

|Rank|team |name |minute |pts |POINT_PER_MINUTES|
|---|---|---|---|---|---|
|1 |島根 |<b>ペリン・ビュフォード |2051.15 |<b>1302</b> |0.634766|
|2 |三河 |<b>ダバンテ・ガードナー |1871.33 |1246 |0.665837|
|3 |川崎 |ニック・ファジーカス |1823.50 |1206 |0.661366|
|4 |大阪 |D.J・ニュービル |2001.58 |1164 |0.581541|
|5 |秋田 |スタントン・キッド |1942.42 |1054 |0.542622|
|6 |群馬 |トレイ・ジョーンズ |1435.03 |1033 |0.719846|
|7 |京都 |ジェロード・ユトフ |1910.27 |1031 |0.539714|
|8 |名古屋D |コティ・クラーク |1575.17 |1020 |0.647549|
|9 |信州 |ジョシュ・ホーキンソン |1906.70 |1020 |0.534956|
|10 |北海道 |ショーン・ロング |1531.75 |1015 |0.662641|

----

### B1リーグ 2022-2023 分間平均得点数ランキング (2024/02/23時点)
試合出場時間に対しての分間平均得点数のランキングです。
注目するべき結果としては、1000ゴール以上の選手のうち、トレイ・ジョーンズ選手、河村 勇輝選手、ダバンテ・ガードナー選手の分間平均のゴール数が高く、得点効率の高い選手であることがわかります。

|Rank|team |name |minute |pts |POINT_PER_MINUTES|
|---|---|---|---|---|---|
|1 |A東京 |宇都宮 陸 |3.90 |5 |1.282051|
|2 |富山 |マイルズ・ヘソン |629.90 |503 |0.798539|
|3 |群馬 |トレイ・ジョーンズ |1435.03 |1033 |0.719846|
|4 |千葉J |クリストファー・スミス |1335.32 |951 |0.712189|
|5 |新潟 |小池 文哉 |8.65 |6 |0.693642|
|6 |横浜BC |<b>河村 勇輝 |1469.08 |1013 |<b>0.689547</b>|
|7 |仙台 |ラショーン・トーマス |1072.40 |725 |0.676054|
|8 |富山 |ブライス・ジョンソン |964.92 |650 |0.673631|
|9 |京都 |ノヴァー・ガドソン |306.10 |206 |0.672983|
|10 |三河 |<b>ダバンテ・ガードナー |1871.33 |1246 |0.665837|

B1リーグ全体の選手の分間得点数を分布で見ると、
1分間に0.6点以上取る選手はごく少数であることがわかります。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551020/771719d7-d78a-c97b-7e75-2304b27e5c97.png)

----

#### B1リーグ 2020～通算得点ランキング（2020年～通算） (2024/02/23時点)
2020年～通算得点の上位10位になります。
||name |points|
|---|---|---|
|1 |<b>ダバンテ・ガードナー |3951|
|2 |ニック・ファジーカス |3869|
|3 |<b>ペリン・ビュフォード |3711|
|4 |セバスチャン・サイズ |3472|
|5 |ニック・メイヨ |3359|
|6 |ドウェイン・エバンス |3308|
|7 |ジョシュ・ホーキンソン |3154|
|8 |ショーン・ロング |3105|
|9 |安藤 誓哉 |3081|
|10 |<b>富樫 勇樹 |3067|

----

#### B1リーグ 選手個人STATS 分間平均得点数ランキング得点ランキング（2020年～） (2024/02/23時点)
2000ゴール以上した選手の中で、2020年～分間平均得点数の上位10位になります。
||name |points |minutes |point_per_minute|
|---|---|---|---|---|
|1 |ショーン・ロング |3105 |4522.39 |0.686584|
|2 |ニック・ファジーカス |3869 |5832.25 |0.663380|
|3 |トレイ・ジョーンズ |2306 |3589.48 |0.642433|
|4 |<b>ダバンテ・ガードナー |3951 |6208.42 |0.636394|
|5 |ライアン・ケリー |2370 |3732.64 |0.634939|
|6 |<b>ペリン・ビュフォード |3711 |5873.64 |0.631806|
|7 |ノヴァー・ガドソン |2103 |3380.12 |0.622167|
|8 |コティ・クラーク |2353 |3789.40 |0.620943|
|9 |<b>河村 勇輝 |2319 |3741.83 |0.619750|
|10 |パトリック・アウダ |2265 |3744.71 |0.604853|

----
#### その他のランキング
他結果も分析しました。
富樫 勇樹選手のスリーポイント成功数はが分間でも通算でも最多であることがわかりました。

##### B1リーグ 通算最多3ポイント成功数ランキング（2020年～） (2024/02/23時点)
|Rank|team |name |minutes |three_points |three_point_per_minutes|
|---|---|---|---|---|---|
|1 |千葉J |<b>富樫 勇樹 |5631.14 |554 |0.098382|
|2 |A東京 |安藤 誓哉 |6363.30 |541 |0.085019|
|3 |川崎 |辻 直人 |5093.56 |428 |0.084028|
|4 |琉球 |岸本 隆一 |4949.95 |407 |0.082223|
|5 |琉球 |今村 佳太 |5345.76 |393 |0.073516|
|6 |京都 |細川 一輝 |4919.68 |374 |0.076021|
|7 |宇都宮 |遠藤 祐亮 |4686.27 |371 |0.079167|
|8 |川崎 |藤井 祐眞 |5051.66 |367 |0.072649|
|9 |三河 |金丸 晃輔 |4203.89 |366 |0.087062|
|10 |広島 |トーマス・ケネディ |4706.62 |365 |0.077550|

----

##### B1リーグ 通算最多3ポイント分間成功数ランキング（2020年～） (2024/02/23時点)
|Rank|team |name |minutes |three_points |three_point_per_minutes|
|---|---|---|---|---|---|
|1 |千葉J |<b>富樫 勇樹 |5631.14 |554 |0.098382|
|2 |大阪 |ディージェイ・ニュービル |2961.85 |291 |0.098249|
|3 |千葉J |クリストファー・スミス |2375.57 |230 |0.096819|
|4 |千葉J |田口 成浩 |2427.85 |222 |0.091439|
|5 |名古屋D |コティ・クラーク |3789.40 |331 |0.087349|
|6 |三河 |金丸 晃輔 |4203.89 |366 |0.087062|
|7 |A東京 |安藤 誓哉 |6363.30 |541 |0.085019|
|8 |川崎 |辻 直人 |5093.56 |428 |0.084028|
|9 |琉球 |岸本 隆一 |4949.95 |407 |0.082223|
|10 |京都 |マシュー・ライト |2552.54 |208 |0.081487|

----

##### B1リーグ 通算最多アシスト成功数ランキング（2020年～） (2024/02/23時点)
得点、スリーポイント成功数でランクインした選手が4名ランクインしています。
|Rank|team |name |minutes |asst_times |asst_times_per_minutes|
|---|---|---|---|---|---|
|1 |島根 |<b>ペリン・ビュフォード |5873.64 |1192 |0.202941|
|2 |千葉J |<b>富樫 勇樹 |5631.14 |1138 |0.202091|
|3 |名古屋D |齋藤 拓実 |4358.26 |1088 |0.249641|
|4 |川崎 |藤井 祐眞 |5051.66 |1013 |0.200528|
|5 |横浜BC |<b>河村 勇輝 |3741.83 |1006 |0.268852|
|6 |三遠 |鈴木 達也 |4818.22 |977 |0.202772|
|7 |琉球 |並里 成 |4451.60 |972 |0.218348|
|8 |横浜BC |森井 健太 |3736.77 |928 |0.248343|
|9 |SR渋谷 |ベンドラメ 礼生 |5461.73 |923 |0.168994|
|10 |三河 |<b>ダバンテ・ガードナー |6208.42 |860 |0.138522|

----

##### B1リーグ 通算最多アシスト分間成功数ランキング（2020年～） (2024/02/23時点)
河村 勇輝選手がランクイン。
|Rank|team |name |minutes |asst_times |asst_times_per_minutes|
|---|---|---|---|---|---|
|1 |横浜BC |<b>河村 勇輝 |3741.83 |1006 |0.268852|
|2 |名古屋D |齋藤 拓実 |4358.26 |1088 |0.249641|
|3 |横浜BC |森井 健太 |3736.77 |928 |0.248343|
|4 |広島 |古野 拓巳 |878.90 |217 |0.246900|
|5 |京都 |マイケル・クレイグ |92.58 |22 |0.237632|
|6 |広島 |田渡 凌 |1337.73 |300 |0.224261|
|7 |大阪 |伊藤 達哉 |2627.77 |585 |0.222622|
|8 |三河 |カイル・コリンズワース |2099.30 |463 |0.220550|
|9 |川崎 |綱井 勇介 |182.33 |40 |0.219382|
|10 |琉球 |並里 成 |4451.60 |972 |0.218348|

----

##### B1リーグ 通算最多ターンオーバ数ランキング（2020年～） (2024/02/23時点)
ターンオーバ数（シュート以外で攻守が変わる数）が上位10選手に4選手がランクインしていることがわかりました。
これは、アシストが多いほどミスが増えやすいということかと思いますので、妥当な結果だと考えています。

|Rank|team |name |minutes |turn_over |turn_over_per_minutes|
|---|---|---|---|---|---|
|1 |川崎 |ニック・ファジーカス |5832.25 |514 |0.088131|
|2 |島根 |<b>ペリン・ビュフォード |5873.64 |500 |0.085126|
|3 |千葉J |<b>富樫 勇樹 |5631.14 |447 |0.079380|
|4 |SR渋谷 |ベンドラメ 礼生 |5461.73 |422 |0.077265|
|5 |三河 |<b>ダバンテ・ガードナー |6208.42 |400 |0.064429|
|6 |SR渋谷 |チャールズ・ジャクソン |5468.77 |390 |0.071314|
|7 |富山 |岡田 侑大 |4664.35 |384 |0.082327|
|8 |横浜BC |<b>河村 勇輝 |3741.83 |383 |0.102356|
|9 |名古屋D |齋藤 拓実 |4358.26 |377 |0.086502|
|10 |川崎 |藤井 祐眞 |5051.66 |377 |0.074629|

----

##### B1リーグ 通算最多ターンオーバ分間数ランキング（2020年～） (2024/02/23時点)
分間にすると結果ががらりと変わりました。
|Rank|team |name |minutes |turn_over |turn_over_per_minutes|
|---|---|---|---|---|---|
|1 |横浜BC |ストックマンJr.　ケドリック |492.48 |65 |0.131985|
|2 |富山 |マイルズ・ヘソン |846.00 |111 |0.131206|
|3 |新潟 |スティーブン・グリーン |340.83 |42 |0.123229|
|4 |仙台 |ラショーン・トーマス |1301.20 |159 |0.122195|
|5 |大阪 |デイビッド・ドブラス |1578.90 |183 |0.115903|
|6 |富山 |ジュリアン・マブンガ |3267.88 |370 |0.113223|
|7 |富山 |コーディ・デンプス |929.05 |101 |0.108713|
|8 |三遠 |高橋 快成 |387.15 |42 |0.108485|
|9 |信州 |ジャスティン・マッツ |755.32 |81 |0.107239|
|10 |三遠 |ネナド・ミリェノヴィッチ |470.32 |50 |0.106311|

----

##### B1リーグ 通算最多スティール数ランキング（2020年～） (2024/02/23時点)
ペリン・ビュフォード選手がランクイン
|Rank|team |name |minutes |steel_times |steel_times_per_minutes|
|---|---|---|---|---|---|
|1 |三遠 |川嶋 勇人 |3929.10 |303 |0.077117|
|2 |秋田 |中山 拓哉 |4661.30 |291 |0.062429|
|3 |SR渋谷 |ベンドラメ 礼生 |5461.73 |279 |0.051083|
|4 |島根 |<b>ペリン・ビュフォード |5873.64 |262 |0.044606|
|5 |川崎 |藤井 祐眞 |5051.66 |240 |0.047509|
|6 |SR渋谷 |ジェームズ・マイケル・マカドゥ |3818.87 |239 |0.062584|
|7 |SR渋谷 |チャールズ・ジャクソン |5468.77 |238 |0.043520|
|8 |名古屋D |齋藤 拓実 |4358.26 |236 |0.054150|
|9 |群馬 |マイケル・パーカー |4374.97 |231 |0.052800|
|10 |宇都宮 |ライアン・ロシター |4941.37 |230 |0.046546|

----

##### B1リーグ 通算最多スティール分間数ランキング（2020年～） (2024/02/23時点)
|Rank|team |name |minutes |steel_times |steel_times_per_minutes|
|---|---|---|---|---|---|
|1 |三遠 |川嶋 勇人 |3929.10 |303 |0.077117|
|2 |千葉J |コー・フリッピン |3132.16 |224 |0.071516|
|3 |川崎 |パブロ・アギラール |2701.54 |188 |0.069590|
|4 |仙台 |ラショーン・トーマス |1301.20 |89 |0.068398|
|5 |長崎 |馬場 雄大 |941.27 |63 |0.066931|
|6 |佐賀 |レイナルド・ガルシア |1049.22 |68 |0.064810|
|7 |新潟 |スティーブン・グリーン |340.83 |22 |0.064548|
|8 |広島 |ジャマリ・トレイラー |778.58 |49 |0.062935|
|9 |SR渋谷 |ジェームズ・マイケル・マカドゥ |3818.87 |239 |0.062584|
|10 |秋田 |中山 拓哉 |4661.30 |291 |0.062429|

----

### データの整合性について
2024/2/23時点の結果のうち、4選手に着目すると、整合性はあっていそうです。
* ペリン・ビュフォード 選手の2020年からの通算得点数は3711
　（2023-24：768、2022-23：1216、2021-22：991、2020-21：650）
* ダバンテ・ガードナー 選手の2020年からの通算得点数は3951
　（2023-24：716、2022-23：1246、2021-22：914、2020-21：1075）
* 富樫 勇樹 選手の2020年からの通算得点数は3067
　（2023-24：775、2022-23：900、2021-22：605、2020-21：787）
* 河村 勇輝 選手の2020年からの通算アシスト数は1006
　（2023-24：272、2022-23：440、2021-22：239、2020-21：55）

### 結果の考察
4選手は高い得点能力だけでなく・アシストも多いことがわかりました。
その一方でターンオーバが目出しました。
では、以下の参考記事で4選手のターンオーバ数当たりのアシスト数を確認するとどうなるか。
参考：https://basket-count.com/article/detail/133669

|選手|アシスト/ターンオーバ|
|---|---|
|ペリン・ビュフォード|2.384|
|富樫 勇樹|2.545861298|
|<b>河村 勇輝|<b>2.626631854|
|ダバンテ・ガードナー|2.15|

すると、河村 勇輝選手が最もアシスト効率が良い結果となりました。
得点効率かつアシスト効率も高いことから、河村 勇輝選手がすごい選手であるとわかりました。


----

### 実装するなかで問題が出た個所
2020～2024現在のデータを実際のBリーグの結果との整合性をチェックすると、何点か問題が発生しました。原因を確認し、以下の対処方法を行いました。

---

#### 事象1.特定チームのデータが入らない
* 原因：リーグ昇格降格でclubのID番号が変わっているため
* 対処方法：各年のチームのclubのID番号のリストを持たせるよう修正
```
    clubs2020 = [696, 704, 728, 726, 700, 727, 706, 701, 729, 703, 699, 720, 698, 693, 695, 721, 702, 697, 694, 716]
    clubs2021 = [727, 704, 729, 720, 701, 713, 728, 696, 706, 721, 702, 698, 703, 712, 726, 693, 700, 716, 697, 694, 699, 695]
    clubs2022 = [704, 729, 721, 720, 726, 727, 694, 713, 701, 702, 712, 696, 697, 693, 728, 700, 706, 699, 698, 695, 716, 703, 717, 692]
    clubs2023 = [702, 692, 693, 712, 703, 713, 704, 706, 726, 727, 694, 696, 716, 697, 728, 717, 729, 699, 700, 720, 721, 1638, 2488, 701]

    for year in years:
        clubs = []
        if year == 2019:
            clubs = clubs2019
        elif year == 2020:
            clubs = clubs2020
        elif year == 2021:
            clubs = clubs2021
        elif year == 2022:
            clubs = clubs2022
        elif year == 2023:
            clubs = clubs2023
        else:
            print("Invalid year")
```
---

#### 事象2.選手も得点が過剰もしく過小計上される
* 原因：引退選手が存在する場合、現役選手とは異なるタグ（リンクの有り無し）となっているため。
    ```
    <span class="link-line text" data-font="sm" data-font-sp="xs">
    <span class="text" data-font="sm" data-font-sp="xs">
    ```
* 対処方法：BeautifulSoupで欲しい下記データを取得するため、`soup.find_all(attrs={"data-font-sp": "xs"})`に変更
    ```
    name = soup.find_all(attrs={"data-font-sp": "xs"})
    ```

---

#### 事象3.statsの値で余計な行が集計対象で表示される。
* 原因：選手が20名以上表示されている場合、以下のようなヘッダー行が集計対象となってしまうため。
	```
	<tr class="tips-parent light-color"><th class="table-title table-title-nosort js-table-title-nosort table-stickey-col" data-tips="順位" rowspan="2">順位</th><th class="table-title table-title-nosort js-table-title-nosort player-name table-stickey-col" data-tips="選手情報" rowspan="2">選手</th><th class="table-title table-title-nosort js-table-title-nosort" data-tips="クラブ名" rowspan="2">クラブ</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="2">試合数</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="2">プレイ時間</th><th class="table-title table-title-nosort js-table-title-nosort">得点</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="3">フィールドゴール</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="3">2Pt</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="3">3Pt</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="3">フリースロー</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="3">リバウンド</th><th class="table-title table-title-nosort js-table-title-nosort">アシスト</th><th class="table-title table-title-nosort js-table-title-nosort">ターンオーバー</th><th class="table-title table-title-nosort js-table-title-nosort">スティール</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="2">ブロック</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="2">ファウル</th><th class="table-title table-title-nosort js-table-title-nosort" colspan="2">貢献度</th></tr>
	
	
	144                     split_time = stats[j+2].contents[5].text.split(':')
	    145                     print(split_time)
	--> 146                     minute = int(split_time[0]) + round((int(split_time[1]) / 60), 2)
	    147 
	    148                     data = (date, team[j].text, name[j].text,
	
	ValueError: invalid literal for int() with base 10: '得点'
	```
* 対処方法：上記の行を除外するよう、BeautifulSoupの削除系メソッドを使用
 	```
	    for row in soup.find_all("tr", class_="tips-parent light-color"):
	        row.extract()
	    stats = soup.find_all("tr")
	```
参考：https://yu-nix.com/archives/bs4-del/

---

## あとがき
* 繰り返しにはなりますが、Webスクレイピングは高負荷をかけてしまう可能性があります。
* 負荷のかからない適切な処理間隔でかつ、規約違反を確認の上利用をお願いします。
（XやYahooFinanceなどはサービス利用規約にスクレイピング禁止や自動化された手段禁止といった記載があるので、利用規約をチェックしましょう。）
* データ分析結果はあくまでも個人見解ですので、参考程度に留めていただければと思います。
* 2020-21、2021-22、2022-23、2023-24（2024/2/23まで）の成績を対象としています。試合が行われる度に結果は変わってきますのでご認識頂ければと思います。

---

## 参考
https://www.bleague.jp/stats/
https://www.bleague.jp/roster_detail/?PlayerID=33094
https://www.bleague.jp/roster_detail/?PlayerID=9040
https://www.bleague.jp/roster_detail/?PlayerID=30460
https://www.bleague.jp/roster_detail/?PlayerID=9055
https://pig-data.jp/blog_news/blog/scraping-crawling/web5/
https://qiita.com/ymtst/items/884df2676a37c0aa2773