Basketball Data Science All studies Scouting one-pagers Code on GitHub
7.5M frames of raw SportVU

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
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 made three, Canaan for PHI, PHI at LAL, January 1, 2016: the ball is in the air 3.1 s before the play-by-play stampCanaan's three for PHI, PHI at LAL, January 1, 2016, Q1 6:50Time runs left to right, in seconds before the moment the play-by-play logs the shot.Who the tracking says has the ballPHILALblank: no one within reach of the ballBall height10 ftshot at its peakLAL has itplay-by-play stampWhat each join samples: a 2 s window, named for the team with the ball mostat the stamp: LAL (wrong)1 s before: LAL (wrong)calibrated, 5.5 s before: PHI (right)876543210seconds before the stamp
One made three, Canaan for PHI, PHI at LAL, January 1, 2016: the ball is in the air 3.1 s before the play-by-play stampCanaan's three for PHI, PHI at LAL, January1, 2016, Q1 6:50Time runs left to right, in seconds before themoment the play-by-play logs the shot.Who the tracking says has the ballPHILALblank: no one within reach of the ballBall height10 ftshot at its peakLAL has itplay-by-play stampWhat each join samples: a 2 s window, named forthe team with the ball mostat the stamp: LAL (wrong)1 s before: LAL (wrong)calibrated, 5.5 s before: PHI (right)86420seconds before the stamp
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 against how far before the stamp the window sits: 24% to 48% at the stamp, each game's best between 2.5 and 6 sMove the window earlier, one half second at a timeEach line is one game: the share of its shots whose window names the shooting team. Dots: thelead the calibration chose for that game.range of chosen leads0%25%50%75%100%PHI at LAL: 24.4%012345678seconds before the stamp where the window starts, in 0.5 s steps
Shot agreement against how far before the stamp the window sits: 24% to 48% at the stamp, each game's best between 2.5 and 6 sMove the window earlier, one half second ata timeEach line is one game: the share of its shotswhose window names the shooting team. Dots: thelead the calibration chose for that game.range of chosen leads0%25%50%75%100%PHI at LAL: 24.4%02468seconds before the stamp where the window starts,in 0.5 s steps
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.

Spacing is the area of the offense's five-player hull: 318 sq ft against 791 sq ft in two real framesSpacing: the area inside the five attackersStretch a band around the five players on offense; spacing is the floor area inside it, insquare feet.Tight: 318 sq ftQ1 (tightest) shots average 313 sq ftWide: 791 sq ftQ4 (widest) shots average 799 sq ftoffensedefenseballrimEach frame is drawn with the basket the offense attacks at the bottom.
Spacing is the area of the offense's five-player hull: 318 sq ft against 791 sq ft in two real framesSpacing: the area inside the five attackersStretch a band around the five players on offense;spacing is the floor area inside it, in squarefeet.Tight: 318 sq ftQ1 (tightest) shots average 313 sq ftWide: 791 sq ftQ4 (widest) shots average 799 sq ftoffensedefenseballrimEach frame is drawn with the basket the offenseattacks at the bottom.
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.