[NBA]三双场次平均数据,谁最豪华?谁最经济?

您所在的位置:网站首页 nba三双是指什么球员 [NBA]三双场次平均数据,谁最豪华?谁最经济?

[NBA]三双场次平均数据,谁最豪华?谁最经济?

2024-07-16 02:09| 来源: 网络整理| 查看: 265

前言

最近刚读完《利用 Python 进行数据分析》,知识点还不是很牢固,于是想找些数据练手,刚好自己是个篮球迷,于是找了些 NBA 数据统计网站作为数据的来源,并借此来走一遍数据分析的流程。

背景

三双

通常情况,是指在一场比赛中,得分,篮板,助攻,抢断,盖帽中,有三项技术统计达到两位数,就被称为「三双」(不考虑失误上双的情况)。

豪华型三双 & 经济型三双

并没有明确标准来定义「豪华型」或「经济型」,下文会以平均得分作为指标,平均得分越高就越「豪华」,反之则越「经济」(实际上可以根据三双数据的标准差来判断选择以得分作为标准的合理性)。

数据来源

来自 Basketball Refference,筛选了 1983-84 赛季至本赛季(2016-2017)的常规赛这段时间所有球员的三双数据,查询到结果共有 1449 人次获得过三双或以上(也会有四双)。

数据抓取

虽然网站提供了 CSV 文本格式,但似乎并不支持下载(需要自己手动复制),此外,数据太详细了,对于这次的分析来说,无效值太多了,与其在数据处理的过程中被繁多的数据项「轰炸」,还不如在抓取的过程中将符合分析需求的数据项筛选出来。

先来看看 Basketball Refference 都提供了哪些数据:

Basketball Refference 数据截图

对于此次的分析来说,我们只需要抓取最基础的数据项,如名字(Player)、得分(PTS)、篮板(TRB)、助攻(AST)、抢断(STL)、盖帽(BLK),当然,还可以根据自己的分析需求加上其他数据项。

确定了需要抓取的数据项后,再确定一下用于抓取的工具,这里我选择了 Python + PySpider 框架。

PySpider

PySpider 是国内大神 binux 开发的一套简单易用并且功能强大的爬虫框架,支持多线程爬取、JS 动态解析,提供 WebUI、出错重试、定时爬取等功能,非常人性化。

PySpider 官网:http://docs.pyspider.org/

PySpider Sample Code

代码展示

阅读 PySpider 文档和 Sample Code,并作出修改:

1. 一页获取多个结果:PySpider 是有提供 url 去重功能的(避免重复抓取 url),而这个例子中的数据是以表格形式展示的(每条数据的 url 是相同的),所以需要人为地修改每条数据的 url,方法是在 url 的结尾加上一个数字标记「#i」。PySpider API 里提供了 self.send_message() 的方法,最后也别忘记设置 on_message()。

2. 设置逐页爬取:response.doc 支持 css selector,所以在找到「下一页」的标签 url 后,将让它重新执行 index_page(),实现逐页爬取功能。

PySpider 爬虫代码

代码在 PySpider 内置的编辑器上执行,点击蓝色 save 保存代码,再点击绿色的 run,就可以调试代码能否正确爬取代码。若确认数据就是自己想要的,可以回到 PySpider 的 Dashboard 上,将项目设置为 Debug 或 Running 状态,再执行 Run,数据就会进行爬取了。

PySpider WebUI 截图

数据爬取完成后,点击 Dashboard 该项目的 Results,右上方便有 CSV 文件下载的选项了,这个就是我想要的历年 NBA 三双球员场次的数据了。

数据清洗

网站爬虫难免会爬取到一些无效值,在进行分析之前,先要对数据进行一番清理,避免影响数据分析的结果。由于我有其他的分析项目,所以我在数据爬虫的时候,也爬取了其他的数据项,但对于本例子的分析项目来说,这些数据项就是无效值,需要清除。另外,表格出现若干带有空值的行,这也是无效值,需要清理。另外,PySpider 也附加了一些无意义的列,也需要清理一下。如下图,红框框住的行/列,都是需要清洗掉的:

需要清除的列/行

代码展示

清除无效值列/行

