[NBA]三雙場次平均數(shù)據(jù),誰最豪華?誰最經(jīng)濟(jì)?

前言

最近剛讀完《利用 Python 進(jìn)行數(shù)據(jù)分析》,知識點(diǎn)還不是很牢固,于是想找些數(shù)據(jù)練手,剛好自己是個籃球迷,于是找了些 NBA 數(shù)據(jù)統(tǒng)計網(wǎng)站作為數(shù)據(jù)的來源,并借此來走一遍數(shù)據(jù)分析的流程。


背景

三雙

通常情況,是指在一場比賽中,得分,籃板,助攻,搶斷,蓋帽中,有三項技術(shù)統(tǒng)計達(dá)到兩位數(shù),就被稱為「三雙」(不考慮失誤上雙的情況)。

豪華型三雙 & 經(jīng)濟(jì)型三雙

并沒有明確標(biāo)準(zhǔn)來定義「豪華型」或「經(jīng)濟(jì)型」,下文會以平均得分作為指標(biāo),平均得分越高就越「豪華」,反之則越「經(jīng)濟(jì)」(實際上可以根據(jù)三雙數(shù)據(jù)的標(biāo)準(zhǔn)差來判斷選擇以得分作為標(biāo)準(zhǔn)的合理性)。

數(shù)據(jù)來源

來自 Basketball Refference,篩選了 1983-84 賽季至本賽季(2016-2017)的常規(guī)賽這段時間所有球員的三雙數(shù)據(jù),查詢到結(jié)果共有 1449 人次獲得過三雙或以上(也會有四雙)。


數(shù)據(jù)抓取

雖然網(wǎng)站提供了 CSV 文本格式,但似乎并不支持下載(需要自己手動復(fù)制),此外,數(shù)據(jù)太詳細(xì)了,對于這次的分析來說,無效值太多了,與其在數(shù)據(jù)處理的過程中被繁多的數(shù)據(jù)項「轟炸」,還不如在抓取的過程中將符合分析需求的數(shù)據(jù)項篩選出來。

先來看看 Basketball Refference 都提供了哪些數(shù)據(jù):

Basketball Refference 數(shù)據(jù)截圖

對于此次的分析來說,我們只需要抓取最基礎(chǔ)的數(shù)據(jù)項,如名字(Player)、得分(PTS)、籃板(TRB)、助攻(AST)、搶斷(STL)、蓋帽(BLK),當(dāng)然,還可以根據(jù)自己的分析需求加上其他數(shù)據(jù)項。

確定了需要抓取的數(shù)據(jù)項后,再確定一下用于抓取的工具,這里我選擇了 Python + PySpider 框架。

PySpider

PySpider 是國內(nèi)大神 binux 開發(fā)的一套簡單易用并且功能強(qiáng)大的爬蟲框架,支持多線程爬取、JS 動態(tài)解析,提供 WebUI、出錯重試、定時爬取等功能,非常人性化。

PySpider 官網(wǎng):http://docs.pyspider.org/

PySpider Sample Code

代碼展示

閱讀 PySpider 文檔和 Sample Code,并作出修改:

1. 一頁獲取多個結(jié)果:PySpider 是有提供 url 去重功能的(避免重復(fù)抓取 url),而這個例子中的數(shù)據(jù)是以表格形式展示的(每條數(shù)據(jù)的 url 是相同的),所以需要人為地修改每條數(shù)據(jù)的 url,方法是在 url 的結(jié)尾加上一個數(shù)字標(biāo)記「#i」。PySpider API 里提供了 self.send_message() 的方法,最后也別忘記設(shè)置 on_message()。

2. 設(shè)置逐頁爬?。簉esponse.doc 支持 css selector,所以在找到「下一頁」的標(biāo)簽 url 后,將讓它重新執(zhí)行 index_page(),實現(xiàn)逐頁爬取功能。

PySpider 爬蟲代碼

代碼在 PySpider 內(nèi)置的編輯器上執(zhí)行,點(diǎn)擊藍(lán)色 save 保存代碼,再點(diǎn)擊綠色的 run,就可以調(diào)試代碼能否正確爬取代碼。若確認(rèn)數(shù)據(jù)就是自己想要的,可以回到 PySpider 的 Dashboard 上,將項目設(shè)置為 Debug 或 Running 狀態(tài),再執(zhí)行 Run,數(shù)據(jù)就會進(jìn)行爬取了。

PySpider WebUI 截圖

數(shù)據(jù)爬取完成后,點(diǎn)擊 Dashboard 該項目的 Results,右上方便有 CSV 文件下載的選項了,這個就是我想要的歷年 NBA 三雙球員場次的數(shù)據(jù)了。


數(shù)據(jù)清洗

網(wǎng)站爬蟲難免會爬取到一些無效值,在進(jìn)行分析之前,先要對數(shù)據(jù)進(jìn)行一番清理,避免影響數(shù)據(jù)分析的結(jié)果。由于我有其他的分析項目,所以我在數(shù)據(jù)爬蟲的時候,也爬取了其他的數(shù)據(jù)項,但對于本例子的分析項目來說,這些數(shù)據(jù)項就是無效值,需要清除。另外,表格出現(xiàn)若干帶有空值的行,這也是無效值,需要清理。另外,PySpider 也附加了一些無意義的列,也需要清理一下。如下圖,紅框框住的行/列,都是需要清洗掉的:

需要清除的列/行

代碼展示

清除無效值列/行

除了對無效值的清洗,數(shù)據(jù)清洗還包括對數(shù)據(jù)類型的轉(zhuǎn)換,通過 df.dtypes 指令可得知,例子中獲取到的 age 和 date 都是字符串?dāng)?shù)據(jù)類型,這樣就不方便進(jìn)行數(shù)值化統(tǒng)計(比如平均年齡)等操作了。所以在進(jìn)行分析前,還需要對這兩列的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換。

