Skip to content
Ranking NFL teams based on net EPA
Jupyter Notebook
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Ranking NFL teams based on net EPA and net success rate.

2018 Google Sheets Link:

2019 Google Sheets Link: Will be posted after Week 2

Ranking System Explanation

These rankings are created using play-by-play data from nflscrapR.

Going game by game, the rankings look at how a team, both offensively and defensively, performed compared to the opposing team's average performance. The rankings are back-adjusted, meaning that the opposing team averages are updated as the season goes on. A great week one performance should not be graded as highly if the opponent ends up being a really bad team.

An example will clarify this (note: the data is made up for clarity). This explanation is also simplified by not separating rush and pass performance although those two are separated in the actual calculation.

Let's say the Rams are playing the Seahawks. To start, the season averages of EPA/play are calculated for both teams, both offense and defense. The Rams are averaging .2 EPA/play offenseively and .05 EPA/play defensively. The Seahawks are averaging .1 EPA/play offenseively and -.05 EPA/play defensively.

Now, we look at the single game EPA/play in this game for each unit.

If the Rams averaged .15 EPA/play offensively (in the game) they would receive a Net Offensive EPA of +.2 because the Seahawks defense averaged -.05 EPA/play over the season. Conversely, the Seahawks would receive a Net Defensive EPA of +.05 because the Rams typically averaged .2 EPA/play but only managed .15 EPA/play in this game.

Now for the other two units (Seahawks offense, Rams defense). If the Seahawks averaged .05 EPA/play in the game offensively, they would receive a Net Offensive EPA of 0.00, because it is the same as what the Rams defense averaged over the whole season. The Rams defense meanwhile would receive a Net Defensive EPA of +.05 because the Seahawks typically average .1 EPA/play offensively but the Rams held them to .05 EPA/play.

The same process is done for success rates. A successful is one that results in positive EPA.

In this system, a negative Net EPA/Success Rate is always bad and positive Net EPA/Success Rate is always good. This is repeated for all 16 games for each team, giving a season long, combined Net Offensive EPA/Success Rate and combined Net Defensive EPA/Success Rate. Net Success Rates are multiplied by 2 to increase weight.

Once calculated for all teams, an additional strength of schedule adjustment is made by going through the opponent rankings on each team's schedule.

The Net EPA and Net Success Rates are added to give an Offense Net Score and Defense Net Score. A Total Net Score is then generated with a heavier weight for Offense Net Score. The scores are added as follows:

Total Net Score = (Offensive Net Score * .7) + (Defensive Net Score * .3)

The weighting may change as more testing is done and will be updated here if/when it does.

Other Notes

Data for the rankings is cleaned following the steps in my nflscrapR guide.

As of now, these rankings are only for the regular season. Garbage time is defined as a team having a win percentage greater than 95% and is filtered out.

The Jupyter Notebook for recreating the rankings is included, as well as end of season rankings back to 2009. From 2019 forward weekly rankings will be included, being updated every week after week 2.

You can’t perform that action at this time.