Player comparisons
The player comparison places two player seasons side by side across 28 scored statistical categories, plus 9 more shown for context. Every category is plotted on a percentile bar, the raw numbers sit beside the bars, and a single summary number, the Avg. Percentile, sits at the bottom of the card. This page explains how that card is put together, focusing on the All view, which is where the whole philosophy is visible at once.
One number, no weights
The Avg. Percentile is the mean of a player's percentile across every scored category in the view, equally weighted. There is no proprietary formula behind it and no tuned coefficients. The only editorial decision is which categories belong in the set, and every one of them is printed on the card where you can see it.
Because it is an unweighted mean, the metric rewards breadth. A player who is excellent at many things outranks a player who is historically great at one thing and poor at several others. That is deliberate. Plenty of stats already crown the best scorer or the best rim protector. This one asks a different question: who is good at the most things?
Ranked within position
A naive version of this metric has a structural flaw: percentiles taken against the whole league measure position as much as play. A guard cannot be a top-tier rebounder however well they rebound, nor can they be a top tier rim protector. When we measured that version across a full season, players listed at center averaged roughly nine percentile points higher than guards and wings, purely from the category mix. Curating the stat list narrowed the gap but could not close it, because what survives any cut is irreducibly positional: block rate, rebound rates and rim protection favour bigs by 35-40 percentile points, however the list is trimmed.
So 13 categories are graded mainly within position group: 75% of the percentile is the player's standing among their group (guards and wings against each other, power forwards and centers against each other), and 25% is their standing across the whole league. These rows carry a dagger † on the card. The test for inclusion is whether position decides the opportunity rather than the skill. Rebounding, rim protection, assist and steal rates all qualify.
The 75/25 blend exists because both a pure positional percentile and a pure league-wide percentile answers are wrong. Grading entirely within position erases genuinely elite production: a big who out-rebounds every wing in the league earns nothing for it, because he is only ever measured against other bigs. Grading entirely league-wide measures position as much as play. Keeping a quarter of the league-wide standing preserves credit for absolute production while the positional share does the balancing, and we measured the split rather than guessed it: 75/25 is where the gap between bigs and everyone else lands closest to level.
Two rules keep the daggered set honest. First, both directions move together. Neutralising only the big-favouring categories does not remove the bias, it hands the same advantage to guards, so assist and steal categories are position-ranked right alongside rebounding and blocks. Second, a counting stat travels with its rate: position-ranking rebound percentage while leaving rebounds per game league-wide would only half-fix rebounding.
Positional groupings
Players are placed into groups structurally, not by the position printed on a roster. A player with enough starts is classified by the lineup slot the official scorer records. Bench players lack these positional designations and are instead classified from structural signals: who they share the floor with, where they rank by height within their own lineups, and their defensive workload. When those signals do not agree confidently, the classifier abstains and the player keeps the league-wide comparison, with a footnote on the card saying so. An honest league-wide number beats a confident wrong grouping.
Role-based stats
Some stat rows describe how a player plays rather than how well. Three-point attempt rate is the clearest case: a high or low number is a shot diet, not a skill. Usage %, minutes, pass % and free throw rate sit in the same family. Some stats such as contest volume and rebound conversion % are interesting to compare but skew too heavily towards bigs.
These rows carry an asterisk *, appear on the card for context, and are excluded from the Avg. Percentile calculation. They are never assigned a winner but we do show the diff between the two players for reference.
The moments that decide games
Most of the set is a full-season aggregate, which is blind to when production happens. High-leverage points created takes a player's own points plus the points they set up with assists, inside high leverage only, per 36 high-leverage minutes. Between them they give the players who raise their level in close games a place in the average that full-season numbers cannot.
Reading the card
Three marks appear on the card, and where a mark sits tells you what it is a property of. Marks on the stat label describe the stat; the mark on a value describes that one player.
| Mark | Meaning |
|---|---|
| * | Role stat, shown for context but never scored. |
| † | Percentile weighted 75% toward the player's position group, 25% toward the whole league. |
| ‡ | This player misses the stat's qualifier, so their rank is estimated by placing their value into the qualified field. |
Each percentile bar's tooltip shows its working. A daggered row states both component placings, the rank among the player's position group and the rank across the whole league, alongside the blended figure the bar draws; an unblended row names the single field it was taken within.
What the data covers
- Box score and play-by-play categories, including points created, cover every season we hold in both leagues.
- Charges drawn requires modern play-by-play foul detail. Available from 2020-21 in the NBA and 2022 in the WNBA.
- The tracking rows (deflections, contested shots, rim defense, pass share, rebound conversion) come from the NBA player-tracking feed, which has no WNBA equivalent.
- A category where neither player has a value is simply not shown, so a comparison never renders empty rows.