2016年7月12日 星期二

[SL] Perceptron

在 Feature Space 中,如果有一個 Hyperplane $H$ 使得 Data Set 在線性可分的前提下,能夠完全的正確分開;找出這個 Hyperplane 即為 Perceptron 的意義。
給一個二維 Data Set 的例子,假設有 2 個 Feature $ X = \{ X_{1},X_{2} \} $ 皆為一個 $ n \times 1 $ 的向量,而 $ Y = \{ y_{1},y_{2},...,y_{n} \}^{T} \in \{-1,+1\} $
也為一個 $ n \times\ 1 $ 的向量,其中 $Y$ 即為我們的 Response Variable,並且 Label 不是 $-1$ 就是 $+1$。

假設這個 Feature Space 中,有一條直線 $H$,可以將 Response 完美的分開,這條直線就是由 Feature Space 所生成的 Hyperplane,
所以,設定這個 Hyperplane 的法向量(係數/Feature 的權重) 為 $W = (w_{1},w_{2})$ 是一個 $ 2 \times 1 $ 的向量 ,若某一筆資料 $X_{i} = (x_{1i},x_{2i})$ 與 $W$ 的內積大於 0,
表示此筆資料與 Hyperplane 的法向量同側,藉由測試 $ H(x_{i}) = \beta_{0} + W \cdot X_{i} $ 為大於 0 或 小於等於 0,作為分類的依據。

所以,若 $ H(x_{i}) > 0 $ 時,假設代表 $x_{i}$ 這個點應該要被分到 $+1$,但若實際上,$y_{i}$ 卻是 $-1$,即分類錯誤的情況,此時 $ y_{i} \times H(x_{i}) \leq 0 $;
由於一開始的假設,在這個 Data Set 一定可以找到一個線性的 Hyperplane 可以完全的正確分類,因此碰到分類錯誤的情況,只要調整 Hyperplane 的法向量 $W$ 即可進行調整,
所以需要測試 $ y_{i} \times \beta_{0} + W \cdot X_{i} = y_{i} \times [ sign ( H(x_{i}) ) ]$,並將此作為 Loss Function 來幫助優化模型,
但因為使用了 sign 函數取值,不像傳統的 Mean Squared Loss Function 可以使用微積分進行處理,因此採用 Gradient Descent 來進行疊代調整 Hyperplane 的法向量。

而 Novikoff Theorem 表示,如果在 Feature Space 中,有一個 "線性的" Hyperplane 可以完全正確分開 Response Variable,
這樣 Perceptron 在 Training Data Set 所犯下的分類錯誤次數是有上限的,意即採 Gradient Descent 疊代調整的 Perceptron 的法向量最終會收斂。

假設我們有一組滿足上面假設的 Dataset $D = (x_1,y_1), (x_2,y_2), ... ,(x_n,y_n) ,\: x_i \in {\rm I\!R}^{p} ,\: y_i \in \{-1,+1\} $,Novikoff Theorem 中包含兩點 :

1. 令此 Hyperplane $H$ ,並滿足 $\|H\|=1$,且存在 $\gamma \geq 0$ ,對所有 $ i = 1,2,...,n $ 而言, $ y_{i}(W_{H} \cdot x_{i} + \beta_{H}) \geq \gamma $
2. 令 $ R = max \| x_i \|, \forall i $ , $k$ 為 Perceptron 在 Training Data Set 所犯下的分類錯誤次數,其滿足 : $ k \leq (\, \dfrac{R}{\gamma} )\,^{2} $

以 Weight Vector 尚未收斂的 Hyperplane $ W_{k-1} \cdot x +\beta_{k-1} $ 而言 (疊代到 k-1 次),若對某一個 $y_{i}$ 進行了錯誤分類 $\hat{y}_i$,代表 $y_{i} \times \hat{y}_{i} = y_{i}(W_{k-1} \cdot x_{i} + \beta_{k-1}) \leq 0 $,
所以我們可以了解,若疊代到收斂後,形成一個可完美分類的 Hyperplane, $ y_{i}( W_{H} \cdot x_{i} + \beta_{H} ) > 0 , \forall i$ , 至少一定會有一個極小值 $\gamma$,
滿足 $\gamma = min_{i} \, y_{i}( W_{H} \cdot x_{i} + \beta_{H} ) $,因此可以很直觀的看出 $ y_{i}( W_{H} \cdot x_{i} + \beta_{H} ) \geq \gamma $

第 2 點的證明可以參考 Andrew Ng 的 Lecture notes : http://cs229.stanford.edu/notes/cs229-notes6.pdf

