NBA shot range analysis

Raw data

To begin, I retrieved raw data for game logs for each team from https://stats.nba.com/stats/teamgamelog/?TeamID=&Season=2018-19&SeasonType=Regular%20Season as well as shot chart data for each player from https://stats.nba.com/stats/shotchartdetail?Period=0&VsConference=&LeagueID=00&LastNGames=0&TeamID=0&Position=&Location=&Outcome=&ContextMeasure=FGA&DateFrom=&StartPeriod=&DateTo=&OpponentTeamID=0&ContextFilter=&RangeType=&Season=2018-19&AheadBehind=&PlayerID=%7B%7D&EndRange=&VsDivision=&PointDiff=&RookieYear=&GameSegment=&Month=0&ClutchTime=&StartRange=&EndPeriod=&SeasonType=Regular+Season&SeasonSegment=&GameID=&PlayerPosition=. In the URLs from above we must a TeamID from https://github.com/seemethere/nba_py/wiki/stats.nba.com-Endpoint-Documentation#current-teams or any PlayerID from the league to get the raw JSON data. I saved the data in a csv to be able to analyze later.

Raw shot chart data

shots <- read.csv("shotcharts-2018-19-Dec-10-18.csv")

                         
allShotShort <- shots %>% select(GAME_ID, TEAM_ID,TEAM_NAME,PERIOD, ACTION_TYPE,MINUTES_REMAINING, SECONDS_REMAINING, PLAYER_ID, PLAYER_NAME, EVENT_TYPE, SHOT_TYPE, SHOT_ZONE_BASIC, SHOT_ZONE_AREA, SHOT_ZONE_RANGE,
                                 SHOT_ATTEMPTED_FLAG, SHOT_MADE_FLAG,SHOT_DISTANCE, LOC_X, LOC_Y, HTM, VTM)

head(allShotShort)
##    GAME_ID    TEAM_ID      TEAM_NAME PERIOD                    ACTION_TYPE
## 1 21800001 1610612738 Boston Celtics      1             Driving Layup Shot
## 2 21800001 1610612738 Boston Celtics      2           Alley Oop Layup shot
## 3 21800001 1610612738 Boston Celtics      2 Driving Finger Roll Layup Shot
## 4 21800001 1610612738 Boston Celtics      3                      Jump Shot
## 5 21800001 1610612738 Boston Celtics      4             Fadeaway Jump Shot
## 6 21800001 1610612738 Boston Celtics      4                      Jump Shot
##   MINUTES_REMAINING SECONDS_REMAINING PLAYER_ID PLAYER_NAME  EVENT_TYPE
## 1                 3                47    201143  Al Horford   Made Shot
## 2                 5                 7    201143  Al Horford   Made Shot
## 3                 2                24    201143  Al Horford   Made Shot
## 4                11                 5    201143  Al Horford   Made Shot
## 5                 7                24    201143  Al Horford Missed Shot
## 6                 4                31    201143  Al Horford Missed Shot
##        SHOT_TYPE       SHOT_ZONE_BASIC SHOT_ZONE_AREA SHOT_ZONE_RANGE
## 1 2PT Field Goal       Restricted Area      Center(C) Less Than 8 ft.
## 2 2PT Field Goal       Restricted Area      Center(C) Less Than 8 ft.
## 3 2PT Field Goal       Restricted Area      Center(C) Less Than 8 ft.
## 4 2PT Field Goal             Mid-Range   Left Side(L)        8-16 ft.
## 5 2PT Field Goal In The Paint (Non-RA)      Center(C) Less Than 8 ft.
## 6 3PT Field Goal        Right Corner 3  Right Side(R)         24+ ft.
##   SHOT_ATTEMPTED_FLAG SHOT_MADE_FLAG SHOT_DISTANCE LOC_X LOC_Y HTM VTM
## 1                   1              1             2    24    -1 BOS PHI
## 2                   1              1             1    -2    11 BOS PHI
## 3                   1              1             1    -9     7 BOS PHI
## 4                   1              1            12  -114    53 BOS PHI
## 5                   1              0             6    40    57 BOS PHI
## 6                   1              0            24   236    53 BOS PHI

Raw game log data

logs <- read.csv('all-game-logs.csv')
head(logs)
##   X    Team_ID  Game_ID    GAME_DATE     MATCHUP WL W  L W_PCT MIN FGM FGA
## 1 0 1610612737 21800412 DEC 12, 2018   ATL @ DAL  L 6 21 0.222 240  43  93
## 2 1 1610612737 21800380 DEC 08, 2018 ATL vs. DEN  W 6 20 0.231 240  40  93
## 3 2 1610612737 21800357 DEC 05, 2018 ATL vs. WAS  L 5 20 0.200 240  41  92
## 4 3 1610612737 21800344 DEC 03, 2018 ATL vs. GSW  L 5 19 0.208 240  44  90
## 5 4 1610612737 21800325 NOV 30, 2018   ATL @ OKC  L 5 18 0.217 240  43  96
## 6 5 1610612737 21800306 NOV 28, 2018   ATL @ CHA  L 5 17 0.227 240  32  93
##   FG_PCT FG3M FG3A FG3_PCT FTM FTA FT_PCT OREB DREB REB AST STL BLK TOV PF
## 1  0.462   11   33   0.333  10  14  0.714   16   28  44  21   7   2  21 30
## 2  0.430   15   42   0.357  11  16  0.688    9   42  51  33   9  11  18 23
## 3  0.446   12   38   0.316  23  31  0.742    8   35  43  28  13   4  17 27
## 4  0.489    5   26   0.192  18  24  0.750    9   26  35  23  10   4  18 21
## 5  0.448   11   36   0.306  12  20  0.600   14   28  42  26  15   3  21 12
## 6  0.344   11   44   0.250  19  22  0.864   16   38  54  20  11   8  19 25
##   PTS
## 1 107
## 2 106
## 3 117
## 4 111
## 5 109
## 6  94

