篮球比赛中的投篮选择
参加过篮球比赛的同学,在球场上是否有这样的经历?
当上一次投篮未命中时,你会倾向于比上一次更近的距离出手投篮,当上一次投篮稳稳命中时,你会想尝试下比上一次更更远距离的出手。于是,抓取了一些NBA球员的数据,来看看他们在这些情况下,做出怎样的投篮选择?
1,数据准备
本次的数据来自于 https://www.basketball-reference.com/,这里有很多有意思的数据,这次主要抓取的是shooting,这里记录球员的所有投篮数据,包括出手位置、出手距离、投篮结果、分值(2/3)等。但是现在网站已有反爬,数据不好抓取。
主要抓取现役常规赛总得分的前十名球员数据。詹姆斯、安东尼、杜兰特、哈登、维斯布鲁克、保罗、库里、阿尔德里奇、德罗赞、霍华德。20w+行数据。
对数据进行处理后,得到数据集
字段说明
字段 | 描述 |
---|---|
top | 投篮点纵坐标,背景图片中到球场的上沿距离 |
left | 投篮点横坐标,背景图片中到球场的左侧距离 |
game_date | 比赛时间 |
team | 比赛双方队伍 |
shot_result | 本次投篮结果,Made:命中,Missed:未命中 |
points | 得分,2 分球 or 3分球 |
distance | 投篮点到篮筐距离,单位:ft(英尺) |
player_name | 球员名称 |
pre_shoot_result | 上一次投篮结果,Made:命中,Missed:未命中 |
dist_diff | 本次投篮点distance 与 上一次投篮点distance 差值,本次distance - 上一次distance,单位:ft(英尺) |
2,数据分析
# 分离数据集
after_made = df[df.pre_shoot_result == 'Made'] # 上一次命中
after_miss = df[df.pre_shoot_result =='Missed'] # 上一次未命中
after_made.dist_diff.describe()
"""
count 90703.000000
mean 2.764738
std 12.134524
min -36.000000
25% -3.000000
50% 1.000000
75% 11.000000
max 39.000000
Name: dist_diff, dtype: float64
"""
after_miss.dist_diff.describe()
"""
count 97785.000000
mean -2.521726
std 12.563584
min -39.000000
25% -12.000000
50% -1.000000
75% 5.000000
max 39.000000
Name: dist_diff, dtype: float64
"""
从整体均值看,命中后,会选择更远的距离出手,反之,会选择更近的距离出手。
print('投失后,下次投篮距离变近比例:{:.2%}'.format(len(after_miss[after_miss.dist_diff < 0])/len(after_miss)))
print('投失后,下次投篮距离变远比例:{:.2%}'.format(len(after_miss[after_miss.dist_diff >= 0])/len(after_miss)))
print('命中后,下次投篮距离变近比例:{:.2%}'.format(len(after_made[after_made.dist_diff < 0])/len(after_made)))
print('命中后,下次投篮距离变远比例:{:.2%}'.format(len(after_made[after_made.dist_diff >= 0])/len(after_made)))
投失后,下次投篮距离变近比例:55.03%
投失后,下次投篮距离变远比例:44.97%
命中后,下次投篮距离变近比例:34.65%
命中后,下次投篮距离变远比例:65.35%
从细分的结果来看,也是得出相同结论:命中后,会选择更远的距离出手,反之,会选择更近的距离出手
在从距离差值直方图来看,在差值< 0的部分,未命中的累计曲线比命中的累计曲线要陡峭的多,也说明了相同结论。
然而,还可以提出一个新问题,球员投篮命中率会不会受到他们之前是否命中的影响?
print('投失后,本次投篮命中率:{:.2%}'.format(len(after_miss[after_miss.shoot_result =='Made'])/len(after_miss)))
print('命中后,本次投篮命中率:{:.2%}'.format(len(after_made[after_made.shoot_result =='Made'])/len(after_made)))
投失后,本次投篮命中率:48.46%
命中后,本次投篮命中率:47.28%
从计算结果,可以得出:球员投篮命中的几率不会受到他们之前是否命中的影响,每次投篮都是独立事件,跳起来投篮就像扔硬币,所谓“火热手感”也并不存在。