← Back to portfolio

Holes in the Defense: A Geometric Currency for Basketball Advantage

By Luke Blommesteyn • Built on the SkillCorner open ACB tracking release • Code, paper and resultsInteractive replay

This is the web version of a longer write-up. Same model, same numbers, less throat-clearing. If you want the PDF with every table, it's in the repo.

The thing coaches see that the box score can't

Watch a pick-and-roll from behind the play and what you see is not a pass or a shot. You see a defender a step late, a big who stepped up to show and left the paint behind him, and for about a second the entire strong side of the floor belonging to the offense. Then the help arrives, the corner defender sinks, and the space closes. Sometimes the ball gets there first. Usually it doesn't.

That second is what coaches mean by advantage. Every offensive action is an attempt to create it, and every defensive rotation is an attempt to repair it. The play-by-play records only the endpoint. So I wanted to know: can you measure the space itself, as a number, every fifth of a second, and does that number behave the way basketball says it should?

SkillCorner published ten Liga ACB games of broadcast tracking: every player and the ball at 25 Hz, each position carrying its own expected error, plus a marked play-by-play with picks, off-ball screens, handoffs, drives, isolations, closeouts and who was guarding whom. That is enough to build the field and, more importantly, enough to test it.

Five court panels showing the exploitable-space field opening after an on-ball screen, with the A(t) trace underneath
An on-ball screen on the right wing. Bright is space the offense will reach first and would score from. Within a second the whole strong side above the arc belongs to the offense; A goes from 253 to 571, and the defense never gets it back before the shot.

What an "empty hole" is

Here is the whole model in three steps.

1. Who gets there first. For every player and every square foot of the offensive half court, estimate the time to arrive: keep going at your current velocity for a 0.2 s reaction time, then accelerate toward the spot at up to 20 ft/s² and cap at 20 ft/s (both fitted from the tracking; a player running the wrong way has to stop first). Treat that time as uncertain, with a floor of 0.15 s for indecision, an extra term from SkillCorner's stated position error (inflated for extrapolated players), and a term that grows with distance. Then compute the probability that the first offensive player arrives before the first defender. With Gaussian arrival times that has a closed form (Clark's recursion for the minimum of Gaussians), which I checked against Monte Carlo on real frames: mean absolute error 0.016 in probability.

2. What the spot is worth. Multiply by the expected points of an open shot from there: a smooth map fitted on open and lightly-contested shots from the other nine games, shrunk toward a simple parametric shape where data are thin. Rim about 1.35, mid-range 0.85, corner three a bit over 1.

3. Add it up. The exploitable-space measure \(A\) is the integral of that field over the cells worth at least half a point:

The field and the measure

\[ H(q,t) = \underbrace{P\big(\min_{i\in O} T_i(q,t) < \min_{j\in D} T_j(q,t)\big)}_{\text{offense reaches } q \text{ first}} \times \underbrace{V(q)}_{\text{open-shot value}}, \qquad A(t) = \int \max\big(0,\,H(q,t)-0.5\big)\,dq. \]

Units are ft²·points. A typical half-court frame sits around 250-300.

Then one split that turned out to matter. Every cell that counts toward \(A\) is either within 5 ft of an offensive player or it isn't. The first kind is an open player: a shooter standing in the corner with nobody near him. The second kind is an empty hole: valuable space nobody is standing in, but which an attacker who cut or drove there would reach before any defender. An empty hole is the geometric footprint of a defender being out of position. An open player is a player being open. They are different things, and the actions that create them are different.

Two simpler models ride along as baselines everywhere: plain Euclidean Voronoi (nearest body wins, no velocity, no uncertainty) and the same kinematic arrival times without the uncertainty (deterministic winner). The whole point of the exercise was to find out whether the probabilistic version earns its complexity.

Six panels: three control models on one frame (Voronoi, kinematic, probabilistic) and two value maps with the resulting field
One frame, three control models (top) and the two value maps plus their product (bottom). Voronoi and kinematic control are hard partitions; the probabilistic field is soft where players are close, fast, or badly tracked.

You can scrub through eight possessions yourself, with the empty-holes-only view, in the interactive replay.

Does it move the way basketball says?

For every marked action in the ten games I took the mean of \(A\) over the 1.5 s after the action minus the mean over the second before it, and did the same for 1,350 random no-action moments (at least a second from any marked event). \(A\) drifts upward by about 11 units on its own as the shot clock runs down, so the number to read is the excess over that null.

ActionnΔA over nullP(ΔA > 0)empty-hole partopen-player part
Pick (on-ball screen)1,196+49.80.84+43.5+6.2
Drive512+44.20.80+40.0+4.2
Off-ball screen838+11.70.63+12.4−0.7
Isolation146+9.20.56+6.0+3.2
Handoff325+7.90.61+9.1−1.2
Pass2,676−8.20.50−7.4−0.7
Closeout (defensive)453−15.60.46−11.8−3.8
No action (null)1,35200.55

