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
