NBA运动员数据分析

背景信息

当前,篮球运动是最受欢迎的运动之一。在此万受瞩目的运动下,我打算针对篮球运动员个人的信息,技能水平等各项指标进行相关的分析与统计。例如,我们可能会关注如下的内容:


  1. 哪些球员从2014年到2019年近6年连续在榜?
  2. 对比各球员在2019年的各项数据如何?
  3. 詹姆斯-哈登随年份数据如何变化?
  4. 2019年球员数据分布如何?
  5. 篮球运动员的失误与上场时长有什么联系?
  6. 球员的各项数据之间的相关性如何?
  7. 哪些数据会对球员的得分有什么影响?

任务说明

概念

数据分析是指用适当的方法与工具,对收集来的大量数据进行分析,提取其中有意义的信息,从而形成有价值的结论的过程。

基本流程

在进行数据分析之前,需要清楚数据分析的基本流程。

  • 明确需求与目的

    • 分析篮球运动员,得出结论
  • 数据收集
    • 爬取新浪体育网站数据
  • 数据预处理
    • 特征筛选

      • 降维
    • 数据清洗
      • 缺失值
      • 异常值
      • 重复值
  • 数据分析
    • 数据建模
    • 数据可视化
  • 编写报告总结

实验步骤

获取收集

导入相关库

import os
import requests
import re
import pandas as pd
from lxml import etree
import warnings
import matplotlib.pyplot as plt
import seaborn as sns
import pyecharts.options as opts
from pyecharts.globals import ThemeTypewarnings.filterwarnings("ignore")
  • 需要爬取的数据

  • 爬虫思路分析:

    • 1.需求获取新浪体育网站的球员信息
    • 2.寻找网址(球员的不同赛季的信息在展示html页面找不到)
      • 可判断该信息是一个Ajax请求
      • 通过浏览器抓包,和多次尝试在Postman软件上发送request请求
      • 寻得球员分页信息的request发送相应url的规律,并循环遍历
    • 3.获取request返回的内容
    • 4.使用正则表达式对request返回信息进行筛选
    • 5.将筛选的数据以csv格式储存在本地文件中