Picks and drives are significant at \(p<10^{-30}\); off-ball screens, closeouts and passes at \(p<10^{-3}\); handoffs and isolations are not (Mann-Whitney against the null).

Three things I did not put in by hand. The ordering is the one a coach would give: screens and drives create advantage, off-ball actions create less, and the one defensive action in the data, the closeout, is the only thing that destroys it. Almost everything a pick or a drive creates shows up as empty holes rather than as open players; the measure is seeing the defense get pulled out of shape, not just a man getting free. And a pass, on average, loses a little: the ball is in the air and the defense uses the flight time. Passes cash advantage in; they don't make it.

Mean change in A around each action kind for the probabilistic field, the Voronoi field, and the ball-handler's nearest-defender distance
Mean \(A(t)\) around each action, baseline-subtracted. Left: the probabilistic field. Middle: the same thing on Voronoi control, where the closeout curve (dark) goes up. Right: the nearest-defender distance to the ball handler, which barely notices anything except the closeout itself.

The baselines get the closeout backwards

This is the result I care most about. On Euclidean Voronoi the closeout scores +23 over the null. A defender sprinting at the ball handler gives up the Voronoi cells behind him, so the area measure reads a defensive recovery as an offensive gain. Voronoi also scores handoffs at −20. The ball handler's nearest-defender distance moves less than 4 ft for any action. The offensive convex hull shrinks on drives and picks. Only the two models that know about motion recover the basketball ordering, and only the probabilistic one keeps the sign of every action right.

Measure (excess over null)PickDriveOff-ballHandoffCloseoutPass
Probabilistic \(A\)+49.8+44.2+11.7+7.9−15.6−8.2
Kinematic \(A\)+70.8+60.3+4.1+5.3−14.9−14.8
Voronoi \(A\)+26.9+24.8+0.6−20.1+23.2+1.4
Handler nearest-defender distance (ft)+0.3−1.0+0.5+0.7+4.0+1.9
Offensive convex hull (ft²)−12−63+36+52+4+27

How fast the defense repairs it

After the post-action peak, \(A\) falls halfway back to its pre-action level in a median of 0.6 s for picks, drives, handoffs and off-ball screens. The defense fixes most holes fast. What differs is how often it can't: 68% of drive-created advantage is still there 3 s later, against 54% for picks, 54% for the null and 47% for closeouts. Drives are the action whose advantage most often outlives the reaction, which is why they end in shots.

Box plots of change in A, gain to peak, and half-life by action kind
Change in \(A\), gain to the post-action peak, and half-life by action.

One currency, every coverage

Because everything is scored on the same field, the SkillCorner coverage labels can be compared directly, and they line up with the coaching vocabulary without anything being tuned to make them.

ContextnΔA over null
Pick, handler defended over the screen775+58.6
Pick, defense switches168+35.7
Pick, handler defended under219+29.4
Pick, screener's man shows485+58.0
Pick, screener's man drops504+46.6
Pick at the step-up / middle / wing154 / 734 / 288+64.6 / +55.5 / +27.3
Off-ball screen, cutter trailed441+18.6
Off-ball screen, cutter whipped (defender beats him through)319+0.7
Off-ball screen, screener's man shows / drops47 / 594+49.9 / +9.2
Drive created by a pick / by an isolation260 / 62+49.8 / +20.3
Pass under 12 ft / 20-30 ft / over 30 ft (skip)642 / 650 / 133+2.4 / −19.2 / −21.6
Closeout followed by a shot / by a pass215 / 83−12.2 / −22.8

Switching or going under costs the offense about 25 units relative to a defender who fights over. A show leaves the paint and concedes more than a drop. A step-up screen in the middle of the floor is the most productive on-ball action in the data; a wing screen creates less than half as much. A whipped off-ball screen creates nothing.

And then the skip pass, which coaches love precisely because it exploits a hole, comes out negative. That is an honest limitation of a field that values space rather than ball position: the skip pass doesn't create a new hole, it moves the ball into one that already exists, and the flight time lets the defense move. Here is what that looks like.

A skip pass into a weak-side hole that was already bright before the pass
A skip pass exploiting a hole. The weak-side wing is bright before the ball is thrown; the pass moves the ball into it and \(A\) rises only modestly (329 to 459). The advantage was made earlier, the pass cashes it.

Does the number predict anything?

Pretty pictures are cheap. The real test is whether \(A\) knows something a model with the ball location, the defender distances, the convex hulls and the Voronoi areas does not. So: from every half-court frame, predict what happens in the next 3 s of the same possession, training on nine games and testing on the tenth, ten times over. No random splitting of neighbouring frames, which would leak like a sieve.

Next 3 s (logistic, AUC)rateball onlybaseline (16 spacing / defender features)+ Voronoi+ kinematic+ probabilistic
Any shot0.240.6600.7220.7310.7410.766
Open / lightly contested shot0.060.6060.6990.7120.7230.740
Shot at the rim0.080.7240.7750.7760.7850.797
Assist opportunity0.110.5390.6060.6150.6170.651
Paint touch0.140.5230.5780.5830.5850.617
Blow-by0.020.5990.6190.6070.6280.615

