Contested Shots Splits

Not Self-Created Shots

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

  • Clips of different close outs
  • Clips demonstrating how overly aggressive closeouts can be negative (i.e. Steph Curry takes it the hoop off a pump fake)
## 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

Self-Created shots between midrange and paint

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

  • Clips of players chasing the block, at the expense of an easy look near the hoop (Think prime Hassan Whiteside before people realized that was a terrible way of playing defense)
## 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

GSW Initiation

General Overview of GSW Initiation Duties

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

Where are the primary initiators initiating from? To what effect?

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

Comparing GSW Pace with NBA Pace

Basically, if GSW show’s a higher propensity for scoring points late in the shot clock, we need to focus on causing havoc early in the posession at risk of exposing ourselves,

{
  off_poss_summary <- read_csv("ops.csv")
  def_poss_summary <- read_csv("ops.csv")
  
  # Cleaning off_poss_summary
  off_poss_summary %>% 
    filter(elapsed > 0) %>% 
    mutate(scored = if_else(points > 0, "Points > 0", "Points == 0"), 
           points = as.numeric(points),
           team = "GSW") -> elapsed_df_gsw
  
  # Cleaning off_poss_summary
  def_poss_summary %>% 
    filter(elapsed > 0) %>% 
    mutate(scored = if_else(points > 0, "Points > 0", "Points == 0"), 
           points = as.numeric(points),
           team = "NBA") -> elapsed_df_nba
}
{
  library(ggthemes)
  library(ggridges)
}

{
  gsw_blue <- "#1D428A" 
  gsw_gold <- "#FFC72C"
  nba_blue <- "#1d428a"
  nba_red <- "#c8102e"
  
  rbind(elapsed_df_gsw, elapsed_df_nba) %>%
    ggplot(aes(x = elapsed, y = team, fill = as.factor(scored))) +
    stat_density_ridges(quantile_lines = TRUE, quantiles = 2, alpha = 0.65) +
    scale_fill_manual(values = c(gsw_blue, gsw_gold)) +
    guides(
      fill = guide_legend(
        label = TRUE, title = "", label.position = "left",
        direction = "vertical",
        label.theme = element_text(size = 20)
      )
    ) +
    theme_light() +
    theme(panel.grid.major.y = element_blank(),
          legend.position = c(0.8, 0.9)) +
    labs(x = "Time Elapsed in Possesion",
         y = "Who's on Offense")
}

We don’t really see a notable difference in density