7 探索式資料分析
7.1 什麼是探索式資料分析
探索式資料分析 (Exploratory Data Analysis) 的主要精神是運用視覺化、基本的統計等工具,反覆的探索資料特性,獲取資料所包含的資訊、結構和特點,因為在進行複雜或嚴謹的分析之前,必須要對資料有更多認識,才能訂定對的資料分析方向。
探索式資料分析包括分析各變數間的關聯性,看是否有預料之外的有趣發現,或是觀察資料內容是否符合預期,若否,檢查資料是否有誤,最後檢查資料是否符合分析前的假設,由上述可知,探索式資料分析通常不需要嚴謹的假設和細節呈現,主要功能還是『觀察』資料的特性。在資料量大/雜的時候,探索式資料分析就非常重要,因為透過探索式資料分析,分析人員可以在複雜的統計計算與耗時的模型建立前,就先發現可能的錯誤,更重要的是,可以透過探索性分析來調整分析的方向,減少因分析方向錯誤所造成的時間浪費。
探索式資料分析分為:
- 圖形化Graphical 或 量化Quantitative
- 單變量Univariate 或 雙變量Bivariate 或 多變量Multivariate
圖形化的分析方式包括做圖與列表,量化的分析方式則是資料初步統計,本章節著重於量化的分析方式,圖形化的分析方式請參考Ch 8。
以單變量分析來說,量化的分析方式可包含
- 計算集中趨勢 (維基百科)
- 平均值 Mean
mean()
- 中位數 Median
median()
- 眾數 Mode,R無內建函數,可直接用
table()
找出現次數最多的資料
- 平均值 Mean
- 計算資料分散程度
- 最小值 Min
min()
- 最大值 Max
max()
- 範圍 Range
range()
- 四分位差 Quartiles
quantile()
- 變異數 Variance
var()
- 標準差 Standard deviation
sd()
- 最小值 Min
以雙變量分析來說,分析方式可包括:
- 列聯表 Crosstabs
table()
,ftable()
,prop.table()
- 共變數 Covariance
cov()
- 相關性 Correlation
cor()
量化分析方式的測量值大多可用R的內建函數完成計算,但是在探索式分析時,常常需要遇到資料分組的分析情形(如觀察男性和女性的血壓差異、A隊與B隊的三分球命中率差異、中鋒和後衛的助攻次數…等),若只用基本的內建函數計算,需要先完成資料分組或子集後,再作進一步的運算,相當耗時,為了使這類資料分組與分析的工作更容易被完成,本書在介紹探索式資料分析時會搭配介紹data.table
(Dowle and Srinivasan 2019)和dplyr
(Wickham, Francois, et al. 2020) packages,這兩個packages各有優點,可依自己喜好選用。
7.2 data.table
data.table是data.frame資料框型別的延伸,如要使用必須安裝並載入data.table(Dowle and Srinivasan 2019) package
使用data.table
讀取大型資料的速度比使用資料框快上數倍,效能比較可參考Benchmarks : Grouping,讀取資料的函數為fread()
,使用方法與一般檔案讀取方法(Ch ??)類似
如果已經使用其他資料來源將檔案讀成資料框data.frame格式,可以使用data.table()
函數將data.frame轉為data.table格式,以先前介紹過的NBA資料為例(Ch 6.10,需安裝與載入SportsAnalytics
套件)
library(SportsAnalytics)
library(data.table)
NBA1516<-fetch_NBAPlayerStatistics("15-16")
NBA1516DT<-data.table(NBA1516)
class(NBA1516DT)
## [1] "data.table" "data.frame"
可以發現轉換後的NBA1516DT
資料型態為data.table
以及data.frame
,這是因為data.table是data.frame資料框型別的延伸,所以是data.table型態的資料,就一定會是data.frame型態。
data.table
資料型態的特殊結構和語法設計,便於後續資料分析處理,基本語法結構如下:
DT[i
,j
,by
=]
i
觀察值 (Row) 篩選邏輯j
所需欄位 (Column)by
分組依據
各參數間需要以逗號,
區隔,但若只需使用前方參數,後方的,
可省略,如只需使用i和j兩個參數,可以寫成DT[i,j]。
各參數的使用方法分述如下:
7.2.1 i 觀察值篩選邏輯
第一個參數i
是用來篩選觀察值,也就是針對列(Row)做子集。篩選方式與Ch 6.4雷同,可透過布林值的向量或是元素索引(index)向量指定篩選條件,透過觀察值的篩選,可保留需要的資料,進行後續分析。
以前述NBA球員資料為例,如需擷取球員姓名包含James字串的資料,可使用下列指令:
League | Name | Team | Position | GamesPlayed | TotalMinutesPlayed | FieldGoalsMade | FieldGoalsAttempted | ThreesMade | ThreesAttempted | FreeThrowsMade | FreeThrowsAttempted | OffensiveRebounds | TotalRebounds | Assists | Steals | Turnovers | Blocks | PersonalFouls | Disqualifications | TotalPoints | Technicals | Ejections | FlagrantFouls | GamesStarted |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
NBA | James Anderson | SAC | SG | 51 | 721 | 67 | 178 | 23 | 86 | 22 | 29 | 13 | 86 | 41 | 21 | 42 | 14 | 54 | 0 | 179 | 0 | 0 | 0 | 15 |
NBA | James Ennis | NOR | SF | 22 | 329 | 54 | 113 | 26 | 58 | 25 | 34 | 21 | 42 | 21 | 16 | 19 | 5 | 28 | 1 | 159 | 0 | 0 | 0 | 5 |
NBA | James Harden | HOU | SG | 82 | 3121 | 710 | 1617 | 236 | 656 | 720 | 837 | 63 | 502 | 612 | 138 | 374 | 51 | 229 | 1 | 2376 | 2 | 0 | 0 | 82 |
NBA | Lebron James | CLE | SF | 76 | 2710 | 737 | 1416 | 87 | 282 | 359 | 491 | 111 | 565 | 512 | 104 | 249 | 49 | 143 | 0 | 1920 | 3 | 0 | 0 | 76 |
NBA | James Johnson | TOR | PF | 57 | 924 | 114 | 240 | 20 | 66 | 39 | 68 | 28 | 126 | 67 | 29 | 54 | 33 | 84 | 0 | 287 | 0 | 0 | 0 | 32 |
NBA | James Jones | CLE | SG | 48 | 466 | 59 | 143 | 41 | 104 | 21 | 26 | 8 | 50 | 14 | 11 | 13 | 10 | 50 | 0 | 180 | 1 | 0 | 0 | 0 |
NBA | James Mcadoo | GSW | SG | 41 | 265 | 45 | 84 | 1 | 2 | 26 | 49 | 30 | 58 | 17 | 10 | 16 | 8 | 39 | 0 | 117 | 0 | 0 | 0 | 1 |
NBA | James Young | BOS | SG | 29 | 200 | 11 | 36 | 6 | 26 | 1 | 4 | 4 | 26 | 9 | 6 | 5 | 1 | 17 | 0 | 29 | 0 | 0 | 0 | 0 |
如需篩選所有中鋒,且姓名包含“A”字串的球員資料,可使用下列指令:
League | Name | Team | Position | GamesPlayed | TotalMinutesPlayed | FieldGoalsMade | FieldGoalsAttempted | ThreesMade | ThreesAttempted | FreeThrowsMade | FreeThrowsAttempted | OffensiveRebounds | TotalRebounds | Assists | Steals | Turnovers | Blocks | PersonalFouls | Disqualifications | TotalPoints | Technicals | Ejections | FlagrantFouls | GamesStarted |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
NBA | Steven Adams | OKL | C | 80 | 2019 | 261 | 426 | 0 | 0 | 114 | 196 | 218 | 531 | 61 | 42 | 84 | 89 | 223 | 2 | 636 | 2 | 0 | 0 | 80 |
NBA | Alexis Ajinca | NOR | C | 59 | 863 | 150 | 314 | 0 | 1 | 52 | 62 | 75 | 269 | 32 | 19 | 54 | 36 | 134 | 0 | 352 | 2 | 0 | 0 | 17 |
NBA | Cole Aldrich | LAC | C | 60 | 802 | 134 | 225 | 0 | 0 | 60 | 84 | 86 | 288 | 50 | 47 | 64 | 68 | 139 | 1 | 328 | 0 | 0 | 0 | 5 |
NBA | Joel Anthony | DET | C | 19 | 95 | 6 | 10 | 0 | 0 | 6 | 8 | 8 | 21 | 1 | 2 | 2 | 12 | 15 | 0 | 18 | 0 | 0 | 0 | 0 |
NBA | Omer Asik | NOR | C | 68 | 1181 | 104 | 196 | 0 | 0 | 61 | 112 | 119 | 413 | 26 | 21 | 60 | 23 | 124 | 0 | 269 | 0 | 0 | 0 | 64 |
NBA | Andrea Bargnani | BRO | C | 46 | 634 | 127 | 278 | 3 | 15 | 47 | 57 | 28 | 97 | 18 | 4 | 26 | 9 | 61 | 0 | 304 | 0 | 0 | 0 | 0 |
NBA | Andrew Bogut | GSW | C | 70 | 1452 | 175 | 279 | 1 | 1 | 24 | 50 | 121 | 491 | 162 | 32 | 83 | 113 | 221 | 4 | 375 | 0 | 0 | 0 | 66 |
NBA | Andre Drummond | DET | C | 81 | 2664 | 552 | 1061 | 2 | 6 | 208 | 586 | 395 | 1198 | 67 | 119 | 154 | 112 | 245 | 2 | 1314 | 7 | 0 | 0 | 81 |
NBA | Al Jefferson | CHA | C | 47 | 1096 | 245 | 505 | 0 | 0 | 72 | 111 | 57 | 301 | 70 | 30 | 34 | 41 | 117 | 1 | 562 | 0 | 0 | 0 | 18 |
NBA | Alex Len | PHO | C | 78 | 1820 | 264 | 623 | 1 | 7 | 174 | 239 | 178 | 594 | 97 | 38 | 145 | 62 | 230 | 3 | 703 | 1 | 0 | 0 | 46 |
NBA | Anderson Varejao | GSW | C | 53 | 494 | 53 | 124 | 0 | 1 | 32 | 50 | 37 | 141 | 35 | 16 | 22 | 10 | 70 | 0 | 138 | 1 | 0 | 0 | 0 |
NBA | Alan Williams | PHO | C | 10 | 67 | 10 | 24 | 0 | 0 | 9 | 14 | 14 | 38 | 5 | 4 | 6 | 5 | 15 | 0 | 29 | 0 | 0 | 0 | 0 |
如需篩選各隊出場數超過80場的球員資料,可使用下列指令:
League | Name | Team | Position | GamesPlayed | TotalMinutesPlayed | FieldGoalsMade | FieldGoalsAttempted | ThreesMade | ThreesAttempted | FreeThrowsMade | FreeThrowsAttempted | OffensiveRebounds | TotalRebounds | Assists | Steals | Turnovers | Blocks | PersonalFouls | Disqualifications | TotalPoints | Technicals | Ejections | FlagrantFouls | GamesStarted |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
NBA | Al-farouq Aminu | POR | SF | 82 | 2342 | 299 | 719 | 126 | 349 | 115 | 156 | 98 | 498 | 138 | 72 | 120 | 53 | 171 | 0 | 839 | 3 | 0 | 0 | 82 |
NBA | Trevor Ariza | HOU | SF | 81 | 2860 | 357 | 858 | 185 | 497 | 126 | 161 | 67 | 366 | 188 | 161 | 113 | 26 | 177 | 0 | 1025 | 2 | 0 | 0 | 81 |
NBA | Will Barton | DEN | SG | 82 | 2355 | 426 | 984 | 112 | 324 | 216 | 268 | 60 | 477 | 204 | 71 | 139 | 39 | 147 | 0 | 1180 | 2 | 0 | 0 | 1 |
NBA | Aron Baynes | DET | PF | 81 | 1241 | 194 | 384 | 0 | 2 | 126 | 165 | 140 | 384 | 51 | 21 | 67 | 52 | 151 | 0 | 514 | 0 | 0 | 0 | 1 |
NBA | Bismack Biyombo | TOR | PF | 82 | 1810 | 156 | 288 | 0 | 1 | 142 | 226 | 182 | 655 | 29 | 19 | 71 | 133 | 225 | 2 | 454 | 3 | 0 | 0 | 22 |
NBA | Corey Brewer | HOU | SG | 82 | 1670 | 212 | 552 | 61 | 225 | 105 | 140 | 42 | 199 | 109 | 84 | 78 | 19 | 168 | 1 | 590 | 0 | 0 | 0 | 12 |
NBA | Allen Crabbe | POR | SF | 81 | 2111 | 312 | 678 | 112 | 284 | 98 | 113 | 27 | 216 | 99 | 63 | 64 | 16 | 192 | 2 | 834 | 0 | 0 | 0 | 8 |
NBA | Ed Davis | POR | PF | 81 | 1684 | 206 | 337 | 0 | 0 | 114 | 204 | 224 | 599 | 88 | 57 | 64 | 72 | 202 | 2 | 526 | 2 | 0 | 0 | 0 |
NBA | Gorgui Dieng | MIN | C | 82 | 2222 | 308 | 578 | 6 | 20 | 205 | 248 | 156 | 584 | 143 | 94 | 140 | 96 | 219 | 0 | 827 | 1 | 0 | 0 | 39 |
NBA | Andre Drummond | DET | C | 81 | 2664 | 552 | 1061 | 2 | 6 | 208 | 586 | 395 | 1198 | 67 | 119 | 154 | 112 | 245 | 2 | 1314 | 7 | 0 | 0 | 81 |
NBA | Jared Dudley | WAS | SG | 81 | 2098 | 233 | 487 | 100 | 239 | 72 | 98 | 54 | 286 | 170 | 75 | 80 | 18 | 190 | 1 | 638 | 1 | 0 | 0 | 41 |
NBA | Monta Ellis | IND | PG | 81 | 2733 | 436 | 1021 | 87 | 281 | 162 | 206 | 42 | 272 | 382 | 149 | 203 | 38 | 174 | 0 | 1121 | 1 | 0 | 0 | 81 |
NBA | Randy Foye | OKC | SG | 81 | 1640 | 168 | 481 | 75 | 250 | 61 | 74 | 24 | 156 | 160 | 39 | 86 | 29 | 131 | 0 | 472 | 0 | 0 | 0 | 8 |
NBA | Langsto Galloway | NYK | PG | 82 | 2032 | 231 | 588 | 77 | 224 | 86 | 114 | 43 | 288 | 207 | 77 | 61 | 22 | 177 | 2 | 625 | 0 | 0 | 0 | 7 |
NBA | Paul George | IND | SF | 81 | 2828 | 605 | 1448 | 210 | 565 | 454 | 528 | 79 | 563 | 329 | 152 | 265 | 29 | 230 | 1 | 1874 | 6 | 0 | 0 | 81 |
NBA | Draymond Green | GSW | SF | 81 | 2807 | 401 | 819 | 100 | 258 | 229 | 329 | 130 | 765 | 597 | 118 | 259 | 111 | 240 | 2 | 1131 | 11 | 0 | 0 | 81 |
NBA | James Harden | HOU | SG | 82 | 3121 | 710 | 1617 | 236 | 656 | 720 | 837 | 63 | 502 | 612 | 138 | 374 | 51 | 229 | 1 | 2376 | 2 | 0 | 0 | 82 |
NBA | Roy Hibbert | LAL | C | 81 | 1881 | 182 | 411 | 0 | 2 | 117 | 145 | 131 | 398 | 95 | 32 | 76 | 110 | 252 | 3 | 481 | 2 | 0 | 0 | 81 |
NBA | Al Horford | ATL | PF | 82 | 2638 | 529 | 1049 | 88 | 257 | 103 | 129 | 148 | 597 | 263 | 67 | 107 | 122 | 163 | 0 | 1249 | 1 | 0 | 0 | 82 |
NBA | Joe Ingles | UTA | SF | 81 | 1241 | 124 | 291 | 81 | 210 | 13 | 18 | 19 | 151 | 96 | 55 | 65 | 4 | 98 | 0 | 342 | 1 | 0 | 0 | 2 |
NBA | Joe Johnson | MIA | SF | 81 | 2703 | 377 | 859 | 120 | 313 | 118 | 142 | 49 | 292 | 318 | 61 | 160 | 4 | 146 | 0 | 992 | 1 | 0 | 0 | 81 |
NBA | Frank Kaminsky | CHA | PF | 81 | 1713 | 215 | 525 | 68 | 202 | 108 | 148 | 69 | 336 | 97 | 37 | 58 | 43 | 126 | 0 | 606 | 0 | 0 | 0 | 3 |
NBA | Enes Kanter | OKL | C | 82 | 1721 | 415 | 720 | 10 | 21 | 200 | 251 | 250 | 665 | 33 | 26 | 115 | 33 | 166 | 1 | 1040 | 2 | 0 | 0 | 1 |
NBA | Zach Lavine | MIN | PG | 82 | 2295 | 433 | 960 | 123 | 316 | 161 | 203 | 28 | 229 | 252 | 69 | 155 | 17 | 193 | 1 | 1150 | 0 | 0 | 0 | 33 |
NBA | Robin Lopez | NYK | C | 82 | 2213 | 357 | 662 | 0 | 1 | 128 | 161 | 268 | 602 | 114 | 16 | 133 | 129 | 182 | 2 | 842 | 3 | 0 | 0 | 82 |
NBA | T.j. Mcconnell | PHI | PG | 81 | 1609 | 218 | 464 | 31 | 89 | 26 | 41 | 43 | 250 | 367 | 95 | 140 | 10 | 114 | 0 | 493 | 0 | 0 | 0 | 17 |
NBA | Doug Mcdermott | CHI | SF | 81 | 1860 | 291 | 644 | 110 | 259 | 72 | 84 | 37 | 195 | 59 | 14 | 52 | 6 | 127 | 0 | 764 | 0 | 0 | 0 | 4 |
NBA | Patty Mills | SAN | PG | 81 | 1659 | 260 | 612 | 123 | 320 | 47 | 58 | 27 | 158 | 226 | 59 | 76 | 6 | 102 | 0 | 690 | 0 | 0 | 0 | 3 |
NBA | Paul Millsap | ATL | PF | 81 | 2640 | 501 | 1067 | 74 | 232 | 309 | 408 | 197 | 733 | 264 | 148 | 191 | 140 | 237 | 2 | 1385 | 4 | 0 | 0 | 81 |
NBA | Shabazz Muhammad | MIN | SF | 82 | 1678 | 317 | 681 | 44 | 152 | 185 | 242 | 100 | 267 | 52 | 24 | 70 | 7 | 94 | 0 | 863 | 0 | 0 | 0 | 0 |
NBA | Raul Neto | UTA | PG | 81 | 1501 | 180 | 418 | 64 | 162 | 52 | 70 | 17 | 120 | 173 | 62 | 109 | 2 | 122 | 1 | 476 | 0 | 0 | 0 | 53 |
NBA | Mason Plumlee | POR | PF | 82 | 2087 | 267 | 517 | 0 | 4 | 215 | 335 | 201 | 628 | 226 | 68 | 154 | 82 | 253 | 4 | 749 | 1 | 0 | 0 | 82 |
NBA | Julius Randle | LAL | PF | 81 | 2287 | 358 | 835 | 10 | 36 | 193 | 270 | 172 | 830 | 144 | 53 | 149 | 29 | 242 | 2 | 919 | 0 | 0 | 0 | 60 |
NBA | Ramon Sessions | WAS | PG | 82 | 1667 | 280 | 592 | 36 | 111 | 214 | 283 | 26 | 204 | 240 | 47 | 115 | 5 | 102 | 0 | 810 | 0 | 0 | 0 | 5 |
NBA | Jared Sullinger | BOS | PF | 81 | 1917 | 351 | 807 | 29 | 104 | 103 | 161 | 194 | 673 | 187 | 75 | 102 | 47 | 209 | 2 | 834 | 2 | 0 | 0 | 73 |
NBA | Isaiah Thomas | BOS | PG | 82 | 2647 | 591 | 1382 | 167 | 465 | 474 | 544 | 46 | 243 | 509 | 91 | 220 | 9 | 167 | 1 | 1823 | 9 | 0 | 0 | 79 |
NBA | Tristan Thompson | CLE | C | 82 | 2269 | 247 | 420 | 0 | 0 | 149 | 242 | 268 | 738 | 63 | 38 | 61 | 51 | 202 | 0 | 643 | 1 | 0 | 0 | 34 |
NBA | Karl-antho Towns | MIN | C | 82 | 2621 | 625 | 1152 | 30 | 88 | 223 | 275 | 226 | 854 | 161 | 58 | 183 | 138 | 245 | 1 | 1503 | 2 | 0 | 0 | 82 |
NBA | P.j. Tucker | PHO | SF | 82 | 2540 | 239 | 582 | 68 | 206 | 106 | 142 | 165 | 512 | 177 | 106 | 111 | 20 | 202 | 3 | 652 | 4 | 0 | 0 | 80 |
NBA | Evan Turner | BOS | SG | 81 | 2270 | 343 | 753 | 20 | 83 | 148 | 179 | 50 | 397 | 359 | 80 | 169 | 28 | 139 | 0 | 854 | 2 | 0 | 0 | 12 |
NBA | Kemba Walker | CHA | PG | 81 | 2885 | 568 | 1332 | 182 | 490 | 371 | 438 | 56 | 358 | 421 | 127 | 171 | 39 | 111 | 0 | 1689 | 5 | 0 | 0 | 81 |
NBA | Andrew Wiggins | MIN | SF | 81 | 2844 | 594 | 1294 | 57 | 190 | 430 | 565 | 107 | 294 | 164 | 78 | 182 | 46 | 165 | 1 | 1675 | 1 | 0 | 0 | 81 |
NBA | Marvin Williams | CHA | PF | 81 | 2339 | 338 | 747 | 152 | 379 | 120 | 144 | 127 | 520 | 110 | 58 | 62 | 77 | 133 | 1 | 948 | 0 | 0 | 0 | 81 |
7.2.2 j 欄位選擇運算
第二個參數j
是用來決定輸出欄位,輸出的欄位可以是原始欄位,也可以是計算後的欄位,以計算所有球員的平均出場數為例:
## [1] 55
也可以一次計算多個數值,如同時計算平均出場數、平均犯規次數以及平均抄截次數,此時第二個欄位j
需要使用.()
包起來
## V1 V2 V3
## 1: 55 105 41
由上述輸出可以發現輸出的數字自動被加上欄位名稱V1, V2, V3,可能會造成數據判別錯誤,所以在計算新欄位時,可以在新欄位定義的前方加上欄位名稱=
,同時替欄位取名字
NBA1516DT[,.(GamesPlayedMean=mean(GamesPlayed),
PersonalFoulsMean=mean(PersonalFouls),
StealsMean=mean(Steals))]
## GamesPlayedMean PersonalFoulsMean StealsMean
## 1: 55 105 41
除了計算平均值以外,當然可以帶入其他函式做各式各樣的運算
NBA1516DT[,.(GamesPlayedMax=max(GamesPlayed), #最大值
ThreesMadeMin=min(ThreesMade), #最小值
FieldGoalsMadeSD=sd(FieldGoalsMade))] #標準差
## GamesPlayedMax ThreesMadeMin FieldGoalsMadeSD
## 1: 82 0 166
若配合第一個參數一起使用,可以計算出所有出場數大於70的球員,平均投進幾顆三分球與兩分球
NBA1516DT[GamesPlayed>70,
.(ThreesMadeMean=mean(ThreesMade), FieldGoalsMadeMean=mean(FieldGoalsMade))]
## ThreesMadeMean FieldGoalsMadeMean
## 1: 76 335
7.2.3 by 分組依據
第三個參數by
為分組計算的依據,舉例來說,我們可以計算NBA各隊的球員數與平均助攻數,球員個數的計算在data.table
內可使用.N
指令,平均使用mean()
函數,此時只要在by=
後方加上分組依據(各隊Team),即可完成運算
## Team N AssistsMean
## 1: SAC 15 134
## 2: MEM 22 74
## 3: OKL 14 126
## 4: NYK 16 105
## 5: NOR 21 87
## 6: LAC 15 124
## 7: SAN 16 130
## 8: POR 15 116
## 9: IND 15 125
## 10: WAS 17 127
## 11: DAL 15 124
## 12: MIL 17 113
## 13: DET 15 105
## 14: ORL 15 128
## 15: HOU 16 101
## 16: LAL 15 99
## 17: DEN 15 122
## 18: CHI 15 121
## 19: GSW 15 158
## 20: BRO 16 100
## 21: CHA 14 118
## 22: ATL 15 142
## 23: TOR 16 97
## 24: MIN 14 129
## 25: PHO 17 97
## 26: UTA 17 94
## 27: MIA 15 131
## 28: BOS 15 128
## 29: PHI 16 118
## 30: CLE 16 117
## 31: OKC 1 160
## Team N AssistsMean
.N
在data.table
內是保留字,用來計算個數
三個參數結合使用,可以輕鬆計算出NBA各隊的中鋒球員數和他們的平均三分球出手次數,指令如下:
## Team N ThreesAttemptedMean
## 1: OKL 3 7.00
## 2: NOR 4 0.25
## 3: LAC 2 0.50
## 4: DET 2 3.00
## 5: BRO 3 10.00
## 6: LAL 3 0.67
## 7: WAS 2 1.00
## 8: GSW 4 16.00
## 9: SAN 3 34.67
## 10: HOU 2 3.50
## 11: SAC 3 70.67
## 12: PHO 3 2.67
## 13: ORL 2 4.50
## 14: MIN 3 36.00
## 15: MEM 2 1.50
## 16: UTA 3 1.33
## 17: IND 2 0.50
## 18: CHA 1 0.00
## 19: DEN 2 43.50
## 20: POR 2 116.00
## 21: CLE 3 2.33
## 22: NYK 1 1.00
## 23: DAL 3 1.67
## 24: MIL 2 0.50
## 25: CHI 1 1.00
## 26: PHI 2 4.00
## 27: TOR 3 6.00
## 28: BOS 2 105.00
## 29: ATL 1 0.00
## 30: MIA 1 0.00
## Team N ThreesAttemptedMean
7.2.4 參考文件與資源
data.table
還有很多好用的功能,有興趣的話可以參考下列資料
7.3 dplyr
dplyr
(Wickham, Francois, et al. 2020) package是Hadley Wickham開發的資料處理分析套件,如要使用必須安裝並載入dplyr
package
dplyr
使用以下函數分析整理資料:
select()
: 選要分析的欄位,欄位子集 (Column)filter()
: 選要分析的觀察值,觀察值子集 (Row)mutate()
: 增加新欄位summarise()
: 計算統計值group_by()
: 分組依據arrange()
: 觀察值排序rename()
: 欄位重新命名%>%
: the “pipe” operator 連結上數函式,將所有函式計算串在一起執行
以上述NBA資料為例,各函數功能分述如下: 首先先讀入資料
7.3.1 select()
使用select()
函式可選要分析的欄位,也就是針對欄位 (Column)做子集,函式使用方式為select(資料名稱,欄位條件1,欄位條件2,...)
,其中條件1與條件2是使用或的連結概念。另外dplyr
提供幾個方便篩選名稱的函式:
starts_with()
ends_with()
contains()
matches()
num_range()
one_of()
everything()
詳細說明可在R執行視窗中輸入?select_helpers
查看。
舉例來說,我們想要篩選欄位名稱為Name
、ThreesMade
、ThreesAttempted
、FieldGoalsMade
與FieldGoalsAttempted
的五個欄位,指令範例如下
##等同於
##NBA1516[,c("Name","ThreesMade","ThreesAttempted","FieldGoalsMade","FieldGoalsAttempted")]
select1<-select(NBA1516,Name,starts_with("Threes"),starts_with("FieldGoals"))
head(select1)
## Name ThreesMade ThreesAttempted FieldGoalsMade FieldGoalsAttempted
## 1 Quincy Acy 19 49 119 214
## 2 Jordan Adams 0 1 2 6
## 3 Steven Adams 0 0 261 426
## 4 Arron Afflalo 91 238 354 799
## 5 Alexis Ajinca 0 1 150 314
## 6 Cole Aldrich 0 0 134 225
若想篩選欄位Name
到欄位FreeThrowsAttempted
間的所有欄位,可用:
串連欄位名稱
## Name Team Position GamesPlayed TotalMinutesPlayed FieldGoalsMade
## 1 Quincy Acy SAC SF 59 877 119
## 2 Jordan Adams MEM SG 2 15 2
## 3 Steven Adams OKL C 80 2019 261
## 4 Arron Afflalo NYK SG 71 2359 354
## 5 Alexis Ajinca NOR C 59 863 150
## 6 Cole Aldrich LAC C 60 802 134
## FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1 214 19 49 50
## 2 6 0 1 3
## 3 426 0 0 114
## 4 799 91 238 110
## 5 314 0 1 52
## 6 225 0 0 60
## FreeThrowsAttempted
## 1 68
## 2 5
## 3 196
## 4 131
## 5 62
## 6 84
##等同於NBA1516[,c(2:4,6:12)]
select3<-select(NBA1516,Name:FreeThrowsAttempted,-GamesPlayed)
head(select3)
## Name Team Position TotalMinutesPlayed FieldGoalsMade
## 1 Quincy Acy SAC SF 877 119
## 2 Jordan Adams MEM SG 15 2
## 3 Steven Adams OKL C 2019 261
## 4 Arron Afflalo NYK SG 2359 354
## 5 Alexis Ajinca NOR C 863 150
## 6 Cole Aldrich LAC C 802 134
## FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1 214 19 49 50
## 2 6 0 1 3
## 3 426 0 0 114
## 4 799 91 238 110
## 5 314 0 1 52
## 6 225 0 0 60
## FreeThrowsAttempted
## 1 68
## 2 5
## 3 196
## 4 131
## 5 62
## 6 84
7.3.2 filter()
使用filter()
函式可選要分析的觀察值,也就是針對列 (Row)做子集,使用方法為filter(資料名稱,篩選條件)
,舉例來說,如果想要看出場分鐘數超過2850分鐘的球員資料,可用輸入下列指令
##等同於 NBA1516[NBA1516$TotalMinutesPlayed>2850,]
filter1<-filter(NBA1516,TotalMinutesPlayed>2850)
filter1
## League Name Team Position GamesPlayed TotalMinutesPlayed
## 1 NBA Trevor Ariza HOU SF 81 2860
## 2 NBA James Harden HOU SG 82 3121
## 3 NBA Gordon Hayward UTA SG 80 2889
## 4 NBA Kyle Lowry TOR PG 77 2853
## 5 NBA Khris Middleton MIL SF 79 2855
## 6 NBA Marcus Morris DET SF 80 2852
## 7 NBA Kemba Walker CHA PG 81 2885
## FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1 357 858 185 497 126
## 2 710 1617 236 656 720
## 3 521 1202 143 410 393
## 4 512 1198 212 546 398
## 5 507 1144 143 362 277
## 6 410 945 108 297 203
## 7 568 1332 182 490 371
## FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists Steals Turnovers
## 1 161 67 366 188 161 113
## 2 837 63 502 612 138 374
## 3 477 61 397 296 95 202
## 4 491 55 365 494 158 225
## 5 312 45 301 331 131 180
## 6 271 91 404 201 67 140
## 7 438 56 358 421 127 171
## Blocks PersonalFouls Disqualifications TotalPoints Technicals Ejections
## 1 26 177 0 1025 2 0
## 2 51 229 1 2376 2 0
## 3 27 183 0 1578 0 0
## 4 34 211 1 1634 9 0
## 5 19 204 1 1434 5 0
## 6 23 170 1 1131 11 0
## 7 39 111 0 1689 5 0
## FlagrantFouls GamesStarted
## 1 0 81
## 2 0 82
## 3 0 80
## 4 0 77
## 5 0 79
## 6 0 80
## 7 0 81
也可選擇隊伍名稱為“BOS”或“SAN”的球員資料
##等同於 NBA1516[NBA1516$Team %in% c("BOS","SAN"),]
filter2<-filter(NBA1516,Team %in% c("BOS","SAN"))
head(filter2)
## League Name Team Position GamesPlayed TotalMinutesPlayed
## 1 NBA Lamarcu Aldridge SAN PF 74 2260
## 2 NBA Kyle Anderson SAN SF 78 1247
## 3 NBA Matt Bonner SAN C 30 210
## 4 NBA Avery Bradley BOS PG 76 2536
## 5 NBA Rasual Butler SAN SF 46 432
## 6 NBA Coty Clarke BOS <NA> 4 8
## FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1 536 1045 0 16 259
## 2 138 296 12 37 62
## 3 29 58 15 35 3
## 4 456 1018 147 406 96
## 5 49 105 15 49 11
## 6 2 4 2 2 0
## FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists Steals Turnovers
## 1 302 175 631 110 38 99
## 2 83 25 245 123 60 59
## 3 4 3 27 9 6 3
## 4 123 48 220 158 117 109
## 5 16 3 56 24 13 8
## 6 0 0 1 0 0 1
## Blocks PersonalFouls Disqualifications TotalPoints Technicals Ejections
## 1 81 151 0 1331 0 0
## 2 29 97 0 350 0 0
## 3 1 16 0 76 0 0
## 4 19 164 2 1155 0 0
## 5 23 11 0 124 0 0
## 6 0 0 0 6 0 0
## FlagrantFouls GamesStarted
## 1 0 74
## 2 0 11
## 3 0 2
## 4 0 72
## 5 0 0
## 6 0 0
在filter()
函式中可直接做變數計算後再篩選
## League Name Team Position GamesPlayed TotalMinutesPlayed
## 1 NBA Th Antetokounmpo NYK SF 3 7
## 2 NBA Rakeem Christmas IND PF 1 6
## 3 NBA Deandre Jordan LAC C 77 2600
## FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1 3 4 0 1 0
## 2 2 2 0 0 0
## 3 357 507 0 1 266
## FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists Steals Turnovers
## 1 0 0 1 0 0 0
## 2 0 1 1 0 0 0
## 3 619 267 1059 90 52 107
## Blocks PersonalFouls Disqualifications TotalPoints Technicals Ejections
## 1 0 2 0 6 0 0
## 2 0 1 0 4 0 0
## 3 176 207 1 980 10 0
## FlagrantFouls GamesStarted
## 1 0 0
## 2 0 0
## 3 0 77
也可使用 &
和 |
等符號串連邏輯
## League Name Team Position GamesPlayed TotalMinutesPlayed
## 1 NBA Deandre Jordan LAC C 77 2600
## FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1 357 507 0 1 266
## FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists Steals Turnovers
## 1 619 267 1059 90 52 107
## Blocks PersonalFouls Disqualifications TotalPoints Technicals Ejections
## 1 176 207 1 980 10 0
## FlagrantFouls GamesStarted
## 1 0 77
7.3.3 mutate()
使用mutate()
增加新欄位,如需新增新欄位FieldGoalsRate
,欄位值為FieldGoalsMade/FieldGoalsAttempted
,指令如下
mutate1<-mutate(NBA1516,FieldGoalsRate=FieldGoalsMade/FieldGoalsAttempted)
mutate1$FieldGoalsRate[1:10]
## [1] 0.56 0.33 0.61 0.44 0.48 0.60 0.51 0.50 0.52 0.46
7.3.4 summarise()
summarise()
函式用來計算統計值,像是球員個數、不重複的隊伍數以及不重複的守備位置數等
## nPlayer nTeam nPosition
## 1 476 31 6
計算統計值的功能通常會與其他功能合併使用,像是與前述filter()
功能 Ch 7.3.2合併使用,可計算出場分鐘數大於2500分鐘的球員個數、平均投進的兩分球數以及平均投出的兩分球數
filter1<-filter(NBA1516,TotalMinutesPlayed>2500)
sum2<-summarise(filter1,
nPlayer=n(),
meanFieldGoalsMade=mean(FieldGoalsMade),
meanFieldGoalsAttempted=mean(FieldGoalsAttempted))
sum2
## nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
## 1 40 512 1121
上述分析序列(先篩選再總和),可直接用pipe符號%>%
將指令串連,減少暫存物件(filter1)的生成,主要概念是先篩選後計算
sum3<-filter(NBA1516,TotalMinutesPlayed>2500) %>%
summarise(nPlayer=n(),meanFieldGoalsMade=mean(FieldGoalsMade),
meanFieldGoalsAttempted=mean(FieldGoalsAttempted))
sum3
## nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
## 1 40 512 1121
7.3.5 group_by()
group_by()
函數的功能為設定分組依據,通常會與summarise()
函式Ch 7.3.4合併使用,例如計算各隊(以Team作為分組依據)的球員數、平均投進的兩分球數以及平均投出的兩分球數
group1<-group_by(NBA1516,Team)%>%
summarise(nPlayer=n(),meanFieldGoalsMade=mean(FieldGoalsMade),
meanFieldGoalsAttempted=mean(FieldGoalsAttempted))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 6 x 4
## Team nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
## <fct> <int> <dbl> <dbl>
## 1 ATL 15 215 471.
## 2 BOS 15 209. 475.
## 3 BRO 16 181. 396.
## 4 CHA 14 199. 451.
## 5 CHI 15 209. 475.
## 6 CLE 16 200. 433.
當然也可以設定多個分組依據,像是計算各隊各守備位置(以Team和Position作為分組依據)的球員數、平均投進的兩分球數以及平均投出的兩分球數
group2<-group_by(NBA1516,Team,Position)%>%
summarise(nPlayer=n(),meanFieldGoalsMade=mean(FieldGoalsMade),
meanFieldGoalsAttempted=mean(FieldGoalsAttempted))
## `summarise()` regrouping output by 'Team' (override with `.groups` argument)
## # A tibble: 6 x 5
## # Groups: Team [2]
## Team Position nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
## <fct> <fct> <int> <dbl> <dbl>
## 1 ATL C 1 11 19
## 2 ATL PF 6 247. 516.
## 3 ATL PG 2 382. 884
## 4 ATL SG 6 161. 364.
## 5 BOS C 2 196. 423
## 6 BOS PF 4 182. 386.
7.3.6 arrange()
排序功能,預設為遞增排序
## League Name Team Position GamesPlayed TotalMinutesPlayed
## 1 NBA J.j. O'brien UTA SF 1 2
## 2 NBA Rakeem Christmas IND PF 1 6
## 3 NBA Th Antetokounmpo NYK SF 3 7
## 4 NBA Sam Dekker HOU SF 3 7
## 5 NBA Coty Clarke BOS <NA> 4 8
## 6 NBA Jordan Adams MEM SG 2 15
## FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1 0 1 0 0 0
## 2 2 2 0 0 0
## 3 3 4 0 1 0
## 4 0 0 0 0 0
## 5 2 4 2 2 0
## 6 2 6 0 1 3
## FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists Steals Turnovers
## 1 0 0 0 0 0 0
## 2 0 1 1 0 0 0
## 3 0 0 1 0 0 0
## 4 0 0 1 0 1 0
## 5 0 0 1 0 0 1
## 6 5 0 2 3 3 2
## Blocks PersonalFouls Disqualifications TotalPoints Technicals Ejections
## 1 0 0 0 0 0 0
## 2 0 1 0 4 0 0
## 3 0 2 0 6 0 0
## 4 0 0 0 0 0 0
## 5 0 0 0 6 0 0
## 6 0 2 0 7 0 0
## FlagrantFouls GamesStarted
## 1 0 0
## 2 0 0
## 3 0 0
## 4 0 0
## 5 0 0
## 6 0 0
使用desc()
將要遞減排序的變數包起來,就可以遞減排序
## League Name Team Position GamesPlayed TotalMinutesPlayed
## 1 NBA James Harden HOU SG 82 3121
## 2 NBA Gordon Hayward UTA SG 80 2889
## 3 NBA Kemba Walker CHA PG 81 2885
## 4 NBA Trevor Ariza HOU SF 81 2860
## 5 NBA Khris Middleton MIL SF 79 2855
## 6 NBA Kyle Lowry TOR PG 77 2853
## FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1 710 1617 236 656 720
## 2 521 1202 143 410 393
## 3 568 1332 182 490 371
## 4 357 858 185 497 126
## 5 507 1144 143 362 277
## 6 512 1198 212 546 398
## FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists Steals Turnovers
## 1 837 63 502 612 138 374
## 2 477 61 397 296 95 202
## 3 438 56 358 421 127 171
## 4 161 67 366 188 161 113
## 5 312 45 301 331 131 180
## 6 491 55 365 494 158 225
## Blocks PersonalFouls Disqualifications TotalPoints Technicals Ejections
## 1 51 229 1 2376 2 0
## 2 27 183 0 1578 0 0
## 3 39 111 0 1689 5 0
## 4 26 177 0 1025 2 0
## 5 19 204 1 1434 5 0
## 6 34 211 1 1634 9 0
## FlagrantFouls GamesStarted
## 1 0 82
## 2 0 80
## 3 0 81
## 4 0 81
## 5 0 79
## 6 0 77
結合group_by()
、summarise()
、arrange()
,可完成一連串的資料分析,例如計算各隊各守備位置(以Team和Position作為分組依據)的球員數、平均投進的兩分球數以及平均投出的兩分球數,並依平均投進的兩分球數由大到小排序
arrange3<-group_by(NBA1516,Team,Position)%>%
summarise(nPlayer=n(),meanFieldGoalsMade=mean(FieldGoalsMade),
meanFieldGoalsAttempted=mean(FieldGoalsAttempted)) %>%
arrange(desc(meanFieldGoalsMade))
## `summarise()` regrouping output by 'Team' (override with `.groups` argument)
## # A tibble: 6 x 5
## # Groups: Team [6]
## Team Position nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
## <fct> <fct> <int> <dbl> <dbl>
## 1 GSW PG 2 504 988
## 2 CLE SF 2 440 864
## 3 ORL SG 1 425 969
## 4 MIA C 1 412 681
## 5 OKL PG 2 385 861
## 6 ATL PG 2 382. 884
7.3.7 rename()
新名稱=舊名稱
## League Name Team Po GamesPlayed
## 1 NBA Quincy Acy SAC SF 59
## 2 NBA Jordan Adams MEM SG 2
## 3 NBA Steven Adams OKL C 80
## 4 NBA Arron Afflalo NYK SG 71
## 5 NBA Alexis Ajinca NOR C 59
7.3.8 參考文件與資源
- Introduction to dplyr
- DataCamp互動式教學課程 Data Manipulation in R with dplyr
References
Dowle, Matt, and Arun Srinivasan. 2019. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.
Wickham, Hadley, Romain Francois, Lionel Henry, and Kirill Muller. 2020. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.