ラベル Pandas の投稿を表示しています。 すべての投稿を表示
ラベル Pandas の投稿を表示しています。 すべての投稿を表示

2025年7月29日火曜日

nba_apiを使いNBAデータを取得する

NBAデータ取得

NBAデータを分析する場合には、まず最初にデータ取得が必要です。
Kaggleなどのデータサイトから検索してもいいし、データサイトからスクレイピングしてる方もいると思います。
そしてPythonのライブラリからもNBAデータを提供してるものがあるので、それを使ってみたいと思います。
nba_apiです。
使用するには
pip install nba_api
でライブラリをインストールします。

nba_apiライブラリ

nba_apiには、沢山のメソッドがあり、かなり詳しいデータが手に入りますが、反面、どこに何のデータが入ってるか使い方に迷います。
https://github.com/swar/nba_api/tree/masterのサイトにexampleなどもありますが少ししかありません。
https://github.com/swar/nba_api/tree/master/docs/nba_api/stats/endpointsから、メソッド名で当たりをつけ、どれが探してるデータか一つ一つ読んで見つけましょう。

今回は、レギュラーシーズンデータを取得してみたいと思います。
PlayerGameLogsが良さそうなので、それを使います。
#! /usr/bin/env python

import numpy as np
import pandas as pd
from nba_api.stats.endpoints import playergamelogs

season_df = playergamelogs.PlayerGameLogs(
    season_nullable = '2024-25',
).player_game_logs.get_data_frame()

print(season_df.head(50))
  
  

引数 season_nullable に取得したいシーズン '2024-25' を入れます。

player_game_logs.get_data_frame()でデータフレーム形式で取得出来ます。


2025年6月18日水曜日

NBA選手シーズンごとの平均リバウンド

NBA選手のシーズン当たりのリバウンド

シーズン毎の得点に続き、シーズン毎のリバウンドを可視化してみます。

外れ値を省くために、1シーズン40試合以上出場した選手で構成しています。

#! /usr/bin/env python

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

sns.set()

fn = "data/player_per_game.csv"
df = pd.read_csv(fn)

df2 = df[df["g"] >= 40] 

desc = df2.groupby("season")["TRB"].describe()
print(desc)

count mean std min 25% 50% 75% max
season
1951 108.0 4.960185 2.849986 1.3 2.900 4.35 6.525 16.4
1952 94.0 5.255319 3.140770 1.0 2.925 4.55 6.950 13.5
1953 102.0 5.138235 3.093143 0.9 3.000 4.25 6.875 14.4
1954 91.0 5.126374 3.164871 0.9 2.800 4.30 6.900 15.3
1955 81.0 5.669136 3.186952 1.2 3.400 4.60 7.600 15.1
1956 80.0 5.626250 3.401479 0.9 3.175 4.45 7.650 16.3
1957 83.0 5.906024 3.658580 1.8 3.400 4.60 8.050 19.6
1958 78.0 6.698718 4.116217 1.7 3.850 5.50 9.550 22.7
1959 85.0 6.207059 3.708510 1.8 3.600 5.30 7.900 23.0
1960 87.0 6.686207 4.410774 1.8 3.800 5.30 8.450 27.0
1961 83.0 6.719277 4.765052 1.2 3.750 5.70 8.200 27.2
1962 100.0 6.430000 4.680488 0.4 3.025 5.80 8.050 25.7
1963 94.0 6.020213 4.181155 0.9 3.000 5.15 7.175 24.3
1964 102.0 5.810784 4.364481 1.1 2.925 4.45 7.350 24.7
1965 94.0 6.128723 4.669637 1.0 2.725 4.75 8.050 24.1
1966 103.0 6.262136 4.472599 1.3 3.200 5.20 7.800 24.6
1967 108.0 6.163889 4.304040 1.1 3.300 5.15 7.650 24.2
1968 136.0 5.927206 4.252833 0.5 2.800 4.70 7.625 23.8
1969 146.0 6.357534 4.192914 0.9 3.500 4.85 8.800 21.1
1970 154.0 5.625974 3.667144 0.9 3.025 4.50 7.475 17.7
1971 181.0 5.475138 3.671193 0.5 3.000 4.50 7.000 18.2
1972 189.0 5.408466 3.859353 0.4 2.800 4.10 6.900 19.2
1973 194.0 5.215464 3.676542 0.8 2.600 4.15 6.450 18.6
1974 184.0 4.972283 3.410149 0.7 2.700 4.00 6.225 18.1
1975 210.0 4.678095 3.153868 0.6 2.200 3.90 6.175 14.8
1976 199.0 4.830151 3.142201 0.6 2.600 4.00 6.250 16.9
1977 260.0 4.676923 3.061885 0.6 2.475 3.80 6.400 14.4
1978 259.0 4.747490 3.039906 0.8 2.600 3.60 6.550 15.7
1979 247.0 4.559514 3.029057 0.8 2.300 3.60 6.050 17.6
1980 248.0 4.656048 2.829866 0.7 2.375 4.00 6.425 15.0
1981 262.0 4.246947 2.670696 0.7 2.100 3.60 5.875 14.8
1982 270.0 4.197778 2.653551 0.6 2.100 3.40 5.700 14.7
1983 277.0 4.253069 2.669222 0.9 2.300 3.60 5.700 15.3
1984 262.0 4.107252 2.664220 0.7 2.100 3.45 5.700 13.4
1985 263.0 4.207224 2.625547 0.6 2.300 3.40 5.650 13.1
1986 260.0 4.213846 2.669888 0.7 2.075 3.45 5.725 13.1
1987 267.0 4.242697 2.804114 0.5 2.000 3.50 5.750 14.6
1988 275.0 4.285455 2.693871 0.6 2.300 3.50 6.050 13.0
1989 292.0 4.261301 2.623311 0.5 2.300 3.55 5.900 13.5
1990 312.0 4.235577 2.640006 0.5 2.375 3.60 5.800 14.0
1991 304.0 4.334539 2.647963 0.6 2.300 3.50 5.825 13.8
1992 310.0 4.260968 2.847617 0.4 2.225 3.45 5.800 18.7
1993 308.0 4.208766 2.792828 0.3 2.275 3.50 5.500 18.3
1994 304.0 4.294737 2.786668 0.7 2.300 3.60 5.500 17.3
1995 314.0 4.174522 2.698690 0.5 2.225 3.30 5.600 16.8
1996 343.0 4.156560 2.615095 0.6 2.250 3.40 5.500 14.9
1997 337.0 4.225223 2.714871 0.4 2.200 3.50 5.500 16.1
1998 342.0 4.232164 2.577404 0.7 2.200 3.50 5.600 15.0
1999 217.0 4.602304 2.575066 1.0 2.700 3.80 6.000 13.0
2000 327.0 4.210398 2.465097 0.6 2.250 3.70 5.700 14.1
2001 335.0 4.276418 2.538543 0.5 2.500 3.70 5.500 14.1
2002 332.0 4.287048 2.386337 0.8 2.600 3.90 5.400 13.0
2003 324.0 4.251235 2.390933 0.4 2.500 3.75 5.525 15.4
2004 348.0 4.263506 2.419223 0.6 2.500 3.80 5.300 13.9
2005 361.0 4.198061 2.427029 0.5 2.400 3.50 5.500 13.5
2006 345.0 4.140290 2.346627 0.4 2.300 3.60 5.200 12.7
2007 348.0 4.118391 2.485521 0.7 2.300 3.40 5.400 12.8
2008 342.0 4.285380 2.571218 0.5 2.400 3.55 5.300 14.2
2009 350.0 4.182857 2.400595 0.8 2.325 3.60 5.300 13.8
2010 348.0 4.204310 2.562793 0.6 2.300 3.50 5.500 13.2
2011 380.0 4.027105 2.375063 0.6 2.400 3.40 5.100 15.2
2012 305.0 4.275410 2.394776 0.8 2.500 3.70 5.300 14.5
2013 365.0 3.986301 2.405506 0.4 2.200 3.30 5.200 12.4
2014 366.0 4.127596 2.449787 0.8 2.400 3.50 5.200 13.6
2015 385.0 4.177143 2.338558 0.7 2.400 3.60 5.300 15.0
2016 360.0 4.134167 2.400563 0.7 2.400 3.50 5.325 14.8
2017 369.0 4.204878 2.443109 0.6 2.600 3.50 5.500 14.1
2018 355.0 4.243944 2.435144 0.4 2.500 3.80 5.400 16.0
2019 391.0 4.353964 2.510497 0.7 2.600 3.80 5.300 15.6
2020 335.0 4.497015 2.457030 1.0 2.700 4.10 5.700 15.8
2021 335.0 4.457612 2.446517 0.9 2.700 3.90 5.600 14.3
2022 384.0 4.383073 2.424720 0.8 2.675 3.90 5.400 14.7
2023 385.0 4.244416 2.354335 0.8 2.600 3.70 5.300 12.5
2024 376.0 4.213298 2.353943 0.8 2.600 3.70 5.200 13.7