(P.S. 這兩數(shù)據(jù)項在本例子里本應(yīng)也是無效值,但作為展示數(shù)據(jù)清洗中的數(shù)據(jù)類型轉(zhuǎn)換,還是保留下來)


數(shù)據(jù)類型轉(zhuǎn)換

最后得出來的數(shù)據(jù)結(jié)果是:

對 index,columns 位置重新設(shè)置后的 df3 的輸出結(jié)果

至此,本例子的數(shù)據(jù)清洗,先到這一步,實際上在其他項目中,可能還需要進(jìn)行的數(shù)據(jù)清洗的操作有,填充空值、去除數(shù)據(jù)中多余的空格、大小寫轉(zhuǎn)換、異常值替換等等。由于篇幅限制,就不展開討論了。


數(shù)據(jù)分析

數(shù)據(jù)分析最重要的是分析目標(biāo),只有明確了分析目標(biāo),才能明確下一步操作的思路。回到本例子中,是希望通過抓取的球員數(shù)據(jù),分析出誰拿的三雙最「豪華」,誰的最「經(jīng)濟(jì)」。

根據(jù)這一目標(biāo),只要匯總統(tǒng)計每個球員的三雙數(shù)據(jù)取平均值就可以了,不過在此之前,還需要對數(shù)據(jù)進(jìn)行一番篩選,我們都知道,只有樣本數(shù)量較大的時候,數(shù)據(jù)平均值才不至于太夸張,這里我將篩選拿到超過 10 次三雙的球員進(jìn)行比較:

匯總統(tǒng)計

player_tribles 就是我們想要的每位球員三雙場次的平均數(shù)據(jù),輸入 player_tribles.head(10) 可得到以下的表格:

根據(jù)平均得分?jǐn)?shù)值大小排名,抽取一部分進(jìn)行比較:

1. 詹姆斯·哈登的三雙場次平均數(shù)據(jù)在得分、籃板、助攻上居然稍壓邁克爾·哪里都有我·喬丹,可以通過 df3[df3['player']=='James Harden'].sort_values(by='pts',ascending=False) 查看哈登所有的三雙場次數(shù)據(jù),本賽常規(guī)賽居然打出了兩次驚世駭俗的 50 分三雙,還有 5 次 40 分三雙,所以三雙場次平均得分被拉上也不奇怪了;

2. 威少和詹姆斯兩位「全能戰(zhàn)士」的比較,威少在得分、籃板、助攻上穩(wěn)壓詹姆斯,但籃球從來不是一個數(shù)據(jù)游戲,熟悉 NBA 的朋友應(yīng)該知道,有些球員對比賽的影響并不會體現(xiàn)在數(shù)據(jù)上;

3. 一生宿敵,海軍上將與大夢,兩人的場均數(shù)據(jù)都沒有達(dá)到三雙,是什么原因呢,通過 df3[df3['player']=='...'] 查詢,原來他們都曾得過不同類型的三雙,包括「得分+籃板+助攻」類型和「得分+籃板+蓋帽」類型,所以數(shù)據(jù)平均下來沒有達(dá)到三雙,但也側(cè)面說面他們的全面身手。(P.S. 巧合的是,兩人都得到四雙)

4. 大家都熟悉的科比,共拿到 21 次三雙,24.48 的平均得分似乎并不符合歷史級得分高手的「人設(shè)」,要進(jìn)一步探究的話,可以補(bǔ)充一下出手次數(shù)和命中率的數(shù)據(jù),分析是他拿三雙的場次,到底是出手意愿不強(qiáng),還是命中率被限制了。


同樣通過 player_tribles.tail(10) 也可以得出:

再來看看三雙場次平均得分較低的十位球員的數(shù)據(jù):

1. 之前因為看球晚,印象中的經(jīng)濟(jì)型三雙常客基德,實際上他在拿到三雙的比賽中平均得分不算低,可能是被生涯后期的數(shù)據(jù)拖累。而三雙拿得最「經(jīng)濟(jì)」的當(dāng)屬被我 Darrell Walker,曾是 93 公牛的一員,職業(yè)生涯最佳的賽季數(shù)據(jù)為 9.5+8.8+8(1989-90賽季 華盛頓子彈隊)。

2. 現(xiàn)役球員中,三雙平均數(shù)據(jù)最經(jīng)濟(jì)的是追夢格林,平均得分居然沒有「真拒投」隆多高…通過 df3[df3['player']=='Draymond Green'] 查了一下,他居然在這賽季拿過一次「籃板+助攻+搶斷」的詭異三雙。


結(jié)語

至此,文章標(biāo)題提到的問題相信已經(jīng)有答案了,由于現(xiàn)有的數(shù)據(jù)已經(jīng)能得出結(jié)論了,就不加入可視化的操作了(也考慮到篇幅問題)。帶著分析目的,從數(shù)據(jù)抓取到數(shù)據(jù)清洗,再到數(shù)據(jù)分析(甚至可視化),可以算是一個比較完整的分析過程了。每一個步驟產(chǎn)出不同的結(jié)果,一步一步逼近「真相」。

當(dāng)然,本例子的數(shù)據(jù)量不大,數(shù)據(jù)清洗,數(shù)據(jù)分析以及可視化,都是可以通過其他工具(比如 Excel,BI)完成的,但如果數(shù)據(jù)量較大時,采用 Pandas 的優(yōu)勢便會顯示出來。

文章里的代碼都是現(xiàn)學(xué)現(xiàn)賣的,未必是最優(yōu)的解決方案,遇到問題,查查官方文檔就對了 :-)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容