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