結果


1950年代から60年代がレギュラー選手当たり1試合平均5リバウンド以上と高いですね。maxは歴代シーズンリバウンド王です。
ウィルト・チェンバレン選手やビル・ラッセル選手が1試合当たり20リバウンド以上と今では考えられない数値を叩き出しています。
3ポイントが導入された1980年以降は平均4リバウンド台を安定して推移しています。

現代バスケは3ポイントが重視され、戦略や平均得点が変わっていく中、レギュラー選手たちの平均リバウンド回数は1980年から意外に安定していることが分かります。

2024年7月24日水曜日

NBAの3ポイント攻撃が多い選手ランキング

3ポイント得点特化型選手


NBAでは、 3ポイント攻撃が重要になったとはいえ、全体で見ればまだまだ2ポイント攻撃の方が主流です。

その中で3ポイント成功数の方が多い選手を3PM÷2PMという計算式でランキングしてみます。

# 外れ値を弾くために3PMを1試合平均3回以下の選手は抜きます
df = df[df['3PM'] >= 3.0]

# 2Pに対する3P成功数の多さを算出します
df['3P/2P%'] = np.round(df['3PM'] / df['2PM'], 3)


2ポイント成功数に対する3ポイント成功数比率ランキング


season player pos age tm g 3PM 3PA 3P% 2PM 2PA 2P% eFG% FTM FTA FT% PPG 3P/2P%
1 2020 Duncan Robinson SG 25.0 MIA 73 3.7 8.3 0.446 0.7 1.1 0.654 0.667 0.9 1.0 0.931 13.5 5.286
2 2021 Duncan Robinson SF 26.0 MIA 72 3.5 8.5 0.408 0.9 1.4 0.625 0.614 0.9 1.0 0.827 13.1 3.889
3 2022 Malik Beasley SG 25.0 MIN 79 3.0 8.1 0.377 1.2 2.7 0.432 0.532 0.6 0.8 0.817 12.1 2.500
4 2021 Buddy Hield SG 28.0 SAC 71 4.0 10.2 0.391 1.7 3.8 0.446 0.548 1.2 1.5 0.846 16.6 2.353
5 2024 Donte DiVincenzo SG 27.0 NYK 81 3.5 8.7 0.401 2.0 3.7 0.542 0.584 1.1 1.4 0.754 15.5 1.750
6 2020 J.J. Redick SG 35.0 NOP 60 3.0 6.6 0.453 1.8 3.9 0.453 0.596 2.8 3.1 0.892 15.3 1.667
7 2023 Tim Hardaway Jr. SG 30.0 DAL 71 3.0 7.7 0.385 1.8 4.2 0.431 0.527 1.8 2.3 0.770 14.4 1.667
8 2023 Buddy Hield SF 30.0 IND 80 3.6 8.5 0.425 2.3 4.5 0.518 0.596 1.3 1.6 0.822 16.8 1.565
9 2022 Evan Fournier SG 29.0 NYK 80 3.0 7.7 0.389 2.0 4.3 0.465 0.541 1.0 1.4 0.708 14.1 1.500
10 2017 Eric Gordon SG 28.0 HOU 75 3.3 8.8 0.372 2.2 4.7 0.468 0.527 2.0 2.3 0.840 16.2 1.500
11 2021 Joe Harris SF 29.0 BRK 69 3.1 6.4 0.475 2.1 3.8 0.555 0.654 0.7 0.9 0.778 14.1 1.476
12 2018 Kyle Lowry PG 31.0 TOR 78 3.1 7.6 0.399 2.1 4.5 0.474 0.553 2.9 3.3 0.854 16.2 1.476
13 2020 Devonte' Graham PG 24.0 CHO 63 3.5 9.3 0.373 2.4 6.0 0.397 0.495 3.0 3.7 0.820 18.2 1.458
14 2022 Buddy Hield SG 29.0 TOT 81 3.2 8.8 0.366 2.3 4.7 0.482 0.526 1.4 1.6 0.874 15.6 1.391
15 2019 Eric Gordon SG 30.0 HOU 68 3.2 8.8 0.360 2.5 5.0 0.497 0.525 1.8 2.2 0.783 16.2 1.280
16 2019 Stephen Curry PG 30.0 GSW 69 5.1 11.7 0.437 4.0 7.7 0.525 0.604 3.8 4.2 0.916 27.3 1.275
17 1996 Dennis Scott SF 27.0 ORL 82 3.3 7.7 0.425 2.7 6.0 0.458 0.559 2.2 2.7 0.820 17.5 1.222
18 2023 Klay Thompson SG 32.0 GSW 69 4.4 10.6 0.412 3.6 7.6 0.470 0.556 1.7 1.9 0.879 21.9 1.222
19 2024 Klay Thompson SF 33.0 GSW 77 3.5 9.0 0.387 2.9 5.7 0.503 0.551 1.6 1.8 0.927 17.9 1.207
20 2024 Stephen Curry PG 35.0 GSW 74 4.8 11.8 0.408 4.0 7.7 0.515 0.573 4.0 4.4 0.923 26.4 1.200
21 2022 Fred VanVleet PG 27.0 TOR 65 3.7 9.9 0.377 3.1 7.0 0.440 0.513 3.0 3.4 0.874 20.3 1.194
22 2020 Buddy Hield SG 27.0 SAC 72 3.8 9.6 0.394 3.2 6.6 0.479 0.545 1.6 1.9 0.846 19.2 1.187
23 2022 Stephen Curry PG 33.0 GSW 64 4.5 11.7 0.380 3.9 7.4 0.527 0.554 4.3 4.7 0.923 25.5 1.154
24 2024 Fred VanVleet PG 29.0 HOU 73 3.1 8.0 0.387 2.7 5.9 0.454 0.527 2.7 3.1 0.860 17.4 1.148
25 2019 J.J. Redick SG 34.0 PHI 76 3.2 8.0 0.397 2.8 5.6 0.502 0.557 3.0 3.4 0.894 18.1 1.143
26 2018 Eric Gordon SG 29.0 HOU 69 3.2 8.8 0.359 2.9 5.2 0.544 0.540 2.8 3.5 0.809 18.0 1.103
27 2021 Stephen Curry PG 32.0 GSW 63 5.3 12.7 0.421 5.1 9.0 0.569 0.605 5.7 6.3 0.916 32.0 1.039
28 2021 Tim Hardaway Jr. SG 28.0 DAL 70 3.0 7.6 0.391 2.9 5.5 0.524 0.560 2.0 2.5 0.816 16.6 1.034
29 2008 Peja Stojaković SF 30.0 NOH 77 3.0 6.8 0.441 2.9 6.5 0.438 0.552 1.7 1.8 0.929 16.4 1.034
30 2024 Bogdan Bogdanović SG 31.0 ATL 79 3.0 8.1 0.374 2.9 5.8 0.503 0.537 1.9 2.1 0.921 16.9 1.034