Data Wrangling

There was a log of data wrangling and summarizing involved. To start I need to merge the shot chart data with the game log data and select the necessary columns.

alllogs <- merge(allShotShort,logs,by.x= c("GAME_ID", "TEAM_ID"),by.y=c("Game_ID","Team_ID"))


allLogShort <- alllogs %>% select(GAME_ID, TEAM_ID,TEAM_NAME,PERIOD, ACTION_TYPE,MINUTES_REMAINING, SECONDS_REMAINING, PLAYER_ID, PLAYER_NAME,   
                                  EVENT_TYPE, SHOT_TYPE, SHOT_ZONE_BASIC, SHOT_ZONE_AREA, SHOT_ZONE_RANGE, 
                                  SHOT_ATTEMPTED_FLAG, SHOT_MADE_FLAG,SHOT_DISTANCE, LOC_X, LOC_Y, HTM, VTM,GAME_DATE, MATCHUP, WL)

Next there were some initial variables that I wanted so I created a variable for location (home or away), the opponent, a concatenation of date and opponent, team abbreviations, and finally the shot range.

allLogShort$HOMEAWAY <- "Away"
allLogShort$HOMEAWAY[str_detect(allLogShort$MATCHUP, "vs") ]<- "Home"

allLogShort$OPPONENT <-str_sub(allLogShort$MATCHUP,-3)

allLogShort$DATE_OPPONENT <- paste(allLogShort$GAME_DATE, str_sub(allLogShort$MATCHUP,5), sep = " ")

allLogShort$TEAM_ABRV <- substr(allLogShort$MATCHUP, 0, 3)

allLogShort <- allLogShort %>% mutate(RANGE = ifelse(SHOT_DISTANCE < 4, "RIM",
                                                     ifelse(SHOT_DISTANCE >= 5 & SHOT_DISTANCE < 14, "SMR", 
                                                            ifelse(SHOT_DISTANCE > 14 & SHOT_TYPE == "2PT Field Goal", "LMR", 
                                                            ifelse(SHOT_DISTANCE >= 22 & SHOT_TYPE == "3PT Field Goal", "3PT", "LMR")))))
allLogShort <- allLogShort %>% mutate(SHOT_VALUE = ifelse(SHOT_TYPE == "3PT Field Goal", 3,2))

head(allLogShort)
##    GAME_ID    TEAM_ID      TEAM_NAME PERIOD        ACTION_TYPE
## 1 21800001 1610612738 Boston Celtics      2   Pullup Jump shot
## 2 21800001 1610612738 Boston Celtics      4          Jump Shot
## 3 21800001 1610612738 Boston Celtics      1   Pullup Jump shot
## 4 21800001 1610612738 Boston Celtics      1   Pullup Jump shot
## 5 21800001 1610612738 Boston Celtics      2          Jump Shot
## 6 21800001 1610612738 Boston Celtics      2 Running Layup Shot
##   MINUTES_REMAINING SECONDS_REMAINING PLAYER_ID   PLAYER_NAME  EVENT_TYPE
## 1                 8                49   1626179  Terry Rozier   Made Shot
## 2                 7                 3    202694 Marcus Morris   Made Shot
## 3                 2                11   1626179  Terry Rozier Missed Shot
## 4                 9                19   1628369  Jayson Tatum   Made Shot
## 5                 7                28   1628369  Jayson Tatum Missed Shot
## 6                 9                42   1628369  Jayson Tatum   Made Shot
##        SHOT_TYPE       SHOT_ZONE_BASIC        SHOT_ZONE_AREA
## 1 2PT Field Goal             Mid-Range  Left Side Center(LC)
## 2 3PT Field Goal     Above the Break 3 Right Side Center(RC)
## 3 2PT Field Goal             Mid-Range  Left Side Center(LC)
## 4 2PT Field Goal In The Paint (Non-RA)             Center(C)
## 5 3PT Field Goal        Right Corner 3         Right Side(R)
## 6 2PT Field Goal       Restricted Area             Center(C)
##   SHOT_ZONE_RANGE SHOT_ATTEMPTED_FLAG SHOT_MADE_FLAG SHOT_DISTANCE LOC_X
## 1       16-24 ft.                   1              1            19   -67
## 2         24+ ft.                   1              1            26   160
## 3       16-24 ft.                   1              0            19  -111
## 4        8-16 ft.                   1              1            15   -63
## 5         24+ ft.                   1              0            22   227
## 6 Less Than 8 ft.                   1              1             1   -18
##   LOC_Y HTM VTM    GAME_DATE     MATCHUP WL HOMEAWAY OPPONENT
## 1   181 BOS PHI OCT 16, 2018 BOS vs. PHI  W     Home      PHI
## 2   209 BOS PHI OCT 16, 2018 BOS vs. PHI  W     Home      PHI
## 3   159 BOS PHI OCT 16, 2018 BOS vs. PHI  W     Home      PHI
## 4   138 BOS PHI OCT 16, 2018 BOS vs. PHI  W     Home      PHI
## 5    29 BOS PHI OCT 16, 2018 BOS vs. PHI  W     Home      PHI
## 6    -3 BOS PHI OCT 16, 2018 BOS vs. PHI  W     Home      PHI
##          DATE_OPPONENT TEAM_ABRV RANGE SHOT_VALUE
## 1 OCT 16, 2018 vs. PHI       BOS   LMR          2
## 2 OCT 16, 2018 vs. PHI       BOS   3PT          3
## 3 OCT 16, 2018 vs. PHI       BOS   LMR          2
## 4 OCT 16, 2018 vs. PHI       BOS   LMR          2
## 5 OCT 16, 2018 vs. PHI       BOS   3PT          3
## 6 OCT 16, 2018 vs. PHI       BOS   RIM          2

