使用 Python 和 R 進(jìn)行足球分析 3:探索性數(shù)據(jù)分析 (1)
能夠完全活在抽象中的人相對(duì)較少。 我們喜歡看到我們正在處理的數(shù)據(jù)。 我們喜歡觸摸我們正在處理的數(shù)據(jù)。 當(dāng)然是比喻。 我們喜歡理解數(shù)據(jù)。 我們喜歡驗(yàn)證數(shù)據(jù)的質(zhì)量,以免弊大于利。 繪制數(shù)據(jù)是探索性數(shù)據(jù)分析過(guò)程(簡(jiǎn)稱(chēng) EDA)的第一步。 我們專(zhuān)注于策劃我們首次涉足 EDA。 EDA 一詞是由美國(guó)統(tǒng)計(jì)學(xué)家 John Tukey 創(chuàng)造的,他促使人們?cè)谡浇y(tǒng)計(jì)分析之前徹底了解他們的數(shù)據(jù)。 一般來(lái)說(shuō),這在足球和體育運(yùn)動(dòng)中非常重要,因?yàn)橐苑治鰹閷?dǎo)向的分析師通常被視為局外人,因此未能考慮數(shù)據(jù)中的細(xì)微差別可能會(huì)破壞您或您團(tuán)隊(duì)的分析工作。 EDA 包括繪制數(shù)據(jù)和匯總數(shù)據(jù)等工具以查看正在發(fā)生的事情。
筆記
John Tukey 還創(chuàng)造了其他您可能知道或希望在本書(shū)結(jié)束時(shí)知道的其他術(shù)語(yǔ),包括箱線圖(一種圖表)、方差分析(簡(jiǎn)稱(chēng) ANOVA;一種統(tǒng)計(jì)測(cè)試)、軟件(計(jì)算機(jī)程序)和 位(計(jì)算機(jī)數(shù)據(jù)的最小單位,通常表示為 0/1;您可能更熟悉較大的單位,例如字節(jié),即八位)。 Tukey 還幫助普林斯頓大學(xué)橄欖球隊(duì)實(shí)施了數(shù)據(jù)分析。 要詳細(xì)了解 Tukey 的生平和貢獻(xiàn),請(qǐng)查看 David Brillinger 撰寫(xiě)的訃告,該訃告出現(xiàn)在統(tǒng)計(jì)年鑒 (JSTOR: Access Check) 中。
我們?cè)谡麄€(gè)足球分析和迭代過(guò)程中使用 EDA。 首先,我們制定目標(biāo),例如預(yù)測(cè)游戲的獲勝者或誰(shuí)將彌補(bǔ)差價(jià)。 其次,我們獲取數(shù)據(jù)來(lái)回答我們的問(wèn)題。 第三,我們?cè)?R 或 Python 等程序中讀取數(shù)據(jù),然后探索數(shù)據(jù)的結(jié)構(gòu)。 這有助于我們了解數(shù)據(jù)的形式并抽查數(shù)據(jù)質(zhì)量是否存在重大問(wèn)題,例如數(shù)據(jù)丟失或數(shù)據(jù)損壞。 第四,我們繪制數(shù)據(jù)。 這使我們能夠可視化數(shù)據(jù)并開(kāi)始了解其形狀。 例如,如果有人記錄分鐘而不是秒,我們可能會(huì)在數(shù)據(jù)中看到這個(gè)錯(cuò)誤條目。 第五,我們總結(jié)數(shù)據(jù)。 這使我們能夠量化數(shù)據(jù)的情況。 第六,我們使用統(tǒng)計(jì)模型來(lái)估計(jì)數(shù)據(jù)中的模式。
最后,我們回過(guò)頭來(lái)使用圖表和摘要來(lái)幫助解釋我們的模型以及我們?cè)噲D用數(shù)據(jù)講述的故事。 如果我們使用演繹推理,我們將從我們想要從數(shù)據(jù)中檢驗(yàn)的想法或假設(shè)開(kāi)始。 如果我們使用歸納推理,我們會(huì)讓數(shù)據(jù)指導(dǎo)我們從數(shù)據(jù)中得出的結(jié)論和假設(shè)。 我們定期使用這兩種方法。 例如,如果我們想了解為什么有些球員比其他球員更好,我們可以檢驗(yàn)這樣一個(gè)假設(shè),即在 NFL 選秀中較早被選中的四分衛(wèi)比較晚被選中的四分衛(wèi)更有效率。 相反,如果我們想要預(yù)測(cè)一場(chǎng)比賽或一個(gè)賽季中夢(mèng)幻足球的表現(xiàn),我們可能會(huì)構(gòu)建模型、測(cè)試模型,然后將模型轉(zhuǎn)化為更易于使用的格式。
我們從繪圖的技術(shù)技能開(kāi)始。 繪圖將幫助您查看數(shù)據(jù)并獲得理解。 我們通常首先繪制數(shù)據(jù),使用其他工具(例如模型和統(tǒng)計(jì)摘要)來(lái)探索數(shù)據(jù),最后創(chuàng)建數(shù)據(jù)的摘要圖以闡明我們的觀點(diǎn)。 此外,我們發(fā)現(xiàn)可視化是講述數(shù)據(jù)故事最有趣的部分之一。
python 和 R 涵蓋了數(shù)據(jù)采集和整理以及更高級(jí)的數(shù)據(jù)導(dǎo)入。 我們?cè)诒菊轮蟀诉@些材料,因?yàn)槲覀儼l(fā)現(xiàn)一旦您獲得了一些編程經(jīng)驗(yàn),這些主題就會(huì)變得更容易。 獲取數(shù)據(jù)然后將其整理成可用的格式很重要,但可能更乏味。 將數(shù)據(jù)技能視為類(lèi)似于足球分析的重量訓(xùn)練或交叉訓(xùn)練。 休閑玩家,如娛樂(lè)聯(lián)盟或校內(nèi)玩家可能不需要這些技能訓(xùn)練。 然而,有競(jìng)爭(zhēng)力的球員需要交叉訓(xùn)練。 此外,有些人只專(zhuān)注于交叉訓(xùn)練,例如競(jìng)技舉重或短跑運(yùn)動(dòng)員。 同樣,有些人專(zhuān)注于處理數(shù)據(jù),通常被稱(chēng)為數(shù)據(jù)工程師。 數(shù)據(jù)工程師的主要工作是關(guān)注數(shù)據(jù)工作流。
在學(xué)習(xí)了如何使用數(shù)據(jù)之后,我們過(guò)渡到更多使用數(shù)據(jù)為足球提供信息的方法。 第 5 章介紹了統(tǒng)計(jì)和建模。 第 6 章介紹了不同的建模方法并相互構(gòu)建。 將 EDA 結(jié)合到講故事中。
激勵(lì)問(wèn)題:我們?nèi)绾巍翱吹健被蛱剿鱾鬟f的數(shù)據(jù)?
很可能,你在實(shí)踐中學(xué)得最好。 我們力求在本書(shū)中使用足球數(shù)據(jù)進(jìn)行示例教學(xué)。 在本章中,我們將使用 2020 年第 2 周綠灣包裝工隊(duì)和底特律雄獅隊(duì)之間比賽的傳球數(shù)據(jù)。 我們還包括 2020 年底特律雄獅隊(duì)和德克薩斯州休斯頓隊(duì)之間比賽的傳球比賽數(shù)據(jù),供您自行探索 det_hou_2020_pass.csv。 我們使用 nflfastR 包獲得了這兩個(gè)數(shù)據(jù)集。 我們?cè)诘?3 章中描述了這個(gè)包,因此您可以開(kāi)始使用數(shù)據(jù)來(lái)回答您的特定問(wèn)題。
也許我們對(duì)綠灣包裝工隊(duì)和底特律雄獅隊(duì)的傳球比賽感興趣。 我們可能會(huì)尋求回答具體問(wèn)題。 例如:
根據(jù)場(chǎng)地的一側(cè),任何一支球隊(duì)都有更好的傳球嗎?
成功傳球后球隊(duì)將球傳多遠(yuǎn)?
加擾會(huì)改變球的去向嗎?
首先,我們需要讀入數(shù)據(jù)。 在 Python 中,我們使用 pandas 包,我們使用 import 命令加載它。 然后,您可以將數(shù)據(jù)讀入計(jì)算機(jī)。 我們需要在計(jì)算機(jī)中為數(shù)據(jù)命名,這可能會(huì)很棘手,因?yàn)槲覀兿MQ(chēng)足夠長(zhǎng)以進(jìn)行描述,但又足夠短以便于輸入。 名稱(chēng) gb_det_20202_pass 告訴我們球隊(duì)(gb 代表綠灣,det 代表底特律,主隊(duì)第一,客隊(duì)第二)、年份(2020 年)和數(shù)據(jù)類(lèi)型(pass 表示傳球)。 您可以使用任何您想要的有效名稱(chēng),包括愚蠢的名稱(chēng),例如 fred 或低信息名稱(chēng),例如 dat。 我們還假設(shè)數(shù)據(jù)位于子文件夾 data 中。
編程時(shí)命名對(duì)象實(shí)際上可能很困難。 嘗試在更容易輸入的簡(jiǎn)單名稱(chēng)與更長(zhǎng)、信息量更大的名稱(chēng)之間取得平衡。 如果您開(kāi)始編寫(xiě)名稱(chēng)較長(zhǎng)的腳本,這一點(diǎn)尤其重要。 命名最重要的部分是創(chuàng)建您和其他人在稍后閱讀代碼時(shí)能夠理解的名稱(chēng)。
同樣,我們可以使用 base R 的 read.csv() 將數(shù)據(jù)讀入 R 并將數(shù)據(jù)命名為相同的名稱(chēng):
在我們深入研究數(shù)據(jù)之前,可以檢查數(shù)據(jù)的頂部或頭部。 對(duì)于 Python 和 R,我們還在數(shù)據(jù)頭部使用 print() 函數(shù)。 在 Python 中,我們?cè)跀?shù)據(jù)對(duì)象之后使用 .head() 。 然后,我們將 print() 包裹在數(shù)據(jù)框的頭部。
大多數(shù)函數(shù)不需要 print(),因?yàn)檫@些語(yǔ)言有默認(rèn)的打印命令。 但是,顯式調(diào)用該命令可確保我們確切知道將發(fā)生什么。
與 R 不同,我們首先將 head(...) 包裹在數(shù)據(jù)框周?chē)?,然后?print(...) 包裹在 head 函數(shù)周?chē)?/p>
請(qǐng)注意 Python 如何從 0 開(kāi)始編號(hào),而 R 從 1 開(kāi)始編號(hào)。Python 使用計(jì)算機(jī)科學(xué)的標(biāo)準(zhǔn)約定,而 R 使用數(shù)學(xué)和統(tǒng)計(jì)學(xué)的標(biāo)準(zhǔn)約定。 這反映了語(yǔ)言作者的歷史。 此外,作為更小的一點(diǎn),請(qǐng)注意 R 的 head() 打印前 6(1、2、3、4、5 和 6)行,而 Python 的 .head() 打印前 5(0、1、2、3、 和 4) 行。
Python 從 0 開(kāi)始編號(hào)。R 從 1 開(kāi)始編號(hào)。如果使用這兩種語(yǔ)言,許多有抱負(fù)的數(shù)據(jù)科學(xué)家都會(huì)被絆倒。
接下來(lái),我們想了解我們的數(shù)據(jù)。 具體來(lái)說(shuō),關(guān)于數(shù)據(jù)或元數(shù)據(jù)的數(shù)據(jù)。 對(duì)于縱隊(duì),posteam 是比賽開(kāi)始時(shí)控球的球隊(duì)。 yards_after_catch 是接球后獲得的碼數(shù)。 air_yards 是球在空中傳了多遠(yuǎn)(無(wú)論傳完與否)。 pass_location 是四分衛(wèi)將球傳給場(chǎng)地的哪一側(cè)。 qb_scramble 是一個(gè)二進(jìn)制響應(yīng)(即 0 表示否或 1 表示是),用于表示四分衛(wèi)是否必須加擾。
對(duì)于任何數(shù)據(jù),確保您了解元數(shù)據(jù)。 例如,0 和 1 是什么意思? 或者,作者是否使用 1 和 2 作為級(jí)別? 我們聽(tīng)說(shuō)有研究被撤回,因?yàn)閿?shù)據(jù)分析師和科學(xué)家誤解了元數(shù)據(jù)以及 1 和 2 與標(biāo)準(zhǔn) 0 和 1 的用途。例如,Significance 中的一篇 2021 年文章描述了這個(gè)錯(cuò)誤的發(fā)生 (https //www.doi.org/10.1111/1740-9713.01522)。
應(yīng)用 EDA
我們將通過(guò)檢查傳遞數(shù)據(jù)來(lái)演示我們?nèi)绾问褂?EDA。 首先,我們將從對(duì)數(shù)據(jù)的廣泛檢查開(kāi)始。 您將檢查兩個(gè)團(tuán)隊(duì)之間是否存在根本差異,或者數(shù)據(jù)中是否出現(xiàn)任何模式。 其次,我們將專(zhuān)注于數(shù)據(jù)的具體問(wèn)題。 比如空中碼數(shù)和接球后碼數(shù)有關(guān)系嗎? 或者哪支球隊(duì)在進(jìn)攻方面比另一支球隊(duì)做得更好?
發(fā)現(xiàn)廣泛的趨勢(shì)可以幫助您理解數(shù)據(jù)并優(yōu)化您的問(wèn)題。 例如,對(duì)于傳球數(shù)據(jù),球隊(duì)更頻繁地向場(chǎng)地的哪一側(cè)傳球。 一支球隊(duì)的防守更差嗎? 或者,如果選擇夢(mèng)幻球員,你希望你的外接手打哪一邊? 最后,EDA 方法還允許您檢查數(shù)據(jù)是否存在任何可能錯(cuò)誤的異常值。 突出的數(shù)據(jù)點(diǎn)可能輸入錯(cuò)誤,或者值得進(jìn)行更多調(diào)查。 我們將在第 4 章中教您去除異常值的工具。但是,這些要點(diǎn)可能也屬于。 對(duì)于這些數(shù)據(jù)點(diǎn),我們可能想要更深入地挖掘,弄清楚它們背后的故事。
我們查看并使用 EDA 以及我們講故事過(guò)程的中心和關(guān)鍵組成部分。 首先,我們使用簡(jiǎn)單的圖表來(lái)可視化數(shù)據(jù)。 這些幫助我們既能感受數(shù)據(jù),又能檢查和發(fā)展我們的直覺(jué)。 接下來(lái),我們通過(guò)擴(kuò)展繪圖以包含更多詳細(xì)信息來(lái)探測(cè)數(shù)據(jù)。 如果我們不了解我們的數(shù)據(jù),我們就會(huì)深入挖掘并弄清楚發(fā)生了什么。 也許我們需要確保我們了解數(shù)據(jù)源或數(shù)據(jù)源沒(méi)有錯(cuò)誤。 最后,我們提出未來(lái)的問(wèn)題。 這些問(wèn)題常常促使我們尋找額外的數(shù)據(jù)來(lái)重復(fù)這個(gè)過(guò)程。
我們將 EDA 視為迭代過(guò)程。 我們繪制數(shù)據(jù)(本章)。 然后,我們對(duì)數(shù)據(jù)進(jìn)行總結(jié)和建模(第 5 章開(kāi)始介紹)。 接下來(lái),我們使用繪圖來(lái)總結(jié)我們的模型。 在這樣做的同時(shí),我們準(zhǔn)備數(shù)據(jù)來(lái)講述一個(gè)故事,然后與我們的利益相關(guān)者進(jìn)行溝通。 最后,我們根據(jù)需要重復(fù)繪圖、建模和交流。
直方圖
我們首先檢查接球后的碼數(shù)。 為此,我們使用直方圖。 直方圖通過(guò)將數(shù)據(jù)計(jì)數(shù)放入箱中來(lái)匯總數(shù)據(jù)。 不同的程序有不同的默認(rèn) bin 寬度。 例如,Python 中的圖 2-1 默認(rèn)共有 7 個(gè) bin。 相比之下,R 中的默認(rèn)有 30 個(gè) bin。 這些不同的箱闡明了數(shù)據(jù)的不同部分。 例如,R 圖顯示一些傳碼是負(fù)數(shù),這在 Python 圖中可能不那么明顯。 然而,R 圖看起來(lái)也很零散。 因此,您故事的創(chuàng)意箱數(shù)量介于 7 到 30 之間。
警告
故意使用錯(cuò)誤數(shù)量的 bin 來(lái)隱藏?cái)?shù)據(jù)的重要屬性被更大的統(tǒng)計(jì)社區(qū)視為欺詐。 在為直方圖選擇 bin 數(shù)時(shí)要考慮周全和有意為之。
在 Python 中,我們導(dǎo)入 seaborn 包,然后對(duì)我們的數(shù)據(jù)使用 displot() 函數(shù)。 所有函數(shù)參數(shù)(輸入)都有直觀的名稱(chēng):data,輸入 DataFrame; 箱子,箱子的數(shù)量; 和要繪制的 x 變量,它是 DataFrame 中的一列。 如果我們想添加更多的繪圖,我們可能需要調(diào)用額外的函數(shù)。 這種類(lèi)型的繪圖是紙筆繪圖,因?yàn)樗?lèi)似于用筆在紙上繪圖并一次添加一個(gè)項(xiàng)目。 matplotlib,seaborn 建立在這種哲學(xué)方法之上:

