篮球NBA

篮球
专注分享篮球|NBA新闻
篮球NBA-国内外篮球时事追踪报道,篮球明星,赛程,战报

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)

更新时间:2022-01-14 01:09:48点击:

这次我们用 NBA 球员赛季表现聚类来探讨下 K-Means 算法,K-Means 是一个清晰明白的无监督学习方法,和 KNN 有很多相似点,例如都有超参数 K,前者是 K 个类别,后者是 K 个邻居。

聚类算法是不需要标签的,直接从数据的内在性之中学习最优的分类结果,或者说确定离散标签类型。K-Means 聚类算法是其中最简单、最容易理解的。

悉知

简单即高效。我们的目标是学习一个东西,然后把它的思想应用到我们想要探索的场景,以加深对算法的理解。

最优的聚类结果需要满足两个假设:

“簇中心点”(cluster center)是属于该簇的所有的数据点坐标的算术平均值

***关于nba2k19转化的数据仅供参考,最终定论归官方所有

一个簇的每个点到该簇中心点的距离,比到其他簇中心点的距离短

于是 K-Means 聚类的工作流为

历史推送:

nba2k19球员数据属性值变化之参考(一) 

随机猜测一些簇中心点

nba2k19球员数据属性值变化之参考(二) 

nba2k19球员数据属性值变化之参考( 三) 

nba2k19球员数据属性值变化之参考( 四)

如何查询19数据:

①:小程序:nba2k游戏助手点我直接打开

将样本分配至离其最近的簇中心点上去

将簇中心点设置为所有点坐标的平均值

②:***:nba2k2球员数据

之前推了19的徽章&能力值,这篇及到游戏更新前会不定时推详细数据的变化,两者互不冲突,数据仅作为参考

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图1)快速查询方式Quick query

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图2)

球员名单

重复 2 和 3 直至收敛

172019.3.2

拉简·隆多

安德鲁·维金斯

马克·加索尔

布莱克·格里芬

卡尔-安东尼·唐斯

我们会编码实现 K-Means 算法,并用于 NBA 控卫 2020-21 常规赛季的表现分析中。

我们知道过去刚刚结束的这个赛季得分王是萌神库里,我爱他。我们这里只关注控卫,一是因为控卫线上星光熠熠,二是数据分析要细分,这本身是一个原则。

哈里森·巴恩斯

赛尔吉·伊巴卡

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图3)

迈勒斯·特纳

尼克拉·武切维奇

泰森·钱德勒

埃里克·布莱索

马克尔·富尔茨

我们开始吧!

伊内斯·坎特

德玛库斯·考辛斯

01

林书豪

学习原理方法

埃里克·戈登

保罗·加索尔

找到数据

拉简·隆多

能力:81↑82

背身后仰跳投:37↑40

我们可以从https://www.basketball-reference.com找到我们想要的数据,那就是NBA球员在过去一个赛季的统计数据。数据获取流程如下

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图4)

看看数据

背身钩射:42↑45

背身控制:42↑45

# 三剑客来一遍
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

nba = pd.read_csv("nba_2020.csv")
nba.head()
秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图5)

我们发现姓名列有个\,后面跟着不知道是什么的简称,可以处理掉。另外字段名全是简写,我一个球迷有很多都看不懂,尴尬。整理了下字段含义,我们看一遍,这样就大概了解了这个数据集有什么了。

Age:年龄(别告诉我你知不知道)

造犯规:32↑35

TM(team):球队

Lg(league):联盟

中距离干扰下投篮:45↑48

三分干扰下投篮:57↑58

传球视野:84↑89

防守篮板:64↑65

Pos(position):位置

PG(Point Guard):组织后卫

GS(Games Started):首发出场次数

盖帽:33↑37

MP(Minutes Played Per Game):场均上场时间

低位防守智商:32↑36

FG(Field Goals Per Game):场均命中数

FGA(Field Goal Attempts Per Game):场均投篮数

FG%(Field Goal Percentage):命中率

突破灌篮:26↑30

力量:45↑48

3P(3-Point Field Goals Per Game):三分球命中率

进攻稳定性:42↑45

