2020-21 to 2025-26 regular seasons · NBA play-by-play

Shot Profile Analysis

Points per shot attempt above a baseline, split into five parts. An attempt is a field-goal attempt or a shooting-foul trip (a fouled miss). Three parts measure decisions and two measure execution, all in points per 100 attempts. Pick a single season or a multi-season view, compare against the league or each player's role peers, and look at performance against the 10 best defenses. Switch to Teams for the same breakdown for all 30 offenses.

DecisionSelectionTakes shot types worth more than an average attempt.
DecisionAlignmentTakes more shots where he beats the baseline, fewer where he doesn't.
DecisionFoul drawingGets to the line on shots, valued at baseline FT%.
ExecutionMakingFinishing by zone, on a baseline shot mix.
ExecutionFT makingHis FT% vs baseline, times his shooting-foul FT volume.
Show
Shot detail
Games
Baseline

Leaderboard

Click a player to open his full breakdown. Total = Decisions + Execution.

Execution vs decisions

Across: Execution. Up: Decisions. Both in points per 100 attempts above the baseline.

Click any dot to open that player's breakdown.

Reading the four corners

Dots near the center are close to average. Distance from the center matters more than which side a player lands on. Examples update with the filters.

Kings of

#PlayerAttMadeFG%Skill est.vs leaguePts above avgSignal

Method

Data

All six seasons come from NBA's own play-by-play feed (7,230 games; 2020-21 was a 72-game season), using a public mirror of that feed. Shot zones use NBA's tags on each shot: restricted area, paint (non-RA), mid-range, corner 3 and above-the-break 3. Backcourt heaves are excluded. Totals match the official box scores, for example 57,768 free throw attempts in 2025-26.

Only trips from shooting fouls count, including and-ones. Bonus fouls, away-from-play hacks, technicals, flagrants and clear-path fouls are excluded. Garbage time is removed for players (teams keep it; see Teams below): 4th-quarter margins of 25+ in the first 3 minutes, 20+ in the next 3, or 15+ in the last 6.

Season views

Single seasons are scored independently, so they can be compared with each other. Last 2, Last 3 and Last 6 add up every attempt with equal weight. That's the best descriptive view, and it roughly halves the noise. Recent-weighted counts attempts at 0.6 / 0.8 / 1.0 by season (the familiar 3-4-5 weighting). It's the best guess at who a player is now. In multi-season views, Pts added is a per-season average.

Baselines

League: everyone in the same seasons and games. Role peers: each player's 20 nearest neighbors on usage, assist %, offensive and defensive rebound %, block %, share of made shots assisted, and minutes per game, all computed from play-by-play. Peers are pooled by attempts, so high-volume peers count most, and the detail panel shows the six that carry the most weight. Adding minutes per game hardly changed how well peers predict shot mix and shooting, but it keeps starters grouped with starters. Height and weight were dropped because they aren't available for every season. Shot location is never an input.

Shrinkage

Each zone FG% and FT% is pulled toward the player's role-peer average: (M + k·peer%) / (A + k). k is estimated from the spread of real talent in the current view. This is the statistically grounded version of pulling extreme numbers back toward the middle: small samples get pulled a lot, big samples barely move. Values for the current view:

Does it repeat?

Year-to-year correlation of single-season scores, for players with 450+ attempts in both seasons:

Teams

Team scores use the same five parts, built from every attempt by every player, not just the players on the leaderboard. Teams include garbage time, so every possession counts, the same way team ratings are usually reported; the team league baseline includes it too. Each attempt counts for the team the shooter played for in that game, so a player traded midseason splits his shots between both teams. Teams are measured against the league only; role peers don't apply. Team zone FG% and FT% are shrunk toward league average with their own k (table above). Team shooting differences in some zones, especially threes, are mostly luck even over thousands of attempts, so those estimates move a lot toward average. A team's noise range is roughly ±1 point per 100 attempts, so most team gaps of 2 or more are real. Team year-to-year correlation, single seasons:

Against top-10 defenses

Defenses are ranked each season by points allowed per 100 possessions. Each split has its own league baseline. The noise test simulates each player as if he were identical against every opponent.

Shot-type mode: how real is it?

Shot types come from the play-by-play's own descriptors (driving, cutting, floating, pull-up, step-back and so on), which scorekeepers enter by hand. Year-to-year correlation of single-season scores, players with 450+ attempts in both seasons:

Each shot type on its own, Last 3 seasons. "Repeat r" is the year-to-year correlation of raw FG% for players with 40+ attempts of that type in both seasons. "Signal at typical volume" is how much of a typical player's raw FG% on that shot is skill rather than luck.

Positions before 2023-24

Listed positions cover players active from 2023-24 on. For about 180 players whose careers ended earlier, position is estimated from their 10 most similar players on rebounding, blocks, assists, usage, screen assists, speed and shot locations. The estimate matches the listed position 68% of the time and is within one position 98% of the time.

Still not covered

  • Shot difficulty within a zone: defender distance, pull-up vs catch-and-shoot, shot clock.
  • Defenses decide which shots are available, so read Alignment as a signal, not a verdict.
  • Age, team changes, injuries and role changes all drive trends. Check context before calling a trend development.
Data source: NBA play-by-play from NBA.com's live data feed, 2020-21 to 2025-26 regular seasons, retrieved through the public nba_data archive (shufinskiy, GitHub). Player names come from NBA.com shot data in the same archive. Totals were checked against official box scores.
Independent analysis. Not affiliated with or endorsed by the NBA.