Next, I needed a bunch of summary statistics for my league and team analysis. I needed team and player totals but also team and player totals by shot range. Both are shown below.

playerStatsByRange <- allLogShort %>% group_by(PLAYER_NAME, RANGE) %>% summarise(FGM = sum(SHOT_MADE_FLAG),FGA = sum(SHOT_ATTEMPTED_FLAG),
                                                                         FG_PERCENTAGE = FGM/FGA, PPS =sum(SHOT_MADE_FLAG * SHOT_VALUE/FGA),  PTS  = sum(SHOT_MADE_FLAG * SHOT_VALUE))
playerStats <- allLogShort %>% group_by(PLAYER_NAME) %>% summarise(FGM = sum(SHOT_MADE_FLAG),FGA = sum(SHOT_ATTEMPTED_FLAG),
                                                           PTS  = sum(SHOT_MADE_FLAG * SHOT_VALUE), EFG = PTS/(FGA*2), PPS = PTS/FGA)

teamStatsByRange <- allLogShort %>% group_by(TEAM_ABRV, RANGE) %>% summarise(FGM = sum(SHOT_MADE_FLAG),FGA = sum(SHOT_ATTEMPTED_FLAG),
                                                                     FG_PERCENTAGE = FGM/FGA, PPS =sum(SHOT_MADE_FLAG * SHOT_VALUE/FGA), PTS  = sum(SHOT_MADE_FLAG * SHOT_VALUE))
teamStats <- allLogShort %>% group_by(TEAM_ABRV) %>% summarise(FGM = sum(SHOT_MADE_FLAG),FGA = sum(SHOT_ATTEMPTED_FLAG),
                                                       PTS  = sum(SHOT_MADE_FLAG * SHOT_VALUE), EFG = PTS/(FGA*2), PPS = PTS/FGA)

Merging the range and total data sets for both players and teams we get the following data.

playerStatsByRange <- playerStatsByRange %>% merge(playerStats, by = 'PLAYER_NAME', suffixes = c("_range","_total"))
head(playerStatsByRange)
##     PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1  Aaron Gordon   3PT        43       113     0.3805310 1.1415929
## 2  Aaron Gordon   LMR        14        54     0.2592593 0.5185185
## 3  Aaron Gordon   RIM        84       124     0.6774194 1.3548387
## 4  Aaron Gordon   SMR        18        50     0.3600000 0.7200000
## 5 Aaron Holiday   3PT        11        43     0.2558140 0.7674419
## 6 Aaron Holiday   LMR         8        15     0.5333333 1.0666667
##   PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1       129       159       341       361 0.5293255 1.0586510
## 2        28       159       341       361 0.5293255 1.0586510
## 3       168       159       341       361 0.5293255 1.0586510
## 4        36       159       341       361 0.5293255 1.0586510
## 5        33        37        89        85 0.4775281 0.9550562
## 6        16        37        89        85 0.4775281 0.9550562
teamStatsByRange <- teamStatsByRange %>% merge(teamStats, by = 'TEAM_ABRV', suffixes = c("_range","_total"))
head(teamStatsByRange)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       ATL   3PT       303       954     0.3176101 0.9528302       909
## 2       ATL   LMR       104       250     0.4160000 0.8360000       209
## 3       ATL   RIM       556       910     0.6109890 1.2219780      1112
## 4       ATL   SMR       102       292     0.3493151 0.6986301       204
## 5       BKN   3PT       348       983     0.3540183 1.0620549      1044
## 6       BKN   LMR       107       295     0.3627119 0.7288136       215
##   FGM_total FGA_total PTS_total       EFG PPS_total
## 1      1065      2406      2434 0.5058188  1.011638
## 2      1065      2406      2434 0.5058188  1.011638
## 3      1065      2406      2434 0.5058188  1.011638
## 4      1065      2406      2434 0.5058188  1.011638
## 5      1140      2566      2629 0.5122759  1.024552
## 6      1140      2566      2629 0.5122759  1.024552

Calculate shotRangeRatio (% of shots at each range)

playerStatsByRange$shotRangeRatio <- playerStatsByRange$FGA_range/playerStatsByRange$FGA_total
teamStatsByRange$shotRangeRatio <- teamStatsByRange$FGA_range/teamStatsByRange$FGA_total