# 爬虫程序def spider_nba():# 创建的目录path = "./basketball_data"if not os.path.exists(path):os.mkdir(path)for i in range(6):url = 'http://slamdunk.sports.sina.com.cn/api?p=radar&callback=jQuery111306538669297726742_1571969723673&p=radar&s=leaders&a=players_top&season='+str(2019-i)+'&season_type=reg&item_type=average&item=points&order=1&_='+str(1571982115616+i)response=requests.get(url)# 采用utf-8解码response.encoding='utf8'# 读取reponsedata = response.textdata = re.findall('\{("rank.*?"personal_fouls":".*?")\}', data)a_list = []for item in data:temp = item.split(",")a_list.append(temp)dic_a = dict()for items in a_list:for item in items:key, value = item.split(":")key = key[1:-1]if key == '':continueif value[1:3] == "\\u":value = "u" + valuevalue = eval(value)else:value = value[1:-1]if re.match("^\d+$", value):value = int(value)elif re.match("^\d*\.\d+$", value):value = float(value)if key not in dic_a.keys():dic_a[key] = [value]else:dic_a[key].append(value)# 用数据框接收df = pd.DataFrame(dic_a)# 写入文件保存df.to_csv('./basketball_data/player_'+str(2019-i)+'.csv')# 判断./basketball_data/路径下是否存在文件,如果不存在,就执行爬虫程序
if not os.path.exists('./basketball_data/'):spider_nba()
else:pass
# 查看写入数据结果
# os.getcwd()
# os.chdir(path)
# 修改当前路径
os.chdir(path='./basketball_data/')
print(os.getcwd())
os.listdir()
['player_2014.csv','player_2015.csv','player_2016.csv','player_2017.csv','player_2018.csv','player_2019.csv']
# 2014年到2019年的球员信息存储到字典中
year_df = dict()
for i in range(6):df = pd.read_csv('player_'+str(2019-i)+'.csv')try:df = df.drop("Unnamed: 0",axis=1)except:passyear_df[2019-i] = df
for i in range(2014, 2020):print("%d年数据形状: %d行 %d列" % (i, year_df[i].shape[0], year_df[i].shape[1]))
2014年数据形状: 25行 29列
2015年数据形状: 25行 29列
2016年数据形状: 25行 29列
2017年数据形状: 25行 29列
2018年数据形状: 25行 29列
2019年数据形状: 27行 29列
# 查看列名
year_df[2019].columns
Index(['rank', 'score', 'pid', 'first_name', 'last_name', 'tid', 'team_name','games_played', 'games_started', 'minutes', 'points','field_goals_made', 'field_goals_att', 'field_goals_pct','three_points_made', 'three_points_att', 'three_points_pct','free_throws_made', 'free_throws_att', 'free_throws_pct','offensive_rebounds', 'defensive_rebounds', 'rebounds', 'assists','turnovers', 'assists_turnover_ratio', 'steals', 'blocks','personal_fouls'],dtype='object')
# 查看前三行
year_df[2019].head(3)
rank score pid first_name last_name tid team_name games_played games_started minutes ... free_throws_pct offensive_rebounds defensive_rebounds rebounds assists turnovers assists_turnover_ratio steals blocks personal_fouls
0 1 38.5 cf418e0c-de9d-438f-a1ac-3be539a56c42 特雷 583ecb8f-fb46-11e1-82cb-f4ce4684ea4c 老鹰 2 2 36.5 ... 0.750 0.0 7.0 7.0 9.0 5.5 1.6 1.5 0.00 1.0
1 2 37.7 dd146010-902b-4ad7-b98c-650d0363a2f0 凯里 欧文 583ec9d6-fb46-11e1-82cb-f4ce4684ea4c 篮网 3 3 34.7 ... 0.931 1.3 4.3 5.7 6.3 2.0 3.2 1.7 0.67 3.3
2 3 32.0 ab532a66-9314-4d57-ade7-bb54a70c65ad 卡尔-安东尼 唐斯 583eca2f-fb46-11e1-82cb-f4ce4684ea4c 森林狼 3 3 33.7 ... 0.630 2.3 11.0 13.3 5.0 2.3 2.1 2.7 2.00 3.0

3 rows × 29 columns

数据预处理

特征筛选

  • 数据集中的列,并非都是我们分析所需要的
  • 可以有选择性的进行加载,只加载我们需要的信息列
for i in range(2014, 2020):year_df[i]# 删除以下列del_name = ['pid','tid','games_played','games_started','points']year_df[i] = year_df[i].drop(del_name,axis=1)# 连接first_name和last_nameyear_df[i]['player_name'] = year_df[i]['first_name']+"-"+year_df[i]['last_name']player_name = year_df[i].player_nameyear_df[i] = year_df[i].drop(['first_name','last_name'],axis=1)year_df[i] = year_df[i].drop('player_name',axis=1)# 将player_name插入到第二列year_df[i].insert(1,'player_name',player_name)team_name = df.team_nameyear_df[i] = year_df[i].drop('team_name',axis=1)# 将team_name插入到第三列year_df[i].insert(2,'team_name',team_name)
year_df[2019].columns
Index(['rank', 'player_name', 'team_name', 'score', 'minutes','field_goals_made', 'field_goals_att', 'field_goals_pct','three_points_made', 'three_points_att', 'three_points_pct','free_throws_made', 'free_throws_att', 'free_throws_pct','offensive_rebounds', 'defensive_rebounds', 'rebounds', 'assists','turnovers', 'assists_turnover_ratio', 'steals', 'blocks','personal_fouls'],dtype='object')
# 查看前三行
year_df[2019].head(3)
rank player_name team_name score minutes field_goals_made field_goals_att field_goals_pct three_points_made three_points_att ... free_throws_pct offensive_rebounds defensive_rebounds rebounds assists turnovers assists_turnover_ratio steals blocks personal_fouls
0 1 特雷-杨 雷霆 38.5 36.5 13.5 23.0 0.587 5.5 10.0 ... 0.750 0.0 7.0 7.0 9.0 5.5 1.6 1.5 0.00 1.0
1 2 凯里-欧文 火箭 37.7 34.7 12.0 26.3 0.456 4.7 11.3 ... 0.931 1.3 4.3 5.7 6.3 2.0 3.2 1.7 0.67 3.3
2 3 卡尔-安东尼-唐斯 雷霆 32.0 33.7 10.7 20.3 0.525 5.0 9.7 ... 0.630 2.3 11.0 13.3 5.0 2.3 2.1 2.7 2.00 3.0