原地近距离投篮:77↓71

中距离空位投篮:76↓73

3PA (3-Point Field Goal Attempts Per Game):场均三分球投篮数

3P% (3-Point Field Goal Percentage):三分球命中率

2P (2-Point Field Goals Per Game):两分球命中数

2PA (2-Point Field Goal Attempts Per Game):场均两分投篮数

2P% (2-Point Field Goal Percentage):两分球命中率

eFG% (Effective Field Goal Percentage):有效命中率

FT (Free Throws Per Game):场均罚球命中数

FTA (Free Throw Attempts Per Game):场均罚球数

传球智商:102↓93

FT% (Free Throw Percentage):罚球命中率

ORB (Offensive Rebounds Per Game):场均进攻篮板数

传球准确性:99↓90

DRB (Defensive Rebounds Per Game):场均防守篮板数

TRB (Total Rebounds Per Game):总篮板数

AST (Assists Per Game):场均助攻

进攻篮板:42↓40

STL (Steals Per Game):场均抢断

BLK (Blocks Per Game):场均盖帽

TOV (Turnovers Per Game):场均失误

运球抢断:55↓42

PF (Personal Fouls Per Game):场均个人犯规

PTS (Points Per Game):场均得分

处理数据

安德鲁·维金斯

能力:86↑87

# 球员名字取\前面的字符
nba['Player'] = nba['Player'].apply(lambda x: x.split('\\')[0])
# 取控卫PG的样本进行分析
point_guards = nba[nba['Pos'] == 'PG']
# 剔除0失误的控卫数据,0tov意味着场次太少,且0不能被除
point_guards = point_guards[point_guards['TOV'] != 0]
# 定义ATR为助攻失误比,并计算出来
point_guards['ATR'] = point_guards['AST'] / point_guards['TOV']

处理后的数据变成了下面的样子,我们剩下了 124 个控卫数据。

背身钩射:42↑45

背身控制:54↑55

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图6)

判断一个控卫优不优秀,最重要的两个指标是场均得分和场均助攻失误比,也就是PTS和ATR。下面我们就用这两个关键特征对球员聚类。

中距离干扰下投篮:60↑73

中距离空位投篮:64↑75

探索数据

看下这些球员的场次得分与助攻失误比散点图,这往往是数据分析和建模的第一步。

# 改善下绘图风格
import seaborn as sns
sns.set()

# nba联盟控卫场次得分与助攻失误比散点图
plt.scatter(point_guards['PTS'], point_guards['ATR'], c='y')
plt.title("Point Guards")
plt.xlabel('Points Per Game', fontsize=13)
plt.ylabel('Assist Turnover Ratio', fontsize=13)
plt.show()
秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图7)

最右边得分超过 30 的你不用猜,就是这个男人。

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图8)

确认下数据,场均得分大于 25 的过滤出来看下,果然是库里,东契奇、欧文、利拉德等人赫然在列。这些超巨得分是高,但看起来助攻失误比差不多都在平均线上下。这是合理的。其实有点干的越多错的越多的意思,工作上亦是如此。

看了下助攻失误比超高或超低的,我都不认识就不说了。

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图9)

我们聚类吧

从散点图来看,其实并没有明显的簇,但我们可以人为定义任意个簇。我们还是分成 5 类。于是我们开始做聚类的第一步。

STEP1:随机认定 5 个样本点作为簇的中心点

num_clusters = 5
# 从样本里随机选5个出来作为5个簇的起始中心点
random_initial_points = np.random.choice(point_guards.index, size=num_clusters)
centroids = point_guards.loc[random_initial_points]
# 画出散点图,包括5个随机选取的聚类中心点
plt.scatter(point_guards['PTS'], point_guards['ATR'], c='y')
plt.scatter(centroids['PTS'], centroids['ATR'], c='red')
plt.title("Centroids")
plt.xlabel('Points Per Game', fontsize=13)
plt.ylabel('Assist Turnover Ratio', fontsize=13)
plt.show()
秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图10)

随后就是不断迭代优化簇中心点的过程,为了方便,我们将中心点的坐标存在一个字典里。