1位、2位とダンカン・ロビンソン選手が突出しています。
2019-20年シーズンは2ポイント成功数の5倍以上3ポイント成功数で稼いでいます。
3ポイント得点が多いイメージのカリー選手でも最高1.27倍くらいなので、アウトサイド特化型の選手と言っていいでしょう。
この選手はNBA史上最速で通算3ポイント成功900本を記録したことでも有名です。

NBAシーズン3ポイント選手ランキング

NBAの3ポイント成功数の多い選手


以前シーズン毎3ポイントチームの表を出しましたが、今回はシーズン毎3ポイント攻撃の多い選手ランキングを作ってみました。

 
print( df.sort_values("3PM", ascending=False))

シーズン毎1試合平均3ポイント成功数の多い選手ランキング


season player pos age tm g MP 3PM 3PA 3P% 2PM 2PA 2P% eFG% FTM FTA FT% PPG
1 2021 Stephen Curry PG 32.0 GSW 63 34.2 5.3 12.7 0.421 5.1 9.0 0.569 0.605 5.7 6.3 0.916 32.0
2 2016 Stephen Curry PG 27.0 GSW 79 34.2 5.1 11.2 0.454 5.1 9.0 0.566 0.630 4.6 5.1 0.908 30.1
3 2019 Stephen Curry PG 30.0 GSW 69 33.8 5.1 11.7 0.437 4.0 7.7 0.525 0.604 3.8 4.2 0.916 27.3
4 2024 Stephen Curry PG 35.0 GSW 74 32.7 4.8 11.8 0.408 4.0 7.7 0.515 0.573 4.0 4.4 0.923 26.4
5 2019 James Harden PG 29.0 HOU 78 36.8 4.8 13.2 0.368 6.0 11.3 0.528 0.541 9.7 11.0 0.879 36.1
6 2022 Stephen Curry PG 33.0 GSW 64 34.5 4.5 11.7 0.380 3.9 7.4 0.527 0.554 4.3 4.7 0.923 25.5
7 2020 James Harden SG 30.0 HOU 68 36.5 4.4 12.4 0.355 5.5 9.9 0.556 0.543 10.2 11.8 0.865 34.3
8 2023 Klay Thompson SG 32.0 GSW 69 33.0 4.4 10.6 0.412 3.6 7.6 0.470 0.556 1.7 1.9 0.879 21.9
9 2023 Damian Lillard PG 32.0 POR 58 36.3 4.2 11.3 0.371 5.4 9.4 0.574 0.564 8.8 9.6 0.914 32.2
10 2021 Damian Lillard PG 30.0 POR 67 35.8 4.1 10.5 0.391 4.9 9.4 0.519 0.554 6.7 7.2 0.928 28.8
11 2020 Damian Lillard PG 29.0 POR 66 37.5 4.1 10.2 0.401 5.4 10.2 0.524 0.563 7.0 7.8 0.888 30.0
12 2017 Stephen Curry PG 28.0 GSW 79 33.4 4.1 10.0 0.411 4.4 8.3 0.537 0.580 4.1 4.6 0.898 25.3
13 2024 Luka Dončić PG 24.0 DAL 70 37.5 4.1 10.6 0.382 7.4 13.0 0.573 0.573 6.8 8.7 0.786 33.9
14 2021 Buddy Hield SG 28.0 SAC 71 34.3 4.0 10.2 0.391 1.7 3.8 0.446 0.548 1.2 1.5 0.846 16.6
15 2019 Paul George SF 28.0 OKC 77 36.9 3.8 9.8 0.386 5.4 11.1 0.484 0.529 5.9 7.0 0.839 28.0
16 2020 Buddy Hield SG 27.0 SAC 72 30.8 3.8 9.6 0.394 3.2 6.6 0.479 0.545 1.6 1.9 0.846 19.2
17 2018 James Harden SG 28.0 HOU 72 35.4 3.7 10.0 0.367 5.4 10.1 0.531 0.541 8.7 10.1 0.858 30.4
18 2020 Duncan Robinson SG 25.0 MIA 73 29.7 3.7 8.3 0.446 0.7 1.1 0.654 0.667 0.9 1.0 0.931 13.5
19 2022 Fred VanVleet PG 27.0 TOR 65 37.9 3.7 9.9 0.377 3.1 7.0 0.440 0.513 3.0 3.4 0.874 20.3
20 2024 CJ McCollum PG 32.0 NOP 66 32.7 3.6 8.4 0.429 3.7 7.5 0.492 0.572 1.7 2.1 0.827 20.0
21 2023 Buddy Hield SF 30.0 IND 80 31.0 3.6 8.5 0.425 2.3 4.5 0.518 0.596 1.3 1.6 0.822 16.8
22 2023 Donovan Mitchell SG 26.0 CLE 68 35.8 3.6 9.3 0.386 6.4 11.3 0.566 0.572 4.7 5.4 0.867 28.3
23 2015 Stephen Curry PG 26.0 GSW 80 32.7 3.6 8.1 0.443 4.6 8.7 0.528 0.594 3.9 4.2 0.914 23.8
24 2022 Donovan Mitchell SG 25.0 UTA 67 33.8 3.5 9.8 0.355 5.7 10.8 0.533 0.533 4.0 4.7 0.853 25.9
25 2020 Devonte' Graham PG 24.0 CHO 63 35.1 3.5 9.3 0.373 2.4 6.0 0.397 0.495 3.0 3.7 0.820 18.2
26 2016 Klay Thompson SG 25.0 GSW 80 33.3 3.5 8.1 0.425 4.7 9.2 0.510 0.569 2.4 2.8 0.873 22.1
27 2024 Donte DiVincenzo SG 27.0 NYK 81 29.1 3.5 8.7 0.401 2.0 3.7 0.542 0.584 1.1 1.4 0.754 15.5
28 2013 Stephen Curry PG 24.0 GSW 78 38.2 3.5 7.7 0.453 4.5 10.1 0.449 0.549 3.4 3.7 0.900 22.9
29 2021 Duncan Robinson SF 26.0 MIA 72 31.4 3.5 8.5 0.408 0.9 1.4 0.625 0.614 0.9 1.0 0.827 13.1
30 2024 Klay Thompson SF 33.0 GSW 77 29.7 3.5 9.0 0.387 2.9 5.7 0.503 0.551 1.6 1.8 0.927 17.9


