Statbotics: 2023 Season

Hi everyone, I hope your build season is off to a great start! Although competitions are still a couple weeks away, I wanted to share some updates to Statbotics (, an open-source project that aims to modernize FRC data analytics. There have been several changes since last year, so let’s dive in!

Expected Points Added (EPA)

While previously Statbotics displayed Elo and OPR ratings, we are now transitioning to a new rating system called Expected Points Added (or EPA for short). EPA builds upon the ideas of the Elo rating system, but assigns a point value to each team (similar to OPR). EPA is more predictive than either Elo or OPR, is separable into components, and can be compared year over year. I encourage anyone interested in learning more to check out the Statbotics blog.

Revamped Infrastructure

After a full codebase rewrite and better integration with The Blue Alliance API, data will be refreshed considerably faster during competitions. While previously the website updated every couple hours, match data is now refreshed every minute. Event simulation is also significantly faster and more robust.

Brand New Website

The website has been rewritten with an emphasis on speed and future extensions. Visit to see match breakdowns, event simulations, team rankings, and more. Several new tables and visualizations are scattered throughout the website as well. If you have bug reports or feature requests, please respond to this thread or raise an issue on GitHub or Canny. I hope to continue adding new features throughout the season.

Note: Since EPA depends on the Week 1 average score, 2023 EPA ratings are projections and will change significantly once competitions start. Currently they assume a Week 1 mean score of 30, split equally between auto, teleop, and endgame. This will be updated after preseason events. Check out the 2022 ratings to get a feel for EPA and new features like bubble and line charts.

REST and Python APIs

To integrate your scouting/strategy systems with the new Expected Points Added model, consider the REST and Python APIs. Read the documentation for the REST and Python APIs, and feel free to contact me with any questions.

Given the amount of changes, I am sure some features have broken or regressed. I would appreciate any feedback to best serve the FRC community. I will continue to use this thread to answer questions, broadcast updates, and share data analysis using the EPA model. Thanks for reading, and best of luck this season!


Answering a questions from the previous thread: Will OPR and Elo be displayed alongside EPA on the new website?

Answer: Currently, the plan is to display only EPA. EPA builds upon Elo and already has a high correlation with Elo. Unitless EPA is scaled to match Elo. EPA is also shown in point units and separable into components like OPR, while being faster to compute (no matrix math) and more predictive. Adding OPR and Elo would slow down the website, and reduce data freshness. If you have a strong reason to want one or both of these metrics, let me know in this thread and we can have a discussion.


New site looks awesome! When trying to load 2023 teams, the just hangs on Loading data, please wait…

Using Microsoft Edge on Windows 11 if that helps.

Sorry, I rushed out a small fix that broke things for a minute or two. Should be working again now.

This is super awesome! We love statbotics on my team and its always so cool to see how you compare to the others in not only your district but also the world.

Additionally I noticed that the 2023 predictions and projections are based off of past year performances. So as the 2023 season progresses will the data for projections and such be based off of purely data from 2023 or will it continue to factor data from past years?

Once again thank you so much for the super valuable resource!


I want you to include all 3 so that I can find which metric my team is ranked highest in and use that rank to validate to others how good we are. If you only have one metric I can’t shop around and the rank shown will usually be lower than I think it should be.


Great question! Over time match data from the current season replaces the past season projection, but it does not necessarily reach 100%. I wrote a quick script to simulate 2022 EPA ratings both incorporating past seasons and starting from scratch (Notebook link).

In 2022, using past season priors improved prediction accuracy from 76.2% to 77.5%, with most of the advantage coming early in the season.



1 Like

Some announcements after Week 0:

  • Using the average component scores in Week 0, team EPA projections have been updated across the site. Another small update will take place after Week 1 to replace Week 0 statistics with Week 1 statistics.

  • A couple bug fixes to event simulation are live. Additionally, I now use the Chezy Arena precomputed schedules to simulate event rankings before schedule release. Later I might release metrics on schedule luck by comparing before and after schedule release simulations.

  • I’m really excited to see many teams using the Statbotics API this year. As a reminder, the /v1/ routes have been deprecated in favor of the new /v2/ routes. I am working on some more documentation to describe the available fields.

Since this is the first year of a mostly rewritten system, please reach out to me on Canny or in this thread if you find any bugs. Thanks!


What would you suggest how to implement this into scouting chart? Thank you for statbotics!

1 Like

Great question! Statbotics is no substitute for scouting, but can augment your own observations and guide decision making.

Many of the tables on the website can be downloaded into a CSV format and opened in Excel or with a programming language. One of the most useful tables is the event insights table. This is probably the best way to quickly integrate Statbotics data with your own scouting data.

There are also several visualizations available directly on the website.

If people have suggestions on helpful visualizations, I would be happy to add more.

For a specific match, Statbotics provides pre-match score breakdown estimates, and updates after the match to include the actual results. This could be helpful for pre-match strategy.

Finally, the simulation feature can be useful to forecast your final ranking for alliance selection strategy.

Hopefully this gives you a good overview of some ways to use Statbotics during an event. Let me know if you have any questions or suggestions!


Looks like statistics aren’t being updated? In today’s Israel event page ranks are all -1 and matches simulations aren’t being updated.
Edit: looks it just updated, but it didn’t most morning.

1 Like

New Feature: Detailed Simulations!

There is now a plus/minus button in the upper-left corner of tables with additional information. When viewing a specific event, you can now see the full distribution of simulated outcomes. Ranking points, first tiebreaker, and second tiebreaker are included. However, the predictions might be a bit overconfident in Week 1 given the increased uncertainty in team EPAs.

Let me know if you find any bugs :slight_smile:. Good luck to all teams competing this week!


Thanks to everyone who used Statbotics this past weekend, and I hope it was useful to spectators and participants alike! I have updated the EPA ratings based on Week 1 results, so some teams might have moved by ~1-2 points from last night. I am looking to make some quality of life improvements over the next two weeks, so send me any bugs or feature requests!

Some fun stats from the website:

Top teams

  1. 2056: OP Robotics (78 EPA)
  2. 1678: Citrus Circuits (66 EPA)
  3. 2910: Jack in the Bot (64 EPA)
  4. 3005: RoboChargers (64 EPA)
  5. 1577: Steampunk (61 EPA)
  6. 695: Bison Robotics (61 EPA)

Undefeated teams

  1. 2910: Jack in the Bot
  2. 1577: Steampunk
  3. 695: Bison Robotics
  4. 67: The HOT Team
  5. 4613: Barker Redbacks
  6. 6919: The Commodores
  7. 4795: Eastbots
  8. 3467: Windham Windup

Most improved teams

  1. 695: Bison Robotics (+36 EPA)
  2. 3005: RoboChargers (+32 EPA)
  3. 5472: Stallion Robotics: The Wyld Stallyns (+29 EPA)
  4. 5232: Talons (+28 EPA)
  5. 4422: Twisted Angels (+28 EPA)
  6. 2056: OP Robotics (+28 EPA)

Best new teams next week

  1. 1323: Madtown Robotics
  2. 1619: Up-A-Creek Robotics
  3. 118: Robonauts
  4. 176: Aces High
  5. 5172: Gators
  6. 2767: Stryke Force

3467: Windham Windup has not lost a match in season


Good catch. I forgot teams with ties, this also includes 4795.


Absolutely unreal


If you don’t mind clarifying, how does EPA get affected by the difficulty of a comp?
As my team excitedly makes it back from week 1 we have been scrubbing through statbotics obsessing over the numbers a little bit too much XD. Once again we love this source and use it almost as much as our scouting data at this point!

1 Like

The gap between 1 and 2 right now is 11.3 with 1678 having an EPA of around 66 and 2056 having an EPA of 78
to put that into perspective this is the same gap between 1678 in 2nd place and 18th with Knightkrawler with a 55 EPA
2056 most anticipated Match review for a lot of us strategy nerds when their match videos come out :laughing:

Thanks for your continued work on this tool, it is a great addition to the community.

To say nothing of the predictive perf bump, your EPA metric seems easier to contextualize (especially in conversations with students new to this type of analytics) than raw ELO, which is a nice win.