Role Vectors to Offensive Value

The Process

Creating Role Vectors

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.

Where this shows up: the Most Similar Players list on player cards uses this exact same technique, just pointed at a player instead of a fixed role template. Each player's play-type mix (Spotup%, Iso%, PNR Ball%, PNR Roll%, Offscreen%, Cut%, Postup%) and shot-zone shot diet (frequency by zone) get z-scored against the qualified league pool for that season, turning both into one combined vector. Cosine similarity between that vector and every other qualified player's ranks who plays most like them, top 3 shown. Since it's comparing shape (how a player generates and takes shots) rather than raw volume, a bench player and a star with the same stylistic fingerprint can still show up as a strong match.

They are then linearly regressed along with USG percentile and Touches/G percentile in order to predict a variety of statistics.

Where this shows up: that predicted-TS%-by-role baseline is also what powers rTS Role a player's actual TS% minus the average TS% of everyone sharing their primary scoring role that season. You'll see it as a stat tile on player cards next to rTS Lg and rTS Pos, and as a sortable column on the Player Stats page.

Shot Zones: the Same Idea, Applied to Shooting Splits

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.

Where this shows up: the Shot Zones tab on the Role-Based Stats page — sortable, and filterable by a minimum number of attempts in each zone.

Simulated PPG Distribution

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.

Simulated AST/G Distribution

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

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.

Simulated OREB/G Distribution

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.

Offensive Creation Above Role

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...

So What?

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.