3 rows × 23 columns

数据清洗

缺失值处理

  • 通过info查看数据信息。
  • 可以通过isnull与sum结合,查看缺失值情况。
# info方法可以显示每列名称,非空值数量,每列的数据类型,内存占用等信息。
# data.info()
for i in range(2014, 2019):print("============"+str(i)+"年============")print(year_df[i].isnull().sum(axis=0))

==2014年=
rank 0
player_name 0
team_name 0
score 0
minutes 0
field_goals_made 0
field_goals_att 0
field_goals_pct 0
three_points_made 0
three_points_att 0
three_points_pct 0
free_throws_made 0
free_throws_att 0
free_throws_pct 0
offensive_rebounds 0
defensive_rebounds 0
rebounds 0
assists 0
turnovers 0
assists_turnover_ratio 0
steals 0
blocks 0
personal_fouls 0
dtype: int64
2015年
rank 0
player_name 0
team_name 0
score 0
minutes 0
field_goals_made 0
field_goals_att 0
field_goals_pct 0
three_points_made 0
three_points_att 0
three_points_pct 0
free_throws_made 0
free_throws_att 0
free_throws_pct 0
offensive_rebounds 0
defensive_rebounds 0
rebounds 0
assists 0
turnovers 0
assists_turnover_ratio 0
steals 0
blocks 0
personal_fouls 0
dtype: int64
2016年
rank 0
player_name 0
team_name 0
score 0
minutes 0
field_goals_made 0
field_goals_att 0
field_goals_pct 0
three_points_made 0
three_points_att 0
three_points_pct 0
free_throws_made 0
free_throws_att 0
free_throws_pct 0
offensive_rebounds 0
defensive_rebounds 0
rebounds 0
assists 0
turnovers 0
assists_turnover_ratio 0
steals 0
blocks 0
personal_fouls 0
dtype: int64
2017年
rank 0
player_name 0
team_name 0
score 0
minutes 0
field_goals_made 0
field_goals_att 0
field_goals_pct 0
three_points_made 0
three_points_att 0
three_points_pct 0
free_throws_made 0
free_throws_att 0
free_throws_pct 0
offensive_rebounds 0
defensive_rebounds 0
rebounds 0
assists 0
turnovers 0
assists_turnover_ratio 0
steals 0
blocks 0
personal_fouls 0
dtype: int64
2018年
rank 0
player_name 0
team_name 0
score 0
minutes 0
field_goals_made 0
field_goals_att 0
field_goals_pct 0
three_points_made 0
three_points_att 0
three_points_pct 0
free_throws_made 0
free_throws_att 0
free_throws_pct 0
offensive_rebounds 0
defensive_rebounds 0
rebounds 0
assists 0
turnovers 0
assists_turnover_ratio 0
steals 0
blocks 0
personal_fouls 0
dtype: int64

# 删除所有含有空值的行。就地修改。
# year_df[2019].dropna(axis=0, inplace=True)
# year_df[2019].isnull().sum()

异常值处理

  • 通过describe查看数值信息。
  • 可配合箱线图辅助。
  • 异常值可以删除,视为缺失值,或者不处理。