需要注意的地方包括 :
(1) Perceptron 是使用分類錯誤來進行驅動(疊代)的演算法。
(2) $ x \cdot y \leq \|x\| \|y\| $
(3) $ \| W_{H} \| = 1 $ (這點很重要,我想了半小時才突然發現有這條件 XD)

暫時貼上自己寫的陽春版 Perceptron Demo :
(1-1) 使用 Perceptron 對 iris 部份資料集進行分類

2016年6月10日 星期五

[Kaggle] Kobe Bryant Shot Selection - (2) k-NN Classification

星期三 (6/8) 的時候突然發現 Kaggle 的 Kobe Bryant Shot Selection 這項競賽就要到期了!
但因為即將要放端午連假沒空作 ,想說至少要在結束前放個分數上去吧 XD
於是就把第一部份的 EDA 先暫停,先放一個成果出來看看如何先。

在先前談過,這是一個 Classification 的問題,我基本上一般會使用的基本演算法有以下幾種:
  1. Logistics Regression
  2. k-Nearest Neighbors Classification ( k-NN, 也可用於  Regression 問題 )
  3. Classification and Regression Trees ( CART ), ID3, C4.5 等 Tree Based 方法
  4. Naive Bayes Classification
  5. Perceptron / SVM 
這些方法分別站在不一樣的角度去進行資料的分類,當然還有更多不同的演算法,各有優缺點及好壞,根據本篇主題先不提演算法之間的比較,專注在本篇主題,使用 k-NN 對資料進行分類。

k-NN 透過計算 Test Data 與 Training Data 之間的 Euclidean Distance ( 或其他距離 Measure ) ,來找出某一筆 Test Data 對照與其最像的 k 筆 Training Data ,再看看這 k 筆 Training Data 之中,哪一個類別的次數最多,即被分到哪一類,是一種很民主的演算法。

由上述可以了解,k-NN 方法直觀、容易理解,計算簡單、並且只需要針對 k 這個參數進行優化。( 好啦,選擇 k-NN 的原因只是因為懶 XD )

當然,如果你的 Data 中是 Continuous Variable 與 Categorical Variable 混合的情況的話,那麼選擇一個適當的距離 Measure 就會是一個相當大的問題,給個例子:在第一部份有提到 action_type 這個變數,其中 Reverse Slam Dunk Shot 與 Fadeaway Jump Shot 的 Euclidean Distance 距離應該要是多少? 在無法計算現實距離又帶點抽象的情形下,是無法進行後續 k-NN 分類的,所以必須要使用某一種 Measure 來對這些 Categorical Variable 進行 Mapping ,並且要是對於這些 Categorical Variable 標準一致的 Measure ,才不會發生貓咪跟蜜蜂比較接近,跟小狗距離比較遠的奇怪現象 XDD

另外,針對 k 的選擇會對 k-NN 的結果產生重大的影響,k 的大小會與 Bias - Variance Trade-off 有直接的關係;假設你正坐在學測的會場中,會場中大家的實力都參差不齊,但是你知道坐你附近的人都與你實力差不多 ( $x$ ),如果你突然遇到一個不會的四選一選擇題 ( $y$ ),想要參考坐你附近的答案,會發生以下幾個狀況  :
  1. 你決定只參考坐你左邊的人 ( $k=1$ ) ,於是你的答案就會跟他一樣。
  2. 你決定參考坐你前後左右四周的人 ( $k=8$ ) ,於是你的答案會是這 8 個人最多人寫的答案 ( 正常人應該不會選最少人寫的吧XD )
  3. 你決定參考整間教室的答案,於是你的答案會是整間教室最多人寫的答案。