def centroids_to_dict(centroids):
    dictionary = dict()
    # iterating counter we use to generate a cluster_id
    counter = 0

    # iterate a pandas data frame row-wise using .iterrows()
    for index, row in centroids.iterrows():
        coordinates = [row['PTS'], row['ATR']]
        dictionary[counter] = coordinates
        counter += 1

    return dictionary

centroids_dict = centroids_to_dict(centroids)
秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图11)

上图我们看到,随机选出来的centroids,我们把它存在了一个centroids_dict里面。

中距离运球后投篮:60↑73

三分干扰下投篮:76↑78

STEP2:将样本分配至离其最近的簇中心点上去

三分运球后投篮:73↑80

这里涉及两个计算,一个是距离的度量,一个是最小元素的查找。前者我们采用欧拉距离,后者是选择排序的精髓。

先定义好这两个计算函数,如下。

传球视野:34↑41

卡位:46↑49

import math

def calculate_distance(centroid, player_values):
    root_distance = 0

    for x in range(0, len(centroid)):
        difference = centroid[x] - player_values[x]
        squared_difference = difference**2
        root_distance += squared_difference

    euclid_distance = math.sqrt(root_distance)
    return euclid_distance


def assign_to_cluster(row):
    lowest_distance = -1
    closest_cluster = -1

    for cluster_id, centroid in centroids_dict.items():
        df_row = [row['PTS'], row['ATR']]
        euclidean_distance = calculate_distance(centroid, df_row)

        if lowest_distance == -1:
            lowest_distance = euclidean_distance
            closest_cluster = cluster_id
        elif euclidean_distance < lowest_distance:
            lowest_distance = euclidean_distance
            closest_cluster = cluster_id
    return closest_cluster

执行这两个函数,我们就完成了 STEP2,我们可视化看下完成后的结果。

进攻篮板:29↑43

防守篮板:49↑52

盖帽:54↑55

point_guards['cluster'] = point_guards.apply(lambda row: assign_to_cluster(row), axis=1)

def visualize_clusters(df, num_clusters):
&n

原地灌篮:37↑40

强行灌篮:37↑40

投篮智商:80↑93

进攻稳定性:73↑95

原地近距离投篮:97↓70

三分空位投篮:91↓82

罚球:84↓75

运球抢断:82↓43

马克·加索尔

中距离运球后投篮:58↑59

三分运球后投篮:29↑33

控球:41↑44

传球视野:73↑75

盖帽:64↑77

突破灌篮:57↑58

强行灌篮:37↑40

速度:48↑50

持球移动速度:36↑39

敏捷:25↑26

弹跳力:34↑38

能力:96↓93

原地上篮:108↓99

背身钩射:108↓107

背身控制:102↓99

造犯规:66↓50

中距离干扰下投篮:93↓82

中距离空位投篮:99↓95

三分空位投篮:95↓85

罚球:82↓80

进攻篮板:44↓42

防守篮板:101↓97

运球抢断:87↓53

进攻稳定性:87↓80

布莱克·格里芬

原地近距离投篮:82↑93

中距离空位投篮:64↑70

中距离运球后投篮:49↑51

三分运球后投篮:42↑45

罚球:77↑82

传球视野:76↑77

横向移动速度:57↑58

盖帽:49↑50

运球抢断:33↑37

三分空位投篮:89↓87

进攻篮板:48↓45

防守篮板:99↓84

卡尔-安东尼·唐斯

能力:99↑102

原地上篮:106↑110

背身后仰跳投:87↑93

背身钩射:93↑96

造犯规:78↑87

中距离干扰下投篮:82↑83

中距离运球后投篮:73↑78

三分干扰下投篮:87↑90

传球视野:37↑64

卡位:99↑104

进攻篮板:68↑78

防守篮板:99↑102

运球抢断:38↑42

强行灌篮:54↑55

投篮智商:110↑115

进攻稳定性:102↑115

原地近距离投篮:110↓104

中距离空位投篮:87↓85

三分空位投篮:96↓93

罚球:104↓95

盖帽:95↓90

哈里森·巴恩斯

背身钩射:45↑48