ステフィン・カリー選手が3Pの名手なのは今更ですが、歴代TOP10の内、5つランクインしてるのはもう別次元です。
 2020-21シーズンは1試合平均12.7回の3Pシュートを狙い、5.3回沈ませており、この年の得点王にも輝いています。 2Pシュート数より多いのですから遠距離攻撃の名人ですね。 
また、ジェームズ・ハーデン選手やデイミアン・リラード選手も3Pシュートの多い選手というが分かります。

2024年7月15日月曜日

NBAチームの年別勝率と3ポイント成功数の関係

前回は数年分のチーム平均の散布図でしたが、こちらは年別の散布図です。

上に行くほどシーズン勝率が高く、右に行くほど平均3ポイント成功数の多いチームになります。

赤点はファイナルの優勝チームです。
 

NBAチームの勝率と3P成功数の関係 (2024年)


 

NBAチームの勝率と3P成功数の関係 (2023年)

NBAチームの勝率と3P成功数の関係 (2022年)

NBAチームの勝率と3P成功数の関係 (2021年)

NBAチームの勝率と3P成功数の関係 (2020年)

NBAチームの勝率と3P成功数の関係 (2019年)

NBAチームの勝率と3P成功数の関係 (2018年)

NBAチームの勝率と3P成功数の関係 (2017年)

NBAチームの勝率と3P成功数の関係 (2016年)

NBAチームの勝率と3P成功数の関係 (2015年)

NBAチームの勝率と3P成功数の関係 (2014年)

シーズンやチームの特性により異なりますが、近年のNBAでは3ポイント攻撃が多いチームの重要性は高まっています。

NBAの3ポイント成功数と勝率

3ポイントシュートと勝率の関係


NBAでは3ポイントシュート比率は増えていますが、それが勝ちに繋がっているかグラフを作成してみます。 
 3ポイントシュートが戦略的に注目されてきた2012年辺りからの相関関係を求めてみます。