Analysis

Players by range sorted on shotRangeRatio (% of shots at each range)

rimPlayer <- playerStatsByRange %>% filter(RANGE == "RIM" & FGA_range >20) %>% arrange(desc(shotRangeRatio))

smrPlayer <- playerStatsByRange %>% filter(RANGE == "SMR" & FGA_range >20) %>% arrange(desc(shotRangeRatio))

lmrPlayer <- playerStatsByRange %>% filter(RANGE == "LMR" & FGA_range >20) %>% arrange(desc(shotRangeRatio))

threePlayer <- playerStatsByRange %>% filter(RANGE == "3PT" & FGA_range >20) %>% arrange(desc(shotRangeRatio))

head(rimPlayer, n=10L)
##           PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1      Tyson Chandler   RIM        30        48     0.6250000  1.250000
## 2   Mitchell Robinson   RIM        51        79     0.6455696  1.291139
## 3            Ed Davis   RIM        63       101     0.6237624  1.247525
## 4      DeAndre Jordan   RIM        98       151     0.6490066  1.298013
## 5         Rudy Gobert   RIM       145       203     0.7142857  1.428571
## 6        Clint Capela   RIM       182       262     0.6946565  1.389313
## 7        Damian Jones   RIM        48        62     0.7741935  1.548387
## 8         Joakim Noah   RIM        11        22     0.5000000  1.000000
## 9    Montrezl Harrell   RIM       141       194     0.7268041  1.453608
## 10 Isaiah Hartenstein   RIM        13        25     0.5200000  1.040000
##    PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1         60        30        50        60 0.6000000 1.2000000
## 2        102        55        86       110 0.6395349 1.2790698
## 3        126        66       113       132 0.5840708 1.1681416
## 4        196       104       171       208 0.6081871 1.2163743
## 5        290       158       231       316 0.6839827 1.3679654
## 6        364       200       307       400 0.6514658 1.3029316
## 7         96        52        73       104 0.7123288 1.4246575
## 8         22        12        26        24 0.4615385 0.9230769
## 9        282       157       245       314 0.6408163 1.2816327
## 10        26        15        32        32 0.5000000 1.0000000
##    shotRangeRatio
## 1       0.9600000
## 2       0.9186047
## 3       0.8938053
## 4       0.8830409
## 5       0.8787879
## 6       0.8534202
## 7       0.8493151
## 8       0.8461538
## 9       0.7918367
## 10      0.7812500
head(smrPlayer, n=10L)
##          PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1       Kosta Koufos   SMR        11        25     0.4400000 0.8800000
## 2   Shaun Livingston   SMR        15        39     0.3846154 0.7692308
## 3        Robin Lopez   SMR        22        41     0.5365854 1.0731707
## 4     T.J. McConnell   SMR        23        41     0.5609756 1.1219512
## 5    Harry Giles III   SMR        16        36     0.4444444 0.8888889
## 6      Marcin Gortat   SMR        13        29     0.4482759 0.8965517
## 7        Jeff Teague   SMR        29        68     0.4264706 0.8529412
## 8      DeMar DeRozan   SMR        81       172     0.4709302 0.9418605
## 9  Jonas Valanciunas   SMR        43        84     0.5119048 1.0238095
## 10  Tristan Thompson   SMR        43        83     0.5180723 1.0361446
##    PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1         22        24        50        48 0.4800000 0.9600000
## 2         30        35        78        70 0.4487179 0.8974359
## 3         44        50        96       102 0.5312500 1.0625000
## 4         46        61       104       127 0.6105769 1.2211538
## 5         32        43        93        86 0.4623656 0.9247312
## 6         26        46        84        92 0.5476190 1.0952381
## 7         58        80       203       179 0.4408867 0.8817734
## 8        162       254       528       514 0.4867424 0.9734848
## 9         86       149       258       307 0.5949612 1.1899225
## 10        86       141       255       282 0.5529412 1.1058824
##    shotRangeRatio
## 1       0.5000000
## 2       0.5000000
## 3       0.4270833
## 4       0.3942308
## 5       0.3870968
## 6       0.3452381
## 7       0.3349754
## 8       0.3257576
## 9       0.3255814
## 10      0.3254902
head(lmrPlayer, n=10L)
##          PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1      Collin Sexton   LMR        70       168     0.4166667 0.8333333
## 2       Gorgui Dieng   LMR        19        47     0.4042553 0.8085106
## 3      Terrence Ross   LMR        62       122     0.5081967 1.0163934
## 4      DeMar DeRozan   LMR        81       194     0.4175258 0.8350515
## 5       Myles Turner   LMR        50       101     0.4950495 0.9900990
## 6  LaMarcus Aldridge   LMR        59       157     0.3757962 0.7515924
## 7      Klay Thompson   LMR        95       198     0.4797980 0.9595960
## 8    Darren Collison   LMR        33        76     0.4342105 0.8684211
## 9      Avery Bradley   LMR        24        59     0.4067797 0.8135593
## 10          JR Smith   LMR        10        26     0.3846154 0.7692308
##    PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1        140       176       387       376 0.4857881 0.9715762
## 2         38        52       116       108 0.4655172 0.9310345
## 3        124       144       317       347 0.5473186 1.0946372
## 4        162       254       528       514 0.4867424 0.9734848
## 5        100       137       280       289 0.5160714 1.0321429
## 6        118       202       439       404 0.4601367 0.9202733
## 7        190       256       567       590 0.5202822 1.0405644
## 8         66        96       222       215 0.4842342 0.9684685
## 9         48        65       176       146 0.4147727 0.8295455
## 10        20        27        78        66 0.4230769 0.8461538
##    shotRangeRatio
## 1       0.4341085
## 2       0.4051724
## 3       0.3848580
## 4       0.3674242
## 5       0.3607143
## 6       0.3576310
## 7       0.3492063
## 8       0.3423423
## 9       0.3352273
## 10      0.3333333
head(threePlayer, n=10L)
##         PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1  Anthony Tolliver   3PT        22        54     0.4074074 1.2222222
## 2        Gary Clark   3PT        20        75     0.2666667 0.8000000
## 3   Wayne Ellington   3PT        45       122     0.3688525 1.1065574
## 4     Darius Miller   3PT        38        99     0.3838384 1.1515152
## 5      Alex Abrines   3PT        32       102     0.3137255 0.9411765
## 6      Troy Daniels   3PT        23        55     0.4181818 1.2545455
## 7      Gerald Green   3PT        35       108     0.3240741 0.9722222
## 8      Mike Muscala   3PT        36       101     0.3564356 1.0693069
## 9     Landry Shamet   3PT        51       132     0.3863636 1.1590909
## 10    Davis Bertans   3PT        39        88     0.4431818 1.3295455
##    PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1         66        26        59        74 0.6271186 1.2542373
## 2         60        24        82        68 0.4146341 0.8292683
## 3        135        53       146       151 0.5171233 1.0342466
## 4        114        51       122       140 0.5737705 1.1475410
## 5         96        42       126       116 0.4603175 0.9206349
## 6         69        31        70        85 0.6071429 1.2142857
## 7        105        58       142       151 0.5316901 1.0633803
## 8        108        53       133       142 0.5338346 1.0676692
## 9        153        77       180       205 0.5694444 1.1388889
## 10       117        58       122       155 0.6352459 1.2704918
##    shotRangeRatio
## 1       0.9152542
## 2       0.9146341
## 3       0.8356164
## 4       0.8114754
## 5       0.8095238
## 6       0.7857143
## 7       0.7605634
## 8       0.7593985
## 9       0.7333333
## 10      0.7213115

