7 探索式資料分析

7.1 什麼是探索式資料分析

探索式資料分析 (Exploratory Data Analysis) 的主要精神是運用視覺化、基本的統計等工具,反覆的探索資料特性,獲取資料所包含的資訊、結構和特點,因為在進行複雜或嚴謹的分析之前,必須要對資料有更多認識,才能訂定對的資料分析方向。

探索式資料分析包括分析各變數間的關聯性,看是否有預料之外的有趣發現,或是觀察資料內容是否符合預期,若否,檢查資料是否有誤,最後檢查資料是否符合分析前的假設,由上述可知,探索式資料分析通常不需要嚴謹的假設和細節呈現,主要功能還是『觀察』資料的特性。在資料量大/雜的時候,探索式資料分析就非常重要,因為透過探索式資料分析,分析人員可以在複雜的統計計算與耗時的模型建立前,就先發現可能的錯誤,更重要的是,可以透過探索性分析來調整分析的方向,減少因分析方向錯誤所造成的時間浪費。

探索式資料分析分為:

  • 圖形化Graphical 或 量化Quantitative
  • 單變量Univariate 或 雙變量Bivariate 或 多變量Multivariate

圖形化的分析方式包括做圖與列表,量化的分析方式則是資料初步統計,本章節著重於量化的分析方式,圖形化的分析方式請參考Ch 8

以單變量分析來說,量化的分析方式可包含

  • 計算集中趨勢 (維基百科)
    • 平均值 Mean mean()
    • 中位數 Median median()
    • 眾數 Mode,R無內建函數,可直接用table()找出現次數最多的資料
  • 計算資料分散程度
    • 最小值 Min min()
    • 最大值 Max max()
    • 範圍 Range range()
    • 四分位差 Quartiles quantile()
    • 變異數 Variance var()
    • 標準差 Standard deviation sd()

以雙變量分析來說,分析方式可包括:

  • 列聯表 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套件)

## [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,可能會造成數據判別錯誤,所以在計算新欄位時,可以在新欄位定義的前方加上欄位名稱=,同時替欄位取名字

##    GamesPlayedMean PersonalFoulsMean StealsMean
## 1:              55               105         41

除了計算平均值以外,當然可以帶入其他函式做各式各樣的運算

##    GamesPlayedMax ThreesMadeMin FieldGoalsMadeSD
## 1:             82             0              166

若配合第一個參數一起使用,可以計算出所有出場數大於70的球員,平均投進幾顆三分球與兩分球

##    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

.Ndata.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查看。

舉例來說,我們想要篩選欄位名稱為NameThreesMadeThreesAttemptedFieldGoalsMadeFieldGoalsAttempted的五個欄位,指令範例如下

##            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
##            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分鐘的球員資料,可用輸入下列指令

##   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”的球員資料

##   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,指令如下

##  [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分鐘的球員個數、平均投進的兩分球數以及平均投出的兩分球數

##   nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
## 1      40                512                    1121

上述分析序列(先篩選再總和),可直接用pipe符號%>%將指令串連,減少暫存物件(filter1)的生成,主要概念是先篩選後計算

##   nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
## 1      40                512                    1121

7.3.5 group_by()

group_by()函數的功能為設定分組依據,通常會與summarise()函式Ch 7.3.4合併使用,例如計算各(以Team作為分組依據)的球員數、平均投進的兩分球數以及平均投出的兩分球數

## `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作為分組依據)的球員數、平均投進的兩分球數以及平均投出的兩分球數

## `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作為分組依據)的球員數、平均投進的兩分球數以及平均投出的兩分球數,並依平均投進的兩分球數由大到小排序

## `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 參考文件與資源

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.