2P3Pと各相関

# 2012年から現在まで
df = df[df['season'] >= 2012]

corr = df.corr(numeric_only=True)
corr2 = df.corr(numeric_only=True, method="spearman")

print(corr)
print(corr2)

ピアソンの相関係数
               3PM       3PA       3P%       2PM       2PA       2P%  win_rate
3PM       1.000000  0.984286  0.413434 -0.515724 -0.888434  0.779407  0.214300
3PA       0.984286  1.000000  0.253633 -0.531972 -0.885692  0.755842  0.115326
3P%       0.413434  0.253633  1.000000 -0.089943 -0.314804  0.376354  0.579180
2PM      -0.515724 -0.531972 -0.089943  1.000000  0.757617 -0.043965  0.087083
2PA      -0.888434 -0.885692 -0.314804  0.757617  1.000000 -0.682443 -0.194469
2P%       0.779407  0.755842  0.376354 -0.043965 -0.682443  1.000000  0.400107
win_rate  0.214300  0.115326  0.579180  0.087083 -0.194469  0.400107  1.000000

スピアマンの相関係数
               3PM       3PA       3P%       2PM       2PA       2P%  win_rate
3PM       1.000000  0.983388  0.385376 -0.492438 -0.884650  0.788074  0.200737
3PA       0.983388  1.000000  0.232052 -0.512703 -0.880743  0.762114  0.104912
3P%       0.385376  0.232052  1.000000 -0.088104 -0.308361  0.357106  0.563749
2PM      -0.492438 -0.512703 -0.088104  1.000000  0.735107 -0.043060  0.084711
2PA      -0.884650 -0.880743 -0.308361  0.735107  1.000000 -0.685526 -0.196108
2P%       0.788074  0.762114  0.357106 -0.043060 -0.685526  1.000000  0.388398
win_rate  0.200737  0.104912  0.563749  0.084711 -0.196108  0.388398  1.000000

一番右列が勝率と各シュートとの相関係数です。
勝率を高めそうなのは3ポイント成功率(3P%)くらいで後は深い関係はなさそうです。

単純な数値上ではこのように出ましたが、一口に3ポイントと言っても様々な戦略があるのであくまで参考値です。



2024年7月13日土曜日

NBAチームの3ポイント比率の変遷

NBAチームの3ポイントシュート比率

NBAで3ポイントシュートが導入されたのは1970-80年シーズンからです。
大きなルール変更でしたが、当初は遠隔からシュートするより、リング下のビックマンにボールをパスして点を稼ぐのが主流でした。
もちろん上手なシューターもいましたが、ほとんどは3ポイントシュートが無かった時代に試合をしてきた人たちですから遠隔からシュートして効率的に得点しようという発想は無かったでしょう。
とはいえ、身長の低い選手はリング下では不利なので遠隔から決める3ポイントシュートの上手い選手も増えていき、3ポイントを高確率で決める職人的な選手も増えてきました。

3ポイントはNBAの戦略の幅を確実に広げてきました。

そして、ステフィン・カリー選手のようなスペシャルな選手が登場し、NBA全体の戦略を変えてしまうほど3ポイントシュートは重要になっています。
今やビッグマンでも3ポイントが必須となるほど重要な攻撃手法となっています。
3ポイントシュートがどれだけ増えてきたがチーム平均のグラフを作ってみたいと思います。