三分干扰下投篮:77↑85

三分空位投篮:82↑90

三分运球后投篮:71↑84

罚球:87↑93

传球视野:27↑32

进攻篮板:33↑37

原地灌篮:54↑55

强行灌篮:54↑55

能力:87↓85

原地近距离投篮:85↓64

中距离干扰下投篮:76↓60

中距离空位投篮:78↓66

中距离运球后投篮:76↓60

防守篮板:65↓54

运球抢断:46↓38

进攻稳定性:95↓87

赛尔吉·伊巴卡

能力:89↑90

造犯规:48↑50

三分运球后投篮:25↑28

罚球:78↑84

控球:32↑35

传球视野:28↑36

传球准确性:25↑29

盖帽:78↑82

运球抢断:34↑35

强行灌篮:42↑45

速度:58↑59

持球移动速度:37↑40

原地上篮:108↓107

三分空位投篮:82↓73

进攻篮板:76↓66

防守篮板:89↓87

迈勒斯·特纳

能力:86↑90

原地近距离投篮:102↑108

三分干扰下投篮:54↑87

三分空位投篮:73↑93

三分运球后投篮:25↑28

控球:32↑35

传球视野:28↑36

传球准确性:27↑31

防守篮板:64↑87

横向移动速度:45↑48

传球抢断:34↑38

盖帽:108↑112

干扰投篮:106↑108

运球抢断:29↑41

防守稳定性:73↑80

突破灌篮:40↑43

强行灌篮:32↑35

持球移动速度:36↑39

敏捷:37↑40

进攻稳定性:48↑80

中距离空位投篮:102↓97

罚球:85↓76

进攻篮板:54↓52

尼克拉·武切维奇

能力:96↑97

原地上篮:110↑114

造犯规:85↑93

中距离运球后投篮:61↑78

三分干扰下投篮:90↑91

三分运球后投篮:25↑49

控球:32↑35

传球视野:73↑75

传球智商:84↑90

传球准确性:32↑54

卡位:108↑114

进攻篮板:73↑77

横向移动速度:46↑49

防守稳定性:48↑50

持球防守智商:58↑59

挡拆防守智商:57↑58

突破灌篮:54↑55

强行灌篮:37↑40

持球移动速度:36↑39

敏捷:51↑52

弹跳力:42↑45

原地近距离投篮:112↓110

中距离干扰下投篮:102↓95

中距离空位投篮:108↓95

三分空位投篮:96↓91

罚球:93↓84

防守篮板:110↓108

盖帽:78↓73

运球抢断:46↓43

泰森·钱德勒

背身后仰跳投:51↑52

背身控制:49↑51

造犯规:45↑48

原地近距离投篮:57↑65

中距离空位投篮:45↑48

罚球:51↑59

控球:32↑35

传球视野:28↑30

传球准确性:37↑40

强行灌篮:37↑40

速度:57↑58

持球移动速度:29↑33

敏捷:33↑37

投篮智商:52↑54

接球:57↑58

进攻稳定性:32↑35

能力:81↓80

进攻篮板:99↓85

防守篮板:101↓96

盖帽:66↓61

运球抢断:40↓38

埃里克·布莱索

能力:87↑95

原地上篮:101↑106

突破上篮:99↑106

背身后仰跳投:37↑40

背身控制:25↑28

造犯规:73↑82

原地近距离投篮:68↑77

中距离干扰下投篮:69↑73

中距离空位投篮:76↑77

中距离运球后投篮:71↑76

控球:96↑101

传球智商:87↑101

传球准确性:84↑99

卡位:48↑50

防守篮板:51↑54

干扰投篮:83↑91

防守稳定性:80↑87

持球防守智商:87↑91

挡拆防守智商:85↑90

协防智商:87↑90

低位防守智商:37↑40

力量:54↑55

投篮智商:110↑115

反应时间:83↑90

进攻稳定性:95↑110

三分干扰下投篮:83↓80

三分空位投篮:85↓80

三分运球后投篮:84↓80

罚球:85↓83

传球视野:84↓77

进攻篮板:51↓43

盖帽:63↓51

运球抢断:78↓77