year_df[2019].describe()
rank score minutes field_goals_made field_goals_att field_goals_pct three_points_made three_points_att three_points_pct free_throws_made ... free_throws_pct offensive_rebounds defensive_rebounds rebounds assists turnovers assists_turnover_ratio steals blocks personal_fouls
count 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 ... 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000 27.000000
mean 13.481481 26.211111 33.692593 9.192593 18.529630 0.501481 2.290000 6.070370 0.386704 5.551852 ... 0.825852 1.235556 6.200000 7.437037 5.611111 3.285185 1.932222 1.277407 0.865185 3.007407
std 7.412932 4.497122 2.674944 1.712606 2.953201 0.086392 1.332554 3.169288 0.156651 2.243344 ... 0.126343 1.066000 3.274376 3.818694 2.856078 1.438670 1.286654 0.695500 0.909105 1.273676
min 1.000000 22.000000 26.300000 5.000000 13.000000 0.238000 0.000000 0.330000 0.000000 1.700000 ... 0.550000 0.000000 2.000000 2.300000 1.700000 1.000000 0.570000 0.330000 0.000000 1.000000
25% 7.500000 23.150000 32.250000 8.300000 16.500000 0.458000 1.400000 4.350000 0.321500 4.150000 ... 0.756000 0.330000 3.850000 4.500000 3.300000 2.300000 1.150000 0.585000 0.330000 2.150000
50% 14.000000 25.000000 34.000000 9.000000 19.000000 0.508000 2.000000 5.500000 0.385000 5.500000 ... 0.833000 1.000000 5.000000 6.000000 5.000000 3.300000 1.600000 1.300000 0.500000 3.000000
75% 20.000000 28.000000 35.650000 10.150000 20.300000 0.555500 3.000000 8.350000 0.500000 6.500000 ... 0.929000 1.700000 8.300000 10.150000 8.150000 4.000000 2.400000 1.700000 1.500000 3.850000
max 23.000000 38.500000 37.300000 13.500000 26.300000 0.646000 5.500000 13.000000 0.750000 12.500000 ... 1.000000 3.700000 13.500000 15.700000 10.500000 7.500000 7.000000 2.700000 3.300000 6.000000

8 rows × 21 columns

# 箱型图plt.figure(figsize=(15, 8))
df = year_df[2019].iloc[:, 3:].copy()
col_name_fe = []
col_name_yi = dict()
i = 0
for item in df.columns.values:temp = (item[0] + item[1] + item[-2]).upper()col_name_fe.append(temp)col_name_yi[temp.upper()] = itemi += 1df.columns = col_name_fe
# whitegrid,darkgrid
sns.set_style("whitegrid")
sns.boxplot(data=df[list(df.columns)])
print(col_name_yi)#小于q1 - 1.5IQR   大于q3 + 1.5IQR

{‘SCR’: ‘score’, ‘MIE’: ‘minutes’, ‘FID’: ‘field_goals_made’, ‘FIT’: ‘field_goals_att’, ‘FIC’: ‘field_goals_pct’, ‘THD’: ‘three_points_made’, ‘THT’: ‘three_points_att’, ‘THC’: ‘three_points_pct’, ‘FRD’: ‘free_throws_made’, ‘FRT’: ‘free_throws_att’, ‘FRC’: ‘free_throws_pct’, ‘OFD’: ‘offensive_rebounds’, ‘DED’: ‘defensive_rebounds’, ‘RED’: ‘rebounds’, ‘AST’: ‘assists’, ‘TUR’: ‘turnovers’, ‘ASI’: ‘assists_turnover_ratio’, ‘STL’: ‘steals’, ‘BLK’: ‘blocks’, ‘PEL’: ‘personal_fouls’}

重复值处理

  • 使用duplicate检查重复值。可配合keep参数进行调整。
  • 使用drop_duplicate删除重复值。
year_df[2019].duplicated().sum()
# data.drop_duplicates(inplace=True)
0

列名英文名词解释