想想看,如果今天有 10 個人決定一起學你,他們的情況也跟你一樣,坐他們附近的實力都差不多,並且你選了多少人,他們就選了多少人 ( $k$ 值一樣 )。

  1. 我們都選擇了 "左邊這個人認為這題這樣寫,風險比較低" 的作法,也就是坐在這 10 個人左邊的人,他們判斷應該是正確的答案,會造成 Training Error 低,但是 Test Error 不一定低的情況,也就是實際上這題,根據左邊這個人所判斷出的答案,他們自己覺得是正確的 ( Training Error 低 ) ,但實際上不一定會對 ( Test Error 有可能高 ),並且因為這 10 個人參考的不一定會是同一個人的答案,造成 Model 複雜程度比較高,導致 Overfitting 的情況;另外,如果今天參考到一個實力差不多,但是想法很奇怪,別人都寫 1 ,他寫 4 的答案 ( Outlier ) ,或是根本來鬧的 ( 寫 5 ),這樣的情況都會因為 k 值太小躲不開這些情形,因此若選的 k 值太小,很容易會被 Noise 所影響,導致分類效果不彰。
  2. 參考四周人的想法很好,可以想見的是,這 10 個與你遇到相同情況的人,會根據附近人的投票來決定自己寫的答案,但有可能出現:
    (1)  " A 這個人,附近寫 1 的有 5 票,寫 2 的有 3 票,所以 A 寫了 1 這個答案 "
    (2)  " B 這個人,附近寫 1 的有 3 票,寫 2 的有 5 票,所以 B 寫了 2 這個答案 "
    這反映出藉由投票,提升了分類的正確率 ( Bias 降低 ) ,但也因為投票,使得分類的出象變多了 ( Variance 增加 ),像上述例子,票數距離很接近,是一個很難分類的情況,使得 Variance  增加;因此,根據你選擇要看附近多少人 ( $k$ ) 的答案,來決定影響降低 Bias 與增加 Variance 的量。相對於只選擇左邊這個人 ( $k=1$ ),選擇多個人降低了模型複雜度,減少了 Model Overfitting 的情況,但是如果增加了參考人數 $k$ ,有可能會因為參考的人越來越多了,導致參考到實力比較差的同學的答案,或是你根本不清楚哪些答案是實力好的同學寫的,哪些是實力差的同學寫的,投票之後得到的答案就會一團混亂,使得分類的正確率下降,因此找到一個適當的參考人數 ( $k$ ) 來平衡 Bias 與 Variance 是有必要的。最後一個小提醒,一般而言,會選擇 " $k$ 為單數 ",如 1,3,5,7,... ,這樣才比較好投票XD
  3. 參考所有人的答案作投票,會發現這 10 個人都跟你寫了一樣的答案,也就是說,就得看這間教室正確答題的人比較多還是錯誤答題的人比較多,答題完全是一翻兩瞪眼的狀態XD這樣的模型太過於簡單,會因為忽略正確答題的人(或說是 Training Data 的有用訊息),導致正確率過於極端,因此通常不會選擇使用這種方法進行投票。
在 k-NN  的問題中大致還有以下幾點 :
  1. 若 Training Data 中的類別不是太均勻,是很不平衡的數量差距,例如:抽樣 2000 筆 Training Data 中,有 1995 筆的類別為 "1" ,有 5 筆的類別為 "2",顯而易見的,丟一筆 Test Data 進 Model 裡面,被分到類別 "1" 的機率要比分到類別 "2" 的機率大的多,原因是因為,即使這筆 Test Data 實際上的類別是 "2",取 $k$ 為 15 ,在 Training Data 與他最近的 5 筆類別為 "2" 的資料都參考到了,但因為剩下 10 筆都是類別 "1",因此多數決投票中,這筆 Test Data 只能被分到類別 "1",這問題的原因是 (1) 抽樣 Training Data 不平均 (2) 選擇 $k$ 值的問題,但是處理 $k$ 值不是一個根本的解決之道,解決方式還是要盡量的讓 Training Data 中的每個類別盡量均勻,或是不要產生太過極端的狀況。
  2. 計算量大;由於需要計算每一筆 Test Data 與 每一筆 Training Data 之間的距離,所以計算上非常耗時。目前較常見使用 kd-tree 來解決這個問題,但還是需要載入整棵 kd-tree,所以在記憶體用量與計算速度上也是一個常見的問題。
  3. 使用多數決的方法真的是可靠的嗎? 距離此 Test Data 較遠的 Training Data 與距離較近的 Training Data 應該是要一票換一票嗎? 還是應該要 0.8 : 1 ? 或是直接利用他們的距離作為票數的權重 ? ( Distance-Weighted k-NN )
以上都是使用 k-NN 時必須注意的一些問題,但不失為一個好用、直覺並使用非常廣泛的分類演算法,並且常拿來與其他分類演算法進行比較;進一步進入本篇主題:使用 k-NN 進行 shot_made_flag 的分類預測。

由於尚未作變數篩選,我們先以上述探索性資料分析與常理推斷,在這裡先選擇了 lat, lon, shot_distance, period, remain_sec 作為基本分類的變數。

在這裡使用 7-fold Cross Validation ,來幫助我們選擇分類的參考數 $k$ 值,因為是一個 Binary 的分類,所以 $k$ 的選擇不太適合用偶數,$k$ 設定從 3 ~ 45 的奇數,每個 $k$ 值重複 10 次的 Cross Validation。為什麼不是用常見的 5, 10-fold, Leave-one-out? 因為 Training Data 剛好可以被 7 整除,而且實際上,我只是想看這樣的條件下, k-NN 針對這筆資料的 Performace 大概會在哪裡,所以就先不作 K-fold 的最佳化,而是先以最佳化分類參考數 $k$ 為主。