马克尔·富尔茨

能力:77↑78

背身后仰跳投:45↑48

背身钩射:39↑42

背身控制:41↑44

原地近距离投篮:60↑64

卡位:54↑55

进攻篮板:54↑58

防守篮板:48↑51

盖帽:42↑47

防守稳定性:37↑40

低位防守智商:48↑50

原地灌篮:26↑30

强行灌篮:32↑35

力量:55↑56

中距离空位投篮:65↓64

传球视野:75↓71

运球抢断:64↓56

伊内斯·坎特

能力:88↑89

突破上篮:85↑91

背身后仰跳投:87↑91

背身钩射:93↑95

造犯规:66↑71

中距离干扰下投篮:73↑82

中距离运球后投篮:52↑54

三分干扰下投篮:27↑54

三分空位投篮:48↑73

控球:48↑50

传球准确性:37↑40

横向移动速度:25↑28

传球抢断:42↑45

运球抢断:32↑35

防守稳定性:26↑30

持球防守智商:37↑40

挡拆防守智商:38↑41

协防智商:36↑39

低位防守智商:51↑52

突破灌篮:57↑58

强行灌篮:32↑35

持球移动速度:37↑40

敏捷:25↑28

力量:95↑99

投篮智商:110↑114

原地近距离投篮:87↓61

罚球:95↓89

传球视野:52↓49

进攻篮板:110↓104

防守篮板:110↓101

盖帽:54↓52

德玛库斯·考辛斯

横向移动速度:46↑49

盖帽:82↑84

运球抢断:68↑83

能力:101↓99

原地上篮:115↓106

突破上篮:101↓93

原地近距离投篮:96↓84

三分空位投篮:89↓77

罚球:80↓77

进攻篮板:60↓53

防守篮板:108↓96

原地灌篮:114↓110

进攻稳定性:115↓110

林书豪

能力:79↑82

背身后仰跳投:42↑45

背身钩射:25↑28

背身控制:34↑38

原地近距离投篮:85↑95

中距离干扰下投篮:76↑85

中距离运球后投篮:78↑85

传球视野:75↑77

卡位:34↑38

进攻篮板:25↑33

防守篮板:48↑53

盖帽:32↑42

防守稳定性:54↑55

低位防守智商:25↑28

突破灌篮:32↑36

强行灌篮:26↑30

力量:32↑35

中距离空位投篮:90↓85

三分空位投篮:82↓80

罚球:101↓95

运球抢断:64↓53

埃里克·戈登

能力:81↑83

背身钩射:32↑35

背身控制:48↑50

原地近距离投篮:60↑64

三分空位投篮:77↑83

传球视野:32↑40

传球智商:51↑53

运球抢断:29↑35

防守稳定性:48↑50

低位防守智商:39↑42

原地灌篮:26↑30

强行灌篮:26↑30

三分干扰下投篮:77↓73

三分运球后投篮:77↓73

罚球:99↓85

进攻篮板:32↓30

防守篮板:51↓45

盖帽:57↓51

保罗·加索尔

原地近距离投篮:80↑90

中距离运球后投篮:58↑59

三分干扰下投篮:54↑55

三分运球后投篮:26↑30

控球:40↑43

横向移动速度:32↑35

运球抢断:26↑35

突破灌篮:57↑58

强行灌篮:26↑30

速度:52↑54

持球移动速度:28↑32

敏捷:37↑40

弹跳力:38↑41

中距离空位投篮:85↓80

罚球:80↓75

传球视野:77↓73

进攻篮板:61↓58

盖帽:91↓80

提示:为了小程序中【球员收藏】功能方便大家使用,即日起,请使用微信授权登录(获取昵称与头像)小程序。新版本已经在审核中...

小程序:nba2k游戏助手

不当你的世界  只做你的肩膀

nba2k2球员数据

数据|资讯|对比|筛选|测评|热区

秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图12)秀,用NBA球员数据学透K-Means聚类nba2k19球员数据属性值变化之参考( 五)(图13)

微信搜索小程序:nba2k游戏助手

https://www.zxcsp.cn

技术研究、2k助手先驱者