Players by PPS

rimPlayer <- playerStatsByRange %>% filter(RANGE == "RIM" & FGA_range >20) %>% arrange(desc(PPS_range))

smrPlayer <- playerStatsByRange %>% filter(RANGE == "SMR" & FGA_range >20) %>% arrange(desc(PPS_range))

lmrPlayer <- playerStatsByRange %>% filter(RANGE == "LMR" & FGA_range >20) %>% arrange(desc(PPS_range))

threePlayer <- playerStatsByRange %>% filter(RANGE == "3PT" & FGA_range >20) %>% arrange(desc(PPS_range))


head(rimPlayer, n=10L)
##              PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1          Dwight Powell   RIM        61        75     0.8133333  1.626667
## 2            Omri Casspi   RIM        29        36     0.8055556  1.611111
## 3         Andre Iguodala   RIM        26        33     0.7878788  1.575758
## 4             Al Horford   RIM        49        63     0.7777778  1.555556
## 5           Damian Jones   RIM        48        62     0.7741935  1.548387
## 6  Giannis Antetokounmpo   RIM       203       263     0.7718631  1.543726
## 7            Serge Ibaka   RIM        83       108     0.7685185  1.537037
## 8          Pascal Siakam   RIM       115       150     0.7666667  1.533333
## 9          Klay Thompson   RIM        46        60     0.7666667  1.533333
## 10          Kevin Durant   RIM        82       107     0.7663551  1.532710
##    PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1        122        72       122       151 0.6188525  1.237705
## 2         58        39        72        85 0.5902778  1.180556
## 3         52        45        99       104 0.5252525  1.050505
## 4         98       112       227       252 0.5550661  1.110132
## 5         96        52        73       104 0.7123288  1.424658
## 6        406       245       425       498 0.5858824  1.171765
## 7        166       200       365       422 0.5780822  1.156164
## 8        230       173       284       365 0.6426056  1.285211
## 9         92       256       567       590 0.5202822  1.040564
## 10       164       293       572       634 0.5541958  1.108392
##    shotRangeRatio
## 1       0.6147541
## 2       0.5000000
## 3       0.3333333
## 4       0.2775330
## 5       0.8493151
## 6       0.6188235
## 7       0.2958904
## 8       0.5281690
## 9       0.1058201
## 10      0.1870629
head(smrPlayer, n=10L)
##         PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1   Otto Porter Jr.   SMR        21        36     0.5833333  1.166667
## 2     Jalen Brunson   SMR        16        28     0.5714286  1.142857
## 3  Tomas Satoransky   SMR        12        21     0.5714286  1.142857
## 4    T.J. McConnell   SMR        23        41     0.5609756  1.121951
## 5      Kyrie Irving   SMR        42        76     0.5526316  1.105263
## 6    Justin Jackson   SMR        16        29     0.5517241  1.103448
## 7       Robin Lopez   SMR        22        41     0.5365854  1.073171
## 8     Jarrett Allen   SMR        15        28     0.5357143  1.071429
## 9       T.J. Warren   SMR        41        77     0.5324675  1.064935
## 10    E'Twaun Moore   SMR        47        89     0.5280899  1.056180
##    PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1         42       116       237       267 0.5632911  1.126582
## 2         32        50       105       109 0.5190476  1.038095
## 3         24        54       112       120 0.5357143  1.071429
## 4         46        61       104       127 0.6105769  1.221154
## 5         84       214       443       494 0.5575621  1.115124
## 6         32        64       142       154 0.5422535  1.084507
## 7         44        50        96       102 0.5312500  1.062500
## 8         30       124       211       251 0.5947867  1.189573
## 9         82       148       289       332 0.5743945  1.148789
## 10        94       155       304       349 0.5740132  1.148026
##    shotRangeRatio
## 1       0.1518987
## 2       0.2666667
## 3       0.1875000
## 4       0.3942308
## 5       0.1715576
## 6       0.2042254
## 7       0.4270833
## 8       0.1327014
## 9       0.2664360
## 10      0.2927632
head(lmrPlayer, n=10L)
##          PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1        Serge Ibaka   LMR        53        83     0.6385542  1.277108
## 2         Jeremy Lin   LMR        15        24     0.6250000  1.250000
## 3  Jonas Valanciunas   LMR        16        27     0.5925926  1.185185
## 4         Quinn Cook   LMR        32        55     0.5818182  1.163636
## 5    Emmanuel Mudiay   LMR        19        34     0.5588235  1.147059
## 6       Kemba Walker   LMR        45        79     0.5696203  1.139241
## 7         Chris Paul   LMR        21        39     0.5384615  1.128205
## 8          JJ Redick   LMR        63       115     0.5478261  1.095652
## 9       Kevin Durant   LMR        93       171     0.5438596  1.087719
## 10       CJ McCollum   LMR        61       113     0.5398230  1.079646
##    PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1        106       200       365       422 0.5780822 1.1561644
## 2         30        84       163       194 0.5950920 1.1901840
## 3         32       149       258       307 0.5949612 1.1899225
## 4         64        91       191       217 0.5680628 1.1361257
## 5         39        99       222       221 0.4977477 0.9954955
## 6         90       231       537       550 0.5121043 1.0242086
## 7         44       119       285       279 0.4894737 0.9789474
## 8        126       179       410       437 0.5329268 1.0658537
## 9        186       293       572       634 0.5541958 1.1083916
## 10       122       234       495       525 0.5303030 1.0606061
##    shotRangeRatio
## 1       0.2273973
## 2       0.1472393
## 3       0.1046512
## 4       0.2879581
## 5       0.1531532
## 6       0.1471136
## 7       0.1368421
## 8       0.2804878
## 9       0.2989510
## 10      0.2282828
head(threePlayer, n=10L)
##         PLAYER_NAME RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range
## 1  Bojan Bogdanovic   3PT        60       121     0.4958678  1.487603
## 2  Dante Cunningham   3PT        23        47     0.4893617  1.468085
## 3     Stephen Curry   3PT        92       189     0.4867725  1.460317
## 4          Rudy Gay   3PT        31        64     0.4843750  1.453125
## 5      Derrick Rose   3PT        40        83     0.4819277  1.445783
## 6    Meyers Leonard   3PT        21        45     0.4666667  1.400000
## 7        Seth Curry   3PT        21        45     0.4666667  1.400000
## 8  Alfonzo McKinnie   3PT        20        43     0.4651163  1.395349
## 9   Malcolm Brogdon   3PT        48       104     0.4615385  1.384615
## 10       Joe Harris   3PT        59       129     0.4573643  1.372093
##    PTS_range FGM_total FGA_total PTS_total       EFG PPS_total
## 1        180       162       309       384 0.6213592 1.2427184
## 2         69        47       100       117 0.5850000 1.1700000
## 3        276       174       346       440 0.6358382 1.2716763
## 4         93       130       255       291 0.5705882 1.1411765
## 5        120       178       364       396 0.5439560 1.0879121
## 6         63        45        92       111 0.6032609 1.2065217
## 7         63        33        90        87 0.4833333 0.9666667
## 8         60        50        99       120 0.6060606 1.2121212
## 9        144       159       309       366 0.5922330 1.1844660
## 10       177       120       247       299 0.6052632 1.2105263
##    shotRangeRatio
## 1       0.3915858
## 2       0.4700000
## 3       0.5462428
## 4       0.2509804
## 5       0.2280220
## 6       0.4891304
## 7       0.5000000
## 8       0.4343434
## 9       0.3365696
## 10      0.5222672