(3-1) 以 7-fold cross validation 在各 k 值 下的分類錯誤率
由圖 (3-1) 來看,隨著 $k$ 的增加,錯誤率逐漸降低,到 $k = 25$ 開始趨於平緩,並且 $k = 27$ 錯誤率有些微上升的傾向,故在此選擇 $ k = 25 $ 作為 k-NN 之參數。
平均而言,選擇 $ k = 25 $ ,分類錯誤率平均約 41.11% 左右, Logarithmic Loss 約為 14.20797 ,雖效果不是很好,但以簡單的模型而言算是可以接受的成果。

選擇好 $k$ 值後,利用模型將分類結果產出,丟上 Kaggle 跑跑看分數。



Logarithmic Loss 為 14.29226 是一個倒數的成績XD 我們可以來看看怎樣接著提升 k-NN 的效果。

2016年5月26日 星期四

[SL] Natural Cubic Splines

碰到需要作預測、分類等分析時,在沒什麼限制的狀況下,通常會先考慮一個簡單並且容易解釋分析結果的方法,
再去依照分析結果與探索性資料分析的結果,互相比對進行優化,所以像 Linear Regression, Logistic Regression 這類線性加法模型,算是最常用的分析方法。

由於使用 $X$ 的線性組合表達方式,使得解釋起來較為清楚易懂;同時在變數數量很多,資料數量偏少 (n小p大) 的情況,
這類模型往往比較容易能夠避開 Overfitting 的情況(或採用 Penalization, Stepwise Selection等方式)。

但有時候現實資料中,$Y$ 與 $X$ 常常不是一個線性的關係,基本上在散佈圖中可以大概看出 $Y$ 跟 $X$ 之間是否具有非線性的關係,
配適線性模型後,根據殘差判斷是否需要加入其他項次,一個個加入 $X$ 的多項式項與交互作用項,最後反覆根據殘差進行相對應的調整。

也因為上述,若要一個個調整,放入 $X$ 的多項式項會是很頭大的一件事情,所以發展出能夠自動配適非線性關係的 Generalized Additive Models (GAM) 。

GAM 簡單的說,就是把每一個 $X$ 先表示成一個不預先定義的平滑函數線性組合,假設真實模型為 $ Y=X^{2} $ ,若令一函數 $g(X)=X^{2}$ ,真實模型可寫成 $Y=g(X)$,
但現實中,我們不知道 $g(X)$ 的真實函數表達式為 $X^{2}$,因此我們使用近似函數 $\hat{g}(X)$ 來替代 $X^{2}$,$\hat{g}(X)$ 這個函數我們利用多項式的 Basis 與 $X$ 進行線性組合來近似,
並且這個近似的函數會保有連續、平滑、可二次微分等良好的性質。

本篇主題 Natural Cubic Splines 即是一個近似的方法,當然還有其他像 B-Spline 等各有優缺點的近似方法,待後續再作討論。


$$ N_{1}(X)=1, N_{2}(X)=X, N_{k+2} (X)=d_{k} (X) - d_{K-1} (X) $$
$$ d_{k}(X)=\frac{(X-\xi_{k})^{3}_{+}-(X-\xi_{K})^{3}_{+}}{\xi_{K}-\xi_{k}}$$
Natural Cubic Spline for Sepal.Width (y) ~ Sepal.Length (x)


2016年5月24日 星期二

[Kaggle] Kobe Bryant Shot Selection - (1) 探索性資料分析

這次選擇的 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) 資料整理


大概了解資料後,就可以先把資料載入:
先對資料進行以下的整理:
  1. Kobe 只待過 Lakers ,所以可以把 team_id, team_name 變數忽略掉。
  2. 由於 matchup 包含主/客場以及交手球隊,但 opponent 就有交手球隊,所以用一個 home_type 變數把 matchup 主 (1)、客 (2) 場的狀態標示出來就好。
  3. 球場座標標示有兩種 lat, lon 與 loc_x, loc_y ,兩種似乎是差不多的意思,在這裡選擇精度看起來較高的 lat, lon。
  4. 資料內分別有 minutes_remaining, seconds_remaining 與其對應的節數( periods ),用一個 remain_sec 變數將這兩個變數合併成:這節剩下幾秒。
  5. 把 game_date 改成 Date 格式物件,方便查詢。
  6. 最後把 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 與命中率,比較有趣的有以下幾點:

  1. 2PT Field Goal 生涯出手比例約佔 75 % 左右,生涯晚期 2014-15, 2015-16 賽季 3PT Field Goal 出手比例較多。
  2. 生涯 2PT Field Goal 命中率差異不大,命中率約落在 45% - 50% 左右,不大會隨著出手次數多而明顯降低,但 2013-14 賽季後,明顯出手命中率降低至 41% 左右。
  3. 生涯 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 個時期進行比較。