With a linear model the gain is monotone in model sophistication for every target but blow-bys: Voronoi adds a little, kinematic more, probabilistic most, +0.04 AUC on shots and open shots and +0.045 on assist opportunities and paint touches. The field's own summaries, with no ball or defender information at all, predict a shot in the next 3 s at 0.69.

Gradient boosting narrows the gap, as it should; with enough trees it can rebuild spatial structure from raw coordinates. Even so the field survives on the two targets that are most about space: blow-bys (0.599 to 0.614 AUC) and the SkillCorner quality grade of the next shot (\(R^2\) 0.166 to 0.200, Voronoi 0.181), and nothing gets worse. Adding the one-second change in \(A\) on top of its level adds nothing; the level is what carries the information.

Two negatives belong in the record. Nothing predicts the points the possession ends with from a single frame (\(R^2 < 0.005\) for every feature set); the next three seconds are geometric, the end of the possession is not. And within an action kind, the advantage an action creates does not predict the points scored on that possession either. Creating advantage and using it are different skills, and this field only measures the first.

Bar chart of leave-one-game-out AUC and R-squared by feature set and target
Leave-one-game-out prediction of the next 3 s, gradient boosting, by feature set.

Possessions, one at a time

The examples were chosen by a rule, not by me: clean tracking (no more than one extrapolated player), gain between the 85th and 97th percentile for the action kind, distinct possessions. Dotted circles are the 5 ft occupancy radius; the white line is the \(H = 0.5\) contour. Bright space outside every dotted circle is an empty hole.

A drive from the top collapsing the defense and opening the weak side
A drive collapses the defense and moves the hole. The drive from the top pulls three defenders into the lane; the space that opens is the weak-side wing and corner, away from the ball (\(A\): 163 to 498).
A closeout erasing the bright region around a shooter on the right wing
A closeout repairs a hole. The catch on the right wing meets a sprinting defender and the bright region around the shooter disappears within a second (\(A\): 474 to 213). The grey Voronoi trace underneath barely moves.
A made contested pull-up with a low, flat A trace
Two points, no geometry. A contested pull-up that went in; \(A\) is low and flat through the whole possession.
An off-ball screen that opens the weak side but is never used
Big geometry, no box score. An off-ball screen opens the corner and wing (\(A\): 112 to 315); the ball never goes there.

Holes as objects

If you take every connected region of \(H > 0.5\) that is more than 5 ft from every attacker and link them frame to frame, you get 15,795 holes across the ten games. Most die fast: median lifetime 0.6 s, mean 2.0 s. Only 8% are ever entered by the ball. But use is concentrated where you'd hope: holes that survive 2.4 s get used 30% of the time, holes in the top mass tercile 24%, holes that live under 1.2 s essentially never. Holes born after an off-ball screen (mean 1.5 s) or a handoff (1.4 s) live longer than those born after a drive (0.7 s). Off-ball actions open space that is waiting; drives open space that is closing.

What it took to break it

For 1,010 event windows I recomputed everything under 24 alternative configurations. Resampling every position from its own stated tracking error, and varying every constant in the movement model, the threshold and the grid, keeps per-event changes correlated above 0.96 with the reference and the action ranking at or near 1.0. The only choices that matter are the two that should: the value map (parametric vs. empirical, correlation 0.86) and the control model. Swap in kinematic and the correlation drops to 0.80; swap in Voronoi and it drops to 0.39 and the closeout flips sign.

Horizontal bar chart of correlation with the reference run under each modelling perturbation
Robustness of the level of \(A\), of per-event \(\Delta A\), and of the action ranking to each modelling choice.

What it does not do

Conclusion

A basketball possession can be written as the creation, movement and closure of valuable holes in the defense, and that description can be computed from broadcast tracking with a model you can explain in a paragraph. The resulting number rises after the actions coaches call advantage-creating, almost entirely in space nobody is standing in yet; falls after the one defensive action in the data; separates coverages the way the coaching vocabulary does; predicts the next three seconds better than ball position, defender distance, convex hulls and Voronoi area; and survives being kicked. The Voronoi diagram it replaces gets the sign of a closeout wrong.

What it can't yet do is tell the offense which hole to use. That's the next thing: a passing model on top of the field, so a skip pass into an open corner gets credit for what it exploits instead of a debit for how long it took.

Reproduce it

Everything is in a fork of SkillCorner's release under analysis/: the library, the eight pipeline stages, the results tables, the paper, and the replay. Stage 1 takes about four minutes a game; the rest is minutes. Courts are drawn with mplbasketball; the FIBA half court it draws coincides with the tracking frame to within 0.05 ft, which is a nice thing to be able to check.

Open the interactive replay →