科比职业生涯数据分析报告


一、前言

在本次数据分析是利用Jupyter对科比职业生涯的数据集进行分析,通过对相关数据的分析,掌握Numpy, Pandas, Matplotlib, Seaborn等常用数据分析库的用法,掌握常规的数据预处理的方法以及特征工程。

二、数据集说明

该数据集收录了自96赛季~2016赛季,共有30697条生涯数据。每条数据都是一次出手,其中包括动作类型,投篮类型,投射距离,投射位置,是否命中等25个特征。在该数据集中我们将对以这30697条数据进行数据处理与分析。部分数据如下:

三、数据预处理

导入需要使用到的相关库,numpy,pandas,matplotlib,pylab等

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import *

导入数据集,展示前三行数据并统计每一列数据的个数

kobe = pd.read_csv('data.csv') 
kobe.head(3)    #显示前3行数据
kobe.describe()

科比的投篮数据分析 科比生涯投篮总数_数据挖掘


科比的投篮数据分析 科比生涯投篮总数_python_02


通过对数据集的列举,我们可以清除的看到在shot_made_flag这一列中,总数为25697,这说明在这些数据存在空值,而这一值是是否命中,对数据分析的结果有重要的影响,所以我们需要对这些空值进行处理。

kobe = kobe[pd.notnull(kobe['shot_made_flag'])]
kobe.describe()

科比的投篮数据分析 科比生涯投篮总数_数据_03


我们对空数据删除,得到剩下的有用数据,最终得到25697个有用数据,这也是之后分析用到的数据。

四、数据分析

1、每个赛季出手次数
首先我们对科比在每个赛季出手的次数做一个统计,并以出手次数的多少排列,我们对season(赛季)这一栏进行统计,查看season一共有多少组数据,即多少个赛季,之后将各个赛季出手次数统计并用柱状图绘制出来。

print(kobe['season'].unique()) 
fig = plt.figure(figsize=(20, 6.5))  #绘图函数
fig.set(alpha=0.2)# 设置图表颜色的alpha参数
kobe.season.value_counts().plot(kind = 'bar') 
plt.xlabel("赛季")
plt.ylabel("出手次数")
plt.title("每个赛季的出手次数")
plt.show()

科比的投篮数据分析 科比生涯投篮总数_数据挖掘_04


柱状图以赛季为x轴,命中的次数为y轴绘制,从图中可以看出,在Jun-05这一赛季中,科比出手的次数最多,在2013-14这一赛季出手最少,从整体来看,在每个赛季中科比出手的次数都是非常多的,这可以说明科比是球队里的主战力之一。

2、赛季命中率

分析完每一赛季出手次数之后,再对赛季命中率做一个统计,选择赛季与是否命中这两个属性,对科比的赛季命中率做统计,并以赛季为x轴,命中率为y轴做折线图展示。

# 职业生涯各赛季命中率
season = kobe.pivot_table(index='season', values='shot_made_flag', aggfunc='mean')
fig, ax = plt.subplots()
for label in ax.xaxis.get_ticklabels():
    label.set_rotation(90)
plt.plot(season.index, season.values)
plt.title('科比职业生涯各赛季命中率示意图')
plt.xlabel('赛季')
plt.ylabel('命中率')

科比的投篮数据分析 科比生涯投篮总数_数据分析_05

3、每一节命中率

选取period节数统计科比在各节中的的命中率,用来看看科比在那节的命中率最高。
# 职业生涯各赛季各节命中率
p_1 = kobe[kobe['period'] == 1].pivot_table(index='season', values='shot_made_flag', aggfunc='mean')  # 第一节
p_2 = kobe[kobe['period'] == 2].pivot_table(index='season', values='shot_made_flag', aggfunc='mean')  # 第二节
p_3 = kobe[kobe['period'] == 3].pivot_table(index='season', values='shot_made_flag', aggfunc='mean')  # 第三节
p_4 = kobe[kobe['period'] == 4].pivot_table(index='season', values='shot_made_flag', aggfunc='mean')  # 第四节
fig, ax = plt.subplots()
plt.plot(p_1)
plt.plot(p_2)
plt.plot(p_3)
plt.plot(p_4)
for label in ax.xaxis.get_ticklabels():
label.set_rotation(90)
plt.title('科比职业生涯各节命中率示意图')
plt.legend(('第一节', '第二节', '第三节', '第四节'), loc='best')
plt.xlabel('赛季')
plt.ylabel('命中率')

科比的投篮数据分析 科比生涯投篮总数_数据分析_06


从示意图可以看出科比在第四节的命中率最低,这也可以说明体力对科比投篮命中率有很大的影响。

4、投篮位置
在对科比投篮命中率做出统计后,我们再来看科比投篮的位置。

#科比投篮位置
plt.figure(figsize=(10,20))
jumpshot = kobe[kobe['combined_shot_type']=='Jump Shot']
layup = kobe[kobe['combined_shot_type']=='Layup']
dunk = kobe[kobe['combined_shot_type']=='Dunk']
tipshot = kobe[kobe['combined_shot_type']=='Tip Shot']
hookshot = kobe[kobe['combined_shot_type']=='Hook Shot']
bankshot = kobe[kobe['combined_shot_type']=='Bank Shot']
plt.scatter(jumpshot.loc_x, jumpshot.loc_y, color='grey')
plt.scatter(layup.loc_x, layup.loc_y, color='red')
plt.scatter(dunk.loc_x, dunk.loc_y, color='yellow' )
plt.scatter(tipshot.loc_x, tipshot.loc_y, color='green')
plt.scatter(hookshot.loc_x, hookshot.loc_y, color='black')
plt.scatter(bankshot.loc_x, bankshot.loc_y, color='blue')
label=['跳投','上篮','扣篮','补篮','勾手','擦板']
plt.legend(label,loc=7)
plt.title('投篮位置')

