Search

Find a player or page

How z-scores and value work

Every number in the rankings, trade analyzer and box scores comes from the same idea: measure each of the nine categories on one common scale, then average them.

What a z-score is

Points and steals can't be compared directly. Five points a game above average is good; one steal a game above average is elite. A z-score fixes that by asking how unusual a number is: how many standard deviations it sits above or below the average.

z = (player's stat − average) ÷ standard deviation

A z-score of 0 is exactly average, +1 is a strong contributor, and +2 or more is elite. Negative scores hurt your team in that category. Because every category is on the same scale, they can be added together.

Who players are compared against

Averaging over every player in the league would compare starters against deep bench players nobody rosters, making everyone look good. Instead, the average and spread come from the top 156 players — roughly everyone rostered in a 12-team league with 13 roster spots. Finding them takes a few passes:

  1. Score every player against everyone who has played.
  2. Take the top 156 by value, and score every player again against just those 156.
  3. Rescoring can shuffle players near the cutoff in or out of the top 156, so repeat step 2 until the top 156 stops changing.

The final pass is what you see. This is the same approach Basketball Monster takes. Every category, including FG% and FT%, is measured against this one sample. The sample is rebuilt for each time frame and measure, so a past-week ranking compares players against the best players of that week.

Counting categories

3PM, PTS, REB, AST, STL and BLK use the formula above directly, with the sample's average and standard deviation for that category.

Turnovers work the same way with the sign flipped, since fewer is better. A player who turns it over more than average gets a negative TO score.

z(TO) = −(player's TO − average) ÷ standard deviation

FG% and FT%

Percentages need volume. A center shooting 70% on 3 attempts a game barely moves your team's FG%, while a star shooting 55% on 20 attempts moves it a lot. So instead of scoring the percentage itself, each player gets an impact: how many makes above or below league average they add per game.

impact = (player's FG% − league FG%) × FGA per game

League FG% is the sample's total makes divided by its total attempts. Impact is then turned into a z-score against the sample's average and spread of impact, just like a counting stat. FT% works the same way with free throws.

z(FG%) = (impact − average impact) ÷ standard deviation

Value

A player's value is the average of their nine z-scores.

value = (sum of the 9 z-scores) ÷ 9

Players are ranked by it, best first. Because the averages come from rostered players, their values average out near 0: roughly +0.5 is a top-10 player, and only the very best reach +1.

Worked example: Luka Dončić

Luka Dončić is the top-ranked player of the 26-27 season per game. Here is where each of their z-scores comes from, against this season's top 156 players. Figures are rounded, so recomputing by hand can be off by a few hundredths.

CategoryLuka DončićSample avgStd devZ-score
3PM5.781.731.093.72
PTS40.1115.926.173.92
REB7.785.632.390.90
AST7.673.592.052.00
STL1.671.150.540.97
BLK0.670.670.600.00
TO4.891.930.96-3.07
CategoryLuka DončićLeagueAttemptsImpactAvgStd devZ-score
FG%.498.47324.6 FGA+0.610.020.830.71
FT%.873.80011.3 FTA+0.820.010.392.11

Taking FG% step by step:

impact = (.498 − .473) × 24.6 = +0.61
z = (0.61 − 0.02) ÷ 0.83 = 0.71

Then the nine z-scores are averaged:

value = 11.26 ÷ 9 = 1.25

See their full line in the player page or compare them with everyone else in the rankings.

Measures

The rankings can measure stats three ways, and the sample is rebuilt for each:

Punting and dropping categories

Punting ignores categories you've decided not to compete in. Value becomes the average of the z-scores you keep: punting FT% and TO averages the other seven.

Minus 1–3 drops each player's worst categories, whichever they are, and averages the rest. It shows how good a player is if you build around their weaknesses.

The z-scores themselves don't change, only which ones are averaged.

Trades and box scores

The trade analyzer adds up each side's per-game z-scores and values, so the net tells you how much value changes hands in each category.

The box score generator scores a single game against the per-game averages and spreads of the season's top 156 players, so a game's value shows how it compares to a typical night from a rostered player.