Chapter 49 Advanced ~50 min read

Draft Analytics and Prospect Evaluation

Using analytics to evaluate NBA draft prospects and predict professional success.

The Draft Prediction Problem

Predicting NBA success from college performance represents one of the most challenging analytics problems. The environment changes dramatically: college schemes differ from NBA, competition quality jumps, and roles often change. Most college stars fail to become NBA stars; identifying the exceptions requires careful analysis.

Predictive Statistics

Research has identified statistics that predict NBA success: steals and blocks (per 40 minutes) indicate defensive impact; assist-to-turnover ratio predicts passing skill; free throw percentage predicts overall shooting ability; and scoring efficiency matters more than volume. These metrics help separate prospects likely to translate from those who won't.

def evaluate_draft_prospect(college_stats, physical_data):
    """Evaluate draft prospect using predictive factors"""
    # Per-40-minute rates
    per40_stl = college_stats['STL'] / college_stats['MIN'] * 40
    per40_blk = college_stats['BLK'] / college_stats['MIN'] * 40
    per40_pts = college_stats['PTS'] / college_stats['MIN'] * 40

    ast_to_ratio = college_stats['AST'] / max(college_stats['TOV'], 1)
    ft_pct = college_stats['FTM'] / max(college_stats['FTA'], 1)

    # Composite score
    prospect_score = (
        per40_stl * 2 +
        per40_blk * 1.5 +
        ast_to_ratio * 3 +
        ft_pct * 10 +
        per40_pts * 0.5 +
        (physical_data['WINGSPAN'] - physical_data['HEIGHT']) * 2  # Wingspan advantage
    )

    return {'prospect_score': round(prospect_score, 1)}

Age and Experience Factors

Younger players at the same performance level project better because they have more development ahead. A 19-year-old producing at 90% of a 22-year-old's level may be the better prospect because he's further from his ceiling. Age-adjusted analysis is essential for proper prospect evaluation.

Physical Measurements

Physical attributes—particularly wingspan relative to height and athleticism measures—predict NBA success beyond what statistics capture. Players with elite measurables at the combine tend to outperform their college statistics would suggest.

Implementation in R

# Salary cap analysis
library(tidyverse)

analyze_salary_value <- function(player_contracts, player_stats) {
  player_contracts %>%
    left_join(player_stats, by = "player_id") %>%
    mutate(
      salary_millions = salary / 1e6,
      cost_per_win_share = salary_millions / pmax(ws, 0.1),
      cap_pct = salary / cap_maximum * 100,

      # Market value estimate
      market_value = ws * 3.5,  # $3.5M per win share
      surplus_value = market_value - salary_millions
    )
}

contracts <- read_csv("player_contracts.csv")
stats <- read_csv("player_stats.csv")
value_analysis <- analyze_salary_value(contracts, stats)

# Best value contracts
best_value <- value_analysis %>%
  filter(ws >= 3) %>%
  arrange(desc(surplus_value)) %>%
  select(player_name, salary_millions, ws, surplus_value) %>%
  head(15)

print(best_value)

Implementation in R

# Salary cap analysis
library(tidyverse)

analyze_salary_value <- function(player_contracts, player_stats) {
  player_contracts %>%
    left_join(player_stats, by = "player_id") %>%
    mutate(
      salary_millions = salary / 1e6,
      cost_per_win_share = salary_millions / pmax(ws, 0.1),
      cap_pct = salary / cap_maximum * 100,

      # Market value estimate
      market_value = ws * 3.5,  # $3.5M per win share
      surplus_value = market_value - salary_millions
    )
}

contracts <- read_csv("player_contracts.csv")
stats <- read_csv("player_stats.csv")
value_analysis <- analyze_salary_value(contracts, stats)

# Best value contracts
best_value <- value_analysis %>%
  filter(ws >= 3) %>%
  arrange(desc(surplus_value)) %>%
  select(player_name, salary_millions, ws, surplus_value) %>%
  head(15)

print(best_value)
Chapter Summary

You've completed Chapter 49: Draft Analytics and Prospect Evaluation.