Skip to content
FRC Article 18 min read

OPR, DPR & CCWM in FRC: What Every Scouting Stat Actually Means

OPR, DPR, and CCWM explained for FRC scouts: how each stat is computed with least squares, what it really measures, where it misleads, and how EPA compares.

to read
18 min

to read

words
2,804

words

sections
9

sections

Open any match-prediction site, a district ranking page, or The Blue Alliance and you will run into three acronyms over and over: OPR, DPR, and CCWM. They get quoted in alliance-selection meetings, pasted into scouting spreadsheets, and argued about on Chief Delphi — usually with more confidence than the numbers deserve. The frustrating part is that almost nobody explains what they actually measure, so students end up treating a single OPR value as gospel and ranking teams by it.

This guide fixes that. We will walk through the exact problem these stats solve, how OPR falls out of a system of linear equations you already have from the schedule, what DPR and CCWM mean in the same framework, where all three quietly mislead you, and how Statbotics' EPA improves on the whole family. The math is real but light — you do not need linear algebra to use these numbers well, only to understand why they behave the way they do.

The problem: you only ever see alliance scores

FRC is a 3-versus-3 game. When a qualification match ends, the scoreboard hands you one number per alliance — the red alliance scored 88, the blue alliance scored 74 — and never a per-robot breakdown. But the question every scout and strategist actually cares about is per-robot: how much did team 1234 contribute? The scoreboard refuses to tell you.

That is the whole problem these metrics attack. You have alliance-level outputs and you want team-level estimates. If a team always played with strong partners, its alliances scored a lot — but that does not make the team good. Conversely, a great robot stuck with two dead partners posts mediocre alliance scores. To separate a team from its company, you need to look across many matches with different partner combinations and let the overlap do the work. That is exactly what a shared, randomized qualification schedule gives you, and it is why these ratings only become meaningful after a chunk of an event has been played.

How OPR is actually computed

OPR — Offensive Power Rating — is an estimate of the average number of points a team adds to its alliance's score. The idea comes straight from the sports-rating world: model each alliance's score as the sum of its members' individual contributions, then solve for the contributions that best fit every match at once.

The system of equations

Start with one equation per alliance appearance. For a match where teams A, B, and C form the red alliance and score 88, you write:

OPR_A + OPR_B + OPR_C = 88

Do that for the blue alliance too, and for every alliance in every match of the event. At a 12-team, 60-match event you end up with roughly 120 of these equations (two alliances per match) and only 12 unknowns — one OPR per team. Stacked together, that is a matrix equation:

A · x = b

A = binary "schedule" matrix   (one row per alliance-score; a 1 in a
                                 team's column if it played on that alliance,
                                 0 otherwise)
x = vector of unknown OPRs      (one entry per team)
b = vector of alliance scores   (the actual points each alliance scored)

Because there are far more equations than unknowns, the system is overdetermined: no single set of OPR values can satisfy every match exactly. Teams are inconsistent, partners vary, defense happens — the real world does not fit a clean linear model. So instead of an exact solution, we look for the best-fitting one.

Why least squares (the math, lightly)

"Best fit" here means least squares: choose the OPR values that minimize the total squared error between what the model predicts for each alliance and what that alliance actually scored — minimize ||A·x − b||². Squaring the errors punishes big misses harder than small ones and gives the problem a clean closed form. Multiply both sides by the transpose of the schedule matrix and you get the normal equations:

Aᵀ · A · x = Aᵀ · bx = (Aᵀ·A)⁻¹ · Aᵀ · b

That single line is all of OPR. Aᵀ·A is essentially a "who played with whom, how often" matrix; inverting it and applying it to the scores untangles each team's average contribution from its partners'. You do not have to compute this by hand — The Blue Alliance and Statbotics do it for you — but knowing the shape explains the metric's whole personality: it is a global average fit, it needs varied partner overlap to be stable, and it treats every point in b as if it came from clean, additive offense.

OPR is a best-fit average over the whole event, not a measurement of any single match. A team's OPR can swing several points after one blowout or one broken robot, especially early, because the fit re-balances across every equation at once.

DPR and CCWM: the same machine, different target

Here is the elegant part. OPR is just A · x = b solved by least squares. Keep the exact same schedule matrix A and change what you put in b, and the same machine spits out a different rating.

DPR

For DPR (Defensive Power Rating), set b to the score the opposing alliance put up in each match — the points scored against you. Solve, and each team's value is its calculated contribution to how much opponents scored while that team was on the field. Lower is nominally better: a low DPR means your alliances tend to hold the other side down.

