2024年7月29日月曜日

NBAの平均年齢推移

NBAチームの平均年齢

NBAにおいて選手の平均年齢がどのように推移してきたかチーム毎のデータを使い抽出してみました。

NBA全体の平均年齢とシーズン毎の若いチームとベテランチーム


season 平均年齢 最高チーム平均年齢 最高齢チーム 最低チーム平均年齢 最低齢チーム
1952 26.2 28.9 Rochester Royals 24.5 Indianapolis Olympians
1953 26.4 29.2 Rochester Royals 25.4 Boston Celtics
1954 26.4 29.2 Rochester Royals 24.1 Baltimore Bullets
1955 26.5 29.0 Rochester Royals 24.9 Baltimore Bullets
1956 26.3 27.2 Fort Wayne Pistons 25.2 Rochester Royals
1957 26.2 27.7 St. Louis Hawks 23.4 Rochester Royals
1958 26.8 28.4 Detroit Pistons 25.1 New York Knicks
1959 26.4 28.1 St. Louis Hawks 23.7 Cincinnati Royals
1960 26.5 27.6 St. Louis Hawks 25.0 Cincinnati Royals
1961 26.4 28.3 Boston Celtics 24.4 Cincinnati Royals
1962 26.4 27.9 Boston Celtics 25.0 Cincinnati Royals
1963 26.3 28.3 Boston Celtics 24.9 Detroit Pistons
1964 26.4 28.4 Boston Celtics 25.0 Baltimore Bullets
1965 26.4 28.3 Boston Celtics 24.4 Detroit Pistons
1966 26.6 28.8 Boston Celtics 25.0 Detroit Pistons
1967 26.6 29.6 Boston Celtics 25.2 Detroit Pistons
1968 26.8 29.5 Boston Celtics 25.1 Seattle SuperSonics
1969 26.9 30.5 Boston Celtics 24.8 Phoenix Suns
1970 26.8 28.4 Boston Celtics 24.9 Milwaukee Bucks
1971 26.6 29.0 Philadelphia 76ers 24.3 Cleveland Cavaliers
1972 26.6 29.5 Los Angeles Lakers 24.2 Cleveland Cavaliers
1973 26.7 30.3 Los Angeles Lakers 24.0 Portland Trail Blazers
1974 26.9 28.7 Chicago Bulls 24.4 Buffalo Braves
1975 26.6 30.2 Chicago Bulls 25.1 Atlanta Hawks
1976 26.5 29.0 Boston Celtics 24.5 Seattle SuperSonics
1977 26.2 28.7 Boston Celtics 24.5 Atlanta Hawks
1978 26.2 29.7 Boston Celtics 23.8 Milwaukee Bucks
1979 26.3 28.2 Washington Bullets 24.6 Atlanta Hawks
1980 26.4 29.0 Washington Bullets 24.1 New York Knicks
1981 26.2 28.6 Washington Bullets 24.3 Detroit Pistons
1982 26.2 28.3 Houston Rockets 24.0 Kansas City Kings
1983 26.1 29.0 Houston Rockets 24.2 Dallas Mavericks
1984 26.4 28.4 Milwaukee Bucks 24.4 Chicago Bulls
1985 26.5 28.5 Boston Celtics 24.1 Indiana Pacers
1986 26.8 29.3 Boston Celtics 25.0 Indiana Pacers
1987 26.6 29.4 Boston Celtics 24.6 Cleveland Cavaliers
1988 26.9 29.8 Boston Celtics 24.6 Cleveland Cavaliers
1989 26.9 29.8 Denver Nuggets 24.6 Los Angeles Clippers
1990 27.1 30.2 Boston Celtics 24.5 Los Angeles Clippers
1991 27.2 30.6 Dallas Mavericks 24.0 Miami Heat
1992 27.2 30.2 Milwaukee Bucks 24.4 Miami Heat
1993 27.1 29.9 Detroit Pistons 24.8 Denver Nuggets
1994 27.2 29.4 Utah Jazz 24.8 Denver Nuggets
1995 27.2 29.6 Utah Jazz 24.3 Dallas Mavericks
1996 27.5 30.4 New York Knicks 24.8 Washington Bullets
1997 27.7 30.8 Houston Rockets 25.0 Vancouver Grizzlies
1998 27.7 32.0 Houston Rockets 23.9 Boston Celtics
1999 27.9 31.2 Seattle SuperSonics 24.3 Boston Celtics
2000 27.8 31.5 Utah Jazz 24.2 Los Angeles Clippers
2001 27.7 32.0 Utah Jazz 23.2 Chicago Bulls
2002 27.4 30.3 New York Knicks 24.4 Los Angeles Clippers
2003 27.2 30.9 Utah Jazz 23.5 Cleveland Cavaliers
2004 27.0 30.3 New Orleans Hornets 24.3 Los Angeles Clippers
2005 26.9 29.7 Houston Rockets 24.9 Charlotte Bobcats
2006 26.5 29.8 San Antonio Spurs 22.7 Atlanta Hawks
2007 26.6 30.4 San Antonio Spurs 23.5 Boston Celtics
2008 26.8 31.4 San Antonio Spurs 24.1 Portland Trail Blazers
2009 26.6 30.4 San Antonio Spurs 23.3 Memphis Grizzlies
2010 26.6 30.7 Dallas Mavericks 23.2 Oklahoma City Thunder
2011 26.6 30.9 Dallas Mavericks 23.7 Oklahoma City Thunder
2012 26.6 31.3 Dallas Mavericks 24.2 Washington Wizards
2013 26.7 30.7 Los Angeles Lakers 24.0 New Orleans Hornets
2014 26.5 30.6 Dallas Mavericks 23.4 Philadelphia 76ers
2015 26.7 29.9 Dallas Mavericks 23.2 Philadelphia 76ers
2016 26.6 30.5 Memphis Grizzlies 23.3 Philadelphia 76ers
2017 26.6 30.0 Los Angeles Clippers 24.0 Minnesota Timberwolves
2018 26.4 30.6 Cleveland Cavaliers 23.7 Los Angeles Lakers
2019 26.3 29.2 Houston Rockets 23.4 New York Knicks
2020 26.0 29.5 Los Angeles Lakers 24.1 Atlanta Hawks
2021 26.1 28.8 Los Angeles Clippers 22.8 Oklahoma City Thunder
2022 26.1 30.2 Los Angeles Lakers 22.4 Oklahoma City Thunder
2023 26.1 29.8 Milwaukee Bucks 22.1 Houston Rockets
2024 26.4 30.4 Los Angeles Clippers 23.0 San Antonio Spurs


