HOW CR IS CALCULATED
CR is built from 5 components made up of 10 underlying metrics: ORAPM and DRAPM (impact components), BPM and PER (box score efficiency), eFG% / Rim Frequency / 3PT Frequency / Midrange Frequency (shot quality), and AST% / Potential Assists (creation).
m₁ ORAPM
m₂ DRAPM
m₃ BPM
m₄ PER
m₅ eFG%
m₆ RIM FREQ
m₇ 3PT FREQ
m₈ MID FREQ
m₉ AST%
m₁₀ POTENTIAL AST
i
The precise weight of each metric is proprietary and not publicly disclosed. This is consistent with industry practice — ESPN's Real Plus-Minus, FiveThirtyEight's RAPTOR, and similar metrics protect their weighting methodology. The inputs and how each is calculated are documented in full below.
THE CALCULATION — STEP BY STEP
1
NORMALISE EACH METRIC TO A PERCENTILE
Each raw metric is converted to a 0–100 percentile score relative to all qualifying players in the pool for that season. This puts every metric on the same scale so they can be fairly combined — otherwise you would be adding "+6.8 ORAPM" to "64.2% eFG%" which are completely different units.
FORMULA
percentile(player, metric) = (players with lower value ÷ total players) × 100
Example: if SGA's eFG% is higher than 190 of 200 qualifying players, his normalised eFG% score = (190 ÷ 200) × 100 = 95. For metrics where lower is better (e.g. midrange frequency), the ranking is inverted — fewer midrange attempts = higher percentile.
Each normalised metric is multiplied by its proprietary weight, then all 10 weighted scores are summed. The weights reflect how much each metric contributes to predicting true player impact. A metric weighted at 0.20 contributes twice as much as one weighted at 0.10.
FORMULA
raw_score = w₁·p(ORAPM) + w₂·p(DRAPM) + w₃·p(BPM) + w₄·p(PER)
+ w₅·p(eFG%) + w₆·p(RimFreq) + w₇·p(3PTFreq) + w₈·p(MidFreq)
+ w₉·p(AST%) + w₁₀·p(PotentialAST)
where p(x) = percentile score of metric x · weights w₁–w₁₀ are proprietary · Σw = 1
The weights sum to 1, meaning the raw score is a weighted average of percentiles and will itself sit between 0 and 100. A player who ranks at the 90th percentile across all metrics would produce a raw score near 90 before scaling.
3
SCALE TO 0–100 USING HISTORICAL ANCHORS
The raw score is scaled using two fixed historical anchor points — a floor and a ceiling — drawn from our full dataset (2017–18 season onward). Anchors are fixed permanently so that a CR of 90 means the same thing in 2025 as it did in 2018. The scale does not recalibrate each season.
FORMULA
CR = (raw_score − floor_score) ÷ (ceiling_score − floor_score) × (99 − 30) + 30
floor_score = raw score of a historical replacement-level player season (maps to CR ≈ 30)
ceiling_score = raw score of the best historical player season in the dataset (maps to CR ≈ 99)
95–99
MVP TIER
Historically elite season
88–94
ALL-NBA
Top 10–15 player
78–87
ALL-STAR
Clear starter, impact player
65–77
SOLID STARTER
Positive contributor
30–64
BENCH / FRINGE
Below average to replacement
All underlying data sourced from the NBA Stats API via swar/nba_api. CR is calculated seasonally and updated nightly during the active season. Historical CR values are available from the 2017–18 season onward. Metrics marked as Tracking Data require NBA.com's player tracking endpoints, which have been publicly available since the 2013–14 season.