0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

背景

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 島根 ペリン・ビュフォード 2051.15 1302 0.634766
2 三河 ダバンテ・ガードナー 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 河村 勇輝 1469.08 1013 0.689547
7 仙台 ラショーン・トーマス 1072.40 725 0.676054
8 富山 ブライス・ジョンソン 964.92 650 0.673631
9 京都 ノヴァー・ガドソン 306.10 206 0.672983
10 三河 ダバンテ・ガードナー 1871.33 1246 0.665837

B1リーグ全体の選手の分間得点数を分布で見ると、
1分間に0.6点以上取る選手はごく少数であることがわかります。
Untitled.png


B1リーグ 2020~通算得点ランキング(2020年~通算) (2024/02/23時点)

2020年~通算得点の上位10位になります。

name points
1 ダバンテ・ガードナー 3951
2 ニック・ファジーカス 3869
3 ペリン・ビュフォード 3711
4 セバスチャン・サイズ 3472
5 ニック・メイヨ 3359
6 ドウェイン・エバンス 3308
7 ジョシュ・ホーキンソン 3154
8 ショーン・ロング 3105
9 安藤 誓哉 3081
10 富樫 勇樹 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 ダバンテ・ガードナー 3951 6208.42 0.636394
5 ライアン・ケリー 2370 3732.64 0.634939
6 ペリン・ビュフォード 3711 5873.64 0.631806
7 ノヴァー・ガドソン 2103 3380.12 0.622167
8 コティ・クラーク 2353 3789.40 0.620943
9 河村 勇輝 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 富樫 勇樹 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 富樫 勇樹 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 島根 ペリン・ビュフォード 5873.64 1192 0.202941
2 千葉J 富樫 勇樹 5631.14 1138 0.202091
3 名古屋D 齋藤 拓実 4358.26 1088 0.249641
4 川崎 藤井 祐眞 5051.66 1013 0.200528
5 横浜BC 河村 勇輝 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 三河 ダバンテ・ガードナー 6208.42 860 0.138522

B1リーグ 通算最多アシスト分間成功数ランキング(2020年~) (2024/02/23時点)

河村 勇輝選手がランクイン。

Rank team name minutes asst_times asst_times_per_minutes
1 横浜BC 河村 勇輝 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 島根 ペリン・ビュフォード 5873.64 500 0.085126
3 千葉J 富樫 勇樹 5631.14 447 0.079380
4 SR渋谷 ベンドラメ 礼生 5461.73 422 0.077265
5 三河 ダバンテ・ガードナー 6208.42 400 0.064429
6 SR渋谷 チャールズ・ジャクソン 5468.77 390 0.071314
7 富山 岡田 侑大 4664.35 384 0.082327
8 横浜BC 河村 勇輝 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 島根 ペリン・ビュフォード 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
河村 勇輝 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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?