season g MP FGM FGA FG% 3PM 3PA 3P% 2PM 2PA 2P% FTM FTA FT% PPG
1 2024 82.0 241.4 42.2 88.9 0.474 12.8 35.1 0.366 29.3 53.8 0.545 17.0 21.7 0.784 114.2
2 2023 82.0 241.8 42.0 88.3 0.475 12.3 34.2 0.361 29.6 54.1 0.548 18.4 23.5 0.782 114.7
3 2022 82.0 241.4 40.6 88.1 0.461 12.4 35.2 0.354 28.2 52.9 0.533 16.9 21.9 0.775 110.6
4 2021 72.0 241.4 41.2 88.4 0.466 12.7 34.6 0.367 28.5 53.8 0.530 17.0 21.8 0.778 112.1
5 2020 71.0 241.8 40.9 88.8 0.460 12.2 34.1 0.358 28.7 54.7 0.524 17.9 23.1 0.773 111.8
6 2019 82.0 241.6 41.1 89.2 0.461 11.4 32.0 0.355 29.7 57.2 0.520 17.7 23.1 0.766 111.2
7 2018 82.0 241.4 39.6 86.1 0.460 10.5 29.0 0.362 29.1 57.1 0.510 16.6 21.7 0.767 106.3
8 2017 82.0 241.6 39.0 85.4 0.457 9.7 27.0 0.358 29.4 58.4 0.503 17.8 23.1 0.772 105.6
9 2016 82.0 241.8 38.2 84.6 0.452 8.5 24.1 0.354 29.7 60.5 0.491 17.7 23.4 0.757 102.7
10 2015 82.0 242.0 37.5 83.6 0.449 7.8 22.4 0.350 29.7 61.2 0.485 17.1 22.8 0.750 100.0
11 2014 82.0 242.0 37.7 83.0 0.454 7.7 21.5 0.360 30.0 61.5 0.488 17.8 23.6 0.756 101.0
12 2013 82.0 241.9 37.1 82.0 0.453 7.2 20.0 0.359 30.0 62.1 0.483 16.7 22.2 0.753 98.1
13 2012 66.0 241.9 36.5 81.4 0.448 6.4 18.4 0.349 30.1 63.0 0.477 16.9 22.5 0.752 96.3
14 2011 82.0 241.9 37.2 81.2 0.459 6.5 18.0 0.358 30.8 63.2 0.487 18.6 24.4 0.763 99.6
15 2010 82.0 241.7 37.7 81.7 0.461 6.4 18.1 0.355 31.3 63.6 0.492 18.6 24.5 0.759 100.4
16 2009 82.0 241.7 37.1 80.9 0.459 6.6 18.1 0.367 30.5 62.8 0.485 19.1 24.7 0.771 100.0
17 2008 82.0 241.5 37.3 81.5 0.457 6.6 18.1 0.362 30.7 63.4 0.484 18.8 24.9 0.755 99.9
18 2007 82.0 242.2 36.5 79.7 0.458 6.1 16.9 0.358 30.5 62.8 0.485 19.6 26.1 0.752 98.7
19 2006 82.0 242.1 35.8 79.0 0.454 5.7 16.0 0.358 30.1 63.0 0.478 19.6 26.3 0.745 97.0
20 2005 82.0 241.9 35.9 80.3 0.447 5.6 15.8 0.356 30.3 64.6 0.470 19.7 26.1 0.756 97.2
21 2004 82.0 241.7 35.0 79.8 0.439 5.2 14.9 0.347 29.8 64.9 0.460 18.2 24.2 0.752 93.4
22 2003 82.0 242.0 35.7 80.8 0.442 5.1 14.7 0.349 30.6 66.1 0.463 18.5 24.4 0.758 95.1
23 2002 82.0 241.7 36.2 81.3 0.445 5.2 14.7 0.354 31.0 66.5 0.465 17.9 23.8 0.752 95.5
24 2001 82.0 242.0 35.7 80.6 0.443 4.8 13.7 0.354 30.8 66.9 0.461 18.6 24.9 0.748 94.8
25 2000 82.0 241.5 36.8 82.1 0.449 4.8 13.7 0.353 32.0 68.4 0.468 19.0 25.3 0.750 97.5
26 1999 50.0 241.8 34.2 78.2 0.437 4.5 13.2 0.339 29.7 65.0 0.457 18.8 25.8 0.728 91.6
27 1998 82.0 241.9 35.9 79.7 0.450 4.4 12.7 0.346 31.5 67.0 0.470 19.4 26.3 0.737 95.6
28 1997 82.0 241.9 36.1 79.3 0.455 6.0 16.8 0.360 30.0 62.5 0.480 18.7 25.3 0.738 96.9
29 1996 82.0 241.6 37.0 80.2 0.462 5.9 16.0 0.367 31.2 64.1 0.486 19.5 26.4 0.740 99.5
30 1995 82.0 241.9 38.0 81.5 0.466 5.5 15.3 0.359 32.5 66.2 0.491 19.9 27.1 0.737 101.4
31 1994 82.0 241.1 39.3 84.4 0.466 3.3 9.9 0.333 36.0 74.5 0.483 19.6 26.6 0.734 101.5
32 1993 82.0 241.7 40.7 86.0 0.473 3.0 9.0 0.336 37.7 77.0 0.489 20.9 27.7 0.754 105.3
33 1992 82.0 241.8 41.3 87.3 0.472 2.5 7.6 0.331 38.7 79.7 0.486 20.2 26.7 0.759 105.3
34 1991 82.0 241.8 41.4 87.2 0.474 2.3 7.1 0.320 39.1 80.1 0.488 21.3 27.9 0.765 106.3
35 1990 82.0 241.5 41.5 87.2 0.476 2.2 6.6 0.331 39.3 80.6 0.488 21.8 28.5 0.764 107.0
36 1989 82.0 241.5 42.5 89.0 0.477 2.1 6.6 0.323 40.4 82.4 0.490 22.1 28.8 0.768 109.2
37 1988 82.0 241.3 42.1 87.7 0.480 1.6 5.0 0.316 40.6 82.7 0.490 22.3 29.1 0.766 108.2
38 1987 82.0 241.6 42.6 88.8 0.480 1.4 4.7 0.301 41.2 84.1 0.490 23.2 30.5 0.763 109.9
39 1986 82.0 241.6 43.2 88.6 0.487 0.9 3.3 0.282 42.3 85.3 0.495 22.9 30.3 0.756 110.2
40 1985 82.0 241.4 43.8 89.1 0.491 0.9 3.1 0.282 42.9 86.0 0.499 22.4 29.4 0.764 110.8
41 1984 82.0 242.0 43.5 88.4 0.492 0.6 2.4 0.250 42.9 86.0 0.499 22.6 29.7 0.760 110.1
42 1983 82.0 241.3 43.5 89.7 0.485 0.5 2.3 0.238 43.0 87.4 0.492 20.9 28.3 0.740 108.5
43 1982 82.0 241.6 43.3 88.2 0.491 0.6 2.3 0.262 42.7 86.0 0.497 21.3 28.6 0.746 108.6
44 1981 82.0 241.4 43.0 88.4 0.486 0.5 2.0 0.245 42.5 86.4 0.491 21.7 28.9 0.751 108.1
45 1980 82.0 241.8 43.6 90.6 0.481 0.8 2.8 0.280 42.9 87.9 0.488 21.3 27.8 0.764 109.3

# 1980シーズンからのデータにする
df2 = df[df['season'] >= 1980]

leg = df2[df2['team'] == 'League Average']

plt.bar(leg["season"], leg["3PM"]*3, label="3PM")
plt.bar(leg["season"], leg["2PM"]*2, bottom=leg['3PM']*3, label="2PM")
plt.bar(leg["season"], leg['FTM'], bottom=leg['3PM']*3+leg['2PM']*2, label="FTM")

plt.title("シーズン毎のゴール(2P,3P,FT)の割合")

plt.xlabel("シーズン")
plt.ylabel("平均得点")

plt.legend()
plt.show()


縦軸がシーズンごとの平均得点で青が3ポイントによる得点、オレンジが2ポイントによる得点、緑はフリースローです。
1995~1997年辺りが山になっているのは一時的に3ポイントラインが近くなったためです。
これを見ると3ポイントの得点比率は導入後増え続け、2ポイントによる得点に迫る勢いです。


こちらは平均シュート試投数です。2ポイントシュートと3ポイントシュートとフリースローを全部足し合わせると1試合当たり約110〜120回試投してることになります。

試投数全体が減って平均得点が増えているなら3ポイントシュートは効率が良い得点方法と言えます。

