SGA probably scored 30 points tonight. And you probably already knew that.

The Outlier finds the most statistically UNUSUAL individual and team performances in every NBA game.

Every performance gets a single number: the OutScore. The higher the OutScore, the more unusual the performance was relative to both the player's own history and the league as a whole.

The OutScore Formula

Each stat in each game generates two z-scores, which are averaged equally, then multiplied by a normalization weight:

50%
Personal Z-Score
How unusual was this relative to their own season average?
(actual − player_avg) / player_std
+
50%
League Z-Score
How unusual was this relative to the whole league?
(actual − league_avg) / league_std

This blend rewards performances that are unusual both for the individual and for the league. The normalization weights ensure every stat competes on equal footing — a historic blocks game, a 60-point night, and an elite efficiency performance all have a fair shot at the top.

👤 Players

Personal z-score vs. their own season averages. League z-score vs. all players league-wide for that stat.

🏀 Teams

Team z-score vs. the team's own season averages. League z-score vs. all teams league-wide for that stat.

How It Works

1
Game logs are collected after every game Player and team box score stats are pulled from the NBA Stats API and stored in a database.
2
Season averages and standard deviations are computed For every player and team, we compute their mean and std dev for each tracked stat across all games played so far this season.
3
League-wide baselines are computed Separately, we compute the mean and std dev for each stat across all players (or all teams) in the league — giving us a league-wide context for every number.
4
Two z-scores are blended into one OutScore Each performance is scored relative to the player's own average and the league average. The two z-scores are averaged 50/50.
5
Top performances are ranked per game The top 10 OutScores from each game — across all stats and all players and teams — are ranked and displayed.

Update Frequency

Example

A player averages 8 pts (std: 4). The league averages 14 pts (std: 6). Tonight they score 28 pts.

personal_z = (288) / 4   = +5.0   # (actual - player_avg) / player_std
league_z   = (2814) / 6  = +2.33  # (actual - league_avg) / league_std

OutScore   = 0.5 × 5.0 + 0.5 × 2.33 = 3.67 × stat_weight

Stats Tracked

The Outlier monitors these stats for every player and team each game:

PTSPoints
ASTAssists
OREBOff. Rebounds
DREBDef. Rebounds
STLSteals
BLKBlocks
TOVTurnovers
FG3M3-Pointers Made
FTMFree Throws Made
TS%True Shooting %
FG3%3-Point %
FT%Free Throw %
AST/TOAssist/TO Ratio
+/-Plus/Minus
PAINT PTSPoints in Paint
FB PTSFast Break Points

Blue label = player only  ·  Green label = team only  ·  No label = both

Quality Filters

Not every unusual number is meaningful. Several filters prevent noise from flooding the rankings:

  • Minutes gate: Players with under 10 minutes are excluded — garbage time stat padding doesn't count.
  • Attempt minimums: Percentage stats (FG%, 3P%, FT%, TS%) require a minimum number of attempts. Going 1-for-1 from three isn't an outlier.
  • Minimum baseline average: Stats like PTS and AST require the player to have a meaningful season average before scoring. A player averaging 0.1 assists can't generate a real outlier in assists.
  • Minimum raw difference: Each stat has a minimum gap between the actual value and the average. A tiny fluctuation won't register even if the z-score is technically high.
  • TS% weight: True Shooting % lives in a tight range (roughly 0.35–0.75 for most players), so its raw z-scores tend to be much smaller than counting stats like points or assists. To keep it competitive in the rankings, its OutScore is multiplied by 2. This isn't a subjective judgment about TS% being "more important" — it's purely a scale correction so the stat isn't systematically buried.

Early Season Fallback

At the start of a season, players and teams haven't played enough games for their averages to be meaningful. If a player or team has fewer than 5 games played in the current season, their averages fall back to the previous season's data. This prevents the first few games of the year from generating unreliable outlier scores.

← Back to Games