# 中文列命名
cn_name = ['排名','球员姓名','球队名称','得分','上场时间','投篮命中数','投篮数','投篮命中率','三分命中数','三分球数','三分命中率','罚球命中数','罚球数','罚球命中率','进攻篮板','防守篮板','总篮板','助攻','失误','助攻率','抢断','盖帽','犯规']
# 英文指标解释
en_name = year_df[2019].columns.values.tolist()
col_en_cn_name = [en_name, cn_name]
temp_df = pd.DataFrame(col_en_cn_name).T
temp_df.columns=["英文", "中文"]
temp_df
英文 中文
0 rank 排名
1 player_name 球员姓名
2 team_name 球队名称
3 score 得分
4 minutes 上场时间
5 field_goals_made 投篮命中数
6 field_goals_att 投篮数
7 field_goals_pct 投篮命中率
8 three_points_made 三分命中数
9 three_points_att 三分球数
10 three_points_pct 三分命中率
11 free_throws_made 罚球命中数
12 free_throws_att 罚球数
13 free_throws_pct 罚球命中率
14 offensive_rebounds 进攻篮板
15 defensive_rebounds 防守篮板
16 rebounds 总篮板
17 assists 助攻
18 turnovers 失误
19 assists_turnover_ratio 助攻率
20 steals 抢断
21 blocks 盖帽
22 personal_fouls 犯规

数据分析

哪些球员近6年连续在榜

# 哪些球员从2014年到2019年一直在榜
temp_list = []
temp_set = set()for i in range(2014, 2020):temp_list.append(set(year_df[i]['player_name']))temp_set =  temp_list[0]&temp_list[1]&temp_list[2]&temp_list[3]&temp_list[4]&temp_list[5]
temp_set
{'拉塞尔-威斯布鲁克', '詹姆斯-哈登', '达米安-利拉德'}

19年球员各项数据对比

from pyecharts.charts import Bar# 2019年各球员各项数据对比
def bar_datazoom_slider() -> Bar:c = (Bar(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE)).add_xaxis(cn_name[3:]).add_yaxis("凯里-欧文", year_df[2019].iloc[0, 3:].tolist()).add_yaxis("特雷-杨", year_df[2019].iloc[1, 3:].tolist()).add_yaxis("帕斯卡尔-西亚卡姆", year_df[2019].iloc[4, 3:].tolist()).add_yaxis("丹尼-格林", year_df[2019].iloc[10, 3:].tolist()).add_yaxis("考瓦伊-莱昂纳德", year_df[2019].iloc[18, 3:].tolist()).add_yaxis("安东尼-戴维斯", year_df[2019].iloc[22, 3:].tolist()).add_yaxis("拉塞尔-威斯布鲁克", year_df[2019].iloc[24, 3:].tolist()).set_global_opts(title_opts=opts.TitleOpts(title='''2019年各球员各项数据对比'''),datazoom_opts=opts.DataZoomOpts(),))return cbar_datazoom_slider().render_notebook()

19年球员数据分布箱型图

# 查看2019NBA球员数据分布箱型图
from pyecharts.charts import Boxplotdef boxpolt_base() -> Boxplot:v1 = [year_df[2019]['score'].tolist()]v2 = [year_df[2019]['minutes'].tolist()]v3 = [year_df[2019]['field_goals_att'].tolist()]v4 = [year_df[2019]['three_points_att'].tolist()]v5 = [year_df[2019]['rebounds'].tolist()]v6 = [year_df[2019]['assists'].tolist()]c = Boxplot(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))c.add_xaxis([]).add_yaxis("score", c.prepare_data(v1)).add_yaxis("minutes", c.prepare_data(v2)).add_yaxis("field_goals_att", c.prepare_data(v3)).add_yaxis("three_points_att", c.prepare_data(v4)).add_yaxis("rebounds", c.prepare_data(v5)).add_yaxis("assists", c.prepare_data(v6)).set_global_opts(title_opts=opts.TitleOpts(title='''2019年
NBA球员数据箱型图'''))return cboxpolt_base().render_notebook()

詹姆斯-哈登随年份数据变化折线图

