2024年10月18日金曜日

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

ベースの地図が出来た所で、他のデータを被せてみます。

国土地理院の 500mメッシュ別将来推計人口データ を使用します。

同じく神奈川県のデータ 500m_mesh_suikei_2018_shape_14.zip をダウンロードします。

ベースの地図データと同じ場所に展開します。

そして同じようにread_fileで読み込みます。

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

#
import geopandas as gpd
import matplotlib.pyplot as plt
import japanize_matplotlib

fn = "../data/N03-20240101_14.shp"
gdf = gpd.read_file(fn)
fn2 = "../data/500m_mesh_2018_14.shp"
pdf = gpd.read_file(fn2)

print(gdf.head(10))
print("")
print(gdf.shape)
print("")
print(pdf.head())
print("")
print(pdf.shape)
(6193, 235)と巨大なデータフレームなので、必要なデータ以外は取り除いてもいいでしょう。
# 必要な列だけ取り出し軽量化します。
pdf2 = pdf[['SHICODE', 'PTN_2020', 'geometry']]

# ベースとなる地図
bg = gdf.boundary.plot(linewidth=0.5, edgecolor="gray", figsize=(14, 8))

# 人口データのプロット
pdf2.plot(ax=bg, column="PTN_2020", cmap="jet", legend=True)

# 地域名を表示
for name, row in citys:
    if row['N03_001'].count() > 1:
        x = row["geometry"].centroid.bounds.minx.mean()
        y = row["geometry"].centroid.bounds.miny.mean()
        bg.annotate(name, xy=(x, y), color="red")
    else:
        x = row["geometry"].centroid.bounds.minx
        y = row["geometry"].centroid.bounds.miny
        bg.annotate(name, xy=(x, y), color="red")  

plt.title("神奈川県人口マップ")
plt.show()

地図データに人口データを重ね合わせることが出来ました。

2024年10月15日火曜日

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

日本地図データ

テストデータで概要を掴めたら、外部からshapeファイルを読み込み使用してみます。
 日本に住んでる方は、日本の地域データを活用することが多いでしょうから国土地理院のデータを読み込んでみます。

国土地理院

全国はデータが大きいので今回は神奈川県のデータをダウンロードしました。
データはzipファイルなので、使用する場所に移動して解凍します。

$ unzip N03-20240101_14_GML.zip 

解凍するとshapeファイルなどいくつかのファイルが出来ます。
それらをリンクして使用されるので、個別で移動させたり、ファイル名を変えたりはしないでください。

回答したshapeファイルを前回と同じように読み込みます。

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

import geopandas as gpd
import matplotlib.pyplot as plt
import japanize_matplotlib

fn = "../data/N03-20240101_14.shp"
gdf = gpd.read_file(fn)

print(gdf.head())
print("")
print(gdf.shape)
print("")

