What is The Outlier
The Outlier finds the most unusual performances in basketball games. When a team or player steps far outside the average performance, that's what really determines the outcome. The Outlier finds these stats for you, and displays them neatly ranked from 1-10, with 1 being the most impactful performance. For example:
- A player who normally scores 15 points suddenly drops 45 points
- A team that usually makes 35% of their 3-pointers only makes 15% in one game
- Tyrese Haliburton finished a game with 5 turnovers and 5 assists, but averages 10 assists per turnover.
It's like a data-driven sports highlight reel - that you can read. Showing you what was genuinely weird or special about each game, not just who scored the most points.
Scoring Overview
- Player z-scores: Two z-scores are calculated. Individual z-scores compare a player's performance to their OWN average of a stat, while League z-scores compare a player's performance to the LEAGUE's average of that stat.
Individual z-scores are combined with league z-scores using a weighted approach, where individual z-scores have a higher impact on outlier score and league z-scores have a slightly lower impact on outlier score. Since rookie players have no previous season's averages to reference, their stats are scored solely in comparison to the league average. - Team z-scores: Team-level stats are evaluated only against that team’s own season averages—no league hybrid is used for team metrics.
- Noise control: Players who play under 10 minutes in a game are excluded, and percentages require minimum attempts (e.g., for FG%, 3P%, FT%) to avoid misleading extremes.
Scoring formula
Each player stat is measured as a z-score relative to both the player’s own season averages and the league’s averages. The final hybrid score blends these components:
// compute player z-score and league z-score
player_z = (actual - player_mean) / player_std
league_z = (actual - league_mean) / league_std
// combine using configured weights
combined_z = player_weight * player_z + league_weight * league_z
// apply stat weight for final score
weighted_score = combined_z * stat_weight
- player_weight and league_weight multipliers are set to 0.6 and 0.4 respectively.
- Team scores always compare against team season averages only.
Stat Weights
Not all stats influence game outcomes equally. To reflect their impact, each stat is multiplied by a stat weight in the scoring formula. Higher-weighted stats contribute more heavily to outlier ranking.
- High-impact examples: PTS, TS%, eFG%, and TOV often receive higher weights because they directly correlate with winning margins and overall game efficiency.
- Medium-impact examples: REB, AST, and STL may carry moderate weights since they affect possession control and ball movement but are more context-dependent.
- Low-impact or volatile stats: BLK, PF, or niche efficiency metrics typically have lower weights to reduce noise and outlier inflation.
Why this method
The hybrid model balances two important perspectives: individual consistency and league-wide rarity. A performance might be ordinary for one player but extraordinary in the league context—or vice versa. Weighting both helps highlight the most meaningful statistical outliers without overreacting to small-sample noise.
Example
If a player who averages 8 points (std 4) scores 24 in a game, their player_z = (24−8)/4 = 4.0. With player_weight = 0.6, league_weight = 0.4, and a stat weight of 1.2, that game becomes a significant positive outlier that rises to the top of the rankings.
Stat Weights & Detection Rules
Each statistic is evaluated using custom thresholds and multipliers to determine whether a performance is a meaningful outlier. More impactful stats receive higher weights, while less predictive or negative stats (like turnovers or fouls) receive lower or negative weights. Here's the actual thresholds and values I currently have applied (open to suggestions).
| Stat | Player Threshold (Z) | Team Threshold (Z) | Weight | Minimum Raw Difference |
|---|---|---|---|---|
| Counting Stats | ||||
| PTS | 0.5 | 1.2 | 1.2 | 5 |
| AST | 0.5 | 1.0 | 1.2 | 4 |
| OREB | 1.0 | 1.0 | 1.5 | 4 |
| DREB | 1.0 | 1.0 | 1.2 | 4 |
| STL | 1.2 | 1.2 | 0.8 | 3 |
| BLK | 1.0 | 1.0 | 1.0 | 3 |
| TOV | 1.0 | 1.0 | -1.0 | 3 |
| PF | 0.5 | 0.5 | -0.6 | 3 |
| Shooting – Made Shots | ||||
| 3PM | 0.5 | 0.5 | 1.3 | 3 |
| FTM | 0.8 | 1.0 | 0.8 | 5 |
| Shooting Percentages | ||||
| 3P% | 1.5 | 1.2 | 1.5 | 0.30 |
| FT% | 1.2 | 1.0 | 0.8 | 0.08 |
| TS% | 0.5 | 1.5 | 2.5 | 0.10 |
| Advanced Metrics | ||||
| AST/TO | 0.3 | 1.0 | - | 4 |
| AST% | 1.2 | - | 1.0 | 0.05 |
| REB% | 0.3 | 1.0 | - | 0.10 |
| PLUS MINUS | 1.0 | 1.0 | 0.7 | 5 |
| Team-Only Advanced Metrics | ||||
| OFF RATING | — | 1.0 | 1.5 | 3 |
| DEF RATING | — | 1.0 | -1.5 | 3 |
| PACE | — | 1.0 | 1.5 | 7 |
| PTS OFF TOV | — | 1.0 | 2.5 | 3 |
| PAINT PTS | — | 1.0 | 1.5 | 4 |
| FASTBREAK PTS | — | 0.3 | 2.0 | 4 |
| SECOND CHANCE PTS | — | 1.0 | 1.8 | 4 |