Team by shotRangeRatio for each range

rimTeam <- teamStatsByRange %>% filter(RANGE == "RIM") %>% arrange(desc(shotRangeRatio))
smrTeam <- teamStatsByRange %>% filter(RANGE == "SMR") %>% arrange(desc(shotRangeRatio))
lmrTeam <- teamStatsByRange %>% filter(RANGE == "LMR") %>%  arrange(desc(shotRangeRatio))
threeTeam <- teamStatsByRange %>% filter(RANGE == "3PT") %>% arrange(desc(shotRangeRatio))

head(rimTeam)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       LAL   RIM       634       984     0.6443089  1.288618      1268
## 2       MIL   RIM       652       957     0.6812957  1.362591      1304
## 3       ATL   RIM       556       910     0.6109890  1.221978      1112
## 4       UTA   RIM       572       868     0.6589862  1.317972      1144
## 5       OKC   RIM       560       888     0.6306306  1.261261      1120
## 6       NOP   RIM       622       947     0.6568110  1.313622      1244
##   FGM_total FGA_total PTS_total       EFG PPS_total shotRangeRatio
## 1      1160      2444      2608 0.5335516  1.067103      0.4026187
## 2      1163      2449      2703 0.5518579  1.103716      0.3907717
## 3      1065      2406      2434 0.5058188  1.011638      0.3782211
## 4      1083      2331      2457 0.5270270  1.054054      0.3723724
## 5      1086      2391      2435 0.5092012  1.018402      0.3713927
## 6      1259      2617      2808 0.5364922  1.072984      0.3618647
head(smrTeam)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       SAS   SMR       251       543     0.4622468 0.9244936       502
## 2       MEM   SMR       175       453     0.3863135 0.7726269       350
## 3       MIN   SMR       198       475     0.4168421 0.8336842       396
## 4       MIA   SMR       160       469     0.3411514 0.6823028       320
## 5       NOP   SMR       204       490     0.4163265 0.8326531       408
## 6       SAC   SMR       183       454     0.4030837 0.8061674       366
##   FGM_total FGA_total PTS_total       EFG PPS_total shotRangeRatio
## 1      1156      2493      2571 0.5156438 1.0312876      0.2178099
## 2      1011      2226      2285 0.5132525 1.0265049      0.2035040
## 3      1082      2416      2449 0.5068295 1.0136589      0.1966060
## 4      1039      2405      2403 0.4995842 0.9991684      0.1950104
## 5      1259      2617      2808 0.5364922 1.0729843      0.1872373
## 6      1180      2454      2661 0.5421760 1.0843521      0.1850041
head(lmrTeam)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       SAS   LMR       251       649     0.3867488 0.7734977       502
## 2       GSW   LMR       297       598     0.4966555 0.9933110       594
## 3       CLE   LMR       228       563     0.4049734 0.8099467       456
## 4       IND   LMR       212       506     0.4189723 0.8379447       424
## 5       ORL   LMR       194       484     0.4008264 0.8037190       389
## 6       NYK   LMR       218       506     0.4308300 0.8636364       437
##   FGM_total FGA_total PTS_total       EFG PPS_total shotRangeRatio
## 1      1156      2493      2571 0.5156438 1.0312876      0.2603289
## 2      1241      2526      2822 0.5585907 1.1171813      0.2367379
## 3      1088      2439      2419 0.4959000 0.9917999      0.2308323
## 4      1138      2384      2537 0.5320889 1.0641779      0.2122483
## 5      1073      2388      2448 0.5125628 1.0251256      0.2026801
## 6      1152      2620      2598 0.4958015 0.9916031      0.1931298
head(threeTeam)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       HOU   3PT       362      1074     0.3370577 1.0111732      1086
## 2       MIL   3PT       377      1080     0.3490741 1.0472222      1131
## 3       BOS   3PT       355       983     0.3611394 1.0834181      1065
## 4       ATL   3PT       303       954     0.3176101 0.9528302       909
## 5       DAL   3PT       308       865     0.3560694 1.0682081       924
## 6       BKN   3PT       348       983     0.3540183 1.0620549      1044
##   FGM_total FGA_total PTS_total       EFG PPS_total shotRangeRatio
## 1       993      2212      2350 0.5311935  1.062387      0.4855335
## 2      1163      2449      2703 0.5518579  1.103716      0.4409963
## 3      1109      2441      2573 0.5270381  1.054076      0.4027038
## 4      1065      2406      2434 0.5058188  1.011638      0.3965087
## 5      1015      2210      2338 0.5289593  1.057919      0.3914027
## 6      1140      2566      2629 0.5122759  1.024552      0.3830865