このまま3ポイント得点が増え続け2ポイント得点比率を抜くまで増えるのか、また戦略が変わりミドルシュートを効率的に決めるチームが増えるのか、今後の見どころです。

2024年7月11日木曜日

NBAシーズン最高勝率ランキング

NBAのチーム勝率

データセットからNBAのチーム勝率を計算し、年ごとのランキングにしてみたいと思います。

すべてのチームの年間ゲーム(勝ち数と負け数)のデータを用意し

ゲーム数で割って勝率列を作ります。

# 勝利数÷ゲーム数で勝率の列を作る
df['win_rate'] = np.round(df['w'] / df['g'], 4)*100

# シーズン毎でグループ化し、年間最高勝率のデータだけ抜き出します
season = df.groupby('season')
win_max= season['win_rate'].max()

# 最高勝率のインデックス
win_max_index = season['win_rate'].idxmax()

highest_win = df.iloc[win_max_index.tolist()].sort_values('win_rate', ascending=False)
print(highest_win)

歴代勝率ランキング


season team playoffs G 3PM 3PA 3P% 2PM 2PA 2P% PPG Win Lose Win_Rate
1 2016 Golden State Warriors True 82 13.1 31.6 0.416 29.4 55.7 0.528 114.9 73 9 89.02
2 1996 Chicago Bulls True 82 6.6 16.5 0.403 33.5 67.6 0.496 105.2 72 10 87.80
3 1972 Los Angeles Lakers True 82 NaN NaN NaN 47.8 97.5 0.490 121.0 69 13 84.15
4 1997 Chicago Bulls True 82 6.4 17.1 0.373 33.6 67.3 0.499 103.1 69 13 84.15
5 1967 Philadelphia 76ers True 81 NaN NaN NaN 48.3 100.0 0.483 125.2 68 13 83.95
6 1973 Boston Celtics True 82 NaN NaN NaN 46.5 103.8 0.448 112.7 68 14 82.93
7 2000 Los Angeles Lakers True 82 4.2 12.8 0.329 34.1 70.6 0.482 100.8 67 15 81.71
8 1986 Boston Celtics True 82 1.7 4.8 0.351 43.7 84.4 0.517 114.1 67 15 81.71
9 1992 Chicago Bulls True 82 1.7 5.5 0.304 42.7 81.9 0.522 109.9 67 15 81.71
10 2007 Dallas Mavericks True 82 6.5 17.1 0.381 30.2 61.4 0.491 100.0 67 15 81.71
11 2015 Golden State Warriors True 82 10.8 27.0 0.398 30.8 60.0 0.514 110.0 67 15 81.71
12 2017 Golden State Warriors True 82 12.0 31.2 0.383 31.1 55.8 0.557 115.9 67 15 81.71
13 1971 Milwaukee Bucks True 82 NaN NaN NaN 48.4 95.2 0.509 118.4 66 16 80.49
14 2008 Boston Celtics True 82 7.3 19.1 0.381 29.1 57.6 0.506 100.5 66 16 80.49
15 2009 Cleveland Cavaliers True 82 8.0 20.4 0.393 28.9 58.3 0.495 100.3 66 16 80.49
16 2013 Miami Heat True 82 8.7 22.1 0.396 29.6 55.4 0.536 102.9 66 16 80.49
17 1950 Syracuse Nationals True 64 NaN NaN NaN 29.2 82.4 0.354 84.8 51 13 79.69
18 1983 Philadelphia 76ers True 82 0.3 1.3 0.229 43.6 86.6 0.503 112.1 65 17 79.27
19 2018 Houston Rockets True 82 15.3 42.3 0.362 23.4 41.9 0.558 112.4 65 17 79.27
20 1987 Los Angeles Lakers True 82 2.0 5.5 0.367 43.6 82.9 0.526 117.8 65 17 79.27
21 1960 Boston Celtics True 75 NaN NaN NaN 49.9 119.6 0.417 124.5 59 16 78.67
22 2024 Boston Celtics True 82 16.5 42.5 0.388 27.4 47.7 0.575 120.6 64 18 78.05
23 2022 Phoenix Suns True 82 11.6 31.9 0.364 32.1 58.2 0.551 114.8 64 18 78.05
24 2006 Detroit Pistons True 82 6.8 17.7 0.384 29.6 62.3 0.475 96.8 64 18 78.05
25 1965 Boston Celtics True 80 NaN NaN NaN 44.6 107.6 0.414 112.8 62 18 77.50
26 1985 Boston Celtics True 82 1.3 3.8 0.356 44.0 85.6 0.515 114.8 63 19 76.83
27 1994 Seattle SuperSonics True 82 3.0 8.8 0.335 37.8 75.4 0.501 105.9 63 19 76.83
28 1989 Detroit Pistons True 82 1.5 4.9 0.300 39.9 79.0 0.505 106.6 63 19 76.83
29 1991 Portland Trail Blazers True 82 4.2 11.0 0.377 39.5 78.8 0.501 114.7 63 19 76.83
30 1990 Los Angeles Lakers True 82 3.8 10.3 0.367 38.1 75.2 0.507 110.7 63 19 76.83


最高勝率は2015-16年シーズンのゴールデンステイト・ウォリアーズの89%、9割近く勝ってるのは驚異的です。 観てたファンはほとんど勝っていたイメージでしょう。
 1996年2位、1997年3位のシカゴ・ブルズも常勝軍団として伝説になっています。 
11位12位にも入っている2015〜2018年のウォリアーズは黄金期でした。3ポイントの得点の高さも特徴的です。 この3ポイントで積極的に勝っていくスタイルがNBA全体の戦略を変えるほどインパクトを残しました。 
リーグ戦で最高勝率のチームが優勝する訳ではないのが、トーナメント戦での面白さですね。

2024年7月6日土曜日

NBA通算得点ランキング

選手スタッツデータの集計 

NBAの選手スタッツデータセットから得点集計を行ってみたいと思います。

使用させていただくデータはkaggleから、拝借いたします。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd

fn = "Player_Totals.csv"
df = pd.read_csv(fn)

