无数据的分析不过一场嘴炮。本篇内容为科赛网用户AK_47基于科赛网明星数据集《NBA数据集》,进行的全面理性分析。30年最强夺冠阵容谁说了算,数据里见分晓。javascript
NBA数据集:NBA历史各赛季常规及季后赛球员、球队及教练综合数据,另附各球员的赛季薪金数据(NBA历史统计缘由,仅存1985-86赛季以后的单场比赛球员数据。
先来看看科赛提供了哪些数据集:java
ls ../input/NBAdata/
复制代码
advanced_basic.csv coach_playoff.csv player_salary.csv team_playoff.csv
advanced_shooting.csv coach_season.csv player_season.csv team_season.csv
avg.csv player_playoff.csv single.csv tot.csv复制代码
既然是找寻史上最XX总冠军,那么 team_season.csv 和 team_playoff.csv这两个数据集即是咱们关注的重点。python
# 导入经常使用的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# R语言中的ggplot画图很漂亮,咱们一样能够调用参数,在Python实现相似风格的可视化
from matplotlib import style
style.use('ggplot')
# 设置warnings
import warnings
warnings.filterwarnings('ignore')
复制代码
# 导入数据
T_season = pd.read_csv('../input/NBAdata/team_season.csv')
T_playoff = pd.read_csv('../input/NBAdata/team_playoff.csv')复制代码
看一眼球队季后赛表现T_playoff.csv这个数据集长什么样bash
T_playoff.head()复制代码
5 rows × 23 columnsapp
里面有哪些columns?
ide
T_playoff.columns复制代码
Index(['球队', '时间', '结果', '主/客场', '比分', '投篮', '命中', '出手', '三分', '三分命中', '三分出手',
'罚球', '罚球命中', '罚球出手', '篮板', '前场', '后场', '助攻', '抢断', '盖帽', '失误', '犯规',
'得分'],
dtype='object')复制代码
对于球队常规赛数据集T_season.csv也是一样的处理方法:优化
T_season.head()复制代码
5 rows × 23 columns
ui
T_season.columns复制代码
Index(['球队', '时间', '结果', '主/客场', '比分', '投篮', '命中', '出手', '三分', '三分命中', '三分出手',
'罚球', '罚球命中', '罚球出手', '篮板', '前场', '后场', '助攻', '抢断', '盖帽', '失误', '犯规',
'得分'],
dtype='object')复制代码
以上咱们大体了解了数据集涵盖的字段和内容,下面开始找寻史上最XX总冠军的征程。
spa
既然目标是找寻史上最XX总冠军,那么咱们先要找到历年的夺冠球队,再进行分析。3d
# 添加对手字段
T_playoff['对手'] = T_playoff['比分'].apply(lambda x: x[0:3])
T_season['对手'] = T_season['比分'].apply(lambda x: x[0:3])
#增长赛季字段,整理年份
T_playoff['赛季'] = T_playoff['时间'].str.extract('([0-9]{4})').astype('int')
#搬来代码,整理冠军及年份
win_dic={}
for i in T_playoff['球队'].unique():
win_dic[i]={}
for i in range(1986,2017):
for j in T_playoff['球队'].unique():
win_dic[j][i]=len(T_playoff[T_playoff.球队==j][T_playoff.赛季==i][T_playoff.结果=='W'].index)
win_count=pd.DataFrame(win_dic)
winner={}
for i in win_count.index:
winner[i]=win_count.loc[i].sort_values(ascending=False).keys()[0]
winner=pd.Series(winner)
T_playoff['时间'] = pd.to_datetime(T_playoff['时间'])
复制代码
总冠军归属整理以下表:
原来近三十年夺冠也就是这几支球队轮流坐庄,那么这些球队瓜分总冠军的次数如何,请看下图分解:
plt.figure(figsize=(12,7))
plt.axes(axisbg='#F5F5F5') #设置一个好看的背景色
winner.value_counts().plot(kind='bar',color='blue')
plt.xlabel('球队')
plt.ylabel('总冠军个数')
plt.title('图1 NBA总冠军如何被瓜分')
plt.show()复制代码
不看不知道,一看吓一跳:
好戏就此开始,咱们先从各年总冠军的常规赛讲起。
# 找到总冠军在夺冠赛季的常规赛和季后赛数据 以及对手的数据
start_time = [str(i)+'-10-01' for i in range(1985,2016)]
end_time = [str(i)+'-07-01' for i in range(1986,2017)]
Name = [winner[i] for i in range(1986,2017)]
Champ_season = [[] for i in range(0,31)]
Champ_playoff = [[] for i in range(0,31)]
Champ_opp_season =[[] for i in range(0,31)]
Champ_opp_playoff = [[] for i in range(0,31)]
for i in range(0,31):
Champ_playoff[i] = T_playoff[(T_playoff['球队']==Name[i])&
(T_playoff['时间']>start_time[i])&
(T_playoff['时间']<end_time[i])]
Champ_opp_playoff[i] = T_playoff[(T_playoff['对手']==Name[i])&
(T_playoff['时间']>start_time[i])&
(T_playoff['时间']<end_time[i])]
Champ_season[i] = T_season[(T_season['球队']==Name[i])&
(T_season['时间']>start_time[i])&
(T_season['时间']<end_time[i])]
Champ_opp_season[i] = T_season[(T_season['对手']==Name[i])&
(T_season['时间']>start_time[i])&
(T_season['时间']<end_time[i])]
复制代码
def get_wininfo(data):
Wscore = []
Wrate = []
for i in range(0,31):
temp = data[i]
Wrate.append(round(len(temp[temp['结果']=='W'])/len(temp),2))
Wscore.append(temp['得分'].mean())
return Wscore, Wrate
复制代码
def get_Rtg(Champ,Opp):
DRtg = []
ORtg = []
for i in range(0,31):
temp1 = Champ[i]
temp2 = Opp[i]
DRtg.append((temp1['得分'].mean()*100)/(temp1['出手'].mean()-temp1['前场'].mean()+temp1['失误'].mean()+temp1['罚球出手'].mean()*0.44))
ORtg.append((temp2['得分'].mean()*100)/(temp2['出手'].mean()-temp2['前场'].mean()+temp2['失误'].mean()+temp2['罚球出手'].mean()*0.44))
return DRtg,ORtg
复制代码
这一部分咱们考察的点主要有:
进攻效率值: 得分 X 100/(出手次数-前场篮板+本身失误+罚球出手 X 0.44)
防守效率值: 对手得分 X 100/(对手的出手次数-对手的前场篮板+对手的失误+对手的罚球出手 X 0.44)
常规赛胜率 v.s 场均得分
在下图中咱们统计了历年总冠军的常规赛场均得分与胜率,其中胜率乘了系数100,这样放在了一个坐标系中,用蓝色表示。
w_score = get_wininfo(Champ_season)[0]
w_rate = get_wininfo(Champ_season)[1]
size = [i*100 for i in w_rate]
idx = range(0,31)
tick = [str(winner.index[i]) + '-' + str(winner[i+1986]) for i in range(0,31)]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.scatter(idx,w_score,label='场均得分')
plt.plot(idx,w_score,linestyle='--',linewidth=1,color='blue')
plt.scatter(idx,size,label='胜率')
plt.plot(idx,size,linestyle='--',linewidth=1,color='black')
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.title('图2 常规赛 - 场均得分 vs 胜率')
plt.xlabel('年份-冠军')
plt.legend(bbox_to_anchor=(1.13,1))
plt.show()
复制代码
不看不知道,一看吓一跳:
三分球统计
咱们统计了各个总冠军的三分出手次数、命中次数以及命中率(命中率乘了系数100,便于展现)
T_season_3pt = [Champ_season[i].三分出手.mean() for i in range(0,31)]
T_season_3p = [Champ_season[i].三分命中.mean() for i in range(0,31)]
rate = [100 * T_season_3p[i]/T_season_3pt[i] for i in range(0,31)]
# Twenty = [20 for i in range(0,31)]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.bar(idx,T_season_3pt,label='场均出手')
plt.bar(idx,T_season_3p,label='场均命中数')
plt.scatter(idx,rate,label='命中率')
plt.plot(idx,rate,linewidth=0.5,color='black',linestyle='--')
plt.legend(bbox_to_anchor=(1,1))
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.title('图3 常规赛 - 三分统计')
plt.xlabel('年份-冠军')
plt.show()
复制代码
篮板统计
总冠军们在常规赛的场均进攻篮板,防守篮板,总篮板分别进行了归类
T_season_dreb = [Champ_season[i].后场.mean() for i in range(0,31)]
T_season_oreb = [Champ_season[i].前场.mean() for i in range(0,31)]
T_season_reb = [Champ_season[i].篮板.mean() for i in range(0,31)]
dreb_mean = [np.array(T_season_dreb).mean() for i in range(0,31)]
oreb_mean = [np.array(T_season_oreb).mean() for i in range(0,31)]
reb_mean = [np.array(T_season_reb).mean() for i in range(0,31)]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.scatter(idx,T_season_oreb,label='进攻篮板')
plt.scatter(idx,T_season_dreb,label='防守篮板')
plt.scatter(idx,T_season_reb,label='总篮板')
plt.plot(idx,T_season_oreb, color='green', linestyle='-', linewidth=0.5)
plt.plot(idx,T_season_dreb, color='green', linestyle='-', linewidth=0.5)
plt.plot(idx,T_season_reb, color='green', linestyle='-', linewidth=0.5)
plt.plot(idx,dreb_mean, color='black', linestyle='--', linewidth=1,label='平均值')
plt.plot(idx,oreb_mean, color='black', linestyle='--', linewidth=1)
plt.plot(idx,reb_mean, color='black', linestyle='--', linewidth=1)
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.title('图4 常规赛 - 篮板表现')
plt.ylabel('场均篮板数')
plt.xlabel('年份-冠军')
plt.legend(bbox_to_anchor=(1,1))
plt.show()复制代码
助攻统计
总冠军们在常规赛的场均助攻表现以下:
T_season_assist = [Champ_season[i].助攻.mean() for i in range(0,31)]
ast_mean = [np.array(T_season_assist).mean() for i in range(0,31)]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.scatter(idx,T_season_assist,label='场均助攻数')
plt.plot(idx,T_season_assist,linestyle='-',linewidth=0.5,color='black')
plt.plot(idx,ast_mean,color='blue', linestyle='--', linewidth=1,label='平均值')
plt.title('图5 常规赛 - 助攻表现')
plt.ylabel('场均助攻数')
plt.xlabel(å'年份-冠军')
plt.ylim(17)
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.legend(bbox_to_anchor=(1.15,1))
plt.show()复制代码
常规赛进攻与防守效率值
Dseason = get_Rtg(Champ_season,Champ_opp_season)[0]
Oseason = get_Rtg(Champ_season,Champ_opp_season)[1]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.scatter(idx,Dseason,label='进攻效率值')
plt.scatter(idx,Oseason,label='防守效率值')
Dseason_mean = [np.array(Dseason).mean() for i in range(0,31)]
Oseason_mean = [np.array(Oseason).mean() for i in range(0,31)]
plt.plot(idx,Dseason,linestyle='-',linewidth=0.5)
plt.plot(idx,Oseason,linestyle='-',linewidth=0.5)
plt.plot(idx,Dseason_mean, color='black', linestyle='--', linewidth=1,label='平均值')
plt.plot(idx,Oseason_mean, color='black', linestyle='--', linewidth=1)
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.legend(bbox_to_anchor=(1.14,1))
plt.title('图6 常规赛 - 进攻/防守效率值')
plt.xlabel('年份-冠军')
plt.ylabel('效率值')
plt.show()复制代码
同常规赛部分,咱们考察的点依旧集中在常规赛胜率 v.s 场均得分,三分球,篮板,助攻,进攻效率值和防守效率值这几个指标上面。
得分高于对手,才能赢得比赛。
T_playoff_mean = [Champ_playoff[i].得分.mean() for i in range(0,31)]
mean = [np.array(T_playoff_mean).mean() for i in range(0,31)]
plt.figure(figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.scatter(idx,T_playoff_mean)
plt.plot(idx,T_playoff_mean,linestyle='--', linewidth=0.5,label='场均得分')
plt.plot(idx,mean, color='blue', linestyle='--', linewidth=1,label='平均值')
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.title('图7 季后赛 - 场均得分')
plt.xlabel('年份-冠军')
plt.legend(bbox_to_anchor=(1,1))
plt.ylim(85)
plt.show()
复制代码
论得分表现:
无兄弟,不篮球;无助攻,可贵分。
T_playoff_assist = [Champ_playoff[i].助攻.mean() for i in range(0,31)]
ast_mean = [np.array(T_playoff_assist).mean() for i in range(0,31)]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.scatter(idx,T_playoff_assist)
plt.plot(idx,T_playoff_assist,linestyle='-',linewidth=0.5,color='black')
plt.plot(idx,ast_mean,color='blue', linestyle='--', linewidth=1,label='平均值')
plt.title('图8 季后赛 - 助攻表现')
plt.ylabel('场均助攻数')
plt.xlabel('年份-冠军')
plt.ylim(17)
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.legend(bbox_to_anchor=(1,1))
plt.show()复制代码
论助攻表现:
篮板篮板篮板,重要的事说三遍。
T_playoff_dreb = [Champ_playoff[i].后场.mean() for i in range(0,31)]
T_playoff_oreb = [Champ_playoff[i].前场.mean() for i in range(0,31)]
T_reb = [Champ_playoff[i].篮板.mean() for i in range(0,31)]
dreb_mean = [np.array(T_playoff_dreb).mean() for i in range(0,31)]
oreb_mean = [np.array(T_playoff_oreb).mean() for i in range(0,31)]
reb_mean = [np.array(T_reb).mean() for i in range(0,31)]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.scatter(idx,T_playoff_oreb,label='进攻篮板')
plt.scatter(idx,T_playoff_dreb,label='防守篮板')
plt.scatter(idx,T_reb,label='总篮板')
plt.plot(idx,T_playoff_oreb, color='green', linestyle='-', linewidth=0.5)
plt.plot(idx,T_playoff_dreb, color='green', linestyle='-', linewidth=0.5)
plt.plot(idx,T_reb, color='green', linestyle='-', linewidth=0.5)
plt.plot(idx,dreb_mean, color='black', linestyle='--', linewidth=1,label='平均值')
plt.plot(idx,oreb_mean, color='black', linestyle='--', linewidth=1)
plt.plot(idx,reb_mean, color='black', linestyle='--', linewidth=1)
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.title('图9 季后赛 - 篮板表现')
plt.ylabel('场均篮板数')
plt.xlabel('年份-冠军')
plt.legend(bbox_to_anchor=(1,1))
plt.show()复制代码
论篮板能力:
他强任他强,三分我最狂。
T_playoff_3pt = [Champ_playoff[i].三分出手.mean() for i in range(0,31)]
T_playoff_3p = [Champ_playoff[i].三分命中.mean() for i in range(0,31)]
rate = [100 * T_playoff_3p[i]/T_playoff_3pt[i] for i in range(0,31)]
rate_mean = [np.array(rate).mean() for i in range(0,31)]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.bar(idx,T_playoff_3pt,label='场均出手')
plt.bar(idx,T_playoff_3p,label='场均命中数')
plt.scatter(idx,rate,label='命中率')
plt.plot(idx,rate,linewidth=0.5,color='black',linestyle='--',label='平均值')
plt.plot(idx,rate_mean,linewidth=1,color='black',linestyle='--')
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.legend(bbox_to_anchor=(1,1))
plt.title('图10 季后赛 - 三分表现')
plt.show()
复制代码
论三分球表现
高阶数据才是实力的体现:季后赛进攻&防守效率值
Dseason = get_Rtg(Champ_playoff,Champ_opp_playoff)[0]
Oseason = get_Rtg(Champ_playoff,Champ_opp_playoff)[1]
plt.figure(1,figsize=(12,6))
plt.axes(axisbg='#F5F5F5')
plt.scatter(idx,Dseason,label='进攻效率值')
plt.scatter(idx,Oseason,label='防守效率值')
plt.plot(idx,Dseason,linestyle='-',linewidth=0.5)
plt.plot(idx,Oseason,linestyle='-',linewidth=0.5)
Dseason_mean = [np.array(Dseason).mean() for i in range(0,31)]
Oseason_mean = [np.array(Oseason).mean() for i in range(0,31)]
plt.plot(idx,Dseason_mean, color='black', linestyle='--', linewidth=1,label='平均值')
plt.plot(idx,Oseason_mean, color='black', linestyle='--', linewidth=1)
plt.setp(plt.xticks(idx,tick)[1],rotation=90)
plt.title('图11 季后赛 - 进攻/防守效率值')
plt.ylabel('效率值')
plt.xlabel('年份-冠军')
plt.legend(bbox_to_anchor=(1,1))
plt.show()
复制代码
关键词:团队篮球 & 三分球
若是你是一名NBA老球迷,你必定听过“永远不要低估了一颗总冠军的心”这句话。屌丝逆袭的故事也在NBA中发生着,because it is where amazing happens. 从未有哪只球队像1995年的休斯顿火箭队同样,在本身的卫冕道路上走得如此艰难。常规赛阶段,胜率不足六成,进攻端低迷,防守端被爆,一路跌跌撞撞,以西部第六的身份进入季后赛。最终依靠团队篮球与三分球赢下德州小强的名号,带走了总冠军。
团队篮球:1995年的火箭在当年季后赛场均送出25次以上助攻,后来从未有球队在季后赛中作到过这一点
三分球: 对!你没看错,火箭在那个年代就在投三分球!1995年的火箭在季候赛有着媲美如今勇士和骑士的三分球命中率,而且三分出手次数在那个年代也是前无古人
关键词:助攻 + 篮板 + 得分 并驾齐驱
这是一个大鸟博德(Larry Bird)与魔术师相互争霸的年代,向伟大体敬!
关键词:三分如雨下
2015年的金州勇士可谓是一只现象级的球队,在常规赛阶段就展示了震古烁今的三分球功力,场均至少10记三分+40%命中率的稳定输出为他们早早锁定了季后赛席位。在季后赛中,勇士也可谓用三分球技能大杀四方,将场均三分出手次数提高到了30+而命中率微弱下降。史上最佳三分总冠军的称号,实至名归。
关键词:进攻是最好的防守
这是进攻篮球最好的时代,这是魔术师的show time。这一年的洛杉矶湖人(LAL)常规赛阶段便在进攻端展现出极强的破坏力,八成胜率进入季后赛,以后更是以场均120+的历史第一高分夺得总冠军,开启了湖人在那个时代的两连冠。
关键词:防守是最好的进攻
论最佳防守总冠军,若是活塞说本身是第二,马刺绝对不敢说本身是第一。2004年的底特律活塞被称为“坏孩子”。这群“坏孩子”们在常规赛阶段就展示了本身对进攻的“厌恶”:场均不到90分也是没谁了。到了季后赛,这群“坏孩子”们更是将防守和进攻演绎到了极致:进攻效率值史上最低,而防守效率倒是史上最佳。原来他们把进攻的功夫所有拿去防守了。This is where amazing happens,向这群“坏孩子”们致敬!
关键词:完美
若是非要找出史上最强总冠军的话,1996年的芝加哥公牛(CHI)当之无愧。来,数听说话:
from IPython.display import HTML
HTML('''<script> code_show=true; function code_toggle() { if (code_show){ $('div.input').hide(); } else { $('div.input').show(); } code_show = !code_show } $( document ).ready(code_toggle); </script> 有球迷的地方就有江湖,有江湖的地方就会有懂球帝和数据分析老司机。为了更好的阅读体验,源代码已经设置隐藏。若有须要,请看这里<a href="javascript:code_toggle()">这里</a>.''')
复制代码
有球迷的地方就有江湖,有江湖的地方就会有懂球帝和数据分析老司机。
本做品完整源代码可直接登陆科赛,在「项目」栏目查看,并能使用K-Lab的「Fork」键功能在源代码基础上再优化,生成本身的分析做品。