Seven and a half million frames, and the clock trap hiding inside them
Optical tracking is the richest basketball data there is: x and y for all
ten players (and z for the ball), twenty-five times a second. It is also
the least forgiving. This study works with the raw 2015-16 SportVU feed
(7.5 million de-duplicated frames across ten games), and its most valuable
finding is not a basketball result at all. It is a data trap that would
have quietly fabricated a basketball result, and the calibration that
defused it.
Terms used in this analysis
SportVU: The NBA's 2013-16 optical tracking system: x,y for all ten players (plus z for the ball) at 25 frames per second.
Scorer's-table lag
4 s
One offset for every game: shifting the join 4 seconds earlier lifts agreement to 96.6%.
Join agreement
24% → 97.6%
Worst-game naive join versus the calibrated join on 1,621 shot events.
The phantom gradient
42% → 53%
The clean spacing-helps-shooting story the uncalibrated join invents. The honest chart is nearly flat.
Sample
7.5M
De-duplicated SportVU frames across ten games, 25 per second.
The license to speak
First, the coordinates reproduce the league's own numbers
Start with the part that builds trust. Before asking the tracking data
anything new, the pipeline asks it something the NBA has already answered:
how far do players run? Distance covered, recomputed frame-by-frame from
raw coordinates, reproduces the league's published player-tracking
aggregates. That check has to come first, because every claim downstream
rides on the coordinates being what they say they are.
Correction, October 19, 2026. A per-game check against the NBA's own
tracking box score found two of the ten games missing stretches of game
clock, up to 43 seconds at the start of a period, so their players'
distances came out short. The workload numbers and this chart now use the
other eight games. The match with the league held with or without them.
Distance covered per game, recomputed from raw frames against the NBA's published aggregates. This figure earns the study its license to say anything else: if the reconstruction disagreed with the league's own numbers, nothing downstream would be worth reading.
The trap
The scorer's clock lies, and it lies differently every game
The interesting work begins when tracking meets play-by-play, because
that join is what turns anonymous coordinates into possessions: who had
the ball, which direction they were attacking, what happened next. The
naive join matches each play-by-play event to the tracking frame with the
same game clock. On the worst of the ten games, that naive join agreed
with a possession-direction heuristic just 24% of the time: worse than a
coin flip, on a binary label.
One real made three, from the game whose same-clock join agrees least. The ball is at the top of its arc well before the play-by-play logs the shot, and by the stamp the other team has the ball. A window placed at the stamp, or one second before it, names the wrong team; the window this game's calibration chose sits inside the shooting team's possession.
The cause was not the heuristic. Play-by-play clocks trail the tracking
clock by several seconds: a human at the scorer's table logs each event
after it happens, so an uncorrected join lands events inside the next
possession. Moving the join earlier fixes it. One offset of 4 seconds for
every game lifts shot agreement to 96.6%. Choosing each game's best offset
on shots only, then scoring turnovers as a held-out check, reaches 97.6% on
1,621 shot events and 94.0% on the 232 held-out turnovers.
Those per-game offsets, 2.5 to 6.0 seconds, are not precise measurements of
each arena's delay. In every game, agreement stays within 2 points of its
best across a band of offsets at least 1.5 seconds wide, so the chosen
offset is the top of a broad stretch, not a sharp peak.
Shot agreement for every game as the window moves earlier, half a second at a time. At the stamp, agreement is below half in every game. It climbs steeply, then levels off, so each game's chosen lead (dots) is the highest point of a broad, nearly flat stretch rather than a sharp peak.
The payoff
Spacing changes the shots taken, not the shooting
Here is why that matters beyond hygiene, and why the third figure is the
one to linger on. With calibrated windows, effective field-goal percentage
across floor-spacing quartiles is nearly flat (50.0%, 45.0%, 45.7%, 47.2%
from tightest to widest), while the share of threes rises steadily (23.5%
to 29.8%). In this sample, spacing changes what shots are taken more than
it changes raw efficiency. But run the same analysis with the naive,
uncalibrated join and you get a publication-ready "wider spacing = better
shooting" rise from 42% to 53%: entirely an
artifact of sampling the floor at the wrong moment. A junior analyst
would have shipped it; a coaching staff might have acted on it.
Spacing here is one measured quantity: the floor area the five attackers enclose.
What the spacing number measures, on two real frames from the same game: the area inside a band stretched around the five players on offense. The left frame sits near the average of the tightest quarter of shots, the right one near the widest quarter.Shooting efficiency by spacing quartile, with spacing measured two ways. Blue: the calibrated join, nearly flat. Gray: the naive join, which samples the floor one second before the logged clock and shows a rise from 42% to 53% that is an artifact. One figure, two joins, opposite conclusions: the argument for clock calibration in a single image.The distribution of team spacing across all frames: the raw material behind the quartile analysis, and the context for how much (or little) spacing actually varies possession to possession.
The modern era
Today's teams cover about 6% more ground
One more thing keeps the study connected to the present. The raw frames
stop in 2015-16, but the league still publishes vendor-computed tracking
aggregates every season. The same pipeline discipline extends to them:
thirteen seasons of official distance and speed, 2013-14 through
2025-26, harvested at player and team level. A reconciliation gate holds
the two tables together, and they agree to about one part in a hundred
thousand, every season.
How far a team runs per game, every season of the tracking era. This figure is what keeps a decade-old raw sample honest: today's teams cover about 6% more ground than in 2015-16, and 2025-26 is the fastest season on record by average speed. Any workload claim built on the raw frames needs this context, and now it is measured rather than assumed.
The boundary, and the lesson
Ten games can't crown a conclusion. The discipline transfers anyway.
The study's honest boundary: ten games is a workload-and-methods sample,
not a league conclusion. And 2015-16 is old data by choice of the league,
not of this study. The NBA has released no raw tracking since these
SportVU logs briefly went public; the Second Spectrum and Hawk-Eye feeds
that followed are private. This archive is the only raw tracking anyone
outside a team building can work with. The family's data-provenance page documents
the timeline. What transfers is the discipline: validate against published
aggregates before trusting coordinates, calibrate clocks before joining
sources, and hold out an event type the calibration never saw. The
spacing-gradient artifact is this family's standing exhibit for why.
The next study planned for this family builds on the modern
broadcast-video datasets (SportsMOT, DeepSportRadar and kin):
pseudo-tracking from footage, error-quantified against the real thing.
The design is already written (README, section 8); the build is next.
Method, code, and verification
The full technical write-up (data provenance, model specification, validation gates, and stated limitations) is the README. The analysis is implemented independently in R and Python and reconciled to numeric tolerance; run_checks.sh replays every gate.