シーズン毎年齢推移グラフ


年齢分布は、取得する時期によってトレードや退団選手などいたり、出場時間も選手によって偏りがあり、必ずしも正確とは言えませんが、傾向は分かるでしょう。

NBAでは大体26歳から27歳辺りで平均年齢が推移しており、これは他の過酷なスポーツでも同様です。
体力と経験が最も出せる年齢がその辺りなのでしょう。
2000年辺りに少し平均年齢が高い時期がありますが、黄金世代と呼ばれる選手が多くいた時期と重なります。

ほとんど新人のチームもいれば、ベテランが多いチームもいてチームの傾向が見て取れます。

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月20日土曜日

scikit-learnのデータセット

scikit-learnのサンプルToy Datasetsデータセット 

scikit-learnのデータセットにはすぐに使えるようにいくつかのサンプルデータがありますが、バージョンによって入れ替わっていたりします。

サンプルデータにはToy DatasetsとReal World Datasetsがありますが、今回はよく使われるトイ・データセットを読み込んでみます。

sklearn.__version__: 0.24.2


import numpy as np


#両方呼ばないとdatasetsは使えません
import sklearn
from sklearn import datasets

# sklearn.datasetsのトイ・データ一覧を取得する関数
def datasets_list():
    module = sklearn.datasets
    setlist = dir(module)

    #print(setlist)

    for funcname in setlist:
        if "load_" in funcname:
            # サンプルデータ以外の関数を弾きます
            if "load_file" in funcname:
                pass
            if "load_s" in funcname:
                pass
            else:
                print(funcname, end=": ")
                print(list(getattr(module, funcname)().keys()))
                
                
datasets_list()



load_boston
['data', 'target', 'feature_names', 'DESCR', 'filename']

load_breast_cancer
['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename']

load_diabetes
['data', 'target', 'frame', 'DESCR', 'feature_names', 'data_filename', 'target_filename']

load_digits
['data', 'target', 'frame', 'feature_names', 'target_names', 'images', 'DESCR']

load_iris
['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename']

load_linnerud
['data', 'feature_names', 'target', 'target_names', 'frame', 'DESCR', 'data_filename', 'target_filename']

load_wine
['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names']


古いバージョンなのでbostonデータセットがあります。
それぞれBunchオブジェクトを返しますが、これを見ると、各メソッドのキーは同じ名前はあるもののそれぞれ数が違っています。
データが回帰や分類に使うなど用途が異なる理由もあるのでしょう。

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: フリースローゴール数

2024年7月4日木曜日

matplotlibのグラフが表示されないエラー

virtualenvで新しい環境を作成した時のエラー

 matplotlibのグラフを表示しようと実行した時、

UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown

  plt.show()


FigureCanvasAgg は非対話型であるため、表示できません

と出てグラフが表示されませんでした。



どうやらPythonのGUIモジュールPyQt5が入ってなかった様なので

 pip install PyQt5

で解決されました。

2024年7月3日水曜日

pandasのスライスが使えないエラー

データフレームのスライス使用時の注意

pd.__version__: 2.1.4

データフレームを使用していたらスライスが使えない現象が出ました。

import numpy as np
import pandas as pd

