新2网址 新2网址 新2网址

Python--NBA数据分析初探(下)

上次学习了使用jupyter notebook简单展示了单变量和双变量的数据可视化。在这篇文章中,我将在上一篇文章的基础上,实践一些python数据处理和派生变量的可视化实践。

如果要在现有数据集中生成新的变量,例如:按照年龄将玩家分成三代,可以定义一个函数,然后使用apply的方法生成新的变量。

#根据已有变量生成新的变量
data['avg_point']=data['POINTS']/data['MP'] #每分钟得分
def age_cut(df):
    if df.AGE<=24:
        return 'young'
    elif df.AGE>=30:
        return 'old'
    else:
        return 'best'
data['age_cut']=data.apply(lambda x: age_cut(x),axis=1) #球员是否处于黄金年龄
data['cnt']=1 #计数用

同样的目的,也可以使用numpy模块中的函数np.where,和excel中的if函数和R语言中的ifelse函数差不多,非常方便。

既然拿到了老中青三代的标签,我们再来看看不同年龄球员的RPM(正负)与之前的工资之间的关系:

nba球员数据排名_nba球员数据统计数据_nba球员出身统计

### 球员薪水与效率值   按年龄段来看
sns.set_style('darkgrid') #设置seaborn的面板风格
plt.figure(figsize=(8,8))
plt.title(u'$RPM\ and\ SALARY$',size=15)
X1=data.loc[data.age_cut=='old'].SALARY_MILLIONS
Y1=data.loc[data.age_cut=='old'].RPM
X2=data.loc[data.age_cut=='best'].SALARY_MILLIONS
Y2=data.loc[data.age_cut=='best'].RPM
X3=data.loc[data.age_cut=='young'].SALARY_MILLIONS
Y3=data.loc[data.age_cut=='young'].RPM
plt.plot(X1,Y1,'.')
plt.plot(X2,Y2,'.')
plt.plot(X3,Y3,'.')
plt.xlim(0,30)
plt.ylim(-8,8)

nba球员数据排名_nba球员出身统计_nba球员数据统计数据

plt.xlabel('Salary',size=10) plt.ylabel('RPM',size=10) plt.xticks(np.arange(0,30,3)) plt.legend(['old','best','young'])

nba球员出身统计_nba球员数据统计数据_nba球员数据排名

点阵图的横轴是球员的薪水,纵轴是效率值。可以观察到:

使用上一篇文章的方法,看一下老中青三代的技术统计分布:

dat2=data.loc[:,['RPM','POINTS','TRB','AST','STL','BLK','age_cut']]
sns.pairplot(dat2,hue='age_cut')

nba球员数据统计数据_nba球员出身统计_nba球员数据排名

团队数据分析

团队薪资排名

将数据按球队分组,平均工资从高到低,看看联盟中最富有的 10 支球队:

### 分组操作 按球队
dat_grp=data.groupby(by=['TEAM'],as_index=False).agg({'SALARY_MILLIONS':np.mean,'RPM':np.mean,'PLAYER':np.size})

nba球员数据排名_nba球员出身统计_nba球员数据统计数据

dat_grp=dat_grp.loc[dat_grp.PLAYER>5] #不考虑在赛季中转会的球员 dat_grp.sort_values(by='SALARY_MILLIONS',ascending=False).head(10)

nba球员数据排名_nba球员出身统计_nba球员数据统计数据

团队年龄结构

先肥不肥,后肥压炕。高素质年轻球员的储备是保持球队竞争力的关键。

我根据球队和年龄组对球员进行降序排列。如果列表中的玩家数量相同,则按照效率值的降序排列。

### 分组操作 按场上位置
dat_grp2=data.groupby(by=['TEAM','age_cut'],as_index=False).agg({'SALARY_MILLIONS':np.mean,'RPM':np.mean,'PLAYER':np.size})
dat_grp2=dat_grp2.loc[dat_grp2.PLAYER>3]     ##剔除掉少量的position摇摆人
dat_grp2.sort_values(by=['PLAYER','RPM'],ascending=False).head(15)

nba球员数据统计数据_nba球员出身统计_nba球员数据排名

团队综合实力分析

最后,我们来看看团队的整体实力:

效率值降序排列前10名的球队信息如下:

##数据可视化 按球队

nba球员数据排名_nba球员数据统计数据_nba球员出身统计

dat_grp3=data.groupby(by=['TEAM'],as_index=False).agg({'SALARY_MILLIONS':np.mean,'RPM':np.mean,'PLAYER':np.size,'POINTS':np.mean,'eFG%':np.mean,'MPG':np.mean,'AGE':np.mean}) dat_grp3=dat_grp3.loc[dat_grp3.PLAYER>5] dat_grp3.sort_values(by=['RPM'],ascending=False).head(10

nba球员数据统计数据_nba球员数据排名_nba球员出身统计

用箱线图和小提琴图看10支球队的相关数据

sns.set_style('whitegrid')#设置seaborn的面板风格
plt.figure(figsize=(12,8))
dat_grp4=data[data['TEAM'].isin(['GS','CLE','SA','LAC','OKC','UTAH','CHA','TOR','NO','BOS'])]
plt.subplot(3,1,1)
sns.boxplot(x='TEAM',y='AGE',data=dat_grp4)
plt.subplot(3,1,2)
sns.boxplot(x='TEAM',y='SALARY_MILLIONS',data=dat_grp4)
plt.subplot(3,1,3)
sns.boxplot(x='TEAM',y='MPG',data=dat_grp4)

nba球员数据排名_nba球员出身统计_nba球员数据统计数据

nba球员数据排名_nba球员数据统计数据_nba球员出身统计

plt.figure(figsize=(12,8))
plt.subplot(3,1,1)
sns.violinplot(x='TEAM',y='POINTS',data=dat_grp4)
plt.subplot(3,1,2)
sns.violinplot(x='TEAM',y='eFG%',data=dat_grp4)
plt.subplot(3,1,3)
sns.violinplot(x='TEAM',y='RPM',data=dat_grp4)

nba球员数据排名_nba球员出身统计_nba球员数据统计数据

聪明点,马刺队作为老牌劲旅,其实有一名效率为负离群值的球员。找出他是谁:

data.loc[data.TEAM=='SA'].sort_values(by='RPM',ascending=True).head(3)

nba球员出身统计_nba球员数据统计数据_nba球员数据排名

23岁的福布斯就出现在这个尴尬的位置上nba球员数据统计数据,加油吧!

结语

一年一度的NBA比赛即将重燃!随着科技的进步,我们可以更好的记录和分析篮球比赛的数据nba球员数据统计数据

这让我们更好地了解篮球,了解球员,结合自己的专业知识和兴趣,更好地享受篮球比赛的无限魅力。