# 詹姆斯-哈登随年份数据变化折线图year_name = list(range(2014, 2020))
name_year_dic = dict()
# for name in playe_name:
for year in year_name:temp = year_df[year][year_df[year]['player_name'].isin(['拉塞尔-威斯布鲁克'])]year_list = temp.values.tolist()year_list = [item for items in year_list for item in items]name_year_dic[year] = year_listname_year_df = pd.DataFrame(name_year_dic)
name_year_df.index = cn_name
name_year_df.head()
s1 = list(name_year_df.loc['得分', :])
s2 = list(name_year_df.loc['上场时间', :])
s3 = list(name_year_df.loc['投篮命中率', :])
s4 = list(name_year_df.loc['三分命中率', :])
s5 = list(name_year_df.loc['罚球命中率', :])
s6 = list(name_year_df.loc['三分命中数', :])
s7 = list(name_year_df.loc['进攻篮板', :])
s8 = list(name_year_df.loc['失误', :])
s9 = list(name_year_df.loc['助攻率', :])
s10 = list(name_year_df.loc['抢断', :])
s11 = list(name_year_df.loc['盖帽', :])
s12 = list(name_year_df.loc['犯规', :])from pyecharts.charts import Linedef line_base() -> Line:c = (Line(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE)).add_xaxis(list(map(str,year_name))).add_yaxis("得分", s1).add_yaxis("上场时间", s2).add_yaxis("投篮命中率", s3).add_yaxis("三分命中率", s4).add_yaxis("罚球命中率", s5).add_yaxis("进攻篮板", s6).add_yaxis("失误", s7).add_yaxis("助攻率", s8).add_yaxis("抢断", s9).add_yaxis("盖帽", s10).add_yaxis("犯规", s11).set_global_opts(title_opts=opts.TitleOpts(title='''詹姆斯-哈登随年份数据变化折线图''')))return c
line_base().render_notebook()

篮球运动员的失误与上场时长有什么联系?

sns.scatterplot(x="minutes", y="rebounds", data=year_df[2019])

# 两变量的相关系数
year_df[2019]["minutes"].corr(year_df[2019]["rebounds"])

0.13196323727585887

各数据的相关性图

# data.corr()
# 相关性图
plt.figure(figsize=(25, 12))
sns.heatmap(year_df[2019].corr(), annot=True, fmt=".2f", cmap=plt.cm.Greens)
# plt.savefig("../corr.png", dpi=100, bbox_inches="tight")

画决策树分析影响得分的因素

# 增加年份一列,并合并2014-2019年所有球员信息
year_df_new = pd.DataFrame()
for year in year_name:if year == 2014:year_df_temp = year_df[year]year_df_temp['year'] = yearyear_df_new = year_df_tempelse:year_df_temp = year_df[year]year_df_temp['year'] = yearyear_df_new = year_df_new.append(year_df_temp)year_df_new.shape

(152, 24)

set(year_df_new['year'])

{2014, 2015, 2016, 2017, 2018, 2019}

year_df_new.columns

Index([‘rank’, ‘player_name’, ‘team_name’, ‘score’, ‘minutes’,
‘field_goals_made’, ‘field_goals_att’, ‘field_goals_pct’,
‘three_points_made’, ‘three_points_att’, ‘three_points_pct’,
‘free_throws_made’, ‘free_throws_att’, ‘free_throws_pct’,
‘offensive_rebounds’, ‘defensive_rebounds’, ‘rebounds’, ‘assists’,
‘turnovers’, ‘assists_turnover_ratio’, ‘steals’, ‘blocks’,
‘personal_fouls’, ‘year’],
dtype=‘object’)

# 删除不需要的列
year_df_new = year_df_new.drop(['rank', 'player_name', 'team_name'],axis=1)
year_df_new.columns

Index([‘score’, ‘minutes’, ‘field_goals_made’, ‘field_goals_att’,
‘field_goals_pct’, ‘three_points_made’, ‘three_points_att’,
‘three_points_pct’, ‘free_throws_made’, ‘free_throws_att’,
‘free_throws_pct’, ‘offensive_rebounds’, ‘defensive_rebounds’,
‘rebounds’, ‘assists’, ‘turnovers’, ‘assists_turnover_ratio’, ‘steals’,
‘blocks’, ‘personal_fouls’, ‘year’],
dtype=‘object’)

# 保存year_df_new数据
year_df_new.to_csv('../year_df_new.csv')
# 分析影响得分的因素
dataSet = pd.read_csv('../year_df_new.csv', dtype = {'year' : float})
dataSet = dataSet.drop('Unnamed: 0',axis=1)
dataSet.dtypes