與 seaborn 相比,使用 ggplot2 繪圖使用不同類(lèi)型的語(yǔ)法。 ggplot2 基于連貫的語(yǔ)法,即第 1 章前面提到的圖形語(yǔ)法。首先,我們加載包含 ggplot2 的 tidyverse。 然后,我們使用 ggplot() 函數(shù)。 我們指定數(shù)據(jù),就像 seaborn 一樣。 但是,ggplot() 具有美學(xué) (aes) 作為情節(jié)的功能。 對(duì)于這個(gè)簡(jiǎn)單的圖,唯一美觀的是 x 軸。 然后我們向圖中添加一個(gè)幾何圖形,特別是使用 geom_histogram() 的直方圖。 這有一個(gè)名為 bins 的對(duì)象,它類(lèi)似于 displot 的參數(shù):

將 seaborn 與 ggplot2 進(jìn)行比較,我們發(fā)現(xiàn)這兩種語(yǔ)法有時(shí)都很有用,有時(shí)卻令人沮喪。 兩者都是高度可定制的,并且在術(shù)語(yǔ)上確實(shí)有一些相似之處,因?yàn)椴糠?seaborn 是在 ggplot2 之后建模的。 如果您還沒(méi)有選擇一種語(yǔ)言,我們鼓勵(lì)您完成本章,看看會(huì)跳出哪種繪圖語(yǔ)言。 繪圖是足球分析的重要組成部分。
如果您還沒(méi)有選擇語(yǔ)言,請(qǐng)?jiān)诒菊轮袑W(xué)習(xí) Python 和 R。 看看哪種類(lèi)型的繪圖對(duì)您來(lái)說(shuō)最自然。
從這兩個(gè)數(shù)字來(lái)看,所有的數(shù)據(jù)似乎都是合理的。 沒(méi)有異常值出現(xiàn),值似乎合理。 該數(shù)據(jù)不遵循正態(tài)曲線或鐘形曲線,因?yàn)榍騿T在正方向接球后比負(fù)方向更有可能獲得大碼(絕對(duì)值)。 我們將在以后的章節(jié)中更多地討論這一點(diǎn)。 但是,我們遺漏了一些非常重要的東西。 我們有兩支球隊(duì)參加比賽。 很有可能,兩支球隊(duì)的傳球分布不同。 事實(shí)上,我們正在尋求檢查這些差異是否存在。
我們可以將兩支球隊(duì)的分布繪制成直方圖。 我們會(huì)將每個(gè)圖吐出或切面成列。 在 seaborn 中,我們添加了一個(gè) col 參數(shù),并根據(jù)控球“posteam”的球隊(duì)繪制分面列。 請(qǐng)注意,與 x 參數(shù)“yards_after_catch”一樣,此輸入也包含在引號(hào)中:

