NBA与数据分析的碰撞
前言:NBA(National Basketball Association)
NBA作为世界上最具体育竞争特色的赛事盛会之一,每年都有大量球迷关注这项体育赛事。在观看比赛的时,我们大多数人都会为球员的DUNK和超远三分而兴奋,球员的场上表现越好,这名球员的数据也会越好。不同球员的擅长领域也不同,这里提到了数据,数据科学作为近些年最为热门的一个领域,人工智能,大数据,云计算等领域离不开数据科学,但是只有数据,没有分析那么这些数据就没有任何的意义。在这篇文章里:我会使用python语言进行对2017赛季NBA球员的相关数据进行分析,让读者体会到数据之美
这是本文提到的一些数据的含义
分析:
1.数据分析及数据可视化库导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from pylab import mpl
这里是常用的python数据分析及可视化的模块,Numpy是一个科学计算的工具,pandas是数据分析工具,matplotlib是一个数据可视化绘图工具
seaborn是matplotlib的高级封装
2.NBA球员数据导入
data = pd.read_csv("../data/nba_2017_nba_players_with_salary.csv")
data.head()
这是2017赛季一些相关球员的相关数据,这里控制只显示了前五行,分别是威斯布鲁克,哈登,托马斯等人的数据
3.数据分析
3.1数据相关性分析
data_cor = data.loc[:,["RPM","AGE","SALARY_MILLIONS","ORPM","DRPM","ORB","POINTS","AST","STL","ORB","DRB"]]
#数据相关性大小计算表得出一个DATAFRAME
coor = data_cor.corr()
#通过热力图来查看相关性关系
sns.heatmap(coor,square=True,linewidths=2,linecolor="w",annot=False)
这个可视化图表是一个热力图,在这里体现了RPM,AGE,SALARY_MILLIONS,ORPM,DRPM,ORB,POINTS,AST,STL,ORB,DRB
这些数据彼此的相关性,最右边的图例代表从下往上数值增大颜色变浅,相关性越弱
在这个图中可以看到RPM和DRPM,ORPM相关性较强,就代表一个球员整体效率值和进攻效率值和防守效率值有密不可分的关系
我们也可以看到POINT和ORPM有极大的相关性,那就代表一个球员的得分和进攻效率值息息相关,同时POINT和AGE相关性并不大,所以并不能得出年龄越大得分越多或者越年轻得分越多,一定是有一个适当的区间才会有强相关性,但是在各个年龄NBA球员中,并没有体现得分和年龄的相关性
相关性解释:相关性是一个通用的概念,可以用于描述事物之间的各种关系和影响程度,相关性越强,两个或多个事务的相互影响越强
4.球员分析
4.1薪资排行前十名
data.loc[:,["PLAYER","SALARY_MILLIONS","AGE","POINTS"]].sort_values(by="SALARY_MILLIONS",ascending=False).head(10)
这里是17赛季当赛季薪资排行的前十名球员,闪电侠如愿拿到了大合同,诺维茨基也到了生涯末期,当时的王者,詹姆斯依旧占据着各项榜单第一名,薪资也是当仁不让
xinzi = data.loc[:,["PLAYER","SALARY_MILLIONS","AGE","POINTS"]].sort_values(by="SALARY_MILLIONS",ascending=False)
xinzi = xinzi.iloc[:10,:]
plt.figure(figsize=(15,5),dpi=100)
plt.bar(xinzi.PLAYER,xinzi.SALARY_MILLIONS,align='center',color=['r','b'])
plt.show()
这是根据薪资数据做出的可视化图,能直观的感受到顶尖高手之间薪资的差异
4.2效率排行前十名
data.loc[:,["PLAYER","RPM","AGE","POINTS"]].sort_values(by="RPM",ascending=False).head(10)
这里体现了当赛季效率值前十名
d = data.loc[:,["PLAYER","RPM","AGE","POINTS"]].sort_values(by="RPM",ascending=False)
d = d.iloc[:10,:]
plt.figure(figsize=(15,5),dpi=100)
plt.bar(d.PLAYER,d.RPM,align='center',color=['r','b'])
plt.show()
这是当赛季效率值排行榜,结合前面的图来看,詹姆斯是联盟薪资最高也是效率值最高的球员,他是当时联盟的王者,而在效率值前十名中有些球员却没有出现在薪资前十名榜单,他们就是低薪高效的代表人物
4.3出场时间排行前十名
data.loc[:,["PLAYER","MPG","AGE","POINTS"]].sort_values(by="MPG",ascending=False).head(10)
MPG = data.loc[:,["PLAYER","MPG","AGE","POINTS"]].sort_values(by="MPG",ascending=False)
MPG = MPG.iloc[:10,:]
plt.figure(figsize=(15,5),dpi=100)
plt.bar(MPG.PLAYER,MPG.MPG,align='center',color=['r','b'])
plt.show()
这里体现出17赛季出场时间排行,这些球员都是球队的绝对核心,才得以出场时间遥遥领先
5.SEABORN可视化
5.1 球员薪水,效率值,年龄分布关系
data1 = data.loc[:,["RPM","SALARY_MILLIONS","AGE","POINTS"]]
sns.jointplot(x=data1["AGE"],y=data1["SALARY_MILLIONS"],kind='hex',height=8)
plt.show()
这里体现的是球员年龄和薪水的分布,通过这张图可以看到,其中20多岁出头心在在3百万的球员是最集中的,而有些球员年龄越大薪资越高,但是有的球员是年龄很大但是薪资也很少,有一些青年才俊很早就签下大合同,通过自己表现拿下高薪
data1 = data.loc[:,["RPM","SALARY_MILLIONS","AGE","POINTS"]]
sns.jointplot(x=data1["AGE"],y=data1["RPM"],kind='kde',height=8)
plt.show()
这张可视化图体现的是球员年龄和效率值的关系,可以看到集中在年轻球员年龄为20-25岁效率值为-2.5左右,可能是处在成长阶段,还没成为独当一面的球星,我妈呢也可以看到25岁以上28岁左右是一个黄金年龄,出现了很多效率值高的球员,步入了自己的巅峰
5.2多个数据之间的关系
da = data.loc[:,["RPM","SALARY_MILLIONS","POINTS","AGE"]]
sns.pairplot(da)
plt.show()
这幅图就是一些常见数据之间的关系分布,例如POINT和RPM有着很强的线性关系,但是AGE和POINT就没有很强的线性关系,也就是我们并不能书一个球员年龄越大得分就越多
6.衍生变量 根据年龄进行分组统计
# 分割年龄函数
def age_cut(df):
if df.AGE <=24:
return 'young'
elif df.AGE >= 30:
return 'old'
else:
return 'gold_age'
data['age_cut'] = data.apply(lambda x:age_cut(x) ,axis=1)
data['cut']=1
data.head()
这里定义了一个分割年龄的函数,将不同年龄标记成不同的阶段,再添加到表中,可以看到新加了一列就是代表年龄分段的一列
#基于年龄阶段对球员薪水和效率值进行分析
#图例以及参数
sns.set_style('darkgrid')
plt.figure(figsize=(10,10),dpi=100)
plt.title('RPM and Salary')
plt.xlabel('Salary')
plt.ylabel('RPM')
x1 = data.loc[data.age_cut=='old'].SALARY_MILLIONS
y1 = data.loc[data.age_cut=='old'].RPM
plt.plot(x1,y1,'^')
x2 = data.loc[data.age_cut=='gold_age'].SALARY_MILLIONS
y2 = data.loc[data.age_cut=='gold_age'].RPM
plt.plot(x2,y2,'.')
x3 = data.loc[data.age_cut=='young'].SALARY_MILLIONS
y3 = data.loc[data.age_cut=='young'].RPM
plt.plot(x3,y3,'^')
plt.legend(['old','gold_age','young'])
这张图可以看到不同年龄段的球员在薪资在和效率值之间关系并不相同,年轻球员一般薪资较低效率值集中在左下角,但是当时有两个年轻球员很特殊,注意看图中绿三角左上角出现了两个不一样的球员,薪资很低,但是效率非常的高,甚至老球员,巅峰年龄球员也没有他们两个高,这两名球员就是与约基奇和戈贝尔两名球员,在前面效率排行榜前十的表中也可以见到他们两人的身影,约老师的高效帮助他在2023年拿到了总冠军,戈贝尔拿到了3次最佳防守球员,这都是他们两位球员高效的回报
dat2 = data.loc[:,["RPM","POINTS","TRB","AST","STL","age_cut"]]
sns.pairplot(dat2,hue='age_cut')
这是类似之前的数据关系图,但是不同的是根据年龄进行了划分
数据集来源:kaggle平台