通过NBA近三十年的数据来看:
关于数据源的介绍以及字段解释各位可以移步科赛网 查看,使用的数据源是 team_season.csv。
# -*- coding: utf-8 -*-
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import numpy as np
import matplotlib as mpl
import warnings
import re
warnings.filterwarnings('ignore')
plt.rcParams['font.family'] = ['Microsoft YaHei']
导入数据并生根据比赛比分生成一列分差:
data_team = pd.read_csv('/home/kesci/input/NBAdata/team_season.csv',encoding ='utf-8')
# 根据比分生成一列分差
data_team[u'分差'] = (data_team[u'比分'].str.extract(r"(\d+\.?\d*)-(\d+\.?\d*)", expand=False)[0].astype('int')
- data_team[u'比分'].str.extract(r"(\d+\.?\d*)-(\d+\.?\d*)", expand=False)[1].astype('int'))
data_team.head()
image.png
解析来我们看下各项统计数据之间有何相关性,使用的是pandas的内置函数dataframe.corr()来计算数据之间的皮尔逊相关系数,绝对值越接近1表明相关性越强。
data_corr = data_team.corr()
plt.figure(figsize = (15,12))
sns.heatmap(data = data_corr,cmap = 'Blues',linewidths=0.25,annot=True)
plt.show()
我们通过seaborn的heatmap来展示:
image.png
我们能看到什么:
可能看了很多年的球迷都在感叹:
但事实真的是这样的吗或者说这些变化又是怎么体现到数据之中的,我们接下来看一看。
# 对比赛时间处理,取年份用于分组
data_team[u'年份'] = data_team[u'时间'].str.split('-').str[0]
data_team[u'月份'] = data_team[u'时间'].str.split('-').str[1]
data_grouped_years = data_team.groupby(data_team[u'年份']).mean().reset_index()
plt.figure(figsize=(15, 12))
for i, column in enumerate(data_grouped_years.iloc[:, 1:19].columns, 1):
plt.subplot(6, 3, i)
plt.plot(data_grouped_years[u'年份'], data_grouped_years[column], 'r')
my_x_ticks = ['1985', '1990', '1995', '2000', '2005', '2010', '2016']
plt.xticks(my_x_ticks)
plt.ylabel(column)
plt.show()
通过绘制折线图我们看下各项数据在三十年间的变化:
image.png
我们能看到什么:
总体来说,防守型的数据都是在下降,无论是篮板,抢断还是盖帽,外线出手暴涨。以前是内线的时代,现在是小球时代,中锋作用被弱化。毕竟NBA是一个商业联盟,更多的是迎合市场,一个更能得分的球员总是会比一个更能抢篮板的球员更受欢迎。
前文中我们也看到了,三分球这些年越来越被重视,我们接下来更加直观来展现下这些年三分选择的变化:
data_team[u'三分占比'] = data_team[u'三分命中']*3/data_team[u'得分']
data_team_3ps_grouped = data_team[u'三分占比'].groupby(
[data_team[u'年份'], data_team[u'月份']]).mean().reset_index()
data_team_pivot = data_team_3ps_grouped.pivot(u'月份', u'年份', u'三分占比')
plt.figure(figsize=(20, 5))
with sns.axes_style("white"):
sns.heatmap(data=data_team_pivot, annot=True, linewidths=.5, cmap='Reds')
plt.ylabel(u'月份')
plt.show()
我们统计来这些年来三分球占比的情况,通过seaborn的heatmap做如下展示:
image.png
我们能看到什么:
现在都这么拼命的扔三分,真的就很合理吗? 在讨论三分合理性之前,我们先引入一个概念——有效命中率
eFG%(effective Field Goal percentage)通常翻译为“有效命中率”,该数据优化了三分球对于球员命中率的影响。 考虑到每一个三分球实际上相当于命中了1.5个两分球,因此,eFG%的计算公式为:eFG% = ( FG + 0.5 * 3P ) / FGA,其中: FG:投篮命中数; 3P:三分命中数 FGA:投篮出手总数
其实简单来说,投中一个三分,算1.5个投篮命中数,下面我们来看下近三十年来,有效命中率是怎么在变化。
data_team[u'有效命中率'] = (data_team[u'命中']+0.5 *
data_team[u'三分命中'])/data_team[u'出手']
data_team_efg_grouped = data_team.groupby(
[u'年份'])[u'有效命中率', u'投篮'].mean().reset_index()
plt.figure(figsize=(15, 5))
plt.plot(data_team_efg_grouped[u'年份'], data_team_efg_grouped[u'有效命中率'], 'r')
plt.plot(data_team_efg_grouped[u'年份'], data_team_efg_grouped[u'投篮'], 'g')
my_x_ticks = ['1985', '1990', '1995', '2000', '2005', '2010', '2016']
plt.xticks(my_x_ticks)
plt.legend(loc='best')
plt.show()
我们使用折线图来看这些年真实命中率的变化:
image.png
我们可以看到,这些年整体命中率虽然是在下降,不过真实命中率反而要高于以前了,可能对于很多老球迷来说,这样的NBA少了很多对抗,观赏性不如以前,不过我们还是可以看到,进攻效率却更高了,当然这样的变化是好是坏,就因人而异了。
结论性的东西就不说了,前文都已经说了很多了。 NBA这么多年变化不少,作为一个球迷的我来说,变化其实也不小,想着以前高中大学的时候,为了自己喜欢的球星,跟同学争的面红耳赤也争不出个好歹,大学的时候只要上午有比赛,铁定是逃课去看比赛的,渐渐的参加工作之后,看NBA的时间没那么多了,搞得现在好多新生辈的球员都不认识了,关注的永远只有老詹,有时候看到一些说老詹不好的话,也没那么生气了,现在希望的就是老詹还能多打几年,等老詹退役了,我也应该就不再年轻了。
之前一直在科赛网-NBA这些年 上更新这个项目的,不过一直没怎么整理,特别是文字部分,很多也是在一边摸索一边统计,后期发现有意义的会再更新到简书的。 peace~