我们选取combined_shot_type属性中各个出手方式,有跳投、上篮、扣篮、补篮、勾手、擦板,不同的出手方式以不同的颜色通过散点图的方式将出手位置在图上绘制出来,得到以下散点图。

科比的投篮数据分析 科比生涯投篮总数_科比的投篮数据分析_07


从图中可以看出篮球场大致的外观,其中红黄绿聚集的地方是球框底下,这里适合上篮、扣篮和补篮,再看灰色点(跳投),灰色点之间存在一条明显的分界线,而这条分界线就是三分线,科比出手的位置可以说是遍布整个球场,这也说明科比出手最多的方式是跳投。

5、进攻方式与命中率

接着对科比的进攻方式与出手命中率,做统计,将每次出手的方式combined_shot_type统计出来,绘制一个饼图,再对每次出手方式不同出手是否命中做一个饼图,观察进攻进攻方式与命中率。

#科比进攻的方式
plt.figure(figsize=(15, 5))
plt.subplot(121)
attack_method = kobe['combined_shot_type'].value_counts()
plt.pie(attack_method, labels=['跳投', '上篮', '扣篮', '补篮','勾手','擦板'], autopct='%1.2f%%')
plt.title('科比进攻方式')
plt.legend(loc= 1)
#科比投篮命中率
plt.subplot(122)
shooting = kobe[kobe['shot_made_flag']==1]['combined_shot_type'].value_counts()
list1 = attack_method.tolist()
list2 = shooting.tolist()
list3 = attack_method.tolist()
for i in range(len(list1)):
list3[i] = list2[i]/list1[i]
hits_df = pd.Series(list3);
plt.pie(hits_df, labels=['跳投', '上篮', '扣篮', '补篮','勾手','擦板'])
plt.title('科比各种投篮方式命中率')
plt.show()

科比的投篮数据分析 科比生涯投篮总数_数据_08


从左边进攻方式饼图可以看出科比跳投的次数最多,占了76.70%,最少是擦板,这也和投篮位置散点图对应上了,从右边命中率中可以看到扣篮的命中率是最高的,而跳投的命中率最低,这是符合实际情况的,因为跳投次数是最多且出手位置也是最多的,不同的出手位置也对命中率有一定的影响,这种情况是非常正常的。

6、各区域投篮次数

统计shot_zone_basic不同出手区域的出手次数,以出手区域为纵坐标,投篮次数为横坐标绘制条形图。

#科比在各个位置投篮的次数
area = kobe['shot_zone_basic'].value_counts()
b = np.array([0,1,2,3,4,5,6])
plt.barh(b,area,align ='center')
plt.yticks(b,('中距离','进攻有理区','底线之外的三分','除进攻有理区外的禁区','右边底线三分','左边底线三分','后场'))
plt.xlabel('次数',fontsize=10)
plt.title('科比在各区域投篮次数',fontsize=20)
plt.tight_layout()# 紧凑显示图片,居中显示
plt.show()

科比的投篮数据分析 科比生涯投篮总数_数据_09


从图中可以看到,科比大多数在中距离出手,三分也投了挺多,根据科比的出手习惯,可以说明科比不管三分还是两分,都是非常的自信的。

7、其他因素对出手的影响

下面是对其他因素对科比出手投篮的影响。下面三个属性是投篮的位置、距离、范围,其实这三个属性可以看作一个属性,都是代表投球位置的。这里将三个属性都按具体位置的类别绘制散点图

import matplotlib.cm as cm
plt.figure(figsize=(20,10))
def scatter_plot_by_category(feat):
alpha = 0.1
gs = kobe.groupby(feat)
cs = cm.rainbow(np.linspace(0, 1, len(gs)))
for g, c in zip(gs, cs):
plt.scatter(g[1].loc_x, g[1].loc_y, color=c, alpha=alpha) 
plt.subplot(131)
scatter_plot_by_category('shot_zone_area')
plt.title('投篮位置')
plt.subplot(132)
scatter_plot_by_category('shot_zone_basic')
plt.title('投篮距离')
plt.subplot(133)
scatter_plot_by_category('shot_zone_range')
plt.title('投篮范围')

科比的投篮数据分析 科比生涯投篮总数_数据_10


第一个图是shot_zone_area属性的,图中红色和橙色是右侧投球区,墨绿色和绿色是左侧投球区,蓝色是中间投球区;第二个图是shot_zone_basic属性的,图中橙色是篮板底下、蓝色是除进攻有理区外的禁区,墨绿色是中距离,紫色是底线之外的三分,红色是右边底线三分,绿色是左边底线三分;第三个图是shot_zone_range属性的,图中红色是除进攻有理区外的禁区,绿色是进攻有理区,紫色是中距离,蓝色是三分线外。这三个图都是对科比投球位置的一个统计。

五、总结

通过本次对科比职业生涯数据的分析,我们可以看到科比在他的职业生涯里为球队的贡献是非常大的