Interior Dominance — Shaq Factor
SHAQ FACTOR: a single number (0-100) that captures a player’s OFFENSIVE INTERIOR DOMINANCE.
Read the formula →Close your eyes and visualize prime Shaq. What do you imagine? Celebrating one of his dominant performances with the Lakers in the finals? A preposterously sized man carrying half the New Jersey Nets to the hoop? An anxious trip to the foul line, sweat dripping into his eyes as he lines up for another clank? A surprisingly soft touch on hooks around the paint? Gathering in offensive rebounds by the dozen?
These are all Shaq, anecdotally, and they are lenses on the most physically dominant player of the full-data (post 1997) era1. A bull in the china shop of a player - lives at the rim, goes through (rather than around) defenders, and converts the paint into their sovereign territory. The Institute can now exclusively release the data that backs up this claim, but also casts some interesting light on it.
Note: all data is post-1997 — the shot data required for populating the formula is lacking prior to then.
The Top of the Index
Top 30 player-seasons by shaq_factor. Each row is a single season. Traded players appear under their primary stint.
The Lopez Arc
Brook Lopez is a fascinating illustration in year-over-year shaq_factor. Across sixteen seasons he travelled most of the index — classic low-block operator into his late twenties, then a complete reformation into a Mike Budenholzer floor-spacing big. When you visualize Brook Lopez now, it isn’t a mammoth human clearing space in the post, it’s setting his feet for a trailing three.
The dashed line is the league-wide qualifying-player average. Interestingly, league-wide shaq_factor is a near-constant, year over year.
Two Low Block Artists, Then Everybody
shaq_factor was, for nineteen consecutive seasons, the domain of exactly whom you would think. From 1996–97 through 2014–15, the same two men held the #1 slot — Shaquille O’Neal for the first ten, Dwight Howard for the next nine. Beginning 2015–16, however, the index broke into a roll call: DeAndre, Gobert, Drummond, Giannis, Zion. Is this the result of the decline of the singular paint-bully and the rise of the league’s deepest ever interior-finisher rotation? The league lacking a generational athletic marvel? Better overall shooting? More specialization? The data is clear, but the conclusion is not.
Read the formula
shaq_factor is a composite of four z-scored components, blended at 0.25 / 0.20 / 0.30 / 0.25 weights and squashed through a sigmoid into a 0–100 scale. The component identities:
- shot dietWhen this player shoots, what shape are those shots? A weighted blend of rim and paint-non-restricted-area frequency, with rim attempts carrying a 1.25× premium over hooks and post-up jumpers. Dunks are layered on as a small additional signal.
weighted_interior_freq = 1.25 × rim_freq + 1.00 × paint_freq shot_diet_z = 0.75 × (weighted_interior_freq − 0.50) / 0.20 + 0.10 × (dunk_rate − 0.10) / 0.10 - interior volumeNot just rate, but absolute volume. A high-frequency rim diet on six attempts a game is one thing; the same diet on eighteen attempts is Shaq territory. Anchored to 8 weighted interior attempts/game = league mean rotation big.
weighted_interior_apg = weighted_interior_freq × fga_per_game interior_volume_z = (weighted_interior_apg − 8.0) / 4.0
- fouls drawnFree throw drawing rate (FTA per FGA + FTA correction) and per-game free throw volume, in a 60/40 blend. Drawing fouls in the paint is the mechanical signature of physical inevitability — demonstrating when defenders have run out of legal options3.
ft_drawing_rate = fta / (fga + 0.44 × fta) foul_z = 0.60 × (ft_drawing_rate − 0.30) / 0.15 + 0.40 × (fta_per_game − 5.0) / 3.0 - finishingField goal percentage, offensive rebounds per game, and offensive charges drawn per 36 minutes. The chaos that happens after the move: the ball goes in, the rebound comes back, the defender flops.
finish_z = 0.35 × (fg_pct − 0.50) / 0.10 + 0.45 × (oreb_per_game − 2.5) / 1.5 + 0.20 × (off_charges_per_36 − 0.10) / 0.05
Notable absences: there is no stretch penalty. A center who shoots threes is not less Shaq-shaped on the possessions where they do go down to the block; they’re just doing fewer of those possessions. The volume signal captures that naturally. Jokić landing in the high 70s while still often spotting up on the perimeter is a feature, not a bug.
Weight is also not a signal. We are deliberately not rewarding players for being heavy. An undersized energy big who lives at the rim and draws contact (Kenneth Faried, Jonas Valančiūnas off the bench) should land high. A 7′2″, 240-pound center4 who plays outside-in should not.
Coverage starts at 1996–97. The composite is shot-events derived; pre-1997 player-seasons have no shot location data, so shaq_factor renders as “—” rather than a guess, per the Institute’s standing policy.
Weighted blend of the four z-scores, then squashed through a sigmoid to a 0–100 scale. Weights sum to 1.0; the sigmoid steepness k = 0.8 keeps elite seasons in the 80s–90s without saturation.
shaq_z = 0.25 × shot_diet_z + 0.20 × interior_volume_z
+ 0.30 × foul_z + 0.25 × finish_z
base = 100 / (1 + exp(−0.8 × shaq_z))When league-tracked paint and post touches are available, a smooth-gated additive bonus credits players who actually operate in those zones. This separates high-volume rim-runners from genuine low-block operators. Pre-tracking seasons skip this enhancement, and use base alone.
rim_factor = smooth ramp on weighted_interior_freq
0 at 0.50 → 1.0 at 0.80
paint_bonus = max(0, paint_touches_per_game − 5.0) × 0.8
post_bonus = max(0, post_touches_per_game − 1.5) × 0.6
interior_bonus = min(8, (paint_bonus + post_bonus) × rim_factor)
shaq_factor = clamp(base + interior_bonus, 0, 100)Footnotes
With apologies to Chris Dudley. ↩
Setting aside when he was rehabbing on company time. ↩
There is likely some noise around this stat with bigs who were catastrophically poor free throw shooters, but also — what’s more Shaq than going 0 for 2 but going back into the post on the next possession anyway? ↩
Also not factored in — whether or not the player is Latvian. ↩