「DATA CHAT」是科赛网打造的品牌活动。拥有最强大脑、最独特视角的数据分析狂热者,将针对体育、影视、音乐、财经四大领域内最生活的话题,开展有趣又烧脑的数据分析探索之旅。bash
首期咱们从NBA话题切入,在官网发布了超全的NBA数据集(全部球员&球队的常规赛、季后赛,教练执教、球员各赛季薪金的数据),N位网友在线根据本身的兴趣,发布了数据分析项目,切入点不少样,也颇有意思。如,王者荣耀 — NBA数据分析 [增长梅西评分模型]、乔科詹库之全方位分析……app
这里PO其中一份原创做品@大野人007 ,感兴趣的朋友也可直接登陆kesci.com,Fork过来在K-Lab上开展我的分析。附:原贴连接。
函数
说明:关于K-Lab。ui
K-Lab是科赛网重点打造的在线数据分析协做平台。它涵盖了Python、R等主流语言,完成了90%以上数据分析&挖掘相关库的部署(如题主所提到的pandas, numpy, matplotlib),免去了本地搭建环境的烦恼,实现了即刻线上动手作分析项目。spa
1)数据维度3d
2)数据处理code
!ls ../input/NBAdata/
复制代码
# 导入必要的包.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import numpy as np
import pylab
%matplotlib inline
warnings.filterwarnings('ignore')
复制代码
读取球员场均数据cdn
player_avg = pd.read_csv('avg.csv') player_avg.head()
复制代码
展现要分析的数据blog
pd.set_option('display.max_columns',30)
player_avg[(player_avg['姓名'] == 'Kawhi Leonard') & (player_avg['赛季'] == '16--17')]
复制代码
pd.set_option('display.max_columns',50)
L_1617_avg = player_avg[(player_avg['姓名'] == 'LeBron James') & (player_avg['赛季'] == '16--17')]
L_1617_avg
复制代码
对比分析及数据可视化three
class Radar(object):
n = 1
angles =None
def __init__(self, fig, titles, labels, rect=None):
if rect is None:
rect = [0.05, 0.05, 0.95, 0.95]
self.n = len(titles)
self.angles = np.arange(90, 90+360, 360.0/self.n)
self.axes = [fig.add_axes(rect, projection="polar", label="axes%d" % i)
for i in range(self.n)]
self.ax = self.axes[0]
self.ax.set_thetagrids(self.angles, labels=titles, fontsize=14)
for ax in self.axes[1:]:
ax.patch.set_visible(False)
ax.grid("off")
ax.xaxis.set_visible(False)
for ax, angle, label in zip(self.axes, self.angles, labels):
ax.set_rgrids(range(1, 6), angle=angle, labels=label)
ax.spines["polar"].set_visible(False)
ax.set_ylim(0, 5)
def angle(self, values, *args, **kw):
return np.deg2rad(np.r_[self.angles]),np.r_[values],values
def plot(self, values, *args, **kw):
angle = np.deg2rad(np.r_[self.angles, self.angles[0]])
values = np.r_[values, values[0]]
self.ax.plot(angle, values, *args, **kw)
titles_ = ['score','shoot','rebound','assist','three','penalty','steal','block']
titles = ['得分','投篮','篮板','助攻','三分','罚球','抢断','盖帽']
# titles = list("ABCDE")复制代码
咱们发现:
赢
输
以上分析较宏观,不能反映事物的本质。下面从微观角度(每场比赛的数据)进行分析。
角度1:基于篮板球
# data_statistics函数主要是方便categoricl型的数据的统计显示,方便后续绘图使用
def data_statistics(Kawhi_season1617, Lebron_season1617, name):
Kawhi_season1617_ = pd.DataFrame(Kawhi_season1617.groupby(name)['球员'].count())
Kawhi_season1617_.columns = ['K_次数']
Kawhi_season1617_.reset_index(inplace=True)
Lebron_season1617_ = pd.DataFrame(Lebron_season1617.groupby(name)['球员'].count())
Lebron_season1617_.columns = ['L_次数']
Lebron_season1617_.reset_index(inplace=True)
data = pd.merge(Lebron_season1617_,Kawhi_season1617_,on = name , how ='outer')
data = data.fillna(0)
data = data.sort_values(name)
return data
复制代码
用seaborn作柱状图可视化
rebounds['K_次数'] = rebounds['K_次数'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '篮板', y = 'L_次数', data = rebounds, color='red')
sns.barplot(x = '篮板',y = 'K_次数', data = rebounds, color ='blue')复制代码
红色:詹姆斯,蓝色:伦纳德
横轴:篮板数,纵轴:发生次数
能够看出:
角度2:基于得分
score['K_次数'] = score['K_次数'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '得分', y = 'L_次数', data = score, color='red')
sns.barplot(x = '得分',y = 'K_次数', data = score, color ='blue')复制代码
红色:詹姆斯,蓝色:伦纳德
横轴:得分数,纵轴:发生次数
用seaborn作violin图可视化
plt.figure(figsize= [12,5])
total = pd.concat([Kawhi_season1617,Lebron_season1617])
total['Is_Kawhi'] = 0
total.loc[total['球员'] == 'Kawhi Leonard','Is_Kawhi'] = 1
total['A'] = 0
sns.violinplot(x= 'A' , y = '得分', hue = 'Is_Kawhi', data = total, split=True)复制代码
绿色:伦纳德,蓝色:詹姆斯
能够看出:
0 - 15分 定为档1
15 - 19 定为档2
20 - 24 定为档3
25 - 29 定为档4
30 - 定为档5
红色:詹姆斯,蓝色:伦纳德
横轴:得分层次,纵轴:发生次数
能够看出:
角度3:基于投篮命中率
shoot = data_statistics(Kawhi_season1617, Lebron_season1617, '投篮')
shoot
# sns.distplot(Kawhi_season1617.groupby('得分')['球员'].count(),color='b')
# sns.distplot(Lebron_season1617.groupby('得分')['球员'].count(),color='r')
Kawhi_season1617.groupby('得分')['球员'].count().plot(figsize=(12,6),color='b',marker='*')
Lebron_season1617.groupby('得分')['球员'].count().plot(figsize=(12,6),color = 'r', marker='o')复制代码
红色:詹姆斯,蓝色:伦纳德
横轴:分数,纵轴:发生次数
用柱状图进行对比分析
能够看出:
角度4:基于抢断和盖帽的分析
steal = data_statistics(Kawhi_season1617, Lebron_season1617, '抢断')
steal
steal['K_次数'] = steal['K_次数'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '抢断', y = 'L_次数', data = steal, color='red')
sns.barplot(x = '抢断',y = 'K_次数', data = steal, color ='blue')复制代码
红色是詹姆斯,蓝色表示伦纳德
横轴表示抢断,纵轴表示发生次数
block = data_statistics(Kawhi_season1617, Lebron_season1617, '盖帽')
block
block['K_次数'] = block['K_次数'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '盖帽', y = 'L_次数', data = block, color='red')
sns.barplot(x = '盖帽',y = 'K_次数', data = block, color ='blue')复制代码
红色是詹姆斯,蓝色表示伦纳德.
横轴表示盖帽次数,纵轴表示发生次数
能够获得:
角度5:基于失误次数的分析
fault_num = data_statistics(Kawhi_season1617, Lebron_season1617, '失误')
fault_num
fault_num['K_次数'] = fault_num['K_次数'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '失误', y = 'L_次数', data = fault_num, color='red')
sns.barplot(x = '失误',y = 'K_次数', data = fault_num, color ='blue')复制代码
红色是詹姆斯,蓝色表示伦纳德。
横轴表示失误次数,纵轴表示发生次数。
能够获得:
3)最终结论
詹姆斯赢伦纳德:突破能力、组织能力、功能性的差距、稳定性的差距。
詹姆斯输伦纳德:远投能力的差距。