DPR is the most misread of the three. It is not a clean measure of a robot's defense. It mixes real defensive play, playing alongside good defenders, and plain luck of the schedule — and because most robots never play defense, DPR mostly reflects who your opponents were, not what your robot did.

CCWM

For CCWM (Calculated Contribution to Winning Margin), set b to the winning margin of each match — your alliance's score minus the opposing alliance's score. Solve the same system and you get each team's estimated contribution to how much its alliances win (or lose) by.

Because winning margin is just "your score minus their score," and OPR fits your score while DPR fits their score, the three collapse into one tidy identity:

CCWM = OPR − DPR

CCWM rewards teams that both add points and suppress the opponent. It is often the single most useful of the three for "how much does this team swing a match," precisely because it folds offense and the defensive side into one number — but it inherits every weakness of the two ratings it is built from.

A worked intuition

Imagine three teams, 1, 2, and 3, and pretend for a second the model were exact. Across the schedule their alliances produced:

Team 1 + Team 2  scored  70
Team 1 + Team 3  scored  60
Team 2 + Team 3  scored  50

Solving those three equations gives OPRs of 40, 30, and 20 for teams 1, 2, and 3. Notice you could never have gotten those numbers from a single match — team 1 never scored "40" on a scoreboard anywhere. The rating only emerges because team 1 appears in multiple alliances with different partners, and the system reconciles all of them. Give team 1 a run of matches with only strong partners and no overlap against the rest of the field, and the fit has nothing to anchor against — which is exactly why early-event OPRs are noisy and why a lopsided schedule can flatter or bury a team.

Real events never fit this cleanly, so least squares finds the closest compromise instead of an exact answer. But the intuition holds: these are relational estimates squeezed out of shared schedules, not measurements.

Where these stats mislead you

OPR, DPR, and CCWM are cheap, automatic, and available for every team at every event — that is their appeal. But they fail in specific, predictable ways, and knowing the failure modes is what separates a scout who uses them from one who gets fooled by them.

Defense is invisible to OPR. OPR only sees your alliance's score. A robot that spends the match pinning the other side's best scorer contributes nothing to its own alliance's points, so it posts a poor OPR — even if it single-handedly won the match by shutting the opponent down. The value it created lives in the opponent's lowered score, which OPR never looks at.

Penalties and fouls land on the wrong team. Alliance scores usually include foul points awarded for the opponent's rule violations. Because OPR fits total alliance score, those gifted points get smeared across whichever teams happened to be on the alliance that received them — inflating robots that did nothing to earn them and rewarding no one for the penalty that actually caused them.

Small samples make early numbers lie. The least-squares fit needs enough matches and enough varied partner overlap to stabilize. In the first handful of qual matches, one blowout, one field fault, or one no-show partner can move a team's OPR by a lot. Numbers pulled before roughly the halfway point of an event should be treated as rumor, not fact.

One number hides the shape of a robot. OPR collapses auto, teleop, and endgame into a single scalar. Two teams with identical OPRs can be completely different picks — one a consistent endgame-and-auto specialist, the other a boom-or-bust cycler. For alliance selection, the shape often matters more than the total, and OPR erases it.

Rule of thumb: OPR is a decent proxy for scoring output, DPR is barely trustworthy on its own, and CCWM is a reasonable "overall swing" number — but none of them survive contact with defense, penalties, or a robot that just broke. Use them to sort, never to decide.

Enter EPA: what Statbotics improves

EPA — Expected Points Added, the rating that powers Statbotics — is best understood as the modern answer to everything OPR gets wrong. It grew out of the Elo rating system used in chess and other sports, but its output is expressed directly in points, which makes it read like OPR and lets you add up an alliance's EPAs to predict a score.

The crucial difference is that EPA is a moving average, not a single global fit. After every match, a team's EPA is nudged up or down based on how its alliance did versus what the model predicted — so recent matches count more, and a team that starts slow and improves through an event (very common for rookies and for teams debugging a new mechanism) has a rating that tracks that improvement instead of averaging it away. EPA also decomposes into components (auto, teleop, endgame), so you can see the shape of a team that OPR flattens into one number. On head-to-head match prediction, EPA meaningfully outperforms OPR and Elo — it is the model most prediction sites now lead with.

That does not make OPR useless. OPR needs no tuning, no priors, and no season-specific model — it is just linear algebra on the scores, which makes it a transparent, reproducible baseline. EPA is more predictive and more interpretable, but it is a model with assumptions baked in. Smart scouts read both.

