粉丝独白
篮球巨星科比,是NBA历史上最佳得分手之一,以前写了一篇关于科比的得分数据分析(厉害了!20年【科比NBA】生涯|数据分析)。这一次,让我们聚焦于进攻方式,用数据来探索科比职业生涯的打球方式,看看如何防守才能最大化阻碍科比的进攻!
要点:
- 数据获取
- 数据的清洗
- 数据的多维度可视化
01.数据来源
玩数据分析的同学一定都知道kaggle,里面有大量好玩的数据集,这次我们下载了科比近20年职业生涯中所尝试的每个投篮命中的位置和情况,由于是篮球领域的数据,可能有一些小伙伴看不懂,不过没关系,后面我都会进行简短的说明的。
链接:
https://kaggle/c/kobe-bryant-shot-selection/data
The field names are self explanatory and contain the following attributes:
- action_type 进攻方式(更具体)
- combined_shot_type 进攻方式
- game_event_id 这个不清楚
- game_id 比赛ID
- lat 投篮点
- loc_x 投篮点
- loc_y 投篮点
- lon 投篮点
- minutes_remaining 单节剩余时间(分钟)
- period 表示第几节
- playoffs 是否是季后赛
- season 赛季
- seconds_remaining 剩余时间(秒)
- shot_distance 投篮距离
- shot_made_flag 是否进球
- shot_type 两分球或三分球
- shot_zone_area 投篮区域
- shot_zone_basic 投篮区域(更具体)
- shot_zone_range 投篮范围
- team_id 球队ID
- team_name 球队名称
- game_date 比赛日期
- matchup 比赛双方
- opponent 对手
- shot_id 投篮ID
02.数据的读取和查看
1).读入数据集:
2).看一下数据集基本情况:一共有25个维度
3).看一下数据集的大小:一共投了30697次
可以看到,科比职业生涯出手投篮了三万多次,确实是厉害!大致先了解一下这份数据,主要是收集了科比每一次进攻的位置,投篮方式和得分,这三个维度也是我们重点关注的,其他的其实影响不是太大。
03.数据清洗和探索
1).数据的清洗
因为这是kaggle上的一个比赛数据,会用于预测,所以在“shot_made_flag”这一列上会有空值(即预测科比这一次投篮是否能投进),后面的部分分析会先剔除掉这些空值的数据,所以科密们,如果见到后面一些分析不太合理的话,要考虑到这一点哦!
#剔除未知命中结果的数据
known_data = data[data['shot_made_flag'].notnull()]
known_data.sample(3)
2).数据的思考
那接下来就慢慢来分析科比的投篮吧。站在一个球迷的位置,我会先关注的是科比的投篮点,有哪一些进攻的方式,哪一种又是偏多呢?
在数据分析前,我先来猜测下,按照我的球迷经验,科比常用的应该是跳投多一些,毕竟江湖上有一句话说,“我科后仰美如画”。科比的投篮姿势也是教科书版的存在,所以会有很多人去模仿他的动作。
3).画出科比的投篮图
- 默认的plt画图太丑,我用sns来设置画图的颜色
- plt来设置中文字体,设置坐标系显示负数
- 用scatter来画散点图
- 设置X,Y轴和Title
可视化看一下:
4).常用的进攻方式
- 取数据集中的'combined_shot_type'统计科比投篮的方式
- 用直方图来显示,构造x和y的参数.(x为1到6的序列,y为每一种投篮方式的统计数)
- 设置坐标标签和刻度范围
果然,跳投是最多的,最少的是擦板(嗯,这个让我想起了另外一位巨星——邓肯,他的擦板肯定不少!)这里用到的是“combined_shot_type”这一列,然后我把结果转为中文了,看起来顺眼一点。
5).计算命中率
- 过滤数据集,获得投篮命中的次数hits_df
- 计算投篮命中率
- 设置坐标参数和lable
可以看到,扣篮的命中率最高,然后是擦板,带球上篮,勾手,跳投,最后居然是补篮命中率最低(有点难以置信,有可能是数据的缺失的原因,我其实更偏向跳投才是最低的).
6).看看不同区域的出手情况
分析完科比的进攻方式,再来看看他喜欢在哪些地方投篮,终结的效果又是如何。同样,数据集里面对投篮区域的描述也有两列,这里我选取描述更具体的“shot_zone_basic”一列来分析。
因为y轴的标签名称太长,所以我们把画布右移0.18
可以看到,科比更多的进攻范围是在中距离,中投多一点。
7).最后一分钟的数据
#选取最后一分钟的数据
last_min_df = known_data[known_data['minutes_remaining']==0]
#平均进攻距离
avg_dis = last_min_df['shot_distance'].mean()
#进攻方式绘制
可以看到,还是中距离的跳投居多,还有一些距离看起来很远的,一般都是时间快到点了,然后乱扔出去的,最为球队领袖,还是有很多出手权的。
限于篇幅,我对小郑的数据探索原文有一些删减,其实这是一份很好可以用来练习的数据集,你可以用来练习pandas数据分析,matplotlib可视化,sklearn数据挖掘,希望大家可以学习和挖掘更多信息。