The Blatsheet

Numbers, narratives, and unsolicited opinion about basketball statistics and visualization.

Removing the minimums

The NBA uses qualification thresholds for percentage stats. 300 field goals made for FG%. 82 threes for 3P%. 125 free throws for FT%. These numbers exist so a player who goes 2-for-2 from three does not lead the league at 100%.

Fair enough for a full season. 82 games. Months of data. The thresholds filter noise.

Shrink the window to January and those numbers collapse. Nobody hits 300 field goals in a month. The thresholds that protected signal become the thing that kills it. Every player fails qualification. The leaderboard empties.

What we changed

When a custom date range is active, qualification minimums are removed entirely. All players with games in the window are eligible. FG%, 3P%, FT% leaders reflect the actual sample. Small sample, yes. Misleading, possibly. But visible. The user chose the window. The data should respect it.

A quiet line appears below the stats table: Qualification minimums removed for custom date range. No modal. No tooltip. Just a fact.

Why it matters

Thresholds are not universal constants. They are calibrated to a specific scope. Change the scope, recalibrate the threshold. In our case, recalibrating to zero was the honest answer.

Finding the averagemeanmedian player

Why median

The average is pulled by outliers. One Wilt Chamberlain season drags the number somewhere no real player lives. The mean is just the average by another name.

The median splits the roster in half. The player right in the middle. Not dragged by the extremes, not inflated by a handful of superstars, not deflated by ten-day contract players who barely saw the court. The median is the player who stands at the exact centre of the league, with half the players above and half below.

He is the most honest statistical portrait of what an NBA player actually looks like in any given season.

The Composite, Decade by Decade

Below is the median player at six points in NBA history, starting from the introduction of the three-point line in 1979. Every number represents the midpoint across all players who logged at least 20 games that season.

EraPPGRPGAPGMPGHeightWeight
1969-7010.85.22.027.06'5"200
1979-809.84.32.325.26'6"207
1989-909.54.02.224.66'6"215
1999-009.03.82.023.56'7"220
2009-109.33.82.123.06'6"222
2019-2010.03.92.423.06'5"215
2024-2510.54.22.823.56'5"215
Dudley Bradley

1979-80

The three-point line arrives. The median player — someone like Dudley Bradley in Indiana — barely notices. He attempts one every three games. The game is still played inside the arc, with bruising post-ups and mid-range pull-ups defining the scoring landscape. He scores 9.8 points a night.

Blue Edwards

1989-90

The Bad Boys era. Physical defence is the norm, and scoring drops. A player like Blue Edwards in Utah is your median — 6'6", 215 pounds, 9.5 PPG. He picks up a three-pointer here and there, but the game lives in the paint.

Brent Barry

1999-00

Peak isolation basketball. The median player is the heaviest he will ever be — 220 pounds. Brent Barry in Seattle embodies the type: post-up, pick-and-roll, contested mid-range. Scoring dips to 9.0 PPG. Three-point shooting is still a specialist's tool.

Brandon Bass

2009-10

The analytics revolution is just beginning. Brandon Bass in Dallas — the original inspiration for the "Most Average Player" award — is your median. He starts to slim down, his three-point attempts are climbing. Load management is becoming protocol.

Terrence Ross

2019-20

Positionless basketball is here. Terrence Ross in Orlando is the new median — 10.0 PPG on three threes a game. He is lighter, quicker, and more versatile than any previous version of the median player. The bubble compresses the schedule but doesn't change the trend.

Herb Jones

2024-25

The current median player looks like Herb Jones in New Orleans: 6'5", 215 pounds, 10.5 PPG on four three-point attempts per game. Every player is a passer. Every player can shoot. The median has evolved into the ultimate tweener — and the game is built for him.

Points: A Flat Line With a Twist

The median player has scored between 8 and 11 points per game since 1970 — a tight band that masks a fascinating U-curve. Scoring dipped from nearly 11 PPG in the high-pace seventies to under 9 in the grind-it-out late nineties, then climbed back above 10 as pace surged in the 2020s. What changed most is where the shots come from. In 1980, the median player attempted roughly one three-pointer every three games. By 2025, he takes four a night. The geometry of the court is completely different.

Minutes: Doing Less, Together

The median player's minutes per game have dropped steadily since the 1970s — from 27 in 1970 to under 24 in 2025. This is roster depth at work. Teams carry 15 players. Coaches use 10 or 11. Load management went from a punchline to protocol. Not because the median player is lazier, but because somebody else is getting his minutes in the fourth quarter of a blowout.

Size: The Era of the Tweener

Height peaked in the late 90s and early 2000s, when the league was stacking rosters with seven-footers who clogged the paint. The median player was 6'7" and 220 pounds in 2000 — the heaviest he would ever be. By 2025, he is 6'5" and 215. The positionless basketball movement shaved two inches and five pounds off the composite. Centres who cannot switch on guards do not last. Guards who cannot rebound do not start. The median player today is the ultimate tweener: too big for traditional guard play, too small for traditional post play, and exactly right for the modern game.

