一、需求
1.数据读取
获取16-17赛季NBA球员相关数据
2.数据相关性分析
获取球员关键数据列,对计算数据列两两之间的相关性,并通过热力图呈现。
3.球员数据分析
3.1 基本分析
3.1.1 获取薪资在前十的球员
3.1.2 获取效率值在前十的球员
3.2 数据可视化
3.2.1 用seaborn中的distplot绘图来分别看一下球员薪水、效率值、年龄这三个信息的分布情况
3.2.1 查看球员薪水和年龄的相关性
3.2.2 查看球员薪水、效率值、年龄、出场时间四个方向的两个相关性
3.2.3 根据年龄段对球员划分young、old、best三类,基于年龄对球员薪水和效率值进行分析;分析球员的RPM','POINTS','TRB','AST','STL','BLK','age_cut'两两相关性图
4.球队数据分析
4.1 球队薪资排名
将数据按球队分组,平均薪水降序排序,获取薪水在前十的球队信息
将数据按球队分组,按照球队正负值降序排序,如果相当按照PLAYER大小升序排序,获取前十数据
4.2 球队年龄结构
4.2.1 查看球队每个年龄阶段的人数。
4.2.2年龄段的上榜人数(PLAYER)进行降序排序,如果相同,则按平均正负值进行降序排序
4.3 球队综合实力
根据球队平均正负值进行降序排名
4.4 数据可视化
4.4.1 绘制箱线图
获取每个球队球员薪资分布情况
获取每个球队球员年龄分布情况
获取每个球队球员出厂时间分布情况
4.4.2 小提琴图
获取每个球队球员3分命中率分布情况
获取每个球队球员命中率分布情况
获取每个球队球员得分分布情况
二、实现
1. 获取数据
data = pd.read_csv('./data/nba_2017_nba_players_with_salary.csv')
2.数据相关性分析
# 获取球员关键数据列,对计算数据列两两之间的相关性,并通过热力图呈现。
# 获取球员关键数据列
data_cor = data.loc[:,['RPM','AGE','SALARY_MILLIONS','ORB','DRB','AST','STL','BLK','TOV','PF','POINTS','GP','MPG','ORPM','DRPM']]
# 获取数据两两之间的相关性
corr = data_cor.corr()
corr.head()
# 绘制热力图
plt.figure(figsize=(20,8),dpi=80)
sns.heatmap(corr,square=True,linewidths=0.1,annot=True)
3.球员数据分析
3.1 基本分析
# 查看16-17赛季薪资、效率值等指标在前十的球员
# 获取相关列数据:薪资、效率值(正负值)、年龄、出场时间
data1 = data.loc[:,['PLAYER','SALARY_MILLIONS','RPM','AGE','MPG']]
# 根据薪资进行降序排序,并获取前十数据
data1_salary_Top10 = data1.sort_values(by='SALARY_MILLIONS',ascending=False).head(10)
data1_salary_Top10
# 根据效率值进行降序排序,并获取在前十的球员
data1_RPM_Top10 = data1.sort_values(by='RPM',ascending=False).head(10)
data1_RPM_Top10
3.2 数据可视化
# 利用seaborn中的distplot绘图来分别看一下球员薪水、效率值、年龄这三个信息的分布情况
# 创建画布
plt.figure(figsize=(10,10))
# 分割图,多图显示
# 第一张图,显示球员薪水
plt.subplot(3,1,1)
sns.distplot(data.SALARY_MILLIONS)
plt.ylabel('salary')
# 第二张图,显示球员效率值
plt.subplot(3,1,2)
sns.distplot(data.RPM)
plt.ylabel('RPM')
# 第三张图,显示球员年龄
plt.subplot(3,1,3)
sns.distplot(data.AGE)
plt.ylabel('AGE')
# 查看球员薪水和年龄的相关性
# kde 核密度估计图形,二维直方图hex,默认为散点图
sns.jointplot(data.SALARY_MILLIONS,data.AGE,kind='hex',height=8)
# 查看球员薪水、效率值、年龄、出场时间四个方向的两个相关性
sns.pairplot(data1)
# 根据年龄段对球员划分young、old、best三类,基于年龄对球员薪水和效率值进行分析;分析球员的RPM','POINTS','TRB','AST','STL','BLK','age_cut'两两相关性图
# 根据年龄段对球员划分young、old、best三类
# 创建分类函数
def age_cut(df):
if df.AGE <= 24:
return "young"
elif df.AGE >=30:
return "old"
else:
return "best"
# 调用apply对年龄进行自定义划分(lambda)
data["age_cut"] = data.apply(lambda x:age_cut(x),axis=1)
data.head()
# 该列用年龄计数
data['cut'] = 1
# 基于年龄对球员薪水和效率值进行分析
# 设置背景类型
sns.set_style('darkgrid')
# 创建画布
plt.figure(figsize=(10,10),dpi=100)
# 设置图的标题
plt.title("RPM and Salary")
## old
# 获取“old”年龄段每个球员的薪资数据(SALARY_MILLIONS)
x1 = data.loc[data.age_cut=="old"].SALARY_MILLIONS
# 获取“old”年龄段每个球员的效率值数据(RPM)
y1 = data.loc[data.age_cut=="old"].RPM
# 绘制old年龄段球员薪资与效率值分析图图
plt.plot(x1,y1,'^')
## young
# 获取“young”年龄段每个球员的薪资数据(SALARY_MILLIONS)
x2 = data.loc[data.age_cut=="young"].SALARY_MILLIONS
# 获取“young”年龄段每个球员的效率值数据(RPM)
y2 = data.loc[data.age_cut=="young"].RPM
# 绘制young年龄段球员薪资与效率值分析图图
plt.plot(x2,y2,'.')
## best
# 获取“best”年龄段每个球员的薪资数据(SALARY_MILLIONS)
x3 = data.loc[data.age_cut=="best"].SALARY_MILLIONS
# 获取“best”年龄段每个球员的效率值数据(RPM)
y3 = data.loc[data.age_cut=="best"].RPM
# 绘制best年龄段球员薪资与效率值分析图图
plt.plot(x3,y3,'*')
# 分析球员的RPM','POINTS','TRB','AST','STL','BLK','age_cut'两两相关性图
multi_data = data.loc[:,['RPM','POINTS','TRB','AST','STL','BLK','age_cut']]
# 绘制多变量分布图
sns.pairplot(multi_data,hue='age_cut')
4. 球队数据分析
4.1 球队薪资排名
## 将数据按球队分组,平均薪水降序排序,获取薪水在前十的球队信息
# 按球队分组,获取球队的平均薪资、平均正负值、队员数
data_grp = data.groupby(by=['TEAM']).agg({"SALARY_MILLIONS":np.mean,"RPM":np.mean,"PLAYER":np.size})
# 根据平均薪资进行降序排序,并获取前十的数据
data_grp.sort_values(by='SALARY_MILLIONS',ascending=False).head(10)
4.2 球队年龄结构
# 4.2.1 查看球队每个年龄阶段的人数。
data_rpm = data.groupby(by=['TEAM','age_cut']).agg({"SALARY_MILLIONS":np.mean,"RPM":np.mean,"PLAYER":np.size})
# 4.2.2年龄段的上榜人数(PLAYER)进行降序排序,如果相同,则按平均正负值进行降序排序
data_rpm.sort_values(by=['PLAYER','RPM'],ascending=False)
4.3 球队综合实力
# 根据球队平均正负值进行降序排名
data_rpm = data.groupby(by=['TEAM'],as_index=False).agg({"SALARY_MILLIONS":np.mean,
'RPM':np.mean,
'PLAYER':np.size,
'eFG%':np.mean,
'MPG':np.mean,
'AGE':np.mean})
data_rpm.head()
# 根据球队正负值进行降序排名
data_rpm.sort_values(by='RPM',ascending=False).head(10)
4.4 数据可视化
## 获取指定球队的队员数据
data_team2 = data[data.TEAM.isin(['GS','CLE','SA','LAC','OKC','UTAH','CHA','TOR','NO','BOS'])]
4.4.1 绘制箱线图
# 绘图
# 设置背景类型
sns.set_style('whitegrid')
# 创建画布
plt.figure(figsize=(20,10))
# 绘制箱线图:获取每个球队球员薪资分布情况
plt.subplot(3,1,1)
sns.boxenplot(x='TEAM',y='SALARY_MILLIONS',data=data_team2)
# 绘制箱线图:获取每个球队球员年龄分布情况
plt.subplot(3,1,2)
sns.boxenplot(x='TEAM',y='AGE',data=data_team2)
# 绘制箱线图:获取每个球队球员出厂时间分布情况
plt.subplot(3,1,3)
sns.boxenplot(x='TEAM',y='MPG',data=data_team2)
4.4.2 小提琴图
# 绘图
# 设置背景类型
sns.set_style('whitegrid')
# 创建画布
plt.figure(figsize=(20,10))
# 小提琴图:获取每个球队球员3分命中率分布情况
plt.subplot(3,1,1)
sns.violinplot(x='TEAM',y='3P%',data=data_team2)
# 小提琴图:获取每个球队球员命中率分布情况
plt.subplot(3,1,2)
sns.violinplot(x='TEAM',y='eFG%',data=data_team2)
# 小提琴图:获取每个球队球员得分分布情况
plt.subplot(3,1,3)
sns.violinplot(x='TEAM',y='POINTS',data=data_team2)