# float型のインデックス
ind = [1.0, 2.0, 3.0]

df = pd.DataFrame({
    "col1": ["A", "B", "C"],
    "col2": [11, 22, 33]
}, index=ind)

print(df)

# ここでワーニング
print(df[1:2])

    col1  col2

1.0    A    11

2.0    B    22

3.0    C    33


内容としては

FutureWarning: The behavior of obj[i:j] with a float-dtype index is deprecated. In a future version, this will be treated as positional instead of label-based. For label-based slicing, use obj.loc[i:j] instead

のワーニングが出てスライスが出来ません。

ワーニングの内容によると、float-dtype のインデックスは今後使えなくなるそうです。
代替としてobj.loc[i:j]で指定してくださいとあります。
ただし、floatのままだと処理が遅くなるようなので根本的に解決するならint型に直したほうがよさそうです。

直接インデックスの型を変えられない様なので、一旦インデックスを解除し、型をintに変更してからまた振り直します。


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

# 型をindexに変更
df2 = df.astype({"index": int})

# インデックスの振り直し
df2.set_index("index", inplace=True)

print(df2)
print(df2.dtypes)


      col1  col2
index           
1        A    11
2        B    22
3        C    33

col1    object
col2     int64
dtype: object

これでスライスも使えるようになります。

2024年7月1日月曜日

NBA選手のキャリア年数

前回の続きです。 データセットは同じ1950年〜2017年までの選手データです。 最高齢プレーヤーは44歳の1人だけと出力されたので、選手名を出してみます。
#最高齢取得
max_player = df['Age'].max()
#最高齢のインデックス取得
max_index = df['Age'].idxmax()

#得られたインデックスから最高齢の選手データをスライス
print(df[max_index:max_index+1])

         Year        Player Pos   Age   Tm    G   GS    MP  PER    TS%  3PAr    FTr  ORB%  DRB%  TRB%  AST%  ...   2PA    2P%   eFG%   FT  FTA  FT%  ORB  DRB  TRB  AST  STL  BLK  TOV    PF   PTS  PPG
18671  2007.0  Kevin Willis  PF  44.0  DAL  5.0  0.0  43.0  6.3  0.432   0.0  0.154   5.7  16.4  11.2   3.6  ...  13.0  0.385  0.385  2.0  2.0  1.0  2.0  6.0  8.0  1.0  2.0  1.0  2.0  11.0  12.0  2.4

最高齢まで活躍したのは2007年まで活躍したKevin Willis選手だと分かりました。
調べてみるとマイケル・ジョーダン選手と同期なんですね。まさに鉄人。


NBA選手のキャリア年数


次は選手のキャリア年数を洗い出してみます。
# プレーヤー毎にグループ化
players = df.groupby('Player')

# それぞれの個数をカウント
players_size = players.size()

print(players_size)

Player
A.C. Green            18
A.J. Bramlett          1
A.J. English           2
A.J. Guyton            3
A.J. Hammons           1
                      ..

プレーヤー毎の行数が抽出されました。
このままの数値を使えば良さそうですが、チームを渡り歩いて重複してるデータもあるので、退団年齢から加入年齢を引いてキャリア年齢を割り出します。



# プレーヤー毎の加入年齢
min_age = players["Age"].min()
# プレーヤー毎の退団年齢
max_age = players['Age'].max()

# 引いてキャリア年数を算出
career = max_age - min_age

# ボリューム順にソートされる
print(career.value_counts())
print(f"選手の平均キャリア年数: {np.round(career.mean(), 2)}年")

plt.hist(career, bins=22)
plt.title("NBA選手のキャリア年数")
plt.xlabel("キャリア年数")
plt.ylabel("人数")
plt.show()

Age
0.0     1052
1.0      486
2.0      323
3.0      276
4.0      212
9.0      184
5.0      181
6.0      178
7.0      170
8.0      169
10.0     161
11.0     138
12.0     130
13.0      95
14.0      52
15.0      41
16.0      26
17.0      20
18.0      16
19.0       3
20.0       2
22.0       1
Name: count, dtype: int64

選手の平均キャリア年数:  4.45年




四則演算でデータ毎の計算を一瞬で出来るのはpandasの強みですね。


結果を見ると、初年度で退団する人が圧倒的に多いです。
世界最高峰の運動能力を持つ選手が集まるNBAの厳しさが伺えます。
そこから緩く減っていきますが、キャリア9年目が一時的に増えてるのはそこがベストなキャリア年数なのか、年金制度などが関係してるのか分かりません。
最長年数は22年、全体の平均選手寿命は4.45年と出ました。


Pythonで地図空間データを扱う⑤

ベースの地図が出来た所で、他のデータを被せてみます。 国土地理院の  500mメッシュ別将来推計人口データ  を使用します。 同じく神奈川県のデータ  500m_mesh_suikei_2018_shape_14.zip をダウンロードします。 ベースの地図データと同じ場所に展開...