Assists: The Passing Renaissance

The median player's assists have crept up over the last decade, hitting 2.8 per game in the current season. This is not because everyone became Magic Johnson. It is because offences now require every player to be a willing passer. The swing-swing-shoot motion offence generates assists from positions that used to just catch and hold. When a centre kicks out to a wing who swings to the corner, that is an assist from a player who in 1990 would have just posted up.

So Who Is the Median Player?

He is 6'5". He weighs 214 pounds. He plays 24.8 minutes a night, scores 12.4 points on a mix of mid-range pull-ups and corner threes, grabs 4.6 rebounds, and dishes 3.2 assists. He is what the NBA looks like when you strip away the stars and the deep bench. He is the most honest version of a professional basketball player alive today.

He is not average. He is not mean. He is the median. And he has been quietly evolving for 45 years.

Sources

  • Player statistics: Basketball Reference (per-game stats, 1970-2025)
  • Modern stats: NBA.com/stats (1996-2025 seasons)
  • Median calculation: Across all players with ≥20 games played per season, median taken per stat (PPG, RPG, APG, MPG, 3PG)
  • Player identification: Closest player to multi-stat median by Euclidean distance

The player who never misses vs. the player who never plays

Why TCR and PGR tell different stories about the same season

Two numbers sit side by side on every player page. TCR. PGR. One measures what you did all season. The other measures what you did when you showed up. In most cases they track together. When they diverge, they reveal something the box score hides.

What they are

PGR is Per Game Rank. It takes a player's per-game averages across nine categories—points, rebounds, assists, steals, blocks, threes, turnovers, FG impact, FT impact—converts each to a z-score against the league, and ranks the composite. It answers: how good is this player on any given night?

TCR is Total Contribution Rank. Same nine categories, but using season totals instead of averages. Benchmarked against the top 170 players by minutes. It answers: how much has this player actually contributed to your fantasy team this year?

The gap between them is where the story lives.

The case for showing up

Jay Huff
Jay Huff
IND · C · 28 years old
Games played75
Minutes/game20.8
Points9.3
Rebounds3.8
Assists1.3
Blocks1.8
FG%47.3%
FT%81.9%
TCR 56
PGR 133
Gap +77

Jay Huff is not a star. 9.3 points, 3.8 boards, 1.8 blocks in 21 minutes off the bench. His per-game rank says he is the 133rd best fantasy player in the league. That's barely rosterable.

His season rank says 56th. That puts him ahead of players you actually drafted. Players you traded for. Players you talk about. The reason is the number in bold above: 75 games played. Huff shows up. Game after game after game. Those 1.8 blocks per night compound into a season-long blocks total that outpaces players with better per-game numbers who sat out 20 games.

In a fantasy season that runs six months, availability is not just the best ability. It is the entire argument.

The case for not showing up

Kristaps Porzingis
Kristaps Porziņģis
GSW · F-C · 30 years old
Games played28
Minutes/game23.9
Points17.3
Rebounds4.9
Assists2.6
Blocks1.3
FG%45.4%
FT%83.1%
PGR 48
TCR 254
Gap −206

Kristaps Porziņģis has played 28 games this season. When he plays, he is the 48th best fantasy player in basketball. But he has missed more games than he has played. His season total contribution ranks him 254th. That is not a roster spot. That is a memory.

This is the trap that PGR sets for you. Porziņģis looks like a top-50 player. He plays like a top-50 player. But he plays less than half the season, and fantasy does not give credit for games you could have played.

The outliers

The most dramatic gaps reveal the season's truths. Joel Embiid: PGR 14, TCR 136. When he plays he is elite. He has played 36 games. Jimmy Butler: PGR 16, TCR 122. Anthony Davis: PGR 31, TCR 278. Paul George: PGR 37, TCR 222. Talent does not expire. But it does depreciate when it sits on the bench in a suit.

PlayerGPPGRTCRGap
Joel Embiid3614136−122
Jimmy Butler III3816122−106
Anthony Davis2031278−247
Paul George3037222−185
Jay Huff7513356+77
Nickeil Alexander-Walker732413+11
Mikal Bridges753515+20
Desmond Bane742817+11

The bottom half of that table is the longevity argument. Mikal Bridges at PGR 35 is not exciting. At TCR 15 he is one of the most valuable fantasy assets in basketball, because he played 75 games and his contributions compounded quietly over six months.

What to do with this

If you play weekly head-to-head, PGR matters more on any given matchup. But if you are building a roster for the long season—or trading mid-year—TCR is the number that tells the truth. A player who gives you 80% of the value for 95% of the games will outscore a player who gives you 100% of the value for 40% of the games.

You can explore both ranks on the Players page, sorted and filtered however you like. The gap between the two columns is the season's real story.

The rule of thumb: A high TCR with a mediocre PGR is a player your league undervalues. A high PGR with a low TCR is a player your league overvalues.