請(qǐng)注意,在這場(chǎng)特殊的比賽中,底特律雄獅隊(duì)在接球后的碼數(shù)分布更均勻,而包裝工隊(duì)在接球后的碼數(shù)分布更接近于零,一小部分更大的比賽(~20 碼)。
換行符和空格對(duì)于編碼很重要。 這些中斷有助于使我們的代碼更易于閱讀。 Python 和 R 也以不同方式處理?yè)Q行符,但有時(shí),兩種語(yǔ)言都將換行符視為特殊命令。 在這兩種語(yǔ)言中,我們經(jīng)常在腳本文件中拆分函數(shù)輸入,以創(chuàng)建更短的行,更易于閱讀。 例如,我們將一個(gè)函數(shù)像
分解行名并使我們的代碼更易于閱讀。 在 R 中,我們需要確保逗號(hào)位于前一行。 在 Python 中,我們可能需要使用 \ 來(lái)?yè)Q行。 例如,我們需要使用:
在 R 中,我們向舊繪圖添加了一個(gè)新命令 facet_grid(...)。 我們使用波浪號(hào) ~ 來(lái)表示輸入行 ~ 列。 這可以作為按列分面的行讀給人類(lèi)。 要僅按行分面或僅按列分面,請(qǐng)對(duì)未使用的條目使用句點(diǎn) .。 例如,為了按擁有球隊(duì)分面,我們添加 facet_grid(. ~ posteam)。 請(qǐng)注意,R 不在繪圖參數(shù)周?chē)褂靡?hào)(與 Python 相比):
~ 符號(hào)位于標(biāo)準(zhǔn)美式鍵盤(pán)上一個(gè)鍵的左側(cè),需要 shift 鍵才能訪問(wèn)。

掃描二維碼推送至手機(jī)訪問(wèn)。
版權(quán)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請(qǐng)聯(lián)系。