Lebron個人數據對球隊勝場數影響. (Part 1)

yuwei
Jacky’s blog
Published in
Sep 7, 2018

大家好,在這次的文章裡,我將帶大家手把手的從’探索資料分析’開始,關於數據的獲得和清理各位可以從我上一篇文章取得相關的處理方式和代碼,如對本文章有興趣,希望了解完整的代碼,可以參考的我的github, 那就開始我們的機器學習過程吧!首先要介紹完整整個Machine Learning Project必須經過的步驟,

參考此大神William Koehrsenblog

  1. 理解問題和對資料的名稱定義有初步的認識決定要評估模型可行性的維 度(metrics)對資料開始進行清洗和格式化

2. 探索性資料分析(Exploratory Data Analysis 俗稱EDA)(視覺化)

3. 特徵工程和特徵選擇

4. 比較不同的機器學習演算法,並選出表現最佳的original 模型

5. 開始調最佳模型裡超參數的參數

6. 調完後的最佳模型開始evaluate 測試集

7. 解釋model的結果

8. 寫出結論並將工作完整記錄起來

這裡必須切記,沒有什麼ㄧ定的分析流程,所有的過程都是必須經過來回確認的,你有可能在調超參數時,發現你在EDA的時候分析有誤,必須回頭更正,並重新影響到你的特徵工程和特徵選擇,所以依照這個大架構,然後開始勇敢的做就對了!

歡迎任何的討論,如有需要,可以寄信來跟我說, gmail: jacky308082@gmail.com

Problem

首先我們會先從問題面開始探討,在開始一整個專案前,我們必須了解我們為了什麼而分析,希望能從裡面獲得什麼利益, 可以先判斷適合的特徵,和知道target是應該用classification還是regression,這樣也能選擇適當的指標去最佳化你的model. 在這次project我想要預測Lebron可能的個人數據會帶來湖人下一季的可能戰績,這篇文主要是建立預測模型,下篇會透過獲得Lebron的個人數據來做一個特別的預測

指標

指標的部份我這邊選擇f1-score,f1-score會介於0到1之間,如果越高,模型愈穩健,在這裡選擇’macro f1',如果想要更一步的解釋可以參考這裡, 簡單來說就是’macro’是以不更改其可能不均勻的平均,而’micro‘會根據不同的confusion matrix去做weighted mean.

資料清洗和格式化(formatting)

在資料擷取和清洗上我在前面的文章已經有提到過了,而在輸出成csv在轉換成新的project所要使用的資料時,我發現產生NaN,在Lebron的三分球命中率和罰球命中率,因為有時Lebron不一定會透過三分或罰球出手得分,所以這兩個命中數和出手數都是0, Python 在判讀命中率時,因為命中數,出手數皆是0的情況下,會使得命中率公式= 命中數/出手數會是’無意義的數’,因為分母也為0,所以我必須把NaN值調整為0

都是出現在投手數也為0的情況上
NaN出現次數

藉由上圖可以了解到出現NaN為‘三分球命中率’和’罰球命中率’,也是因爲投球數(分母)為0的關係才使得命中率出現NaN值,這也說明了另一件數,Lebron還沒有一場出賽沒有投過二分球的!

探索性資料分析

現在要進行個人資料科學裡面最重要的步驟,在這裡的資料分析會藉由各種圖表來展示各項feature對target的影響,是否會有顯著的影響力,還是不同的target只會有同一種feature的趨勢, 因爲這裡的columns眾多,建議各位可以搭配我github的圖表一起服用會比較好,將圖形看的仔細一點

而在針對’輸贏’去做相關係數(correlation coefficient:兩變數之間的相關程度)判斷時, 我們發現其輸贏的內容還是以’W’和’L’來代表’贏‘和’輸’,所以我們要重新修改將’W’改成0,’L’改成1,如圖所示:

因為只取前5項,剛好Lebron才18歲快19歲,剛進NBA,所以都輸球了QQ

這樣我們就可以開始進行EDA了

首先選擇dtype為int64的columns來看與輸贏之間的關係,同時我們也要先處理掉‘是否先發’和’勝分’

是否先發:Lebron在生涯的場次中,只有一次替補的機會,而那一場替補的原因是因為要為Anderson Varejao 在停留了很長的一段時間回到球場後,Lebron考慮到有可能會被球迷噓的危險,Lebron就退下替補,讓Varejao先發,因為先發球員在該主場一定都會受到鼓掌加尖叫,這才叫真正的好隊友,新聞在此

#pie為圓餅圖 標記label 並顯示各自擁有的比例
plt.pie(df['是否先發'].value_counts(),labels=['先發','替補'],shadow=True,autopct='%.2f%%')

這樣的資料分配對預測資料並無使用價值,所以到時候看’輸贏’的correlation efficient時會去掉

勝分: 取勝分來做分析是完全沒有意義的, 在這個project中要解決的problem為以Lebron的數據來預測球隊的勝敗,而’勝分’這個feature則是指球隊在贏球時是贏幾分,輸球時是輸幾分,所以無關乎Lebron的個人數據,所以到時也會把這個column 去除

最後剩下19個dtype為int的columns,可以實作kdeplot(密度圖)

這裡可以看得出在kdeplot ‘輸贏’有明顯差異的是‘主客場’,’二分球投球數’,’進攻籃板’,’防守籃板’,’助攻’,’抄截‘,’失誤’,’犯規’,’正負值’

用同樣的方法選擇dtype=float64的column

我們可以看出在這幾個column裡, ‘輸贏’都是有明顯差別的,所以我們會在保留他們

接下來我們會分別對分類型資料做探討,第一個會從Lebron James曾經碰過的球隊並且最後的勝父開始,看是不是會有明顯的差別,讓我們能從對陣球隊中判斷出Lebron 贏或輸的機率是多少

紅色為’贏球’ 藍色為’輸球’

相信各位可以藉由上述的表格得知,對陣不一樣的球隊會給Lebron所屬的隊伍帶來不同的戰績,所以之後在feature engineering的時候我會透過onehotencoder的方式將其調整為不同的columns

最後的是比賽時間,我就會帶大家看不同的賽季Lebron所有的戰績,但這裡先不討論時間預測(time series)的部分,之後會再寫一篇關於時間預測的文章

在這裡,不同的時間代表不同的戰績,也因為不同的時間代表不穩定的數值, Random的呈現數值, 對預測是沒有幫助的, 所以我不會保留該column。

結論

今天這篇走過了對資料的認識,了解需要處理的問題,已經衡量問題需要使用的指標,而後是資料清洗的部分, 最後是上述的EDA的比較之後,我會在下篇的文章中討論到接下來的步驟和特徵工程和特徵選擇的方法

謝謝你看這一篇文章,如果有任何的問題,都可以傳email跟我討論, 我的email帳號是 jacky308082@gmail.com

--

--

yuwei
Jacky’s blog

Curious Data scientist. Strong Lebron James’s fan. #StriveForGreatness #JustAKidFromTaiwan https://www.linkedin.com/in/yu-wei-chung/