OPR vs DPR vs CCWM vs EPA at a glance

MetricWhat it measuresMain strengthMain weakness
OPREstimated points a team adds to its alliance's scoreSimple, transparent, no tuning; good proxy for raw offenseDefense-blind; penalties misattributed; noisy on small samples
DPREstimated points a team's alliance allows the opponentOnly auto stat that gestures at the defensive sideWeak signal; mostly reflects schedule and partners, not the robot
CCWMEstimated contribution to winning margin (OPR − DPR)Folds offense and defense into one "swing" numberInherits every flaw of OPR and DPR combined
EPAElo-style moving average of point contributionMore predictive; recency-weighted; splits into auto/teleop/endgameA model with assumptions; season-specific; less transparent than OPR

When to trust each

Reach for OPR when you want a fast, model-free read on offensive output and you have most of an event's matches in hand. It is a fine first sort for "who is scoring a lot." Treat DPR as a hint at best — never rank a team by it, and never assume a low DPR means a good defender. Use CCWM when you want a single "does this team make its alliance win by more" number, remembering it is only as good as the OPR and DPR underneath it.

Prefer EPA whenever you are predicting matches, comparing teams across different events, or watching a team's trajectory during an event — it is built for exactly those jobs and it is more accurate at them. When OPR and EPA disagree sharply about a team, that gap is a flag to go watch the robot, not a coin to flip. For the full picture of what Statbotics exposes and how to read it, see our Statbotics and EPA guide, and for where these numbers come from in the first place, our Blue Alliance guide.

Use them alongside physical scouting

None of these stats watch the robot. They cannot tell you that a team's intake jams on the third game piece, that their auto only works from one starting spot, that they no-show a third of their matches, or that their "defense" is really just driving into people. That information only comes from humans in the stands with a scouting sheet and a plan.

The right workflow treats calculated metrics and human scouting as complementary. Let OPR, CCWM, and EPA do the coarse sorting — they will surface the teams worth a closer look and flag the mismatches worth investigating. Then use match video and stand scouting to answer the questions the numbers cannot: consistency, failure modes, driver skill, and endgame reliability. Build that habit into your season with a repeatable scouting system, lean on it hard during alliance selection, and make sure your drive team knows which opponents the data says to respect. Everything ties back to the guides hub if you want the wider strategy picture.

Frequently asked questions

What is OPR in FRC?

OPR (Offensive Power Rating) estimates the average number of points a team adds to its alliance's score. It is computed by modeling every alliance's score as the sum of its three teams' contributions and solving that overdetermined system of equations with least squares, so it separates a team's output from its partners'.

What is the difference between OPR, DPR, and CCWM?

They come from the same linear system with different targets: OPR fits your alliance's score, DPR fits the opponent's score (points allowed), and CCWM fits the winning margin. They are linked by the identity CCWM = OPR − DPR, so CCWM rewards teams that both score and suppress the opponent.

Is OPR or EPA better?

For predicting matches and comparing teams, EPA is better — it is more accurate, weights recent matches, and splits into auto/teleop/endgame components. OPR's advantage is transparency: it is pure linear algebra on the scores with no tuning, which makes it a reproducible baseline. Most scouts read both.

Why is my team's OPR so low even though we play good defense?

Because OPR only looks at your own alliance's score. Defense shows up as a lower opponent score, which OPR never considers, so a strong defensive robot that scores few points of its own will always post a low OPR despite winning matches.

How many matches before OPR is reliable?

OPR needs enough matches and varied partner overlap to stabilize. As a rough guide, treat it as noisy until roughly the halfway point of an event; a single blowout, field fault, or dead-partner match can swing an early rating by several points.

Does OPR account for penalties and fouls?

Not cleanly. Alliance scores usually include foul points earned from the opponent's violations, and because OPR fits total alliance score, those points get spread across whichever teams were on the receiving alliance — inflating robots that did nothing to earn them.

These three stats are worth understanding precisely because they are everywhere, not because any one of them is the answer. Read OPR as a rough scoring proxy, CCWM as an overall swing, DPR with heavy skepticism, and EPA as the sharper modern tool — then go watch the robots and let what you see settle the ties the math cannot.

Spot an error or something out of date?Create a free account to suggest an edit

Keep reading

More from the pit

Start learning FRC — free

Structured lessons and quizzes across every department. Create a free account to save your progress, track your team, and earn a certificate.

394lessons
11departments
100%free