結果
N03_001 N03_002 N03_003 N03_004 N03_005 N03_007 geometry
0 神奈川県 None None 横浜市 鶴見区 14101 POLYGON ((139.65294 35.50000, 139.65281 35.50010, 139.65270 35.50015, 139.65221 35.50030, 139.65214 35.50034, 139.65207 35.50038,・・・
1 神奈川県 None None 横浜市 鶴見区 14101 POLYGON ((139.67394 35.46229, 139.67347 35.46329, 139.67303 35.46426, 139.67272 35.46494, 139.67259 35.46523,・・・
2 神奈川県 None None 横浜市 鶴見区 14101 POLYGON ((139.70755 35.47204, 139.70756 35.47208, 139.70719 35.47264, 139.70595 35.47454, 139.70582 35.47457, ・・・
3 神奈川県 None None 横浜市 鶴見区 14101 POLYGON ((139.71140 35.48577, 139.71141 35.48575, 139.71108 35.48560, 139.71114 35.48551, 139.71097 35.48543, 139.71091 35.48553,・・・
4 神奈川県 None None 横浜市 鶴見区 14101 POLYGON ((139.70710 35.47226, 139.70713 35.47228, 139.70715 35.47227, 139.70722 35.47216, 139.70722 35.47215,・・・

1275, 7


地図の表示

次に地図をプロットしてみます。 boundary.plotは境界線のみ描画します。
linewidthやedgecolorで線を調節します。

 
gdf.boundary.plot(linewidth=0.5, edgecolor="gray", figsize=(12, 8))
plt.title("神奈川県")
plt.show()
神奈川県の地区データが表示されました。

2024年10月12日土曜日

ValueError: numpy.dtype size changed, may indicate binary incompatibility. というエラーが出たケース

 以前動いたnumpyのコードからエラーが出るようになりました。

エラー内容

ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject

どうやら他のライブラリと互換性が無い場合に出るエラーの様で、新しくなったnumpyに対応出来ていないライブラリが使われているとのことです。


 pip freeze | grep numpy

numpy==2.0.2


ライブラリが対応するまでnumpyのバージョンを落とすなどの措置が必要です。

numpyが2.0以上なら、それ以前の最新版1.26.4に落とします。


pip uninstall numpy

pip install numpy=1.26.4


一先ず解決出来ました。

2024年9月30日月曜日

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

GeoPandasで都市データのプロット

GeoPandasのdatasetsには、naturalearth_lowresの他に主要都市のデータnaturalearth_citiesがあります。
これを使い世界地図に都市もプロットしてみましょう。

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

import geopandas as gpd
import matplotlib.pyplot as plt

# 世界地図のデータ
world = gpd.datasets.get_path('naturalearth_lowres')
# 主要都市のデータ
cities = gpd.datasets.get_path('naturalearth_cities')

wdf = gpd.read_file(world)
cdf = gpd.read_file(cities)

print(wdf.head())
print()
print(wdf.shape)
print()
print(cdf.head())
print()
print(cdf.shape)
結果
       pop_est      continent                      name iso_a3  gdp_md_est                                           geometry
0     889953.0        Oceania                      Fiji    FJI        5496  MULTIPOLYGON (((180.00000 -16.06713, 180.00000...
1   58005463.0         Africa                  Tanzania    TZA       63177  POLYGON ((33.90371 -0.95000, 34.07262 -1.05982...
2     603253.0         Africa                 W. Sahara    ESH         907  POLYGON ((-8.66559 27.65643, -8.66512 27.58948...
3   37589262.0  North America                    Canada    CAN     1736425  MULTIPOLYGON (((-122.84000 49.00000, -122.9742...
4  328239523.0  North America  United States of America    USA    21433226  MULTIPOLYGON (((-122.84000 49.00000, -120.0000...

(177, 6)

           name                    geometry
0  Vatican City   POINT (12.45339 41.90328)
1    San Marino   POINT (12.44177 43.93610)
2         Vaduz    POINT (9.51667 47.13372)
3       Lobamba  POINT (31.20000 -26.46667)
4    Luxembourg    POINT (6.13000 49.61166)

(243, 2)

naturalearth_citiesは主要都市の名前と位置というシンプルなデータです。
これを世界地図に乗せていきます。

世界地図のGeoDataFrameオブジェクトを変数にして、axに指定することで両方プロットすることが出来ます。
# ベースとなる世界地図
bg = wdf.plot(column='continent', figsize=(18, 8))
# 主要都市をマッピング
cdf.plot(ax=bg, marker='o', color='firebrick')

# アノテーションで主要都市の名前をマッピング
for i, (city, point) in cdf.iterrows():
    # pointオブジェクトから緯度経度を抽出
    x1, y1, x2, y2 = point.bounds
    bg.annotate(city, xy=(x1, y1))

plt.show()


都市名はannotateでプロットします。 
geomatryデータからshapely.geometry.point.Pointオブジェクトを抜き出し、 bounds変数には(minx, miny, maxx, maxy)が入っているので、xy座標に指定します。

shapely.Point
https://shapely.readthedocs.io/en/stable/reference/shapely.Point.html
世界地図に都市名も表示出来ました。

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

GeoPandasでコロプレスマップを表示

基本的な動作を確認したら、コロプレスマップを作ってみます。 
 naturalearth_lowresには大陸以外に人口とGDPデータがあるので、それらを色で段階的に分けて表示します。


人口マップ

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

import geopandas as gpd
import matplotlib.pyplot as plt
#日本語を表示するため
import japanize_matplotlib


fn = gpd.datasets.get_path('naturalearth_lowres')
gdf = gpd.read_file(fn)

# 人口データをint型にします
gdf['population'] = gdf['pop_est'].astype("int")
# 人口の多い順にソートします
gdf = gdf.sort_values("pop_est", ascending=False)
gdf = gdf.drop("pop_est", axis=1)

print(gdf.head(10))


continent                      name iso_a3  gdp_md_est  population
139           Asia                     China    CHN    14342903  1397715000
98            Asia                     India    IND     2868929  1366417754
4    North America  United States of America    USA    21433226   328239523
8             Asia                 Indonesia    IDN     1119190   270625568
102           Asia                  Pakistan    PAK      278221   216565318
29   South America                    Brazil    BRA     1839758   211049527
56          Africa                   Nigeria    NGA      448120   200963599
99            Asia                Bangladesh    BGD      302571   163046161
18          Europe                    Russia    RUS     1699876   144373535
27   North America                    Mexico    MEX     1268870   127575529

人口を分かりやすく表示しています。
それらのデータをプロットすることで人口のコロプレスマップが出来ます。
gdf.plot(column='population', cmap="jet", legend=True, figsize=(16, 8))
plt.title("人口マップ")
plt.show()
中国、インドの人口が多いのがひと目で理解できます。

 

各国のGDPマップ


次はGDPデータを使いコロプレスマップにしてみます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import geopandas as gpd
import matplotlib.pyplot as plt
import japanize_matplotlib


fn = gpd.datasets.get_path('naturalearth_lowres')
gdf = gpd.read_file(fn)

gdf = gdf.rename(columns={"gdp_md_est": "gdp_md"})
# GDPの多い順に並べます
gdf = gdf.sort_values("gdp_md", ascending=False)

print(gdf.head(10))

gdf.plot(column='gdp_md', cmap="jet", legend=True, figsize=(16, 8))
plt.title("GDP")
plt.show()
各国のGDPのコロプレスマップを表示出来ました。

2024年9月27日金曜日

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

GeoPandasを使いPythonで地図を描画

Pythonはデータ処理関係のライブラリが豊富ですが、地図とデータを組み合わせられたら地域データの詳細もより分かりやすくなります。 ここ数年で注目度が高まっているGeoPandasを使って地図データを扱ってみたいと思います。

pip install geopandas

他のライブラリにも依存してしますので適宜インストールしてください。

  GeoDataFrameに変換するにはshapeファイルやGeoJSONファイルが必要ですが、テスト用のファイルがdatasetsにあります。 
 現在は3つほどと少ないですが、気軽にGeoDataFrmeを試すにはとても良いデータです。
 naturalearth_lowresを使用してみます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import geopandas as gpd
import matplotlib.pyplot as plt

# ①地図データファイルのあるパスを指定
path = gpd.datasets.get_path('naturalearth_lowres')

# ②ファイルからGeoDataFrameオブジェクトを生成
gdf = gpd.read_file(path)

print(gdf.head())
print("")
print(gdf.shape)
print("")
print(gdf.crs)


結果
       pop_est      continent                      name iso_a3  gdp_md_est                                           geometry
0     889953.0        Oceania                      Fiji    FJI        5496  MULTIPOLYGON (((180.00000 -16.06713, 180.00000...
1   58005463.0         Africa                  Tanzania    TZA       63177  POLYGON ((33.90371 -0.95000, 34.07262 -1.05982...
2     603253.0         Africa                 W. Sahara    ESH         907  POLYGON ((-8.66559 27.65643, -8.66512 27.58948...
3   37589262.0  North America                    Canada    CAN     1736425  MULTIPOLYGON (((-122.84000 49.00000, -122.9742...
4  328239523.0  North America  United States of America    USA    21433226  MULTIPOLYGON (((-122.84000 49.00000, -120.0000...

(177, 6)

EPSG:4326



pandasに慣れていれば非常に扱いやすいですね。
headやshapeも同じ使い方です。
Geoデータフレームはデータにgeometryという位置データが追加されているのがpandasデータフレームとの違いです。

CRSとは座標参照系(Coordinate Reference System)のことで、位置情報のルールを表します。
文字コードのようなものです。



このデータを使ってプロットします。
gdf.plot()
plt.show()


世界地図がプロットされました。 pandasライクで簡単に地図データを扱うことが出来ます。 このままでは味気ないので、オプションをつけて、少し装飾してみます。
 columnは色分け、cmapはカラーマップを指定します。
gdf.plot(column="continent", cmap="Accent", legend=True, figsize=(16, 8))
plt.show()
綺麗になりました。

2024年9月2日月曜日

2点間を通る直線の式を連立方程式で解く(Python)

2点間を通る直線の式

Pythonで連立方程式を解くことが出来たら、2点間を結ぶ一次方程式も導き出せるので

Pythonで書いてみます。


2点の位置 (-1, -5) (3, 3)
#! /usr/bin/env python  
  
# -*- coding:utf-8 -*-  
   
# 
import numpy as np  
import matplotlib.pyplot as plt  
from sympy import Symbol, solve
  
# 一次関数のデータを作る関数   
def linear(a, b, ran=np.arange(-10,10)):  
  
    arr = []  
    for x in ran:  
        y = x*a + b  
        arr.append(y)  
  
    # 式から配列データを返します
    return arr  
  
ax = fig.add_subplot(1, 1, 1)  
   
# これで正方形になります 
ax.set_aspect('equal', adjustable='box')  
  
# 表示する幅  
ax.set_xlim(-10, 11)  
ax.set_ylim(-10, 11)  
  
# グラフの刻み  
ax.set_xticks(np.arange(-10, 10, 5))  
ax.set_yticks(np.arange(-10, 10, 5))  
   
# 補助線をonにします  
ax.minorticks_on()   
  
# グリッドの主線と補助線  
ax.grid(which="major", color="black", alpha=0.5)  
ax.grid(which="minor", color="gray", linestyle="--", alpha=0.5)  
  
# 数値表示を0に合わせます
ax.spines['bottom'].set_position("zero")  
ax.spines['left'].set_position("zero")  

# xの生成
x = np.arange(-10, 10)

# 2点の位置 (-1, -5) (3, 3)
x1, y1 = (-1, -5)
x2, y2 = (3, 3)

a = Symbol("a")
b = Symbol("b")

# 2点を連立方程式に変えます
s1 = a * x1 + b - y1
s2 = a * x2 + b - y2

result = solve((s1, s2))

# 得られた解
print(result)

# yの生成
y = linear(result[a], result[b], x)

# 得られた一次方程式のプロット
ax.plot(x, y)

# 点(-1, -5) のプロット
ax.plot(x1, y1, marker="o")
ax.annotate("(-1, -1)", xy=(x1, y1), color="red")
# 点(3, 3) のプロット 
ax.plot(x2, y2, marker="o")
ax.annotate("(3, 3)", xy=(x2, y2), color="red")
plt.show()  




このように2点間から一次関数のグラフが描画出来ました。

statsmodelsのseasonal_decomposeでエラーが出る場合

seasonal_decompose


statsmodels.apiで波形分解する場合、sm.tsa.seasonal_decomposeを使いますが、バージョンによって書き方が異なります。 

 TypeError: seasonal_decompose() got an unexpected keyword argument 'freq' 

 というエラーが出る場合は、新しい書き方に置き換えればエラーは出なくなると思います。

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

# sm.tsa.seasonal_decompose(data, freq=365).plot()

# 上記でエラーが出る場合、こちらに変更
sm.tsa.seasonal_decompose(data, period=365, extrapolate_trend='freq').plot()

2024年8月13日火曜日

連立方程式をPythonで解く

Pythonの数学ライブラリ

Pythonは柔軟な言語で数学関係のライブラリが非常に充実しています。 方程式はSymPyライブラリが得意とする部分で、そのまま記号を使い直感的に数学を解いてくれます。
例題(1)
\begin{align} \begin{aligned}2x+y=2\\ 4x+y=-4\end{aligned} \end{align}
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Symbolとsolveをインポートします
from sympy import Symbol, solve

# x と y を代入出来るようにします
x = Symbol("x")
y = Symbol("y")

# 方程式をすべて片辺に移項し代入します。
s1 = 2 * x + y - 2
s2 = 4 * x + y + 4

# 方程式を入れた変数をリストかタプル形式でsolveに入れると答えが出ます。
print(solve((s1, s2)))

答え: {x: -3, y: 8}

x = -3, y = 8と答えが出ました。
例題(2)
\begin{align} \begin{aligned}3x-4y=10\\ -5x-4y=26\end{aligned} \end{align}
s1 = 3 * x - 4 * y - 10
s2 = -5 * x -4 * y - 26


print(solve((s1, s2)))

答え: {x: -2, y: -4}

ライブラリを使えば簡単に答えが出せます。

2024年8月3日土曜日

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

matplotlibでUserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.というエラーが出た場合


古いPython version-3.6を使用してmatplotlibを使用した所、UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure. というエラーが出てグラフが表示されませんでした。 

 これはGUIバックエンドが入ってない事で起きるエラーで 

 pip install pyqt5 

 とすることで解決しました。

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ポイント得点比率を抜くまで増えるのか、また戦略が変わりミドルシュートを効率的に決めるチームが増えるのか、今後の見どころです。

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

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