article / 19 min
Statbotics explained: what EPA (Expected Points Added) means in FRC, how it's calculated, how EPA compares to OPR, and how to use it for scouting.
/ 2,866 words / 10 sections
If you have ever opened a match on The Blue Alliance and wondered "which alliance is actually favored here?", Statbotics is the tool that answers it with a number. It is a free, open-source analytics site for FIRST Robotics Competition that assigns every team a single rating called EPA — Expected Points Added — and uses those ratings to rank teams, simulate events, and predict matches before they happen.
EPA has quietly become the default "how good is this team?" number in the FRC community. Scouting leads cite it in the pits, drive coaches glance at it before an elimination match, and alliance captains pull it up during selection. This guide explains what Statbotics is, what EPA really measures, how it is calculated at a conceptual level, how it compares to OPR, and — most importantly — how to use it without getting burned by its blind spots.
Statbotics (statbotics.io) is a full-stack FRC data analytics platform built and maintained by Abhijit Gupta, an FRC alum who created it to modernize how the community looks at match data. It is open-source under the MIT license, and it is free to use — the creator personally covers the cloud hosting costs and takes contributions on GitHub.
Under the hood, a server pulls match results from The Blue Alliance (TBA), computes ratings, and serves them back through several front doors:
pip install statbotics puts EPA data a few lines of code away, which is why so many teams' custom scouting tools quietly run on Statbotics underneath.The reason teams reach for it is simple: TBA tells you what happened (scores, rankings, results), while Statbotics tells you how good each team is and what is likely to happen next. It is the analytics layer on top of the raw record. If you are new to where FRC data lives in general, the guides library is a good on-ramp before you go deep on any single metric.
EPA is a single number that estimates how many points a team contributes to its alliance's score in an average match. That is the whole idea. A team with an EPA of 45 is, on average, worth about 45 points of the roughly 3-robot alliance total. Add up the three teams' EPAs on an alliance and you get a predicted alliance score.
Because EPA is expressed directly in points, it is intuitive in a way that raw Elo never was. You do not have to translate "this team is 1750" into anything — the number is points on the board.
Read it as a contribution, not a solo score. An EPA of 45 does not mean the team scores exactly 45 points alone every match. It is the average marginal points they add to whatever alliance they are on, learned across many matches and many different partners.
"Expected Points Added" is borrowed from sports analytics, where EPA-style metrics have long been used to measure how much a single player or play contributes to scoring. Statbotics adapts the spirit of that idea to FRC — a per-team, points-denominated contribution rating — but the actual engine underneath is its own Elo-derived model, not a copy of any football formula. Do not overthink the name; think of it as "average points this robot is worth."
You do not need the math to use EPA well, but understanding the shape of the model tells you exactly when to trust it and when to be skeptical.
EPA is built on the same core loop as Elo, the rating system used for chess and popularized for sports predictions. Classic Elo is unitless and zero-sum (someone's gain is another's loss). Statbotics changes two things: it seeds each team near one-third of the average early-season score instead of an arbitrary 1500, and it keeps the whole rating in point units. The result is a rating you can literally add up across an alliance to predict a score.
Here is the loop in plain language:
That "size of the nudge" is controlled by a factor (often called K) that is large early in the season and shrinks as more matches are played. Early on, the model knows little about a team, so each result moves the rating a lot. Later, once a team has a track record, a single fluky match barely budges it. This is why early-week EPA is jumpy and late-season EPA is stable.
The model also gives a little more weight to offensive signal than defensive signal, because a team's own scoring is a less noisy measurement than trying to infer how much they suppressed an opponent.
The practical takeaway: an EPA from a team's first two or three qualification matches is a rough guess. By the end of quals — and especially across multiple events — it has converged and is far more trustworthy.
Statbotics does not just give you one number. It breaks EPA into the phases of a match:
This breakdown is where a lot of the real scouting value hides. Two teams can have identical total EPA while being completely different robots — one a teleop cycling machine with no endgame, the other a modest scorer that reliably banks big endgame points. Knowing the split changes who you pick and how you build a balanced alliance.
One raw-points problem: a 40-point EPA in a low-scoring game is elite, while 40 might be mediocre in a high-scoring game. To compare across seasons, Statbotics also publishes normalized versions of EPA (a standardized, unitless scale and a year-normalized rating fit to end-of-season distributions). Use raw EPA to reason about this season's matches, and the normalized/percentile views when you want to say "this team is a top-1% robot" regardless of the year.
A team page is the fastest way to size up a robot you have never seen. Focus on:
There is no universal EPA threshold because it depends on the game and the year. Lean on rank and percentile rather than the raw number. A top-25 world EPA is a powerhouse in any season; a team hovering around the median is a solid role player, not a carry.
Event pages are built for competition day:
Open any match and Statbotics shows a predicted winner and a win probability for each alliance, derived from the two alliances' summed EPAs run through a logistic (Elo-style) win-probability curve. A 50/50 prediction is a genuine toss-up; an 85/15 is a heavy favorite.
The number to internalize: a well-calibrated 70% prediction is still wrong 30% of the time — and Statbotics says so itself. The predictions are calibrated, meaning that across all the matches it calls at 70%, the favorite really does win about 70% of the time. That is a feature, not a bug: upsets are supposed to happen at the advertised rate. Treat win probability as a betting line, not a prophecy.
Use predictions to allocate attention. Do not sweat the matches you are forecast to win 90/10. Spend your strategy meeting on the 55/45 coin-flips — those are the matches your driving and defense actually swing.
Before EPA, the community's go-to contribution metric was OPR (Offensive Power Rating) and its cousins DPR and CCWM. OPR solves a big system of linear equations over an event's scores to back out each team's implied point contribution. It works, but it has well-known weaknesses. If you want the full breakdown of those metrics, see OPR, DPR, and CCWM explained; here is the head-to-head with EPA:
| EPA (Statbotics) | OPR (linear algebra) | |
|---|---|---|
| What it is | Elo-style rating updated match by match, in points | Least-squares fit over all of an event's scores |
| Early-event behavior | Uses a sensible prior, stabilizes quickly | Wild and unreliable until ~8+ matches exist |
| Cross-event / cross-year | Carries over; normalized views compare seasons | Recomputed per event; hard to compare across events |
| Component detail | Splits into auto / teleop / endgame | Single number (separate calcs needed per phase) |
| Handles noise / blowouts | Dampens surprise via shrinking K-factor | Sensitive to outliers and score ceilings |
| Predictive accuracy | Higher in Statbotics' backtests | Lower, and noisier early |
| Interpretability | "Points contributed," plus world rank | "Points contributed," event-local only |
In Statbotics' own backtests across the 2016–2022 seasons, EPA predicted match winners correctly about 72% of the time, versus roughly 70% for OPR and Elo — a small-sounding edge that compounds over a full event's worth of matches. The bigger practical wins are robustness and availability: EPA gives you a usable rating after a team's very first match (OPR needs a chunk of the schedule before it means anything), it does not swing violently on one blowout, and it travels across events and seasons. OPR still has a place — it is transparent and easy to compute from a single event's scores — but as a default "how good is this team and who wins this match?" tool, EPA is the stronger pick.
A rating is only worth as much as the decision it improves. Here is where EPA earns its keep.
EPA is a prioritization tool, not a replacement for watching robots. Use it to triage: sort the field by EPA, and spend your limited human scouting hours on the teams that actually matter for your picks — the top tier you might select and the mid-tier sleepers trending up. Then let your own scouting catch what EPA cannot see: cycle consistency, driver skill, defense quality, mechanism reliability, and pit-crew turnaround. A great workflow pairs Statbotics for the shortlist with a structured scouting sheet for the qualitative detail. For the bigger picture on building a scouting operation, start with the FRC scouting guide.
EPA cannot see intangibles. Reliability, driver skill under pressure, defensive impact, and "did they break in their last match" are invisible to it. That is exactly the gap your scouts fill.
Before each qual, pull the match prediction and the three opponents' EPA splits. This tells your drive team where the danger is: a high-endgame opponent means you cannot cede the endgame, a dominant teleop scorer might be worth a defensive assignment. Combine that with the win-probability read from earlier — pour your prep into the close matches, coast the lopsided ones. Understanding the match and event structure makes these reads faster.
This is EPA's marquee use case. During selection you are making high-stakes picks fast, and EPA gives you an objective ranking to anchor against — but the winning move is building a balanced alliance, not stacking three of the highest raw EPAs. Use the auto/teleop/endgame splits to cover gaps: if your robot is a teleop monster with a weak endgame, a slightly lower-EPA partner who reliably banks endgame points may raise your alliance EPA more than a flashier all-around bot. Run the alliance's combined EPA through your head (or through Statbotics' predictions) against the other likely alliances. For the full decision framework, see alliance selection strategy.
EPA is powerful, not magic. Keep these in mind:
The healthiest mental model: EPA is an extremely well-informed first opinion. Let it point your attention and anchor your rankings, then let real scouting and match footage make the final call.
Yes. Statbotics is free to use and open-source under the MIT license. There is no paywall on the website, API, or Python package; the creator, Abhijit Gupta, covers the hosting costs and accepts community contributions and donations.
EPA (Expected Points Added) is Statbotics' rating that estimates how many points a team contributes to its alliance's score in an average match. Sum the EPAs of an alliance's three teams and you get a predicted alliance score, which is how Statbotics forecasts match winners.
For prediction and cross-event comparison, generally yes. EPA stabilizes faster, resists outliers, carries across events and seasons, and edges out OPR in Statbotics' accuracy backtests. OPR is still useful for its transparency and single-event simplicity, but EPA is the stronger default.
From The Blue Alliance. Statbotics ingests official match results from TBA, then computes and stores EPA ratings on top of them — so EPA updates shortly after matches are posted, not in real time during a match.
In Statbotics' backtests over the 2016–2022 seasons, EPA picked the correct winner about 72% of the time. The predictions are calibrated, meaning a stated 70% favorite really does win close to 70% of the time — so roughly 3 in 10 of those "favored" matches are upsets by design.
Yes. Statbotics exposes a public REST API and a Python package (pip install statbotics), plus CSV exports. Many custom team scouting dashboards pull EPA through the API rather than recomputing ratings themselves.
EPA is the closest thing FRC has to a universal "how good is this robot?" number, and Statbotics makes it free and a click away. Learn to read the team page, respect the auto/teleop/endgame split, treat win probabilities as calibrated odds rather than certainties, and always pair the numbers with real eyes on the field. Do that, and you will walk into your next scouting meeting, strategy huddle, or alliance selection with a genuine edge.
where this came from
This article is AI-assisted: drafted from primary sources, then reviewed and edited by hand. Errors still get through. When one is reported we fix it and write down what changed, in public, in the corrections log.
dept / scouting-strategy
You came for one answer. These teach the same subject properly, in the order a team actually learns it. All 32 are free, and none of them need an account to read.
if you want to keep the ticks
LearnFRC has 394 free FRC lessons across every department. Create a free account to save your place, track your progress, and earn a certificate.
Create a free accountReading never needs one. This is only for saving where you got to.
these are the closest, not the newest
18 min read
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.
read it18 min read
The Blue Alliance (TBA) is FRC's free match and team database. Navigate team, event, and match pages, set up myTBA notifications, and use its read API.
read it20 min read
Build an FRC scouting app: match and pit scouting, a simple data model, pulling schedules and EPA from the TBA and Statbotics APIs, and building a picklist.
read itend of sheet
Keep going with the other 102 articles, or work through all 394 lessons across 11 departments.