score float64
minutes float64
field_goals_made float64
field_goals_att float64
field_goals_pct float64
three_points_made float64
three_points_att float64
three_points_pct float64
free_throws_made float64
free_throws_att float64
free_throws_pct float64
offensive_rebounds float64
defensive_rebounds float64
rebounds float64
assists float64
turnovers float64
assists_turnover_ratio float64
steals float64
blocks float64
personal_fouls float64
year float64
dtype: object

#自定义区间并进行分割
qujian=[0,25,100]
pd.cut(dataSet.score,qujian)#起别名
dataSet['score'] = pd.cut(dataSet.score,qujian,labels=[1,2])# dataSet['score']
dataSet.head()
score minutes field_goals_made field_goals_att field_goals_pct three_points_made three_points_att three_points_pct free_throws_made free_throws_att ... offensive_rebounds defensive_rebounds rebounds assists turnovers assists_turnover_ratio steals blocks personal_fouls year
0 2 34.4 9.4 22.0 0.426 1.30 4.30 0.299 8.2 9.8 ... 1.90 5.4 7.3 8.6 4.4 2.0 2.10 0.21 2.8 2014.0
1 2 36.8 8.0 18.2 0.440 2.60 6.90 0.375 8.8 10.2 ... 0.93 4.7 5.7 7.0 4.0 1.8 1.90 0.74 2.6 2014.0
2 2 33.8 8.8 17.3 0.510 2.40 5.90 0.403 5.4 6.3 ... 0.59 6.0 6.6 4.1 2.7 1.5 0.89 0.93 1.5 2014.0
3 2 36.1 9.0 18.5 0.488 1.70 4.90 0.354 5.4 7.7 ... 0.74 5.3 6.0 7.4 3.9 1.9 1.60 0.71 2.0 2014.0
4 1 36.1 9.4 17.6 0.535 0.01 0.18 0.083 5.5 6.8 ... 2.50 7.7 10.2 2.2 1.4 1.6 1.50 2.90 2.1 2014.0

5 rows × 21 columns

