Looking at catch and shoot/1-2 dribble pull-ups shooting stats based on varying degrees of ‘contestion’. Only statistics with 20 attempts from each split were included, few shots were marked as having poor contests so I chose not to include them
Useful supplements
## Vector of Shot Plays that require strong closeouts
shots <- c("1-2D Pull-Up", "Catch & Shoot")
results %>%
filter((off_team == "GSW") & (result_type %in% shots) & self_created == 0) %>%
mutate(made_shot = if_else(points > 1, 1, 0)) %>%
group_by(Player = result_off, result_contest) %>%
summarise(fg_pct = mean(made_shot), shots = n()) %>%
filter(shots >= 20) %>%
select(-shots) %>%
pivot_wider(names_from = result_contest, values_from = fg_pct) %>%
drop_na(Open, Plus) %>%
select(Open, Average, Plus) %>%
arrange(-Open)
## # A tibble: 5 × 4
## # Groups: Player [5]
## Player Open Average Plus
## <chr> <dbl> <dbl> <dbl>
## 1 Jordan Poole 0.491 0.357 0.304
## 2 Klay Thompson 0.475 0.446 0.5
## 3 Stephen Curry 0.432 0.384 0.6
## 4 Andrew Wiggins 0.405 0.413 0.333
## 5 Otto Porter Jr. 0.378 0.505 0.326
The idea here was to examine how well these players shoot the ball when contested inside the 3-point arc. Which players’ shots should we contest, at the expense of giving up an easy look near the rim.
Useful supplements
## Shots where contests near the rim may be important, at the expense of creating an opportunity
shots <- c("1-2D Pull-Up", "Floater", "Leaner", "Hook", "PU Fade", "3+D Pull-Up")
## Basically how hard should we contest players in the midrange
results %>%
filter((off_team == "GSW") & (result_type %in% shots) & self_created == 1 &
(grepl("Midrange", result_zone) | grepl("Paint", result_zone) | grepl("Short", result_zone))) %>%
mutate(made_shot = if_else(points > 1, 1, 0)) %>%
group_by(Player = result_off, result_contest) %>%
summarise(fg_pct = mean(made_shot), shots = n()) %>%
filter(shots > 6) %>%
select(-shots) %>%
pivot_wider(names_from = result_contest, values_from = fg_pct) %>%
drop_na(Open) %>%
select(Open, Poor, Average, Plus) %>%
arrange(-Open)
## # A tibble: 4 × 5
## # Groups: Player [4]
## Player Open Poor Average Plus
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Klay Thompson 0.909 NA 0.581 0.375
## 2 Jordan Poole 0.636 0.4 0.368 0.370
## 3 Stephen Curry 0.5 0.429 0.486 0.375
## 4 Andrew Wiggins 0.412 0.364 0.403 0.338
I don’t expect this to be insightful, but this is just a general view of who creates and how well in this offense
## Who's creating the most points when initiating
left_join(pbp, results, by = "result_id") %>%
arrange(poss_id.x) %>%
filter((off_team.x == "GSW") & (play_type == "Initiation") & (player_type == "Ball-Handler")) %>%
group_by(player_name) %>%
mutate(points = if_else(between(points, 0, 4), points, "NA")) %>%
filter(!is.na(points) | points != "NA") %>%
summarise(Avg_Points = mean(as.numeric(points)), Initiations = n()) %>%
filter(Initiations > 30) %>%
arrange(-Initiations)
## # A tibble: 4 × 3
## player_name Avg_Points Initiations
## <chr> <dbl> <int>
## 1 Stephen Curry 0.815 168
## 2 Jordan Poole 0.992 130
## 3 Draymond Green 0.409 44
## 4 Andrew Wiggins 0.706 34
I think here we see a little insight. Steph better from shallow 3 point area, Poole doesn’t matter. Speculation is Poole is more athletic, gets a step and makes you pay. Steph thrives in a “telephone booth”, one misstep and he can pull trigger. Easier to pass and shoot from closer to the basket.
Useful supplements
Any film support of this theory (foremost)
Info on o-reb conversion rate and ability to predict team success against warriors
-> If o-reb is equally big factor in success, then this strategy may be hard to implement
## Highlighting players that initiate
highlighted <- c("Stephen Curry", "Jordan Poole", "Draymond Green")
## Who is most effective creating from where?
left_join(pbp, results, by = "result_id") %>%
arrange(poss_id.x) %>%
filter((player_name %in% highlighted) & (play_type == "Initiation") & (player_type == "Ball-Handler")) %>%
group_by(player_name, play_zone) %>%
mutate(points = if_else(between(points, 0, 4), points, "NA")) %>%
filter(!is.na(points) | points != "NA") %>%
summarise(Avg_Points = mean(as.numeric(points)), Initiations = n()) %>%
filter(Initiations > 10)
## # A tibble: 5 × 4
## # Groups: player_name [3]
## player_name play_zone Avg_Points Initiations
## <chr> <chr> <dbl> <int>
## 1 Draymond Green Deep Backcourt 0.5 30
## 2 Jordan Poole Deep Backcourt 1.03 69
## 3 Jordan Poole Short Backcourt 1.06 47
## 4 Stephen Curry Deep Backcourt 0.660 103
## 5 Stephen Curry Short Backcourt 1.09 56