Skip to content
FRC Article 19 min read

What Is Statbotics? FRC EPA (Expected Points Added) Explained

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.

to read
19 min

to read

words
2,866

words

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

What is Statbotics?

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:

  • The website — searchable tables, team/event/match pages, per-year leaderboards, and an event simulator you can run in the browser.
  • A public REST API — for anyone building their own scouting dashboard or app.
  • A Python packagepip 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.
  • CSV exports — for the spreadsheet-driven scouting crews.

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.

What EPA (Expected Points Added) actually means

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.

Where the name comes from

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

How EPA is calculated (conceptually)

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.

Start with an Elo-style rating, but in points

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.

The update: nudge toward reality after every match

Here is the loop in plain language:

  1. Before a match, predict each alliance's score by summing the EPAs of its three teams.
  2. The match happens. Compare the predicted margin to the actual margin.
  3. If an alliance scored more than predicted, nudge its teams' EPAs up; if they scored less, nudge them down. The size of the nudge is proportional to the surprise.

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.

Auto, teleop, and endgame components

Statbotics does not just give you one number. It breaks EPA into the phases of a match:

  • Auto EPA — contribution during the autonomous period.
  • Teleop EPA — contribution during driver-controlled play.
  • Endgame EPA — contribution from the endgame (climbing, parking, or whatever that season rewards).

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.

Unitless and year-normalized EPA

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.

How to read a Statbotics team page

A team page is the fastest way to size up a robot you have never seen. Focus on:

  • Total EPA and its rank — the headline number, plus where the team sits worldwide. A global rank tells you far more than the raw number in isolation.
  • Percentile / normalized rating — often color-coded. This answers "how good relative to everyone?" without you needing to know the season's scoring scale.
  • Auto / Teleop / Endgame split — the shape of the robot, as described above.
  • EPA over time — a line that shows whether the team is improving, plateaued, or declining across the season. A steep upward trend on a mid-ranked team is a classic sleeper signal.
  • Match-by-match history — every match with predicted vs. actual, so you can see consistency versus boom-or-bust.

What "good" looks like

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.

How to read an event page

Event pages are built for competition day:

  • Max EPA and mean EPA at the top tell you the strength of the field at a glance — a "stacked" regional jumps out immediately.
  • Rankings enriched with EPA — the official TBA ranking table with EPA columns bolted on, so you can spot teams whose ranking-point standing is out of step with their underlying strength (usually a schedule-luck story).
  • The event simulator — Statbotics can Monte-Carlo the remaining schedule to project final rankings and each team's odds of finishing in a given position. This is genuinely useful late in quals when you are trying to figure out whether you will end up a captain or a first pick.

How to read a match prediction

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.

EPA vs OPR: what is the difference?

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 isElo-style rating updated match by match, in pointsLeast-squares fit over all of an event's scores
Early-event behaviorUses a sensible prior, stabilizes quicklyWild and unreliable until ~8+ matches exist
Cross-event / cross-yearCarries over; normalized views compare seasonsRecomputed per event; hard to compare across events
Component detailSplits into auto / teleop / endgameSingle number (separate calcs needed per phase)
Handles noise / blowoutsDampens surprise via shrinking K-factorSensitive to outliers and score ceilings
Predictive accuracyHigher in Statbotics' backtestsLower, and noisier early
Interpretability"Points contributed," plus world rank"Points contributed," event-local only

Why EPA is usually more predictive

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.

How to actually use EPA

A rating is only worth as much as the decision it improves. Here is where EPA earns its keep.

For scouting

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.

For match strategy

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.

For alliance selection

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.

Limitations and caveats

EPA is powerful, not magic. Keep these in mind:

  • Early-season ratings are noisy. The first few matches lean heavily on the prior. Do not over-index on Week 1 EPA.
  • Defense and intangibles are underweighted. The model favors offensive signal and cannot measure driver skill, reliability, or how well a team plays defense in any detail.
  • It reflects the past, not the future. A team that just fixed a major mechanism, or one that just broke it, will not show up in EPA until several matches later.
  • Partner and schedule effects linger. EPA works hard to isolate individual contribution, but a team that always played with strong partners can carry a slightly inflated rating, and vice versa.
  • Predictions are probabilities. A 75% favorite loses one time in four by design. Never treat a win probability as a guarantee, and never let it override what your scouts saw on the field.

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.

Frequently asked questions

Is Statbotics free?

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.

What is EPA in FRC?

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.

Is EPA better than OPR?

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.

Where does Statbotics get its data?

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.

How accurate are Statbotics match predictions?

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.

Can I get EPA data for my own scouting app?

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.

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