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

前言

最近刚读完《利用 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 的优势便会显示出来。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容