print(df.head())

seas_id  season  player_id         player  birth_year pos   age  experience   lg   tm   g    gs  ...   ft  fta  ft_percent    orb    drb    trb  ast   stl   blk    tov   pf   pts

0    31136    2024       5025     A.J. Green         NaN  SG  24.0           2  NBA  MIL  56   0.0  ...   17   19       0.895    9.0   55.0   64.0   30   9.0   4.0   12.0   49   252

1    31137    2024       5026    A.J. Lawson         NaN  SG  23.0           2  NBA  DAL  42   0.0  ...   15   23       0.652   14.0   36.0   50.0   20  10.0   3.0   14.0   22   136

2    31138    2024       5027     AJ Griffin         NaN  SF  20.0           2  NBA  ATL  20   0.0  ...    2    2       1.000    2.0   16.0   18.0    5   1.0   2.0    8.0    6    48

3    31139    2024       4219   Aaron Gordon         NaN  PF  28.0          10  NBA  DEN  73  73.0  ...  177  269       0.658  174.0  297.0  471.0  259  56.0  45.0  105.0  142  1013

4    31140    2024       4582  Aaron Holiday         NaN  PG  27.0           6  NBA  HOU  78   1.0  ...   58   63       0.921   23.0  100.0  123.0  140  42.0   6.0   53.0  125   514

1947年から最新の2024年データまであるのは助かります。

NBA選手の通算得点ランキング

このデータセットから、歴代通算得点ランキングを集計します。
完成データの手本は、wikipediaのこちら
まずはデータの整理から


print(df['lg'].unique())

# NBAデータだけ抜き出します。
df2 = df[df['lg'] == "NBA"]
df2 = df2[df2['tm'] != "TOT"]


['NBA' 'ABA' 'BAA']

unique関数で見るとNBAデータ以外も含まれています。
NBAデータだけにし、チームからTOT(複数チームの合計)列を抜かします。[合計が入ると二重に加算されてしまうため]


# 必要な列名をリネーム
df2 = df2.rename(columns={'player': 'Player', 'g': 'G', 'fg': 'FGM', 'x3p': '3PM', 'ft': 'FTM'})

# 必要な列だけにする
df3 = df2[['player_id', 'Player', 'G', 'FGM', '3PM', 'FTM']]

print(df3.head())
 player_id         Player   PTS   G  FGM   3PM  FTM
0       5025     A.J. Green   252  56   83  69.0   17
1       5026    A.J. Lawson   136  42   54  13.0   15
2       5027     AJ Griffin    48  20   18  10.0    2
3       4219   Aaron Gordon  1013  73  398  40.0  177
4       4582  Aaron Holiday   514  78  186  84.0   58

データセットが小さくまとまりました。

選手でグループ化

得られたデータを選手でgroupbyします。
インデックスにplayer_idも含めているのは同名の選手を区別するためです。

# 選手でグループ化
players = df3.groupby(["player_id", "Player"])

# グループ毎の合計を出す
score_sum = players.sum()

# 総合得点順にソート
score_sum = score_sum.sort_values('PTS', ascending=False)

# 1試合あたりの平均得点の列を作る
score_sum['PPG'] = np.round(score_sum['PTS'] / score_sum['G'], 2)

# インデックス解除
score_sum.reset_index(inplace=True)

# player_id 削除
score_sum.drop("player_id", axis=1, inplace=True)
print(score_sum)

Player PTS G FGM 3PM FTM PPG
0 LeBron James 40474 1492 14837 2410 8390 27.13
1 Kareem Abdul-Jabbar 38387 1560 15837 1 6712 24.61
2 Karl Malone 36928 1476 13528 85 9787 25.02
3 Kobe Bryant 33643 1346 11719 1827 8378 24.99
4 Michael Jordan 32292 1072 12192 581 7327 30.12
5 Dirk Nowitzki 31560 1522 11169 1982 7240 20.74
6 Wilt Chamberlain 31419 1045 12681 0 6057 30.07
7 Kevin Durant 28924 1061 9950 2031 6993 27.26
8 Shaquille O'Neal 28596 1207 11330 1 5935 23.69
9 Carmelo Anthony 28289 1260 10119 1731 6320 22.45
10 Moses Malone 27409 1329 9435 8 8531 20.62
11 Elvin Hayes 27313 1303 10976 5 5356 20.96
12 Hakeem Olajuwon 26946 1238 10749 25 5423 21.77
13 Oscar Robertson 26710 1040 9508 0 7694 25.68
14 Dominique Wilkins 26668 1074 9963 711 6031 24.83
15 Tim Duncan 26496 1392 10285 30 5896 19.03
16 Paul Pierce 26397 1343 8668 2143 6918 19.66
17 John Havlicek 26395 1270 10513 0 5369 20.78
18 Kevin Garnett 26071 1462 10505 174 4887 17.83
19 James Harden 25885 1072 7643 2940 7659 24.15
20 Vince Carter 25728 1541 9293 2290 4852 16.70
21 Alex English 25613 1193 10659 18 4277 21.47
22 Reggie Miller 25279 1389 8241 2560 6237 18.20
23 Russell Westbrook 25211 1162 9055 1273 5828 21.70
24 Jerry West 25192 932 9016 0 7160 27.03
25 Patrick Ewing 24815 1183 9702 19 5392 20.98
26 Ray Allen 24505 1300 8567 2973 4398 18.85
27 Allen Iverson 24368 914 8467 1059 6375 26.66
28 Charles Barkley 23757 1073 8435 538 6349 22.14
29 Stephen Curry 23668 956 8084 3747 3753 24.76



と同じ結果が得られました。


PTS = (FGM * 2) + 3PM + FTMで計算出来ます。

PTS: 合計得点
G: 試合数
FGM: フィールドゴール数
3PM: 3Pゴール数
FTM: フリースローゴール数

NBAの1試合平均チームスタッツ (2025-26レギュラーシーズン)

前回 の元となったデータ、チーム毎の各スタッツ平均です。   team games w l win% PTS AST BLK STL ...