展开全文

上回学习到利用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(正负值)与薪水之前的关系如何:

### 球员薪水与效率值   按年龄段来看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_MILLIONSY1=data.loc[data.age_cut=='old'].RPMX2=data.loc[data.age_cut=='best'].SALARY_MILLIONSY2=data.loc[data.age_cut=='best'].RPMX3=data.loc[data.age_cut=='young'].SALARY_MILLIONSY3=data.loc[data.age_cut=='young'].RPMplt.plot(X1,Y1,'.')plt.plot(X2,Y2,'.')plt.plot(X3,Y3,'.')plt.xlim(0,30)plt.ylim(-8,8)plt.xlabel('Salary',size=10)plt.ylabel('RPM',size=10)plt.xticks(np.arange(0,30,3))plt.legend(['old','best','young'])

点图横坐标为球员薪水,纵坐标为效率值。可以观测到:

  • 绝大部分的年轻球员拿着较低的薪水,数据非常集中。有两个离群点,是上文提到的戈贝尔和约基奇,两个小兄弟前途无量啊。

  • 黄金年龄的球员和老球员的数据相对发散,黄金年龄球员薪水与效率值正相关性更强。第一集团有几个全明星排头兵。

  • 老球员过了呼风唤雨的年纪,运动状态有所下滑,“高薪低效”的球员也稍微多一些。

用上篇的方法看一下老中青三代各技术统计的分布情况:

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

球队数据分析

球队薪资排行

将数据按球队分组,平均薪水降序排列,看一下联盟十大土豪球队:

### 分组操作 按球队dat_grp=data.groupby(by=['TEAM'],as_index=False).agg({'SALARY_MILLIONS':np.mean,'RPM':np.mean,'PLAYER':np.size})dat_grp=dat_grp.loc[dat_grp.PLAYER>5]  #不考虑在赛季中转会的球员dat_grp.sort_values(by='SALARY_MILLIONS',ascending=False).head(10)

  • 骑士队和勇士队已超高的薪水排在这份榜单的前两名,群星璀璨的他们最终在季后赛中一路厮杀,双双闯入分区决赛。

  • 排在第三的开拓者有10名球员上榜,可谓后补活力充沛。球队薪金结构的健康与否对球队的发展至关重要。

球队年龄结构

先胖不算胖,后胖压倒炕,优质的年轻球员储备是保持球队竞争性的密匙。

我按照分球队分年龄段,上榜球员降序排列,如上榜球员数相同,则按效率值降序排列。

### 分组操作 按场上位置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)

  • 在这份榜单里,排在榜首的公牛队有年轻球员8人,但效率值偏低,小伙子们还需努力啊。

  • 绿凯不得了,黄金年龄球员和年轻球员共14人,效率值较高,未来一片光明。

  • 年轻的森林狼有6名黄金年龄球员,老马刺有5为年长球员,一老一小效率值还都不错。

  • 最牛的还属宇宙勇,5名黄金年龄球员效率值为恐怖的4.7,明星在手天下我有!

球队综合实力分析

最后我们来看看球队综合实力:

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

##数据可视化 按球队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)

  • 勇士和其实占据前两名的位置,cross check了效率值反映球队实力的事实。

  • 老马刺排名第三,平均年龄达29.5岁排名第一,更新血液迫在眉睫。

  • 我所钟爱的雷霆由于大威少的存在能排在第5位,各项数据中规中矩。

利用箱线图和小提琴图看着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)

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)

  • 从年龄结构看,老马刺年龄跨度最大,年龄中位数最高。猛龙队最年轻且年龄跨度最小,后劲十足。

  • 从球队薪金看,勇士和骑士最高,俄村雷霆在失去杜兰特后栽了大跟头,薪金健康情况堪忧。

  • 从出场时间看,骑士队最高且跨度低,小团体战斗能力出众。

  • 从得分来看,骑士和勇士整体出众。雷霆的威少、绿军的小托马斯、醍醐的浓眉哥以及马刺的伦纳德均是各队的离群点,双拳难敌四手。

  • 从命中率看,命中率各队非常集中,绿凯的小托马刺作为地表最强175远远高于其他人。

  • 从效率值看,骑士和勇士是大赢家。各个队的离群点我们甚至不用通过具体的查询就可以猜到是哪位球员。

抖个机灵,马刺作为老牌劲旅,居然有一个球员效率值为负离群点,查一下他是谁:

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

福布斯这个23岁的小伙子出现在了这个尴尬的位置,要好好加油了!

结语

一年一度的NBA比赛即将战火重燃!而随着科技的进步我们可以更好的对篮球比赛的数据进行记录和分析,

这使得我们能更好地理解篮球,理解球员,结合我们的专业知识和兴趣爱好,更好地享受篮球比赛的无穷魅力。