NFL Ratings - Offense and Defense
Published:
======
Background
If you haven’t read my last post, then a quick introduction to the project is in order. Every year, I participate in a friendly pick’em competition, where I try to guess the spread and over/under of each nfl game. In the last post, I described how I’m using an Elo system this year in order to predict the spreads. However, this system doesn’t help when it comes to predicting an over/under, e.g. predicting the total points that will be scored in a given game.
Approach If two teams with equal Elo play each other, we obviously expect them to be tied. But tied at what?
Main idea: Instead of just having one rating (Elo) for each team, let’s split the Elo rating into separate ratings for the offense and the defense! After all, they are separate units1, and the performance of one is somewhat independent from the performance of the other. So we’ll introduce two new ratings: Offensive Rating (ORTG) and Defensive Rating (DRTG). Using ORTG and DRTG, we can look to the relative strength of their offenses to determine how many points will be scored in the game.
Rating Update The post-game shift in ORTG and DRTG is taken by dividing up the shift in Elo.
The predicted total score for the game will be (approximately): \(\begin{equation} 42 + (ORTG_A + ORTG_B - DRTG_A - DRTG_B)/25 \end{equation}\) Here, 42 is the average score of an NFL game, and 25 is a normalizing factor2, taken from our spread computations. This relatively simple formula allows us to go from ORTG/DRTG to expected total points very easily. But how do we update these ratings once the game is over?
Well, we take the shift in Elo rating, and “distribute” it between the offense and defense. For this, we just compute a new variable called $O$, which is clipped between 0 and 1.
\[\begin{equation*} O = total_score / (2 * 42) \end{equation*}\]Then we multiply it by the shift in Elo to determine how much of that shift will be added to our ORTG.
\[\begin{equation*} ORTG_{shift} = Shift * o_factor \end{equation*}\] \[\begin{equation*} DRTG_{shift} = Shift * (1 - o_factor) \end{equation*}\]As a reminder, the “Shift” in Elo is computed according to the following equation: \(\begin{equation*} Shift = K * MOV * (Result - Pr(A)) \end{equation*}\)
And there you have it. Now we have an Elo-like rating for each separate offensive and defensive unit in the NFL!
Conclusion
The repository described in this blog post can be found here.
Now that we have working ORTG and DRTG for each team, what should we incorporate next? Here’s some ideas…
- Take Weather/Stadium into account
- The reasoning behind this is straightforward if you’re familiar with american football. In rainy or snowy games, offenses tend to struggle. In addition, there are some teams and players that are well-known for being affected by weather. This could be a strong predictive feature when it comes to both spread and over/under.
- Take more stats into account when updating ratings
- I currently consider only the score of the game when we update ratings. But of course final score doesn’t tell the whole story. If we also kept track of things like turnovers, yards, or first downs, we might be able to get a better picture of the performance of each unit.
- Quarterback-aware ratings. This idea is inspired by fivethirtyeight, which incorporates the active quarterback directly into their Elo system.
- Special teams ratings (see footnote 1)
There are three “units” in a football team: offense, defense and special teams. Special teams is the least significant by far (although the greatest coach of all time may disagree). ↩
I’m using 25 because, for each 25 point difference in Elo, the favored team is expected to win by an extra point. ↩