Appendix
Data audit
Every data source in the analysis was audited column by column. The list below covers only errors in the providers' own data: NBA.com feeds, public datasets copied from them, Basketball-Reference, Barttorvik and other public sources. Each error was corrected, kept out of the analysis, or flagged where it is used.
Errors by source
| Source | Errors | Corrected | Kept out | Flagged |
|---|---|---|---|---|
| Box scores | 14 | 8 | 4 | 2 |
| Play-by-play | 3 | 2 | 0 | 1 |
| Tracking dashboards | 13 | 12 | 0 | 1 |
| Synergy play types | 3 | 3 | 0 | 0 |
| Draft and combine | 6 | 4 | 0 | 2 |
| Contracts and transactions | 2 | 0 | 1 | 1 |
| Player bios | 3 | 2 | 0 | 1 |
| College and international | 4 | 4 | 0 | 0 |
| Third-party player ratings | 1 | 1 | 0 | 0 |
| Several sources | 2 | 1 | 1 | 0 |
| All sources | 51 | 37 | 6 | 8 |
Box scores14
Game and season box scores.
Stored final scores are wrong in 33 games (20 from 1996-2018, 13 in 1989), including two stored ties.
Would distort: Standings (2004-05 Portland one win short, Toronto one over) and game margins.
1982-83 box scores lack offensive and defensive rebound splits on 5,309 rows, and some steals.
Would distort: Rebound and steal rates in any study that starts in 1982-83.
From 1976 to 1985, some scorers show 0 minutes in nearly every game (one 1984-85 player: 0 minutes in 80 games).
Would distort: Per-minute rates for about 250 player-seasons in 1982-85.
Box-score minutes are written as "22:60" instead of "23:00" on about 60 rows in 2024-26.
Would distort: Minutes totals, by 0.4 minutes per affected row, when parsed as written.
Stats the league did not record are stored as 0: blocks and steals before 1973-74, turnovers before 1977-78, plus-minus before 1996-97, game minutes before 1982-83. About 60,000 early game rows show impossible shooting lines, such as makes above attempts.
Would distort: Any shooting or per-minute study before 1982-83.
1946-54 coverage is thin (1949-50: 122 of 561 games), and George Mikan carries 7 duplicate rows copied from Ed Mikan.
Would distort: Career totals that reach back to 1946-54.
Label slips: Goga Bitadze stored as "ga" on 470 rows, blank playoff labels in 1982-95, and two spellings of preseason.
Would distort: Name lookups and game-type filters.
1984-85 team rebound totals include team rebounds: 6.77 more per team-game than the player sums.
Would distort: Team rebound rates in 1984-85.
Final scores are rotated or swapped in 6 games (games 5-7 of a 1981 East semifinal and 3 others), and one 1974-75 record reads 41-41 instead of 40-42.
Would distort: Margins and records in those seasons.
Team turnovers in the 2000-01 playoffs are double the player sum in 11 of 142 team-games (3 more in 2003-04). Team turnovers for 1985-95 regular seasons leave out team-charged turnovers.
Would distort: Playoff possessions in 2000-01, and offensive Win Shares for 1985-95 (3-7% low).
Player-game rows for 1973-95: phantom 0-minute scorer rows (84 team-games in 1982-83), missing rows in 1984-95 (113 team-games, 778 points), short minutes in 1984-85, and bogus playoff rows.
Would distort: Per-minute rates and games played in 1982-85, and point totals in 1984-95.
Live box-score files for 15 games froze as partial in-game snapshots (minutes far below 240), and live files are not updated after official stat corrections.
Would distort: Minutes and games-missed reasons in those games.
Player box sums differ from the team box in about 40 team-games of 1996-2002 (steals, fouls, assists, blocks).
Would distort: Team totals rebuilt from player rows, in under 0.1% of team-games per stat.
Points differ from 2 x FGM + 3PM + FTM in 44 player-game rows from 1955-56 to 1963-64.
Would distort: Points before 1964, by a few.
Play-by-play3
Event-by-event game logs.
2019-20 play-by-play mixes two feed formats: substitutions do not balance in 221 games, only 12,053 of 16,200 steals carry a player, and 9 games are cut short.
Would distort: 2019-20 lineup ratings and any steal-based measure that season.
Small play-by-play gaps: 3 games absent, 4,820 padded action labels in 2000-01, 3 impossible shot distances (up to 1,640 ft), and 2 games one point short.
Would distort: Little beyond those games.
From 2025-26 most missed end-of-period heaves no longer count as player field-goal attempts, a league rule change that the play-by-play does not flag. Threes from 36 ft or more fell from 770 in 2024-25 to 100 in 2025-26.
Would distort: Three-point percentages and attempt counts that compare 2025-26 with earlier seasons, unless heaves are removed from every season.
Tracking dashboards13
NBA.com tracking: hustle, speed and distance, defended shots, passes, matchups (who guarded whom) and Hawk-Eye shot logs.
Catch-and-shoot and pull-up three-point makes and attempts are blank where the true value is zero.
Would distort: Shooting on those shots for 316 and 257 player-seasons, if blanks are treated as missing.
Corrupt tracking in three 2025-26 games: 39 regular-season player rows average above 6 mph, up to 22.6 mph.
Would distort: Season speed and distance for every player in those games.
The 2024-25 file of shots defended within 6 feet was served wrong on one day: 235 players had more attempts under 6 feet than under 10 feet (89,679 in all, against 71,396 two days later).
Would distort: Rim-protection numbers for 2024-25.
The 2015-16 regular-season hustle file covers 2 games but is served as a season. Box-outs and loose balls read 0 before 2017-18, when they were not tracked.
Would distort: Hustle rates in 2015-16, and box-out trends that treat untracked zeros as real.
Defended shot attempts sum to 108-112% of league attempts from 2017-18 to 2023-24, because several defenders share one shot.
Would distort: Defended-shot totals compared across seasons.
Tracking definitions changed in 2025-26: seconds per touch +34%, drives +49%, passes received per pass made from 1.000 to 0.883.
Would distort: Year-over-year drive, touch and possession comparisons into 2025-26.
Matchup data (who guarded whom) doubles partial possessions in 69 games, mostly late in 2018-19.
Would distort: Matchup possession counts, expected attempts and guarded-height averages.
Season tracking rows carry the player's latest team. 77 rows name a team he never played for that season.
Would distort: Team assignment and team-change flags.
The Hawk-Eye shot log returns 30 shots twice.
Would distort: Shot counts for the players involved.
Tracking files contradict themselves: play-type points per possession stored rounded in 18 files, rebound contest splits that do not sum to totals, and assists above potential assists on 102 rows.
Would distort: Shares and rates above 100% unless clipped.
The 2024-25 defended-threes dashboard serves a stale copy unless the request changes: 2-point plus 3-point attempts miss the total for 63% of players.
Would distort: Three-point defense for 2024-25.
Definitions changed without notice: 2024-25 playoff tracking already uses the 2025-26 definitions, and play-by-play shot distance reads 0 ft for most corner threes in the legacy feed.
Would distort: Any trend that pools playoff tracking or shot distance across the change.
The passes file includes players passing to themselves (34 rows per file), and bulk play-by-play has about 35 impossible shot coordinates.
Would distort: Pass totals and shot charts, slightly.
Synergy play types3
Offensive and defensive play-type tables.
2023-24 offensive tables have no rows for some high-usage players, and regular-season files drop rows under 10 possessions without saying so.
Would distort: Play-type shares and volumes, when a missing row is read as zero.
Defensive play types changed meaning in 2023-24: defensive possessions exceed offensive ones by 6-23%, and the ball-handler share jumped from 0.28 to 0.41.
Would distort: Defensive play-type trends across 2023-24.
2025-26 play-type files count about 4% fewer games than the box score.
Would distort: Play-type volume per game or per 36, 4-7% low.
Draft and combine6
Draft history, combine measurements and drills, public draft datasets.
The player file codes undrafted players as pick -1 or -22, and -22 also means "drafted, pick unknown" (1,323 players).
Would distort: Draft-slot studies: undrafted players read as top picks. One era table counted 933 player-seasons as No. 1 picks.
Combine max vertical changed protocol around 2013: max minus standing went from about 4-5 in to 5.5-6.75 in. 8 rows show max below standing.
Would distort: Leap percentiles pooled across eras.
Combine ids and measurements: 23 NBA players carry a non-NBA or wrong id, numeric and feet-inch fields disagree (one wingspan by 4 in), and 61 of 76 barefoot heights in 2007 are rounded down.
Would distort: Links from the combine to NBA careers, and 2007 height and length measures.
2010 ages are class-year values (off by up to 1.34 years), the international flag is empty for 2010-15, and unranked prospects are coded 0.
Would distort: Draft-age effects and international splits in draft studies.
From 2021, combine shooting drills are mislabelled: one spot holds the whole 25-shot spot-up drill, and one off-dribble field holds a 30-shot total.
Would distort: Drill shooting by spot and range.
Draft history disagrees with the player file on 2 rows: a draft year, and a 10th-round pick given as round 0, pick 0.
Would distort: Two 1950s draft records.
Contracts and transactions2
Contracts, salaries, options and transactions.
The 2013-14 team salary table is incomplete: 419 salaried players against 487 on rosters.
Would distort: Payroll and contract pricing for 2013-14.
Team contract pages omit some dead-money cap hits: 3 rows, $5.08M in 2026-27.
Would distort: Team payroll totals for 2026-27.
Player bios3
Birth dates, heights and player ids.
The player file holds 97 birth dates of 1900-01-01 and lists one player as 15 at his debut.
Would distort: Ages, aging curves and age at draft.
Six players carry a second player id that NBA.com does not use, which splits their careers (one has 466 games under the old id).
Would distort: Career totals and aging curves for those players.
Listed heights follow two standards: players who left before the league's 2019 re-measurement keep older in-shoes listings, about 0.65 in taller against combine measurements than players listed since.
Would distort: Any comparison that pools heights across 2019, such as height-based position groups.
College and international4
College (Barttorvik) and international league totals.
Birth dates of the form YYYY-10-15 are class-based placeholders: 28.7% of a draft comparison pool, median error 151 days, max 2.3 years.
Would distort: Age at draft for college prospects.
One player id covers unrelated players (12 ids). NBA.com's awards feed also gives one player another same-name player's award.
Would distort: College careers and award histories joined by player.
French league and Spanish ACB 2025-26 totals do not add up: points differ from the sum of 2-point, 3-point and free-throw points on 331 rows.
Would distort: Shooting splits and per-40 rates for players moving between those leagues and the NBA.
Still to do: 130 of 268 French league players still lack a usable 2-point split.
Per-game stats use a different game count from games played in 2008, 2015 and 2017-26. 15-20% of rows are off by more than 5%.
Would distort: Season totals rebuilt from per-game numbers, and college-to-NBA translations.
Third-party player ratings1
Public player-rating sets.
One rating column is about a month older than the panel's posting date, and the file carries no dates.
Would distort: Comparisons of public ratings on a fixed date.
Several sources2
Smaller defects spread across several providers.
Barttorvik stores some heights as "4-0" (48 in), and ESPN's final 2026 draft board has two tied overall ranks.
Would distort: Height comparisons for college players and draft-board rankings.
Further provider files that no part of the analysis reads carry their own defects, such as a 0-100 percentage scale in 2019 live box files.
Would distort: Nothing in this analysis; any study that reads those files.
Still to do: One newer study reads one of these columns; a check flags it.