Team by PPS for each range

rimTeam <- teamStatsByRange %>% filter(RANGE == "RIM") %>% arrange(desc(PPS_range))#desc(shotRangeRatio), desc(EFG))
smrTeam <- teamStatsByRange %>% filter(RANGE == "SMR") %>% arrange(desc(PPS_range))#desc(shotRangeRatio), desc(EFG))
lmrTeam <- teamStatsByRange %>% filter(RANGE == "LMR") %>% arrange(desc(PPS_range))#shotRangeRatio), desc(EFG))
threeTeam <- teamStatsByRange %>% filter(RANGE == "3PT") %>% arrange(desc(PPS_range))#shotRangeRatio), desc(EFG))

head(rimTeam)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       MIL   RIM       652       957     0.6812957  1.362591      1304
## 2       GSW   RIM       428       637     0.6718995  1.343799       856
## 3       TOR   RIM       570       852     0.6690141  1.338028      1140
## 4       UTA   RIM       572       868     0.6589862  1.317972      1144
## 5       PHI   RIM       511       776     0.6585052  1.317010      1022
## 6       NOP   RIM       622       947     0.6568110  1.313622      1244
##   FGM_total FGA_total PTS_total       EFG PPS_total shotRangeRatio
## 1      1163      2449      2703 0.5518579  1.103716      0.3907717
## 2      1241      2526      2822 0.5585907  1.117181      0.2521774
## 3      1300      2682      2946 0.5492170  1.098434      0.3176734
## 4      1083      2331      2457 0.5270270  1.054054      0.3723724
## 5      1176      2522      2674 0.5301348  1.060270      0.3076923
## 6      1259      2617      2808 0.5364922  1.072984      0.3618647
head(smrTeam)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       SAS   SMR       251       543     0.4622468 0.9244936       502
## 2       TOR   SMR       205       457     0.4485777 0.8971554       410
## 3       BOS   SMR       162       372     0.4354839 0.8709677       324
## 4       IND   SMR       154       360     0.4277778 0.8555556       308
## 5       GSW   SMR       176       414     0.4251208 0.8502415       352
## 6       LAC   SMR       185       436     0.4243119 0.8486239       370
##   FGM_total FGA_total PTS_total       EFG PPS_total shotRangeRatio
## 1      1156      2493      2571 0.5156438  1.031288      0.2178099
## 2      1300      2682      2946 0.5492170  1.098434      0.1703952
## 3      1109      2441      2573 0.5270381  1.054076      0.1523966
## 4      1138      2384      2537 0.5320889  1.064178      0.1510067
## 5      1241      2526      2822 0.5585907  1.117181      0.1638955
## 6      1105      2358      2455 0.5205683  1.041137      0.1849025
head(lmrTeam)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       GSW   LMR       297       598     0.4966555 0.9933110       594
## 2       TOR   LMR       179       372     0.4811828 0.9623656       358
## 3       NYK   LMR       218       506     0.4308300 0.8636364       437
## 4       PHI   LMR       174       408     0.4264706 0.8529412       348
## 5       UTA   LMR       106       250     0.4240000 0.8480000       212
## 6       DEN   LMR       137       326     0.4202454 0.8435583       275
##   FGM_total FGA_total PTS_total       EFG PPS_total shotRangeRatio
## 1      1241      2526      2822 0.5585907 1.1171813      0.2367379
## 2      1300      2682      2946 0.5492170 1.0984340      0.1387025
## 3      1152      2620      2598 0.4958015 0.9916031      0.1931298
## 4      1176      2522      2674 0.5301348 1.0602696      0.1617764
## 5      1083      2331      2457 0.5270270 1.0540541      0.1072501
## 6      1114      2409      2504 0.5197177 1.0394355      0.1353259
head(threeTeam)
##   TEAM_ABRV RANGE FGM_range FGA_range FG_PERCENTAGE PPS_range PTS_range
## 1       SAC   3PT       301       768     0.3919271  1.175781       903
## 2       GSW   3PT       340       877     0.3876853  1.163056      1020
## 3       SAS   3PT       259       671     0.3859911  1.157973       777
## 4       IND   3PT       261       698     0.3739255  1.121777       783
## 5       MIN   3PT       285       770     0.3701299  1.110390       855
## 6       LAC   3PT       245       666     0.3678679  1.103604       735
##   FGM_total FGA_total PTS_total       EFG PPS_total shotRangeRatio
## 1      1180      2454      2661 0.5421760  1.084352      0.3129584
## 2      1241      2526      2822 0.5585907  1.117181      0.3471892
## 3      1156      2493      2571 0.5156438  1.031288      0.2691536
## 4      1138      2384      2537 0.5320889  1.064178      0.2927852
## 5      1082      2416      2449 0.5068295  1.013659      0.3187086
## 6      1105      2358      2455 0.5205683  1.041137      0.2824427

