liveBook · Manning

Win shares per 48 minutes

As explained in Statistics Slam Dunk

Win shares per 48 minutes (WS48) is a basketball efficiency metric estimating a player's team-win contribution normalized to 48 minutes of playing time.

Win shares per 48 minutes (WS48) estimates a player's contribution to team success for every 48 minutes of regular-season playing time. Because NBA regulation games last 48 minutes, it provides a playing-time-normalized view of productivity. section 2.4

Use WS48 to compare performance across draft segments:

  • Group players by first-round segment, then calculate the mean and median WS48 for each group. section 3.5.4
  • Compare normalized productivity without treating total career playing time as the only measure of value. section 3.5
  • Interpret the result alongside career win shares, games played, and minutes per game rather than as a complete evaluation. section 3.5

Comparing draft segments

In the 2000–2009 first-round draft data, players selected in picks 1–5 averaged almost 20% more WS48 than players selected 6–10 and nearly 40% more than players in the other segments. The 6–10 segment also exceeded the remaining four segments by more than 20%. section 3.5.4

sumWS48 <- sum(draft2$WS48)
draft2 %>% 
 group_by(Pk2) %>%
 summarize(mean = mean(WS48),
           median = median(WS48),
           pct = sum(WS48)/sumWS48) -> tibble4

ws3 <- ggplot(tibble4, aes(x = Pk2, y = mean)) + 
 geom_bar(stat = "identity", width = .8, 
          fill = "gold", color = "gold4") + 
 labs(title = "Average Win Shares per 48 Minutes",
      subtitle = "First-Round Selections between 
      2000 and 2009 NBA Drafts", 
      x = "Segment", 
      y = "Average Win Shares per 48 Minutes",
      caption = "regular season games only") + 
 scale_x_discrete(limits = c("1-5", "6-10", "11-15", 
                             "16-20", "21-25", "26-30"),
                  labels = c("1-5", "6-10", "11-15",
                             "16-20", "21-25", "26-30")) +
 geom_text(aes(label = round(mean, 2), vjust = -0.3)) +
 geom_label(aes(label = trunc(pct*100), vjust = 1.2)) +
 ylim(0, 0.13) +
 theme(plot.title = element_text(face = "bold"))

ws4 <- ggplot(tibble4, aes(x = Pk2, y = median)) + 
 geom_bar(stat = "identity", width = .8, 
          fill = "gold3", color = "gold4") + 
 labs(title = "Median Win Shares per 48 Minutes",
      subtitle = "First-Round Selections between 
      2000 and 2009 NBA Drafts", 
      x = "Segment", y = "Median Win Shares per 48 Minutes",
      caption = "regular season games only") + 
 scale_x_discrete(limits = c("1-5", "6-10", "11-15", 
                             "16-20", "21-25", "26-30"),
                  labels = c("1-5", "6-10", "11-15", 
                             "16-20", "21-25", "26-30")) +
 geom_text(aes(label = round(median, 2), vjust = -0.3)) +
 geom_label(aes(label = trunc(pct*100), vjust = 1.2)) +
 ylim(0, 0.13) +
 theme(plot.title = element_text(face = "bold"))

ws3 + ws4 + plot_layout(ncol = 1)

Inspect the R workflow that groups WS48 by Pk2, computes mean, median, and percentage totals, and builds a labeled ggplot2 bar chart. section 3.5.4

How Statistics Slam Dunk covers it

How deep it goes
Defines the metric and demonstrates grouped means, medians, and charts, but does not derive its statistical construction.
Examples
Uses 2000–2009 first-round NBA draft segments, grouped summaries, bar charts, and player records containing WS48.
What it assumes
Assumes grouped data and basic means and medians, while defining WS48 and win shares in plain language.
What you can do after
Apply it via dplyr and ggplot2 to summarize and visualize normalized productivity across player groups.
How it connects
Links WS48 to win shares, playing time, draft position, segmentation analysis, and exploratory data analysis.

Related concepts

This explainer was generated by Manning's knowledge graph from the text of Statistics Slam Dunk. The section links point to the parts of the book it draws on.