除了对无效值的清洗,数据清洗还包括对数据类型的转换,通过 df.dtypes 指令可得知,例子中获取到的 age 和 date 都是字符串数据类型,这样就不方便进行数值化统计(比如平均年龄)等操作了。所以在进行分析前,还需要对这两列的数据类型进行转换。

(P.S. 这两数据项在本例子里本应也是无效值,但作为展示数据清洗中的数据类型转换,还是保留下来)

数据类型转换

最后得出来的数据结果是:

对 index,columns 位置重新设置后的 df3 的输出结果

至此,本例子的数据清洗,先到这一步,实际上在其他项目中,可能还需要进行的数据清洗的操作有,填充空值、去除数据中多余的空格、大小写转换、异常值替换等等。由于篇幅限制,就不展开讨论了。

数据分析

数据分析最重要的是分析目标,只有明确了分析目标,才能明确下一步操作的思路。回到本例子中,是希望通过抓取的球员数据,分析出谁拿的三双最「豪华」,谁的最「经济」。

根据这一目标,只要汇总统计每个球员的三双数据取平均值就可以了,不过在此之前,还需要对数据进行一番筛选,我们都知道,只有样本数量较大的时候,数据平均值才不至于太夸张,这里我将筛选拿到超过 10 次三双的球员进行比较:

汇总统计

player_tribles 就是我们想要的每位球员三双场次的平均数据,输入 player_tribles.head(10) 可得到以下的表格:

根据平均得分数值大小排名,抽取一部分进行比较:

1. 詹姆斯·哈登的三双场次平均数据在得分、篮板、助攻上居然稍压迈克尔·哪里都有我·乔丹,可以通过 df3[df3['player']=='James Harden'].sort_values(by='pts',ascending=False) 查看哈登所有的三双场次数据,本赛常规赛居然打出了两次惊世骇俗的 50 分三双,还有 5 次 40 分三双,所以三双场次平均得分被拉上也不奇怪了;

2. 威少和詹姆斯两位「全能战士」的比较,威少在得分、篮板、助攻上稳压詹姆斯,但篮球从来不是一个数据游戏,熟悉 NBA 的朋友应该知道,有些球员对比赛的影响并不会体现在数据上;

3. 一生宿敌,海军上将与大梦,两人的场均数据都没有达到三双,是什么原因呢,通过 df3[df3['player']=='...'] 查询,原来他们都曾得过不同类型的三双,包括「得分+篮板+助攻」类型和「得分+篮板+盖帽」类型,所以数据平均下来没有达到三双,但也侧面说面他们的全面身手。(P.S. 巧合的是,两人都得到四双)

4. 大家都熟悉的科比,共拿到 21 次三双,24.48 的平均得分似乎并不符合历史级得分高手的「人设」,要进一步探究的话,可以补充一下出手次数和命中率的数据,分析是他拿三双的场次,到底是出手意愿不强,还是命中率被限制了。

同样通过 player_tribles.tail(10) 也可以得出:

再来看看三双场次平均得分较低的十位球员的数据:

1. 之前因为看球晚,印象中的经济型三双常客基德,实际上他在拿到三双的比赛中平均得分不算低,可能是被生涯后期的数据拖累。而三双拿得最「经济」的当属被我 Darrell Walker,曾是 93 公牛的一员,职业生涯最佳的赛季数据为 9.5+8.8+8(1989-90赛季 华盛顿子弹队)。

2. 现役球员中,三双平均数据最经济的是追梦格林,平均得分居然没有「真拒投」隆多高…通过 df3[df3['player']=='Draymond Green'] 查了一下,他居然在这赛季拿过一次「篮板+助攻+抢断」的诡异三双。

结语

至此,文章标题提到的问题相信已经有答案了,由于现有的数据已经能得出结论了,就不加入可视化的操作了(也考虑到篇幅问题)。带着分析目的,从数据抓取到数据清洗,再到数据分析(甚至可视化),可以算是一个比较完整的分析过程了。每一个步骤产出不同的结果,一步一步逼近「真相」。

当然,本例子的数据量不大,数据清洗,数据分析以及可视化,都是可以通过其他工具(比如 Excel,BI)完成的,但如果数据量较大时,采用 Pandas 的优势便会显示出来。

文章里的代码都是现学现卖的,未必是最优的解决方案,遇到问题,查查官方文档就对了 :-)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3