🏀
How Basketball Is Scored
Every NBA possession ends in one of three outcomes: a two-point field goal worth 2 pts, a three-pointer from beyond the arc worth 3 pts, or a free throw worth 1 pt. Because all scoring increments are odd numbers (1 or 3) mixed with even numbers (2), final team scores can be any non-negative integer, though in practice they almost always fall between 70 and 150.
The exact distribution of final scores is not uniform. Scores cluster around values that are easy to reach through common combinations of possessions. A team finishing with 107 points, for example, might have hit 40 field goals, 5 three-pointers, and 12 free throws across an entire game. The sheer number of paths to any given total means the distribution is roughly bell-shaped, peaking near the league average for that era.
✦
Prime Numbers & Final Scores
A prime number is any integer greater than 1 that has no divisors other than 1 and itself …2, 3, 5, 7, 11… 97, 101, 107, 109, 113… The primes are distributed irregularly, becoming sparser as numbers grow larger, though they never disappear entirely.
In the range where NBA scores typically land — roughly 80 to 130 — primes make up about 20–27% of all integers, depending on the exact range. This creates a natural expected baseline: if basketball scores were purely random integers in that window, roughly one in four or five final scores would be prime by pure chance.
The actual rate turns out to be very close to that expectation. There is no cosmic force making teams land on primes but the proximity of observed to expected rates is itself the finding. The z-score on this dashboard quantifies exactly how close (or not) the real rate is to the theoretical one.
📐
Understanding the Z-Score
A z-score (also called a standard score) measures how many standard deviations an observed value sits away from what you'd expect under a null hypothesis. Here, the null hypothesis is: final scores are distributed uniformly across the observed score range, with no special tendency to land on primes.
Formally: z = (observed rate − expected rate) / standard error
The standard error shrinks as the sample size grows, which is why the z-score can be very large (20, 50, 100+) even when the actual difference in percentage points is small. A z of ±1.96 corresponds to a p-value of 0.05 — statistical significance at the conventional threshold. A z of ±2.58 corresponds to p = 0.01. Very large z-scores with large sample sizes often reflect real but tiny effects — use the Diff % column to judge practical magnitude.
The expected rate is calculated per-team and per-season using only the actual score range observed in that slice of data, so teams or eras with higher scoring aren't penalized for playing in a range with a different prime density.
📈
Scoring Eras & Prime Density Over Time
The NBA has gone through several distinct scoring eras, each shifting which part of the number line scores land on — and therefore which primes are candidates:
- 1970s run-and-gun (76–80 pts avg): The ABA merger flooded the league with talent and fast-break offense. Scores clustered in the mid-to-high 90s through low 110s. Primes like 97, 101, 103, 107, 109, 113 were common.
- 1980s Showtime & Bird era (107–110 pts avg): High-tempo offenses pushed scores into the 100–120 range. The prime density here is slightly lower — the 110s have several composite gaps.
- 1990s defensive era (95–100 pts avg): Physical defense and slower pace dragged averages back down. Scores bunched near 90–105, which is a relatively prime-rich band.
- 2000s post-Jordan transition (95–100 pts avg): Similar defensive emphasis; iso-ball and midrange shooting dominated. The prime rate held relatively steady.
- 2010s–present three-point revolution (106–120+ pts avg): Pace-and-space analytics pushed scoring sharply upward. Modern teams regularly hit 115–130, a range where primes are slightly sparser, which nudges the expected prime rate down even as raw counts rise.
These shifts are visible in the Season Trend chart above: watch the expected prime rate (dashed) move as the score range changes, and see whether the actual rate tracks it.