2017年NBA球员数据分析
2017年NBA数据分析
- 前言
- 获取数据
- 数据分析
- 数据相关性
- 基本数据排名分析
- Seaborn常用的三个数据可视化方法
- 单变量:
- 双变量
- 多变量
- 衍生变量的一些可视化实践-以年龄为例
- 球队数据分析
- 球队薪资排行
- 按照球队综合实力排名
- 利用箱线图和小提琴图进行数据分析
前言
原始数据可以通过我分享的资源获取
NBA–2017年数据表
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
获取数据
data = pd.read_csv("./data/nba_2017_nba_players_with_salary.csv")
data.head()
data.shape
(342, 38)
# 粗略观察数据的各个统计值
data.describe()
Rk | AGE | MP | FG | FGA | FG% | 3P | 3PA | 3P% | 2P | ... | GP | MPG | ORPM | DRPM | RPM | WINS_RPM | PIE | PACE | W | SALARY_MILLIONS | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 320.000000 | 342.000000 | ... | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 | 342.000000 |
mean | 217.269006 | 26.444444 | 21.572515 | 3.483626 | 7.725439 | 0.446096 | 0.865789 | 2.440058 | 0.307016 | 2.620175 | ... | 58.198830 | 21.572807 | -0.676023 | -0.005789 | -0.681813 | 2.861725 | 9.186842 | 98.341053 | 28.950292 | 7.294006 |
std | 136.403138 | 4.295686 | 8.804018 | 2.200872 | 4.646933 | 0.078992 | 0.780010 | 2.021716 | 0.134691 | 1.828714 | ... | 22.282015 | 8.804121 | 2.063237 | 1.614293 | 2.522014 | 3.880914 | 3.585475 | 2.870091 | 14.603876 | 6.516326 |
min | 1.000000 | 19.000000 | 2.200000 | 0.000000 | 0.800000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | ... | 2.000000 | 2.200000 | -4.430000 | -3.920000 | -6.600000 | -2.320000 | -1.600000 | 87.460000 | 0.000000 | 0.030000 |
25% | 100.250000 | 23.000000 | 15.025000 | 1.800000 | 4.225000 | 0.402250 | 0.200000 | 0.800000 | 0.280250 | 1.200000 | ... | 43.500000 | 15.025000 | -2.147500 | -1.222500 | -2.422500 | 0.102500 | 7.100000 | 96.850000 | 19.000000 | 2.185000 |
50% | 205.500000 | 26.000000 | 21.650000 | 3.000000 | 6.700000 | 0.442000 | 0.700000 | 2.200000 | 0.340500 | 2.200000 | ... | 66.000000 | 21.650000 | -0.990000 | -0.130000 | -1.170000 | 1.410000 | 8.700000 | 98.205000 | 29.000000 | 4.920000 |
75% | 327.750000 | 29.000000 | 29.075000 | 4.700000 | 10.400000 | 0.481000 | 1.400000 | 3.600000 | 0.373500 | 3.700000 | ... | 76.000000 | 29.075000 | 0.257500 | 1.067500 | 0.865000 | 4.487500 | 10.900000 | 100.060000 | 39.000000 | 11.110000 |
max | 482.000000 | 40.000000 | 37.800000 | 10.300000 | 24.000000 | 0.750000 | 4.100000 | 10.000000 | 1.000000 | 9.700000 | ... | 82.000000 | 37.800000 | 7.270000 | 6.020000 | 8.420000 | 20.430000 | 23.000000 | 109.870000 | 66.000000 | 30.960000 |
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()
RPM | AGE | SALARY_MILLIONS | ORB | DRB | TRB | AST | STL | BLK | TOV | PF | POINTS | GP | MPG | ORPM | DRPM | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 6.27 | 28 | 26.50 | 1.7 | 9.0 | 10.7 | 10.4 | 1.6 | 0.4 | 5.4 | 2.3 | 31.6 | 81 | 34.6 | 6.74 | -0.47 |
1 | 4.81 | 27 | 26.50 | 1.2 | 7.0 | 8.1 | 11.2 | 1.5 | 0.5 | 5.7 | 2.7 | 29.1 | 81 | 36.4 | 6.38 | -1.57 |
2 | 1.83 | 27 | 6.59 | 0.6 | 2.1 | 2.7 | 5.9 | 0.9 | 0.2 | 2.8 | 2.2 | 28.9 | 76 | 33.8 | 5.72 | -3.89 |
3 | 4.35 | 23 | 22.12 | 2.3 | 9.5 | 11.8 | 2.1 | 1.3 | 2.2 | 2.4 | 2.2 | 28.0 | 75 | 36.1 | 0.45 | 3.90 |
4 | 4.20 | 26 | 16.96 | 2.1 | 8.9 | 11.0 | 4.6 | 1.4 | 1.3 | 3.7 | 3.9 | 27.0 | 72 | 34.2 | 3.56 | 0.64 |
# 获取两列数据之间的相关性
corr = data_cor.corr()
corr.head()
RPM | AGE | SALARY_MILLIONS | ORB | DRB | TRB | AST | STL | BLK | TOV | PF | POINTS | GP | MPG | ORPM | DRPM | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
RPM | 1.000000 | 0.175820 | 0.477542 | 0.388764 | 0.623515 | 0.587853 | 0.481971 | 0.599008 | 0.463097 | 0.492014 | 0.434226 | 0.604432 | 0.340810 | 0.549449 | 0.769822 | 0.578388 |
AGE | 0.175820 | 1.000000 | 0.353312 | -0.015752 | 0.088859 | 0.062064 | 0.114908 | 0.069892 | -0.062917 | 0.030673 | 0.005512 | 0.031422 | 0.051863 | 0.099657 | 0.136177 | 0.100636 |
SALARY_MILLIONS | 0.477542 | 0.353312 | 1.000000 | 0.264954 | 0.531569 | 0.482088 | 0.486159 | 0.446763 | 0.260288 | 0.536993 | 0.341512 | 0.635425 | 0.348093 | 0.594162 | 0.503682 | 0.102307 |
ORB | 0.388764 | -0.015752 | 0.264954 | 1.000000 | 0.731345 | 0.861103 | -0.011632 | 0.169075 | 0.654265 | 0.274670 | 0.557957 | 0.284908 | 0.296975 | 0.342140 | 0.102113 | 0.476857 |
DRB | 0.623515 | 0.088859 | 0.531569 | 0.731345 | 1.000000 | 0.976244 | 0.350786 | 0.485726 | 0.660733 | 0.598043 | 0.670708 | 0.648267 | 0.473376 | 0.684662 | 0.428433 | 0.426536 |
# 创建画布
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()
PLAYER | RPM | AGE | |
---|---|---|---|
6 | LeBron James | 8.42 | 32 |
37 | Chris Paul | 7.92 | 31 |
8 | Stephen Curry | 7.41 | 28 |
120 | Draymond Green | 7.14 | 26 |
7 | Kawhi Leonard | 7.08 | 25 |
# 按照球员薪资排名data.loc[:, ["PLAYER", "RPM", "AGE", "SALARY_MILLIONS"]].sort_values(by="SALARY_MILLIONS", ascending=False).head()
PLAYER | RPM | AGE | SALARY_MILLIONS | |
---|---|---|---|---|
6 | LeBron James | 8.42 | 32 | 30.96 |
25 | Mike Conley | 4.47 | 29 | 26.54 |
67 | Al Horford | 1.82 | 30 | 26.54 |
0 | Russell Westbrook | 6.27 | 28 | 26.50 |
1 | James Harden | 4.81 | 27 | 26.50 |
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()
RPM | SALARY_MILLIONS | AGE | POINTS | |
---|---|---|---|---|
0 | 6.27 | 26.50 | 28 | 31.6 |
1 | 4.81 | 26.50 | 27 | 29.1 |
2 | 1.83 | 6.59 | 27 | 28.9 |
3 | 4.35 | 22.12 | 23 | 28.0 |
4 | 4.20 | 16.96 | 26 | 27.0 |
# 多变量两两做一个表
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 colunm
data["age_cut"] = data.apply(lambda x:age_cut(x), axis=1)
data.head()
Rk | PLAYER | POSITION | AGE | MP | FG | FGA | FG% | 3P | 3PA | ... | MPG | ORPM | DRPM | RPM | WINS_RPM | PIE | PACE | W | SALARY_MILLIONS | age_cut | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Russell Westbrook | PG | 28 | 34.6 | 10.2 | 24.0 | 0.425 | 2.5 | 7.2 | ... | 34.6 | 6.74 | -0.47 | 6.27 | 17.34 | 23.0 | 102.31 | 46 | 26.50 | best |
1 | 2 | James Harden | PG | 27 | 36.4 | 8.3 | 18.9 | 0.440 | 3.2 | 9.3 | ... | 36.4 | 6.38 | -1.57 | 4.81 | 15.54 | 19.0 | 102.98 | 54 | 26.50 | best |
2 | 3 | Isaiah Thomas | PG | 27 | 33.8 | 9.0 | 19.4 | 0.463 | 3.2 | 8.5 | ... | 33.8 | 5.72 | -3.89 | 1.83 | 8.19 | 16.1 | 99.84 | 51 | 6.59 | best |
3 | 4 | Anthony Davis | C | 23 | 36.1 | 10.3 | 20.3 | 0.505 | 0.5 | 1.8 | ... | 36.1 | 0.45 | 3.90 | 4.35 | 12.81 | 19.2 | 100.19 | 31 | 22.12 | young |
4 | 6 | DeMarcus Cousins | C | 26 | 34.2 | 9.0 | 19.9 | 0.452 | 1.8 | 5.0 | ... | 34.2 | 3.56 | 0.64 | 4.20 | 11.26 | 17.8 | 97.11 | 30 | 16.96 | best |
5 rows × 39 columns
# 方便计数
data["cut"] = 1
data.loc[data.age_cut == "best"].SALARY_MILLIONS.head()
0 26.50
1 26.50
2 6.59
4 16.96
5 24.33
Name: 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_MILLIONS
y1 = data.loc[data.age_cut == "old"].RPM
plt.plot(x1, y1, "^")x2 = data.loc[data.age_cut == "best"].SALARY_MILLIONS
y2 = data.loc[data.age_cut == "best"].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, ".")
# 取出多个变量画图
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})
SALARY_MILLIONS | |
---|---|
age_cut | |
best | 26.54 |
old | 30.96 |
young | 22.12 |
# 按照球队进行分类
data_team = data.groupby(by="TEAM").agg({"SALARY_MILLIONS":np.mean})# 按照薪资进行分类, 降序排列
data_team.sort_values(by="SALARY_MILLIONS", ascending=False).head(10)
SALARY_MILLIONS | |
---|---|
TEAM | |
CLE | 17.095000 |
HOU | 13.432000 |
GS | 12.701429 |
ORL/TOR | 11.125000 |
POR | 9.730000 |
WSH | 9.628889 |
ORL | 9.490000 |
MIL/CHA | 9.425000 |
SA | 9.347273 |
NO/SAC | 8.970000 |
# 按照分球队分年龄段,上榜球员降序排列,
# 如上榜球员数相同,则按效率值降序排列。
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()
SALARY_MILLIONS | RPM | PLAYER | ||
---|---|---|---|---|
TEAM | age_cut | |||
ATL | best | 4.678000 | -1.768000 | 5 |
old | 12.775000 | 0.982500 | 4 | |
young | 1.926667 | -3.076667 | 3 | |
ATL/CLE | old | 5.040000 | -2.485000 | 2 |
ATL/PHI/OKC | best | 8.400000 | 1.720000 | 1 |
按照球队综合实力排名
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()
TEAM | SALARY_MILLIONS | RPM | PLAYER | POINTS | eFG% | MPG | AGE | |
---|---|---|---|---|---|---|---|---|
0 | ATL | 6.689167 | -1.178333 | 12 | 7.416667 | 0.442667 | 18.541667 | 27.000000 |
1 | ATL/CLE | 5.040000 | -2.485000 | 2 | 7.650000 | 0.582000 | 21.050000 | 35.500000 |
2 | ATL/PHI/OKC | 8.400000 | 1.720000 | 1 | 13.100000 | 0.511000 | 26.100000 | 29.000000 |
3 | BKN | 5.704545 | -1.224545 | 11 | 9.045455 | 0.487273 | 20.227273 | 27.636364 |
4 | BKN/WSH | 4.910000 | -4.045000 | 2 | 8.150000 | 0.470000 | 17.350000 | 27.000000 |
# 按照效率值降序排列
data_rpm2.sort_values(by="RPM", ascending=False).head()
TEAM | SALARY_MILLIONS | RPM | PLAYER | POINTS | eFG% | MPG | AGE | |
---|---|---|---|---|---|---|---|---|
18 | GS | 12.701429 | 3.478571 | 7 | 14.528571 | 0.575143 | 26.700000 | 28.714286 |
9 | CLE | 17.095000 | 2.566667 | 6 | 15.883333 | 0.555833 | 29.766667 | 28.000000 |
2 | ATL/PHI/OKC | 8.400000 | 1.720000 | 1 | 13.100000 | 0.511000 | 26.100000 | 29.000000 |
20 | HOU | 13.432000 | 1.582000 | 5 | 15.420000 | 0.534600 | 29.980000 | 27.200000 |
44 | SA | 9.347273 | 0.901818 | 11 | 9.818182 | 0.524182 | 21.472727 | 29.545455 |
利用箱线图和小提琴图进行数据分析
# 筛选数据
data.TEAM.isin(['GS', 'CLE', 'SA', 'LAC','OKC', 'UTAH', 'CHA', 'TOR', 'NO', 'BOS']).head()
0 True
1 False
2 True
3 True
4 False
Name: 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)
2017年NBA球员数据分析相关推荐
- 9.NBA球员数据分析
NBA球员数据分析 1.导入库 2.获取数据 3.数据分析 3.1 数据相关性--heatmap() 3.2 球员数据分析 3.3 seaborn常用的三个可视化方法 3.3.1 单变量--distp ...
- nba球员数据分析和可视化_可视化NBA球员统计
nba球员数据分析和可视化 I haven't written a post in a while. I had a lot to do for university and my hobbies l ...
- 人工智能-seaborn单双多变量绘图、两案例:NBA球员数据分析、北京租房数据统
1. seaborn 作用:更高效地绘图 #安装 pip3 install seaborn#导入 import seaborn as sns 单变量:直方图或核密度曲线 双变量:散点图.二维直方图. ...
- 【球迷福利】NBA球员数据分析
数据分析综合实战 前言 数据解释 数据分析 效率值相关性分析 球员数据分析 基本数据排名分析 薪资最高的10名球星 效率值最高的10名球星 出场时间最高的10名球星 Seaborn常用的三个数据可视化 ...
- NBA运动员球员数据分析
NBA运动员数据分析 背景信息 当前,篮球运动是最受欢迎的运动之一.在此万受瞩目的运动下,我打算针对篮球运动员个人的信息,技能水平等各项指标进行相关的分析与统计.例如,我们可能会关注如下的内容: 哪些 ...
- 爬table数据_爬取NBA球员薪资数据【Python数据分析百例连载】
通过Pandas模块也可以实现简单的爬虫.主要使用Pandas的read_html方法,该方法用于导入带有table标签的网页表格数据,语法如下: pandas.read_html(io,match= ...
- kaggle:NBA球员投篮数据分析与可视化
感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 本文作者:天善智能社区专家鲁伟 天善智能社区地址:htt ...
- kaggle:NBA球员投篮数据分析与可视化(一)
作为数据科学领域的金字招牌,kaggle已成为世界上最受欢迎的数据科学竞赛平台.在kaggle上,每个竞赛题下都藏匿着大批来自世界各地并且身怀绝技的数据科学家.作为一种众包模式,kaggle通过收取部 ...
- 实例:【基于机器学习的NBA球员信息数据分析与可视化】
文章目录 一.项目任务 二.代码实现及分析 1. 导入模块 2. 导入文件并对文件信息进行整体探测 3. 数据预处理 3.1 查看数据集信息 3.2 数据清洗与转换 3.3 数据去重 4. 数据可视化 ...
- python分析出nba球员的位置_解码NBA:数据分析揭示十三个隐藏的球员位置
自打1891年詹姆斯·奈史密斯(JAMES A. NAISMITH)发明篮球以来,篮球场上的球员就一直按照五个位置划分:中锋,大前锋.小前锋.组织后卫和得分后卫.但是斯坦福大学的一位数据狂人Muthu ...
最新文章
- SLAM综述(4)激光与视觉融合SLAM
- silverlight RadGridView总结二(转载)
- HDU 5703 Desert 水题 找规律
- 关于海量数据的SQL查询优化.........
- 操作系统--中断和异常
- 腾讯研发专家:TXSQL如何成为云计算时代数据库核弹头?
- [导入]blog年终小结
- linux下的常用命令
- 正则表达式之反向引用
- java要频繁调用容器时_Java知识点梳理
- ASP.NET中UpdatePanel与jQuery同时使用所遇问题解决
- Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计
- leetcode679:24Game
- 数据结构-直接选择排序
- ECharts饼状图legend显示Value所占百分比
- 计算机二级的图片尺寸,2021计算机二级照片是几寸 大小千万要记住咯
- php制作水印图片,PHP实例制作水印图片
- [Python] 必应搜索主页的背景图片爬虫
- NYOJ----366D的小L
- 怎样使PPT自动播放
热门文章
- NO JVM installation found. please install a 64-bit JDK,解决方法 Error launching android studio NO J
- 十三、PS 基本操作
- mbedtls交换服务器证书,mbedtls | 07 - DH秘钥协商算法的配置与使用
- 企业级代码静态测试工具Helix QAC——Helix QAC Dashboard基于团队的工程质量管理系统/Helix QAC资质认证
- php随机生成6个数字,php随机产生六位数密码的实例代码
- 微信小程序UI设计规范及文档模版
- ShaderForge - 纹理旋转
- java png图片转换成jpg_Java实现将png格式图片转换成jpg格式图片的方法【测试可用】...
- jQuery 前端操作
- ISAC(internet Speech Audio Codec):