The Process
The main process used when trying to attribute roles to NBA players was cosine similarity. The idea behind cosine similarity is finding vectors pointing in similar directions in an n-dimensional space. Shot frequency data (0-5 FT, 5-9 FT, 10-14 FT, 15-19 FT, and 3P range) & possession data (Cut%, Iso%, Spotup%, etc) converted into percentile scores for each player, in order to compare around the league.
Each role then scores each area from 0 to 1. For example, a Rollman would have a 1 for 0-5FT Frequency but 0 for 3P frequency. Cosine similarity is then calculated for every player across every role, and the top 4 best matching roles are selected.
They are then linearly regressed along with USG percentile and Touches/G percentile in order to predict a variety of statistics.
The role baseline behind rTS Role extends naturally to shot-zone efficiency. Rim, mid-range, and 3-point FG% are each compared two ways: against the attempt-weighted average for players at the same position, and against an average built from the shooter's own blend of scoring roles.
Both baselines are attempt-weighted, a high-volume shooter moves the average more than someone with a handful of attempts, the same convention used for the position and role averages elsewhere on the site. "vs Role" doesn't just use a player's single best-fitting role, either it blends across their top 3 scoring roles, weighted by how strongly they match each one (from the same cosine-similarity role vectors described above). A player who's mostly a Spot-Up shooter but also grades out partly as a Movement Shooter and a Cutter gets an expected FG% reflecting that full mix, not just their #1 label.
Using each player's predicted FGA, FTA, and TS% (plus their game-to-game standard deviations), we simulate 82 games × 200 seasons to build a distribution of expected PPG. Points per game = TS% × 2 × (FGA + 0.44 × FTA).
Because this model is trained on all NBA player data, this acts as a value over replacement statistic. The simulated PPG represents the most average player taking on the simulated player's role. This explains the very large residual for superstar players, as the amount of points they score over expected can be attributed to mostly their own skill, and not the amount of usage they have.
Taking this idea further, the same thought process can be slightly tweaked and applied to playmaking. There are less roles, and the roles are decided by different statistics. Passes, touches, usage, Pick & roll handling, dribbles per touch, are all considered. Players are then aligned to their respective roles using Euclidean distance. Euclidean distance was chosen over cosine similarity for the playmaking roles since aligning with a role, such as Primary Initiator is reliant on similarity of magnitude of these statistics, not the direction.
Player roles are then used to predict AST through a regression model. USG was added since it was encoded in the stats used to align with roles.
The same process was applied for game to game AST standard deviation.
Using each player's predicted AST/G and game-to-game standard deviation, we simulate 82 games × 200 seasons to build a distribution of expected assists per game.
This simulation presents the predicted number of assists/g throughout the season, but there is an important issue. Certain elite players are being shown as "subpar" playmakers when compared to their average replacement counterparts when in reality we know this is not true. This arises from the fact that USG and touches can only be split up so many ways.
Essentially elite scorers do not have the same playstyle as an average player — when SGA runs the Pick and Roll, he is more inclined to score since he has elite level finishing, while an average player would consider the pass more. Following from this, we can combine BOTH predicted PPG and predicted AST/G into a PTS over replacement statistic where the average PTS generated by an AST is the league-avg 2.38 to avoid over/under rewarding players on good/bad teams.
Offensive rebounding is predicted from the same role vectors — Rollmen, Postmen, and Cutters naturally generate more offensive board opportunities than Spot-up shooters standing behind the arc. Role scores are regressed to predict expected OREB/G and game-to-game standard deviation.
Using each player's predicted OREB/G and game-to-game standard deviation, we simulate 82 games × 200 seasons to build a distribution of expected offensive boards per game.
Click any column header to sort. PRF Residual = Actual PRF − Predicted PRF. Positive means the player creates more offense than a typical player in their role.
Loading...
Limitations
This metric only captures offensive creation — players like Draymond or Gobert whose value is primarily defensive will appear much lower than their true overall impact. Other metrics of offensive value are missed, such as offensive rebounding or something a little harder to catch analytically like gravity.
Games played matters — always check the GP column before drawing conclusions from extreme residuals.
Rookies can show negative residuals because the model was trained on all players, which means mostly veterans — so a large negative for a young player reflects a development gap, not a ceiling.
Strengths
Unlike metrics that just compare raw stats, the baseline here is built from cosine similarity role vectors — so the replacement player isn't just an average NBA player, it's an average player in your exact role, with your exact shot profile and possession usage.
The Monte Carlo simulation across 200 seasons captures game-to-game variance, meaning the predicted baseline accounts for consistency too — a streaky player and a reliable player with the same averages will produce different distributions.
Because the prediction is derived from role and usage rather than past scoring, it works as a forward-looking baseline. Useful for evaluating whether a player is living up to what their role and opportunity should produce.