对于一个球员来说,衡量其基本价值的最大利器就是其薪资与期望,还有其未来的发展。本节首先从球员薪资数据开始,开启我们的数据分析之旅。
对于数据处理来说,数据是一切的基础,在这里笔者准备了球员薪资数据集,如图3.1所示。
图3.1
数据集中分别对球员的姓名、年龄、收入等进行了说明。其对应的文本字段如表3.1所示。
表3.1 球员薪资数据字段说明
我们在本节中所需要的包如下:
● NumPy:数据分析包。
● Pandas:以表格的形式对数据分析的包。
● Matplotlib:图像处理包。
● Seaborn:表绘制包。
安装方法则使用Anaconda自带的pip安装即可,代码如下:
pip install numpy pip install pandas pip install matplotlib pip install seaborn
处理的第一步就是对数据的获取,在这里我们直接使用Pandas包对数据进行读取。Pandas本身就是Python数据分析的利器,是一个开源的数据分析包,最初是为金融数据分析而开发出来的。使用Pandas包获取数据的代码如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt pd.set_option('display.max_columns', None) # 对所有列进行展示 data = pd.read_csv("./NBA data/球员薪资.csv") print(data.head()) print(data.shape)
输出结果如图3.2所示。
图3.2
这里统计了342名球员的39项信息,图3.2所示是打印出了前5名的标准信息。整表的数据展示如图3.3所示。
从输出结果中可以分析出一些有趣的内容,几个比较重要的信息如下:
● 球员平均年龄为26.4岁,年龄段在19~40岁。
● 球员平均年薪为730万美金,当时最大的合同为年薪3000万美金。
● 球员平均出场时间为21.5分钟,某球员场均出场37.8分钟领跑联盟,当然也有只出场2.2分钟的角色球员,机会来之不易。
图3.3
当然类似的信息还请读者自行发掘。
对一个球员价值多少的最好衡量标准就是在比赛中的贡献度。在众多的数据中,有一项名为“RPM”,标识球员的效率值,该数据反映球员在场时对球队比赛获胜的贡献大小,最能反映球员的综合实力。
而RPM并不是一个单独存在的数据,我们想要知道对贡献度的影响和球员的哪些因素相关,对此的探索需要在不同的数据中计算其对应的相关性。下面我们计算一下RPM与其他列数据的相关性,在这里我们选取了部分可能相关的输入,代码如下:
data_cor = data.loc[:, ['RPM', 'AGE', 'SALARY_MILLIONS', 'ORB','DRB', 'TRB','AST', 'STL','BLK', 'TOV', 'PF','POINTS', 'GP', 'MPG', 'ORPM', 'DRPM']] corr = data_cor.corr() print(corr.iloc[:, 0]) # 只打印相关性分析结果的第一列
打印相关性的计算结果如图3.4所示。
可以看到相对于RPM来说,其中的ORPM(进攻效率值)对效率值的影响最高。换一种展示方式,如果此时我们希望将这个数据以热力图的形式展示,可以使用如下函数:
import seaborn as sns sns.heatmap(corr,square=True, linewidths=0.2, annot=False) plt.show()
热力图结果如图3.5所示。
图3.4
图3.5
由相关性分析的热力图可以看出,RPM值与年龄的相关性最弱,与ORPM(进攻效率值)、POINTS(场均得分)、STL(场均抢断数)等比赛技术数据的相关性最强。
在接下来的分析中,我们将把RPM作为评价一个球员能力及状态的直观反映因素之一,然后据此分析一个球员的薪资与能力是否与其RPM相匹配。
(1)薪资最高的球员与RPM的分析
前面已经说了,薪资可以认为是对一个球员最好的肯定,那么对于一个球员来说,其价值是否又符合薪资水准呢?我们打印出薪资最高的球员以及其对应的RPM,代码如下:
# 薪资最高的10名运动员 print(data.loc[:, ['PLAYER', 'SALARY_MILLIONS', 'RPM', 'AGE', 'MPG'] ].sort_values(by='SALARY_MILLIONS', ascending=False).head(10))
(2)效率最高的球员与RPM的分析
效率最高的球员与RPM的分析代码如下:
# 效率值最高的10名运动员 print(data.loc[:, ['PLAYER', 'RPM', 'SALARY_MILLIONS', 'AGE', 'MPG'] ].sort_values(by='RPM', ascending=False).head(10))
(3)上场时间最高的球员与RPM的分析
上场时间最高的球员与RPM的分析代码如下:
# 上场时间最高的10名运动员 print(data.loc[:, ['PLAYER', 'RPM', 'SALARY_MILLIONS', 'AGE', 'MPG'] ].sort_values(by='MPG', ascending=False).head(10))
至于最终结果那就是仁者见仁,智者见智,请读者自行打印分析。