Trend Research

How much did the shape of the league change from one season to the next? We measure it with Procrustes alignment — details on the methods page.

Rotation, season to season

Each point is one year-to-year step: how far the league’s 14-stat player profile had to rotate to line up with the next season. Shaded bands are the five research eras; orange rings mark the five biggest jumps.

Blue markers are our read on league events near spikes — not derived from the math. “Scoring era” at 2022-23 was wrong (7.6°); post-bubble spacing at 2021-22 (11.1°) is the better recent tag.

Biggest shifts

The five season-pairs with the largest rotation — where the league's statistical geometry moved the most in one year.

Season pairRotationResidualShared playersMost-rotated featuresInterpretation
Loading…

Method

Loading…

Full write-up, the era-twin cross-era matching this same chained transform powers, and every other method on the site: read the methods page →

Archetypes over 30 seasons

Eight player types tracked across 30 seasons, who gained or lost share, and how types shift within each era.

Biggest type shifts (first 5 vs last 5 seasons)

Top types by era

Loading…

Court zone map

Loading…

More than baseline Less than baseline Defense zones (hatched)

Eight global player types, plus era-specific re-clusters for research. Court zones map where each era’s play showed up on the floor; by-era view compares each window to the one before (the first era is compared to today). How we built this →

Archetype emergence

Did genuinely new role shapes show up? Role tags by era and how crowded the type landscape got.

Loading…

Roles by era

How many player types fit each era

What we tested

New types by era

Loading…

A type counts as “new” when it doesn’t resemble anything from the prior era. How we built this →

Career shapes

How players move between archetypes over a career — class mix, example paths, and common switches.

Example paths (one per class)

Careers migrate more now

Common reinvention paths

Path labels under common switches are our read, not model output. How we built this →