15 — North-Star Metric Discovery (the value currency)
15 — North-Star Metric Discovery (the value currency)
Goal. Define the single team-level quantity that best predicts NSBA standings (matches won; total points as tiebreak), and recommend how to decompose it into per-player win shares — the currency we will draft against for NSBA4.
Data. team_season.csv (41 team-seasons: nsba1=12, nsba2=13, nsba3=16),
player_season_master.csv (207 player-seasons), combine_ability.csv.
All built from the clean 180-game set (standard Science-Bowl scoring; combine never
mixed into value stats). Script: scripts/north_star.py.
Method
For each team-season I engineered candidate north-star metrics and split them into two classes, because not all "predictors" are legal draft inputs:
- Draftable / roster-only (computable from who is on the roster, no opponent outcome):
pptf_team,ppg_team,ppg_total,subject_hhi,n_subjects,top2_share,player_hhi,depth,eff_contrib,roster_size,neg_rate. - Outcome-laden (require games already played vs specific opponents — useful as a
ceiling/diagnostic, illegal as a draft predictor):
point_margin,points_against.
Target = win_pct. I report univariate pearson/spearman, leave-one-season-out (LOSO)
ridge regression (train on 2 seasons, predict the held-out season — the honest test of
transfer), and partial correlations to see what adds over raw production.
Definitions: pptf_team = team total toss-up points / total tossups-faced (an efficiency
rate, opponent-agnostic). ppg_total = points_for / games (full TU+bonus per game).
subject_hhi low = broad; n_subjects = breadth.
Results
Univariate correlation with win% (n=41)
| metric | pearson | spearman | class |
|---|---|---|---|
| point_margin | +0.799 | +0.794 | outcome (not draftable) |
| ppg_total (TU+bonus/game) | +0.731 | +0.757 | roster |
| pptf_team (toss rate) | +0.624 | +0.556 | roster |
| n_subjects (breadth) | +0.533 | +0.503 | roster |
| subject_hhi | −0.473 | −0.193 | roster |
| ppg_team (toss/game) | +0.352 | +0.348 | roster |
| top2_share / player_hhi / depth / roster_size / neg_rate | ~0 ( | r | <0.13) |
LOSO out-of-sample R² / spearman (predict win%)
| model | OOS R² | OOS spearman |
|---|---|---|
| PointMargin only (outcome — upper bound) | +0.612 | +0.792 |
| PPG_total + n_subjects | +0.370 | +0.722 |
| PPG_total only | +0.354 | +0.694 |
| PPTF + n_subjects | +0.293 | +0.484 |
| PPTF only | +0.258 | +0.531 |
| PPTF + subject_hhi + depth | +0.194 | +0.422 |
| breadth / hhi / top2 / depth alone | ≤ 0 | ~0 |
| full "production+structure" (6 feats) | −0.13 | +0.07 |
What adds over raw production?
- Partial corr(
n_subjects, win% |pptf) = +0.173 — breadth gives a small real lift on top of scoring rate. - Partial corr(
subject_hhi, win% |pptf) = −0.074 — concentration shape adds almost nothing once you know the rate. - Player-concentration metrics (
top2_share,player_hhi,depth) are ~0 with win% — how points are spread across the roster barely matters; total production does. - Per-season pearson(
pptf, win%) is stable and positive every season (nsba1 +0.535, nsba2 +0.561, nsba3 +0.752) — it transfers, which is why we trust it.
Recommendation — the north-star value currency
Toss-up production efficiency = PPTF (toss-up points per toss-up faced).
Why PPTF and not the slightly-higher PPG_total or point_margin:
- It is a rate, not a count — robust to schedule length, # games, and roster size, so it composes cleanly across players into a team prediction.
- It is opponent-agnostic and individually attributable —
point_marginandpoints_againstare downstream outcomes (they encode who you played and lost to), so they top the correlation table but are illegal as a draft input. PPTF is built only from the player's own buzzes. - It transfers (positive every season; LOSO R²=0.26, spearman=0.53) — modest because n=41 teams is tiny, but stable.
- PPG_total wins narrowly (R²=0.35) only because it folds in bonus conversion, a team skill that is not individually attributable (bonuses are team-answered). Use it as a team-level scoreboard check, not as the per-player draft currency.
Add breadth as a secondary tiebreak, not the core. PPG_total + n_subjects is the best
LOSO model (R²=0.370), and breadth has a +0.17 partial lift over rate — consistent with the
F1 prior (corr(win%, #subjects)=+0.52 in natural rosters). But it is a second-order
adjustment; production rate dominates.
Decomposition into per-player win shares
The currency decomposes additively because team toss-up points are a sum of player buzzes:
player_win_share = (player_toss_points / team_toss_points) * team_wins
This is implemented in data/processed/player_win_shares.csv (226 player rows). It is
exact: each team's player win-shares sum to its actual wins (max abs error = 0.0000).
Reading: a player's win-share = the share of his team's wins attributable to his toss-up
production. Top contributors:
| season | team | player | toss_pts | point_share | win_shares |
|---|---|---|---|---|---|
| nsba1 | devansh | arolakiv | 268 | 0.728 | 5.10 |
| nsba2 | Coby | sanj | 196 | 0.598 | 4.78 |
| nsba1 | sheep b | VulcanForge | 216 | 0.667 | 4.67 |
| nsba1 | mount ellis | Vish | 180 | 0.529 | 4.24 |
| nsba3 | limitless | evan | 156 | 0.582 | 4.07 |
For drafting NSBA4: project each candidate's PPTF (expected toss-up points per
toss-up faced) from their game history and/or de-biked combine ability
(combine_ability.theta_*), sum the projected production across a hypothetical roster to a
team PPTF, and add a small breadth bonus for subject coverage. Win shares then allocate
expected team wins back to individuals as the value-per-pick currency.
Limitations & caveats
- Tiny n. 41 team-seasons total (12/13/16 per season). LOSO R² values carry wide error bars; treat the ranking of metrics as the robust finding, not the point estimates.
- PPTF for nsba3 is a games×rate proxy, not an exact heard-count: the paired NSBA3
scoresheet layout records no per-player TUH, so
tossups_facedis estimated from the season mean for those rows (tuh_source). nsba1 TUH is exact; nsba2 partial. - Bonuses are team-attributed, so
ppg_total's edge over PPTF cannot be pushed down to individuals — a structural reason to prefer PPTF as the per-player currency. - point_margin's high R² is mechanical, not causal-for-drafting: margin is a function of game results, so it cannot guide who to pick. It is reported only as the outcome ceiling.
- Win-share decomposition credits toss-up points only (no bonus, no defense/lineup plus-minus — not recoverable for nsba3); it is a production attribution, not a complete value model.
- 4 nsba3 Round-1 games are team-level-only (no player names); their points sit in
team_seasonbut contribute no player win-shares (documented in the spine).
Artifacts
scripts/north_star.py— full reproducible analysis.data/processed/team_north_star_features.csv— 41 teams × candidate metrics.data/processed/player_win_shares.csv— 226 rows; per-player win-share decomposition.data/processed/north_star_univariate.csv— univariate correlation table.