這次選擇的 Kaggle 主題是 : 預測 Kobe Bryant 是否會進球
https://www.kaggle.com/c/kobe-bryant-shot-selection
在 Training Data 中,要預測的變數 : shot_made_flag 是一個二元值,1 代表進球,0 代表沒進
要注意的小提示是,這次比賽採 Logarithmic Loss ,如果你的預測結果是一個二元值,例如:預測為進球 ( 1 ) ,實際是沒進 ( 0 ),那麼基於這種 Loss Function 會給予無限大的懲罰,
所以在 Leaderboard 上看到的分數有兩種情況,一種是 1 以下,一種是 10 以上,基本上是產出的 Test Data 是在 0 ~ 1 範圍之間變動的值還是 0 , 1 二元值的差別,如果實際上你希望得到高分,
應該變成是要預測基於 Kobe 這樣的投籃,投進的機率應該是多少XD
關於 Kaggle 中對於 Logarithmic Loss 的定義與解釋如下:
https://www.kaggle.com/wiki/LogarithmicLoss
這次競賽利用的是 Kobe 生涯投籃的相關數據,主要比較多類別型的變數,轉貼 Kaggle 的變數內容如下:
The field names are self explanatory and contain the following attributes:
action_type
combined_shot_type
game_event_id
game_id
lat
loc_x
loc_y
lon
minutes_remaining
period
playoffs
season
seconds_remaining
shot_distance
shot_made_flag (this is what you are predicting)
shot_type
shot_zone_area
shot_zone_basic
shot_zone_range
team_id
team_name
game_date
matchup
opponent
shot_id
(1) 資料整理
大概了解資料後,就可以先把資料載入:
先對資料進行以下的整理:
- Kobe 只待過 Lakers ,所以可以把 team_id, team_name 變數忽略掉。
- 由於 matchup 包含主/客場以及交手球隊,但 opponent 就有交手球隊,所以用一個 home_type 變數把 matchup 主 (1)、客 (2) 場的狀態標示出來就好。
- 球場座標標示有兩種 lat, lon 與 loc_x, loc_y ,兩種似乎是差不多的意思,在這裡選擇
精度看起來較高的 lat, lon。
- 資料內分別有 minutes_remaining, seconds_remaining 與其對應的節數( periods ),用一個 remain_sec 變數將這兩個變數合併成:這節剩下幾秒。
- 把 game_date 改成 Date 格式物件,方便查詢。
- 最後把 Training Data 與 Test Data 切開,留下 Training Data 作探索性資料分析 ( EDA )。
由於原始資料中有很多類別型的變數,檢查一下有沒有 Test Data 有的 Level 但 Training Data 沒有 :
發現 Test Data 中只有 action_type 具有兩種情形不在 Training Data 中,但資料筆數不多 (2筆),若 action_type 為一個具有顯著影響力的變數,後續可以試試看與這兩筆差不多的資料進行預測。
例如 : Turnaround Fadeaway Bank Shot 在 Combined_shot_type 變數屬於 Jump Shot, shot_distance 變數為 14,即可用這些資訊進行 shot_made_flag 的預測。
(2) 探索性資料分析
|
(2-1) 各種 combined_shot_type 的比例 (2-2) 各種 combined_shot_type 下的命中率 |
Kobe 的出手以 Jump Shot 為主,佔了約 76.7%,命中率為 39.1%,為所有出手種類命中率最低的。
Dunk, Layup, Jump Shot 三種佔多數的出手種類,投籃命中率分別為 92.8%, 56.5%, 39.1% ,上述與在正常投籃狀況下大致相符,投籃命中率隨著與籃框的距離而增減。
比較有趣的是 Bank Shot 雖僅佔出手次數的 0.5% ,但命中率為令人意外的 79.2% (Tim Duncan表示XD),而 Hook Shot 也有超過 50% 的命中率,待後續與投籃距離、座標、兩/三分球等進行比較。
|
(2-3) 各種 combined_shot_type 下,action_type 的比例 |
|
(2-4) 各種 combined_shot_type, action_type 下的命中率 |
接下來看分類較細的 action_type ,圖(2-3)、圖(2-4)上方,以每項 combined_shot_type 進行分類,括號內代表此 combined_shot_type 佔所有 Training Data 的比例,也對應到圖(2-1)。
圖(2-3)內的每一長條代表此 combined_shot_type 之下,此 action_type 所佔的比例與數量;圖(2-4)內的每一長條代表此 action_type 之下,出手進球的比例。
可以發現 Kobe 在各種 combined_shot_type 之下,約有 1 ~ 3 種習慣出手的方式,
與一般印象不同的是, Fadeaway Jump Shot 的數量僅 872 次,佔 Jump Shot 數量的 4.4% 而已。
並且以飛人球員的形象來看, Layup 與 Dunk 的變化好像也不多,不過看起來應該是有足夠在空中的 Drive 就不需要其他多餘的花招破壞美感XD
另外可以發現,有些 action_type 雖然出手的次數少,但命中率卻相當高,例如 : Hook Bank Shot, Running Slam Dunk Shot, Reverse Slam Dunk Shot, Turnaround Finger Roll shot,
Driving Floating Bank Jump Shot 等命中率都為 100% (怎麼感覺越難的越會進阿XD),
Bank Shot 的命中率也皆有超過 50% 的命中率,像是上述提到的 Driving Floating Bank Jump Shot 與 Fadeaway Bank Shot 在 Jump Shot 裡都是命中率很高的類別。
另外出手次數較多且較基本的動作,像是 Jump Shot, Layup Shot, Hook Shot 等,命中率僅 3 成左右;Tip Shot 比較可以猜的出來,是因為點球這種需要靠手感及瞬間反應的動作,命中率會較低。
除了上述談到的基本動作命中率之外,其他動作的出手數雖然較少,大部份都有超過 50% 的水準,因此的確可以看出 action_type 與命中率是有一些關係的。
|
(2-5) 各 shot_zone_area 與 shot_zone_basic 的命中率 |
圖(2-5) 將投籃方位 (shot_zone_area) 與投籃位置 (shot_zone_basic) 合併在一起看,繪出 Kobe 在各個出手位置的出手散佈圖,並且將各個位置的命中率(命中次數/出手次數)列於圖中。
可以發現球場右半邊的出手次數較左半邊來的多,但是在三分線內,球場左右邊各相對位置之間的命中率差異不大,
命中率差異較多的在左右側油漆區 Left Side(L) & In The Paint(Non-RA) : 41.3% 與 Right Side(R) & In The Paint(Non-RA) : 48.1% ,右邊投籃次數及命中率較高;
而在三分線的命中率,可以發現在兩側底角 Left Side(L) & Left Corner 3 : 37.1% 與 Right Side(R) & Right Corner 3 : 33.9 % ,左邊命中率較高,與油漆區相反,
三分線的弧頂位置,命中率由左至右逐漸升高,而距離較遠延伸至中、後場的命中率則僅命中一球。
在此以 Two Sample Chi-Squared Independence Test 雙尾檢定上述之 (1) 左右側油漆區命中率 (2) 三分線兩側底角命中率 是否有顯著差異,顯著水準($\alpha$)訂為0.05。
$H_{0} : P_{1}=P_{2}$,檢定結果 : (1) p-Value=0.07902, (2) p-Value=0.4903 ,兩者皆無顯著證據證明投籃命中率不一。
根據 Wiki,從 1997-98 賽季開始,NBA的三分線離籃框水平距離,於角落為 22呎,其他區域為 23呎9吋。
首先將 shot_zone_range 與 shot_type 對應,可以發現幾筆比較有疑問的資料,分別在以下列出。
shot_id : 5251, 9104 這兩筆投籃距離分別為 50, 26 但 shot_type 皆為 2PT Field Goal;
shot_id : 14513, 22905 這兩筆投籃距離分別為 9, 0 但 shot_type 皆為 3PT Field Goal。
接著將 shot_zone_range 與 shot_distance 對應, shot_zone_range 有以下幾種距離分類 : Less Than 8 ft, 8-16ft, 16-24ft, 24+ ft, Back Court Shot ,
但在資料中可以發現這幾種距離分類與 shot_distance 在 Interval Boundary 上面會有一些問題,例如 :
shot_distance 為 8, 會出現在 shot_zone_range 為 Less Than 8 ft(4), 8-16ft(564);
shot_distance 為 16, 會出現在 shot_zone_range 為 8-16ft(2), 16-24ft(1163);
shot_zone_range 為 24+ ft,但 shot_distance 為 22(161), 23(374), 24(1263)。
針對資料有些許品質問題的情形,例如 : 遺失值、異常值等,一般而言,會先了解資料形成的原因,才可以判斷下一步進行修改、補值或刪去等動作,
反之,若無法了解形成原因,若這些資料相對稀少,通常會採取較安全的作法,先將這些資料進行篩選、移出 Training Data,待後續了解原因後再對這些資料進行判斷。
那如果這些資料蠻多的呢? 那就需要更深入的將資料圖表化,進一步判斷這是不是一個資料品質問題,還是資料就是從這些分布所取得的。
在這邊我們雖然知道 shot_id : 5251, 9104 的 shot_type 應該是 3PT Field Goal, 而 shot_id : 14513, 22905 的 shot_type 應該是 2PT Field Goal,
但是這應該牽涉到記錄問題,我們並不知道是否記錄錯誤,並且這樣的資料數量相對於整個 Training Data 相對稀少 (4/25697),因此考慮移出 Training Data。
而 shot_zone_range 為一個區隔不同距離的變數,由資料上來看,shot_distance 為 8 應該是被放在 8-16ft. 裡,也就是 $ 8 \leq x < 16 $ 這樣的區間;
使用有些分析方法時,例如 : Classification and Regression Tree (CART) ,這類使用 Gini Index 作為估計不純度( Impurity )的方法,
會因為上述 shot_zone_range 的 Level 標示不一致,導致篩選重要性變數的機制會有些許問題,對整體模型造成影響。
但在本篇分析中,由於我們不確定資料異常原因,也不確定資料定義是否如預期,因此我會先標註這些具有異常資料的情形,於後續模型優化時再考慮修正。
|
(2-6) 各 shot_distance 的命中率 |
圖 (2-6) 顯示各 shot_distance 之下的命中率,可以發現 Kobe 的命中率隨著距離逐漸減低,
從圖中,依命中率可區分為五大群 (1) 0 ft. ~ 2 ft. (2) 3 ft. ~ 15 ft. (3) 16 ft. ~ 21 ft. (4) 22 ft. ~ 25 ft. (5) 25 ft. +
其中在 3 ft. ~ 15 ft. 之間,命中率雖會隨著距離的增加而下降,但有些距離的命中率卻是突然飆高的,例如 4 ft., 8 ft., 11 ft., 12ft. 等,
由投籃次數來看,超過 1000 次出手的距離有 16 ft. ~ 19 ft., 24 ft. ~ 26 ft.,顯示 Kobe 偏好在中長程距離出手。
|
(2-7) combine_shot_type 為 Jump Shot 之下,前 3 個 action_type 類別命中率與距離的比較。 |
由上述提到,combined_shot_type 為 Jump Shot 佔了總出手次數的 76.7%,而在此之下的前三個 action_type : Jump Shot, Turnaround Shot, Fadeaway Jump Shot 佔了這些出手次數近 90%,
因此,圖 (2-7) 顯示在各 shot_distance 下,這些 action_type 的命中率,值得注意的是,根據上述,出手命中率會隨著距離而降低,
但 Jump Shot 的命中率由 3 ft. 的 21% 開始,隨著距離增加逐漸攀升至 21 ft. 的 40% 才開始滑落至 22 ft. 的 35% 以下;
Turnaround Jump Shot 與 Fadeaway Jump Shot 大多數的出手集中在 3 ft. ~ 21ft.,皆有 50% 左右的命中率,在 8 ft. 也有超過 70% 的命中率。
投籃次數最多的落在 14 ft. ~ 16 ft. 之間,在 15 ft. 的 Fadeaway Jump Shot 有超過 60% 的命中率,
可以看出 Kobe 的 Jump Shot 在中長程距離的命中率並不太會隨著距離增加所影響,並且 Fadeaway 及 Turnaround 的動作對命中率有所提高。
|
(2-8-1) 各季出手次數與 shot_type 比率 |
|
(2-8-2) 各季 shot_type 命中率 |
圖 (2-8-1)、(2-8-2) 分別繪出對於每季的 shot_type 與命中率,比較有趣的有以下幾點:
- 2PT Field Goal 生涯出手比例約佔 75 % 左右,生涯晚期 2014-15, 2015-16 賽季 3PT Field Goal 出手比例較多。
- 生涯 2PT Field Goal 命中率差異不大,命中率約落在 45% - 50% 左右,不大會隨著出手次數多而明顯降低,但 2013-14 賽季後,明顯出手命中率降低至 41% 左右。
- 生涯 3PT Field Goal 命中率從 2010-11 降到約 30% 左右的命中率便逐漸維持這樣的命中率;但隨著 2015-16 賽季 3PT Field Goal 出手比例較多,但命中率僅 28.4% ,得分效率就會明顯與過去有落差。
對照 Kobe 的 維基百科:
https://zh.wikipedia.org/wiki/%E7%A7%91%E6%AF%94%C2%B7%E5%B8%83%E8%8E%B1%E6%81%A9%E7%89%B9
Kobe 在 2003 - 2005 期間經歷了個人與球隊的低潮,因此出手及出賽次數較低,但僅 2003-04 的 3PT Field Goal 命中率較低,為 30.5%。
在 2013-14 賽季阿基里斯腱受傷及 2014-15 受傷後,也反應在他的命中率上。
|
(2-9) 年份分群下,各節剩餘時間之命中率 |
由圖 (2-8-1)以及維基百科 ,將 Kobe 的生涯分成 5 群,分別為 : "1996 - 99", "1999 - 04", "2004 - 07", "2007 - 13", "2013 - 16",也就是新人時期、湖人 OK 三連霸與 F4 時期、 81 分時期、 Gasol & Howard 時期 、大傷至退休時期,以上 5 個時期進行比較。