NBA数据分析
前言获取数据数据分析数据相关性基本数据排名分析Seaborn常用的三个数据可视化方法单变量:双变量多变量衍生变量的一些可视化实践-以年龄为例球队数据分析球队薪资排行按照球队综合实力排名利用箱线图和小提琴图进行数据分析前言
原始数据可以通过我分享的资源获取
NBA–数据表
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
获取数据
data = pd.read_csv("./data/nba__nba_players_with_salary.csv")data.head()data.shape
(342, 38)
# 粗略观察数据的各个统计值data.describe()
8 rows × 35 columns
数据分析
数据相关性
data_cor = data.loc[:, ['RPM', 'AGE', 'SALARY_MILLIONS', 'ORB', 'DRB', 'TRB','AST', 'STL','BLK', 'TOV', 'PF', 'POINTS', 'GP', 'MPG', 'ORPM', 'DRPM']]data_cor.head()
# 获取两列数据之间的相关性corr = data_cor.corr()corr.head()
# 创建画布plt.figure(figsize=(20, 8), dpi=100)# 画出相关性热图# param1: 数据# param2; 正方形# param3: 线宽# param4: 显示值sns.heatmap(corr, square=True, linewidths=0.1, annot=True)
基本数据排名分析
# 按照效率值排名data.loc[:, ["PLAYER", "RPM","AGE"]].sort_values(by="RPM", ascending=False).head()
# 按照球员薪资排名data.loc[:, ["PLAYER", "RPM", "AGE", "SALARY_MILLIONS"]].sort_values(by="SALARY_MILLIONS", ascending=False).head()
Seaborn常用的三个数据可视化方法
单变量:
# 利用seaborn中的distplot绘图来#分别看一下球员薪水、效率值、年龄这三个信息的分布情况# 设置显示风格sns.set_style("darkgrid")# 设置画布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")
双变量
sns.jointplot(data.AGE, data.SALARY_MILLIONS, kind="hex")
多变量
multi_data = data.loc[:, ['RPM','SALARY_MILLIONS','AGE','POINTS']]multi_data.head()
# 多变量两两做一个表sns.pairplot(multi_data)
衍生变量的一些可视化实践-以年龄为例
def age_cut(df):"""年龄划分"""if df.AGE <= 24:return "young"elif df.AGE >= 30:return "old"else:return "best"
# 使用apply对年龄进行划分# 函数作为一个对象,能作为参数传递给其它参数,并且能作为函数的返回值# 循环data的每一个值, 带入age_cut求值, 得到的结果赋给age_cut colunmdata["age_cut"] = data.apply(lambda x:age_cut(x), axis=1)data.head()
5 rows × 39 columns
# 方便计数data["cut"] = 1
data.loc[data.age_cut == "best"].SALARY_MILLIONS.head()
0 26.501 26.5026.594 16.965 24.33Name: SALARY_MILLIONS, dtype: float64
# 基于年龄段对球员薪水和效率值进行分析sns.set_style("darkgrid")plt.figure(figsize=(10,10), dpi=100)plt.title("RPM and Salary")x1 = data.loc[data.age_cut == "old"].SALARY_MILLIONSy1 = data.loc[data.age_cut == "old"].RPMplt.plot(x1, y1, "^")x2 = data.loc[data.age_cut == "best"].SALARY_MILLIONSy2 = data.loc[data.age_cut == "best"].RPMplt.plot(x2, y2, "^")x3 = data.loc[data.age_cut == "young"].SALARY_MILLIONSy3 = data.loc[data.age_cut == "young"].RPMplt.plot(x3, y3, ".")
# 取出多个变量画图multi_data2 = data.loc[:, ['RPM','POINTS','TRB','AST','STL','BLK','age_cut']]# 用hue来指定对应colunm所有取值中每一种对应的颜色sns.pairplot(multi_data2, hue="age_cut")
球队数据分析
球队薪资排行
# .agg() 聚合方法 -- 字典data.groupby(by="age_cut").agg({"SALARY_MILLIONS":np.max})
# 按照球队进行分类data_team = data.groupby(by="TEAM").agg({"SALARY_MILLIONS":np.mean})# 按照薪资进行分类, 降序排列data_team.sort_values(by="SALARY_MILLIONS", ascending=False).head(10)
# 按照分球队分年龄段,上榜球员降序排列,# 如上榜球员数相同,则按效率值降序排列。data_rpm = data.groupby(by=["TEAM","age_cut"]).agg({"SALARY_MILLIONS": np.mean,"RPM": np.mean, "PLAYER": np.size})data_rpm.sort_values(by=["PLAYER", "RPM"], ascending=False).head()data_rpm.head()
按照球队综合实力排名
data_rpm2 = 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})data_rpm2.head()
# 按照效率值降序排列data_rpm2.sort_values(by="RPM", ascending=False).head()
利用箱线图和小提琴图进行数据分析
# 筛选数据data.TEAM.isin(['GS', 'CLE', 'SA', 'LAC','OKC', 'UTAH', 'CHA', 'TOR', 'NO', 'BOS']).head()
0True1 False2True3True4 FalseName: TEAM, dtype: bool
# 箱线图#设置图片背景sns.set_style("whitegrid")plt.figure(figsize=(20, 10))# 获取需要的数据data_team2 = data[data.TEAM.isin(['GS', 'CLE', 'SA', 'LAC','OKC', 'UTAH', 'CHA', 'TOR', 'NO', 'BOS'])]# 进行相应的绘图\# 年薪plt.subplot(3,1,1)sns.boxplot(x="TEAM", y="SALARY_MILLIONS", data = data_team2)# 年龄plt.subplot(3,1,2)sns.boxplot(x="TEAM", y="AGE", data = data_team2)# 场均上场时间plt.subplot(3,1,3)sns.boxplot(x="TEAM", y="MPG", data = data_team2)
# 绘制小提琴图# 设置图背景sns.set_style("whitegrid")plt.figure(figsize=(20, 10))# 三分命中率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)
如果觉得《NBA球员数据分析》对你有帮助,请点赞、收藏,并留下你的观点哦!