NSBA Draft Analyticsembargoed Β· 2026-06-06

20_difficulty.md

20 β€” Difficulty Normalization ("Park Factors")

difficulty_factors.png

20 β€” Difficulty Normalization ("Park Factors")

Goal: quantify how question difficulty differs across contexts and produce adjustment factors so player tossup stats are comparable across seasons, playoff/regular, and subjects. Identify which season is most comparable to the nsba4 draft target.

Date: 2026-05-30. Env: /home/david/code/nsba/.venv/bin/python. Inputs: tossups_long.csv, bonuses_long.csv, games_meta.csv (GAME data only β€” standard Science-Bowl scoring, never combine). Outputs: outputs/difficulty_factors.csv, outputs/difficulty_factors.png.


Method

Difficulty is measured at the question level, not the player level, because a question-level metric is largely independent of which player is on the floor, whereas per-player point rates (PPTF) are confounded by roster strength, opponent, and role. The primary metric is conversion = fraction of toss-up questions that some team answered correctly (any_correct). Lower conversion = harder questions. (Dead rate = 1 βˆ’ conversion.)


Results

(a) Season / era difficulty

season era raw conversion subject-adjusted conversion difficulty factor β†’ nsba3
nsba1_2022 alumni-written 0.783 0.761 1.089
nsba2_2023 alumni-written 0.738 0.754 1.100
nsba3_2025 packet-submission 0.819 0.829 1.000 (reference)

nsba3 questions are easier (highest conversion) than the alumni-era seasons. The difficulty_factor is nsba3_adj_conv / season_adj_conv: multiply a player's nsba1 toss-up rate by 1.089 (nsba2 by 1.100) to express it in nsba3-equivalent units. The era axis (alumni vs packet) lines up with this: both alumni seasons are ~9–10% harder than the packet-era nsba3.

Player-anchored corroboration (noisy, small n, PPTF is a gamesΓ—rate proxy for nsba3): players appearing in both nsba2 and nsba3 scored higher in nsba3 (mean PPTF 0.25β†’0.54; n=5), and nsba1β†’nsba2 rates rose too β€” directionally consistent with each later season being easier, but these ratios are too confounded by roster/opponent to use as the factor; the question-level model is the anchor.

(b) Playoff vs regular season

Within nsba3 (the only season with clean playoff games):

(c) Per-subject baselines (nsba3 reference)

nsba3 mean conversion = 0.819. subject_factor = mean / subject_conv (>1 = harder subject, so each correct buzz there is "worth more"):

subject conversion n subject factor
b (Bio) 0.921 203 0.889 (easiest)
ess (Earth/Space) 0.844 205 0.971
p (Physics) 0.833 203 0.984
ch (Chemistry) 0.803 208 1.020
m (Math) 0.794 199 1.032
cs (Comp Sci) 0.690 155 1.187 (hardest)

CS is the hardest subject to convert and Bio the easiest β€” consistent with the prior that CS is the "unbikable" / cleaner-signal subject.

Bonus conversion (secondary context check)

Bonuses earned per correct toss-up: nsba1 0.497, nsba2 0.438, nsba3 0.562 (nsba3 playoff 0.512 < regular 0.575). Same direction as toss-up difficulty β€” nsba3 easiest, playoffs harder.


Which season is most comparable to nsba4?

nsba3_2025. nsba4 is the same packet-submission era as nsba3 (vs the alumni-written nsba1/nsba2), includes CS (like nsba2/nsba3, unlike nsba1), and uses the modern 6-subject set (no legacy Energy). nsba3 needs no season adjustment (factor 1.0) as the reference; nsba1/nsba2 player stats should be scaled up by ~1.09–1.10 before comparing to nsba4 expectations.


How to use outputs/difficulty_factors.csv

To put a player's per-context toss-up rate on a common (nsba3/nsba4-equivalent) scale, multiply by the relevant difficulty_factor. Factors are roughly composable (season Γ— playoff Γ— subject) but were each estimated holding the others at their reference, so treat the product as approximate. The factors adjust the value of a correct buzz (rarity), not a player's speed.


Limitations / caveats


NSBA Draft Analytics Β· embargoed until after the SSB draft Β· ← hub