On a semi-recent episode of The Lowe Post, Jeff Van Gundy asked- “Is this the worst [rookie class] as far as initial contribution? Has there ever been less contribution to winning?” 1
Curious to know the answer, I looked at each draft class since 1989 (when the draft was changed to two rounds) and their performance in that year’s season. To be clear, this is only looking at immediate contribution, and not long-term success. Only those who played the same year they were drafted are being considered- so players like Joel Embiid, who did not play their first year, are not in the data.
The data are all from basketball-reference.com scraped using the the rvest
package. The function below pulls the necessary data for any one year. The first thing to grab is the year’s draft class. The only necessary information from this is the link to each player’s page. This link is used as a unique identifier for the player, allowing us to easily merge with the other data necessary, which are found on the advanced season statistics page. For the purpose of this analysis, the only stats needed are minutes played, and win shares as these will work for measuring contribution to winning. The total number of minutes played, and total win shares by all players are computed as well to make it possible to compare across seasons. I then used the function to grab data from 1989 - 2016. The resulting data frame contains 1,204 observations, and can be found here.
library(rvest)
library(tidyverse)
get_draft_data <- function(year){
draft_url <- paste0("http://www.basketball-reference.com/draft/NBA_",
year, ".html")
draft_site <- read_html(draft_url)
# pull the links to the players' pages from draft table
draft <- draft_site %>%
html_nodes(".left:nth-child(4) a") %>%
html_attr("href") %>%
data_frame() %>%
select(Link = 1) %>%
mutate(Year = year)
stats_url <- paste0("http://www.basketball-reference.com/leagues/NBA_",
year + 1, "_advanced.html")
stats_site <- read_html(stats_url)
# get the links to the players' pages from stats table
stats_links <- stats_site %>%
html_nodes("th+ .left a") %>%
html_attr("href") %>%
data_frame() %>%
select(Link = 1)
# get the stats table
stats <- stats_site %>%
html_node("table") %>%
html_table(header=TRUE)
# make new data_frame because of problems with unnamed variables
data_frame(Player = stats$Player,
MP = stats$MP,
WS = stats$WS) %>%
filter(Player != "Player") %>%
cbind(stats_links) %>%
filter(!duplicated(Link)) %>%
mutate(MP = as.numeric(MP),
WS = as.numeric(WS),
TotalMP = sum(MP),
TotalWS = sum(WS)) %>%
inner_join(draft, by="Link")
}
# pull data 1989 - 2016
nba <- lapply(1989:2016, get_draft_data) %>%
bind_rows()
The first thing that can be used as a measure of contribution is minutes played. In order to compare across seasons, we compute what percentage of minutes played in a season were by rookies.
For any given year rookies played an average of around 7% of all minutes in a season, but the 2016 NBA rookie class played only 5.28%. This is the second lowest after 2014’s 5.20%.
The next statistic to consider is the number of win shares rookies contributed. Again we measure this as a percentage of total win shares each season.
Again, we see that the 2014 draft class had the lowest percentage- less than 2% of all win shares came from rookies that year. Similarly, the 2016 had the second lowest at 2.10%.
As we might expect, the percent of total win shares and percent of total minutes each year are highly correlated with each other (r = 0.87). I do not think this is a problem, as the question asked was about initial contribution not the talent of the rookies. Whether we consider minutes played or win shares a better measure of impact, both suggest that the 2014 draft may have been the least immediately impactful.
To answer Van Gundy’s question, while this years draft class may not have been the absolute worst, they were certainly among the lowest contributing rookie class in history.
Around the 42 minute mark.↩