NBA Summary stats

Look at teh PPS_range and shotRangeRatio to see averages in the NBA for each range.

allNBA <- teamStatsByRange %>% group_by(RANGE) %>% summarise(TEAM_ABRV = "All" ,FGA_range = sum(FGA_range), FGM_range = sum(FGM_range), 
                                                             FG_PERCENTAGE = FGM_range/FGA_range,PTS_range = sum(PTS_range), EFG = mean(EFG),
                                                             FGM_total = sum(.$FGM_range), FGA_total = sum(.$FGA_range), PTS_total= sum(.$PTS_range),
                                                             PPS_range = PTS_range/FGA_range,shotRangeRatio = mean(shotRangeRatio), 
                                                             PPS_total = sum(.$PTS_range)/sum(.$FGA_range))
head(allNBA)
## # A tibble: 4 x 13
##   RANGE TEAM_ABRV FGA_range FGM_range FG_PERCENTAGE PTS_range   EFG
##   <chr> <chr>         <int>     <int>         <dbl>     <dbl> <dbl>
## 1 3PT   All           25613      8988         0.351     26964 0.520
## 2 LMR   All           11276      4558         0.404      9125 0.520
## 3 RIM   All           24167     15176         0.628     30352 0.520
## 4 SMR   All           11811      4716         0.399      9432 0.520
## # ... with 6 more variables: FGM_total <int>, FGA_total <int>,
## #   PTS_total <dbl>, PPS_range <dbl>, shotRangeRatio <dbl>,
## #   PPS_total <dbl>

Wrap up and export to csv for Shiny app use

teamStatsByRange <- rbind(teamStatsByRange, allNBA)
write_csv(teamStatsByRange,"longTeamByRange.csv")
write_csv(allLogShort,"all-log-short.csv")