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 2016)dplyr(Wickham and Francois 2016) packages,這兩個packages各有優點,可依自己喜好選用。

7.2 data.table

data.table是data.frame資料框型別的延伸,如要使用必須安裝並載入data.table(Dowle and Srinivasan 2016) package

install.packages("data.table") ##安裝
library(data.table) ##載入

使用data.table讀取大型資料的速度比使用資料框快上數倍,讀取資料的函數為fread(),使用方法與一般檔案讀取方法(Ch 5.1)類似

fread("檔案名稱")

如果已經使用其他資料來源將檔案讀成資料框data.frame格式,可以使用data.table()函數將data.frame轉為data.table格式,以先前介紹過的NBA資料為例(Ch 6.9,需安裝與載入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字串的資料,可使用下列指令:

NBA1516DT[grepl('James',Name)]
##    League           Name Team Position GamesPlayed TotalMinutesPlayed
## 1:    NBA James Anderson  SAC       SG          51                721
## 2:    NBA    James Ennis  NOR       SF          22                329
## 3:    NBA   James Harden  HOU       SG          82               3121
## 4:    NBA   Lebron James  CLE       SF          76               2710
## 5:    NBA  James Johnson  TOR       PF          57                924
## 6:    NBA    James Jones  CLE       SG          48                466
## 7:    NBA   James Mcadoo  GSW       SG          41                265
## 8:    NBA    James Young  BOS       SG          29                200
##    FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted FreeThrowsMade
## 1:             67                 178         23              86             22
## 2:             54                 113         26              58             25
## 3:            710                1617        236             656            720
## 4:            737                1416         87             282            359
## 5:            114                 240         20              66             39
## 6:             59                 143         41             104             21
## 7:             45                  84          1               2             26
## 8:             11                  36          6              26              1
##    FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists Steals Turnovers
## 1:                  29                13            86      41     21        42
## 2:                  34                21            42      21     16        19
## 3:                 837                63           502     612    138       374
## 4:                 491               111           565     512    104       249
## 5:                  68                28           126      67     29        54
## 6:                  26                 8            50      14     11        13
## 7:                  49                30            58      17     10        16
## 8:                   4                 4            26       9      6         5
##    Blocks PersonalFouls Disqualifications TotalPoints Technicals Ejections
## 1:     14            54                 0         179          0         0
## 2:      5            28                 1         159          0         0
## 3:     51           229                 1        2376          2         0
## 4:     49           143                 0        1920          3         0
## 5:     33            84                 0         287          0         0
## 6:     10            50                 0         180          1         0
## 7:      8            39                 0         117          0         0
## 8:      1            17                 0          29          0         0
##    FlagrantFouls GamesStarted
## 1:             0           15
## 2:             0            5
## 3:             0           82
## 4:             0           76
## 5:             0           32
## 6:             0            0
## 7:             0            1
## 8:             0            0

如需篩選所有中鋒,且姓名包含“A”字串的球員資料,可使用下列指令:

NBA1516DT[grepl('A',Name)&Position=="C"]
##     League             Name Team Position GamesPlayed TotalMinutesPlayed
##  1:    NBA     Steven Adams  OKL        C          80               2019
##  2:    NBA    Alexis Ajinca  NOR        C          59                863
##  3:    NBA     Cole Aldrich  LAC        C          60                802
##  4:    NBA     Joel Anthony  DET        C          19                 95
##  5:    NBA        Omer Asik  NOR        C          68               1181
##  6:    NBA  Andrea Bargnani  BRO        C          46                634
##  7:    NBA     Andrew Bogut  GSW        C          70               1452
##  8:    NBA   Andre Drummond  DET        C          81               2664
##  9:    NBA     Al Jefferson  CHA        C          47               1096
## 10:    NBA         Alex Len  PHO        C          78               1820
## 11:    NBA Anderson Varejao  GSW        C          53                494
## 12:    NBA    Alan Williams  PHO        C          10                 67
##     FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted
##  1:            261                 426          0               0
##  2:            150                 314          0               1
##  3:            134                 225          0               0
##  4:              6                  10          0               0
##  5:            104                 196          0               0
##  6:            127                 278          3              15
##  7:            175                 279          1               1
##  8:            552                1061          2               6
##  9:            245                 505          0               0
## 10:            264                 623          1               7
## 11:             53                 124          0               1
## 12:             10                  24          0               0
##     FreeThrowsMade FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists
##  1:            114                 196               218           531      61
##  2:             52                  62                75           269      32
##  3:             60                  84                86           288      50
##  4:              6                   8                 8            21       1
##  5:             61                 112               119           413      26
##  6:             47                  57                28            97      18
##  7:             24                  50               121           491     162
##  8:            208                 586               395          1198      67
##  9:             72                 111                57           301      70
## 10:            174                 239               178           594      97
## 11:             32                  50                37           141      35
## 12:              9                  14                14            38       5
##     Steals Turnovers Blocks PersonalFouls Disqualifications TotalPoints
##  1:     42        84     89           223                 2         636
##  2:     19        54     36           134                 0         352
##  3:     47        64     68           139                 1         328
##  4:      2         2     12            15                 0          18
##  5:     21        60     23           124                 0         269
##  6:      4        26      9            61                 0         304
##  7:     32        83    113           221                 4         375
##  8:    119       154    112           245                 2        1314
##  9:     30        34     41           117                 1         562
## 10:     38       145     62           230                 3         703
## 11:     16        22     10            70                 0         138
## 12:      4         6      5            15                 0          29
##     Technicals Ejections FlagrantFouls GamesStarted
##  1:          2         0             0           80
##  2:          2         0             0           17
##  3:          0         0             0            5
##  4:          0         0             0            0
##  5:          0         0             0           64
##  6:          0         0             0            0
##  7:          0         0             0           66
##  8:          7         0             0           81
##  9:          0         0             0           18
## 10:          1         0             0           46
## 11:          1         0             0            0
## 12:          0         0             0            0

如需篩選各隊出場數超過70場的球員資料,可使用下列指令:

NBA1516DT[GamesPlayed>70]
##      League             Name Team Position GamesPlayed TotalMinutesPlayed
##   1:    NBA     Steven Adams  OKL        C          80               2019
##   2:    NBA    Arron Afflalo  NYK       SG          71               2359
##   3:    NBA Lamarcu Aldridge  SAN       PF          74               2260
##   4:    NBA      Lavoy Allen  IND       PF          79               1601
##   5:    NBA  Al-farouq Aminu  POR       SF          82               2342
##  ---                                                                     
## 172:    NBA Derrick Williams  NYK       PF          80               1442
## 173:    NBA  Marvin Williams  CHA       PF          81               2339
## 174:    NBA  Justise Winslow  MIA       SF          78               2237
## 175:    NBA   Thaddeus Young  BRO       SF          73               2413
## 176:    NBA      Cody Zeller  CHA       PF          73               1773
##      FieldGoalsMade FieldGoalsAttempted ThreesMade ThreesAttempted
##   1:            261                 426          0               0
##   2:            354                 799         91             238
##   3:            536                1045          0              16
##   4:            191                 370          0               0
##   5:            299                 719        126             349
##  ---                                                              
## 172:            254                 565         44             150
## 173:            338                 747        152             379
## 174:            196                 463         32             116
## 175:            495                 963          7              30
## 176:            231                 437          1              10
##      FreeThrowsMade FreeThrowsAttempted OffensiveRebounds TotalRebounds Assists
##   1:            114                 196               218           531      61
##   2:            110                 131                23           266     145
##   3:            259                 302               175           631     110
##   4:             46                  73               162           424      76
##   5:            115                 156                98           498     138
##  ---                                                                           
## 172:            194                 256                47           296      75
## 173:            120                 144               127           520     110
## 174:             80                 117                81           403     117
## 175:            105                 163               177           661     135
## 176:            175                 232               138           456      71
##      Steals Turnovers Blocks PersonalFouls Disqualifications TotalPoints
##   1:     42        84     89           223                 2         636
##   2:     25        82     10           142                 1         909
##   3:     38        99     81           151                 0        1331
##   4:     26        69     42           147                 1         428
##   5:     72       120     53           171                 0         839
##  ---                                                                    
## 172:     30        61      9            69                 0         746
## 173:     58        62     77           133                 1         948
## 174:     68        95     26           184                 0         504
## 175:    112       136     37           182                 3        1102
## 176:     57        68     63           204                 4         638
##      Technicals Ejections FlagrantFouls GamesStarted
##   1:          2         0             0           80
##   2:          1         0             0           57
##   3:          0         0             0           74
##   4:          0         0             0           28
##   5:          3         0             0           82
##  ---                                                
## 172:          0         0             0            9
## 173:          0         0             0           81
## 174:          0         0             0            8
## 175:          1         0             0           73
## 176:          0         0             0           60

7.2.2 j 欄位選擇運算

第二個參數j是用來決定輸出欄位,輸出的欄位可以是原始欄位,也可以是計算後的欄位,以計算所有球員的平均出場數為例:

NBA1516DT[,mean(GamesPlayed)] ##因沒有篩選需求,,前方留空
## [1] 55

也可以一次計算多個數值,如同時計算平均出場數、平均犯規次數以及平均抄截次數,此時第二個欄位j需要使用.()包起來

NBA1516DT[,.(mean(GamesPlayed),mean(PersonalFouls),mean(Steals))] ##因沒有篩選需求,,前方留空
##    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),即可完成運算

NBA1516DT[,.(.N,AssistsMean=mean(Assists)),
          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各隊的中鋒球員數和他們的平均三分球出手次數,指令如下:

NBA1516DT[Position=="C",
          .(.N,ThreesAttemptedMean=mean(ThreesAttempted)),
          by=Team]
##     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 and Francois 2016) package是Hadley Wickham開發的資料處理分析套件,如要使用必須安裝並載入dplyr package

install.packages("dplyr") ##安裝
library(dplyr) ##載入

dplyr使用以下函數分析整理資料:

  • select(): 選要分析的欄位,欄位子集 (Column)
  • filter(): 選要分析的觀察值,觀察值子集 (Row)
  • mutate(): 增加新欄位
  • summarise(): 計算統計值
  • group_by(): 分組依據
  • arrange(): 觀察值排序
  • rename(): 欄位重新命名
  • %>%: the “pipe” operator 連結上數函式,將所有函式計算串在一起執行

以上述NBA資料為例,各函數功能分述如下: 首先先讀入資料

library(SportsAnalytics)
NBA1516<-fetch_NBAPlayerStatistics("15-16")

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的五個欄位,指令範例如下

##等同於
##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間的所有欄位,可用:串連欄位名稱

##等同於NBA1516[,2:12]
select2<-select(NBA1516,Name:FreeThrowsAttempted)
head(select2)
##            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,612)]
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()函式中可直接做變數計算後再篩選

##等同於
filter3<-filter(NBA1516,FieldGoalsMade/FieldGoalsAttempted>0.7)
filter3
##   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

也可使用 &|等符號串連邏輯

##等同於
filter4<-filter(NBA1516,FieldGoalsMade/FieldGoalsAttempted>0.7 & GamesPlayed>30)
filter4
##   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()函式用來計算統計值,像是球員個數不重複的隊伍數以及不重複的守備位置數

sum1<-summarise(NBA1516,
                nPlayer=n(),
                nTeam=n_distinct(Team),
                nPosition=n_distinct(Position))
sum1
##   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))
head(group1)
## # A tibble: 6 × 4
##     Team nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
##   <fctr>   <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))
head(group2)
## Source: local data frame [6 x 5]
## Groups: Team [2]
## 
##     Team Position nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
##   <fctr>   <fctr>   <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()

排序功能,預設為遞增排序

arrange1<-arrange(NBA1516,TotalMinutesPlayed)
head(arrange1)
##   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()將要遞減排序的變數包起來,就可以遞減排序

arrange2<-arrange(NBA1516,desc(TotalMinutesPlayed),desc(GamesPlayed))
head(arrange2)
##   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))
head(arrange3)
## Source: local data frame [6 x 5]
## Groups: Team [6]
## 
##     Team Position nPlayer meanFieldGoalsMade meanFieldGoalsAttempted
##   <fctr>   <fctr>   <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()

新名稱=舊名稱

rename1<-rename(NBA1516,Po=Position)
rename1[1:5,1:5]
##   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. 2016. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.

Wickham, Hadley, and Romain Francois. 2016. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.