from itertools import productimport numpy as np
import matplotlib.pyplot as pltfrom sklearn import datasets
from sklearn.tree import DecisionTreeClassifierfrom IPython.display import Image
from sklearn import tree
import pydotplus
import os
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin'X = dataSet.iloc[:, 1:]
y = dataSet.iloc[:, 0]# 训练模型,限制树的最大深度4
clf = DecisionTreeClassifier(max_depth=4)
#拟合模型
clf.fit(X, y)dot_data = tree.export_graphviz(clf, out_file=None,feature_names=dataSet.columns.values[1:],class_names=['low', 'high'],filled=True, rounded=True,special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
# 使用ipython的终端jupyter notebook显示。
Image(graph.create_png())
# 如果没有ipython的jupyter notebook,可以把此图写到pdf文件里,在pdf文件里查看。
# graph.write_pdf("iris.pdf") 

总结

  1. 拉塞尔-威斯布鲁克、詹姆斯-哈登、达米安-利拉德这三人连续6年从2014年到2020年都在榜上,可以说明这三人在当下球员竞技状态非常稳定
  1. 对比2019年各球员各项数据,可知球员与球员之间相同数据项的差异
  1. 针对詹姆斯-哈登,分析其六年的各项数据的变化,2016年其各项正数据普偏高,而负数据普偏低,所有该年是詹姆斯-哈登的巅峰期。从宏观上看,从2014年打篮球能力从2014年到2016年逐步提高,到2016年达到巅峰,之后下降,最后趋向与平稳
  1. 可根据箱型图可视化所有球员各项数据分布
  1. 篮球运动员的失误与上场时长成正相关
  1. 分析球员的各项数据之间的相关性,可知得分与投球的数据关系非常大,其次是投球命中率
  1. 根据决策树逐步分析各项因素决定得分情况,由此可以对球员各项训练计划表进行优化

NBA运动员球员数据分析相关推荐

  1. NBA篮球运动员大数据分析决策支持系统

    package com.dt.spark.sparksql import org.apache.hadoop.conf.Configuration import org.apache.hadoop.f ...

  2. 9.NBA球员数据分析

    NBA球员数据分析 1.导入库 2.获取数据 3.数据分析 3.1 数据相关性--heatmap() 3.2 球员数据分析 3.3 seaborn常用的三个可视化方法 3.3.1 单变量--distp ...

  3. nba球员数据分析和可视化_可视化NBA球员统计

    nba球员数据分析和可视化 I haven't written a post in a while. I had a lot to do for university and my hobbies l ...

  4. Spark商业案例与性能调优实战100课》第16课:商业案例之NBA篮球运动员大数据分析系统架构和实现思路

    Spark商业案例与性能调优实战100课>第16课:商业案例之NBA篮球运动员大数据分析系统架构和实现思路 http://www.basketball-reference.com/leagues ...

  5. 《Spark商业案例与性能调优实战100课》第17课:商业案例之NBA篮球运动员大数据分析系统代码实战

    <<<Spark商业案例与性能调优实战100课>第17课:商业案例之NBA篮球运动员大数据分析系统代码实战

  6. 《Spark商业案例与性能调优实战100课》第18课:商业案例之NBA篮球运动员大数据分析代码实战之核心基础数据项编写

    <Spark商业案例与性能调优实战100课>第18课:商业案例之NBA篮球运动员大数据分析代码实战之核心基础数据项编写

  7. 《Spark商业案例与性能调优实战100课》第19课:商业案例之NBA篮球运动员大数据分析核心业务逻辑代码实战

    <Spark商业案例与性能调优实战100课>第19课:商业案例之NBA篮球运动员大数据分析核心业务逻辑代码实战

  8. 人工智能-seaborn单双多变量绘图、两案例:NBA球员数据分析、北京租房数据统

    1. seaborn 作用:更高效地绘图 #安装 pip3 install seaborn#导入 import seaborn as sns 单变量:直方图或核密度曲线 双变量:散点图.二维直方图. ...

  9. 【球迷福利】NBA球员数据分析

    数据分析综合实战 前言 数据解释 数据分析 效率值相关性分析 球员数据分析 基本数据排名分析 薪资最高的10名球星 效率值最高的10名球星 出场时间最高的10名球星 Seaborn常用的三个数据可视化 ...

最新文章

  1. Git 配置命令设置
  2. [转]如何讓IE7中關閉瀏覽器不出現詢問
  3. 让Web站点崩溃最常见的七大原因
  4. search Paths $(SRCROOT)和$(PROJECT_DIR)区别
  5. boost::container实现扩展bwd测试分配器程序
  6. nginx的请求接收流程(二)
  7. 注解参数获取不到_scm-springboot基于spring boot的统一注解缓存
  8. C#之生成树形菜单数据
  9. 台式计算机诞生,生物电脑 ①1946年,世界上第一台计算机诞生,这个庞然大物开创了一个电脑时代。从那时候起,人们不断革新、创造,把庞然大物的体积一减再减,现在我们所见的台式电脑、掌上电脑...
  10. jsonrpc php使用,Json-RPC 的 PHP 扩展 php-JsonRPC
  11. 利用AD13设计PCB的问题总结21-30
  12. 正确的握笔姿势,握笔的姿势非常的重要
  13. 软件测试车载系统,车载软件测试
  14. 段子界“鼻祖”将关闭服务,它提高了一代人的笑点
  15. 如何从有故障的 SD 卡恢复文件
  16. [matlab]获取多项式的系数,表达式的系数
  17. 小白如何学3D建模?从零开始变大神
  18. 8则使用的Linux Shell命令
  19. java image 反色,C#实现图像反色的方法
  20. 京东店铺人群标签如何优化?

热门文章

  1. 硅谷裁员潮下的华人码农
  2. 绝地求生服务器维护需要多久,绝地求生8月4日更新到几点?绝地求生维护一次需要多长时间?...
  3. Webpack的基本使用
  4. 【ResNet】Deep Residual Learning for Image Recognition
  5. 微信小程序自定义底部导航栏遮挡页面内容(已解决)
  6. 改变PS1变量的颜色
  7. 为富人服务,挣富人的钱
  8. uniapp扭蛋抽奖
  9. awl 多线程SYN***工具0.2版[转]
  10. amCharts 报表(转)