Experiment for the Season: The NDtex25

For this season, I thought it would be a little fun to do a bit of an experiment with college football rankings.  I make absolutely zero promises on this working out to make any sense at all, but I figure it’s worth a shot anyways.  Yes, I know, it’s another crazy formula in a sport that has too many already, but I’m a sports nerd, deal with it.

My goal here was to make the formula as simple as possible, but also try to find good metrics to separate teams.  I want to keep conference biases out of the equation and I don’t want preseason rankings to matter either.  Also, despite them being removed from BCS rankings, I firmly believe that margin of victory matters.  Finally I want to make sure wins are valued dynamically, that is, if you beat presesaon #1 in OU and OU finishes in the middle of the pack, that victory isn’t nearly as impressive.

So here’s what I’ve come up with.


Simply put, wins and losses matter; however, not every win or loss is created equal.  We often here analysts talk about “style points” regarding the margin of victory, even though they have long since been removed from BCS equations.  Of course, running up the score is something no ranking should encourage, but I think I’ve found a happy middle ground here.  In my mind, there are really three types of victories in a football game: a close win, a comfortable win, and a complete blowout.  My ranking will put all wins and losses into these three categories, defining each as follows:

  • Close Win: Single possession victory (1-8 points)
  • Comfortable Win: Two possession victory (9-16 points)
  • Blowout Win: Three possession victory and above (17+ points)

The above will define some separation for the teams as far as “style points” are concerned, plus there will be little bonus for running up the score.  In my mind, once you are up by three possessions, everything else is just stat padding at that point.

The other major metric to add is the rank of the team you beat or lost to.  Victories against top ranked opponents should be rewarded as opposed to destroying a bottom feeder.  On the loss side, losing to an opponent that is clearly better than you shouldn’t drop you as much as losing to a team that is one of the worst in college football.

With all this in mind, I’ve come up with the following over-simplified formula:

  • W/L [1/-1] * Margin [1/2/3] * Opponent Rank [1-120] = Total W/L Points

The opponent rank multiplier will be initially based on their ranking for that current week and will change dynamically for the remainder of the season.  For wins, beating #1 means a 120 multiplier, but losing to #1 will result in a 1 multiplier.

Oh, and if a team schedules a FCS team, I will not be rewarding it, period.  I’m going to treat FCS games like a BYE.  Bowl games don’t count FCS wins, so I surely won’t.  I’ve thought about being extremely vindictive and penalizing heavily for pulling a Michigan and losing to a FCS team, but for simplicity of programming I won’t this year.

Other Metrics

While measuring wins and losses will be the bulk of my rankings, I wanted to add in something to provide a bit of extra separation between the teams (also, I need to have a way to initially rank teams for week 1).  I wanted to find some kind of stat to measure a teams overall effectiveness on both sides of the ball and try to find a way to incorporate special teams as well.  For this area, I will be adding in Average Total Net Yardage along with Average Turnover Margin.  The forumlas for each are as follows:

  • Average Total Net Yardage = [(Offensive Yards Gained + Punt Return Yards + Kick Return Yards) – (Yards Allowed + Punt Return Yards Allowed + Kick Return Yards Allowed + Penalty Yardage)]/Games Played
  • Average Turnover Margin = (Turnovers Forced-Turnovers Allowed)/Games Played

The Average Total Net Yardage (good God, I need to come up with a different name for now, I’ll use ATNY for this), will measure the performance of a team in every area of the game, including shooting yourself in the foot with penalties.  Turnover Margin is rather self-explanatory: good teams hold onto the ball, bad teams cough it up.

Now, you will notice that I’m taking the averages for both.  This should help give a better ranking as the season progresses so the rare explosions or complete brain-farts will even out by season’s end.

I won’t be throwing out the high & lows for either stat this season; however, much like the wins category, if there is a game against a FCS team, I won’t be counting the stats regardless of the outcome.  There should be zero reward at all for scheduling the cupcakes and that goes for the stats as well.

Putting It All Together

Ok, so with all these crazy numbers, each team will be ranked for each category 1-120 separately, with 120 points going to the top rank, descending appropriately.  Keeping in mind that wins and losses should be the big player here, I have come up with the following:

  • (W/L Points Rank + (ANTY Rank + TO Margin Rank)/2)/2 = Final Score

All teams will then be ranked based on their final score.  As I said before, week 1 will be a little bit goofy as I will have to do an “initial ranking” based on ANTY and TO Margin before the week 1 wins and losses can come into play.

Overall, I expect some seriously crazy and hilarious rankings early on in the season.  Once the season rolls on, and the losses start piling up, I am hoping that the ranking seems at least halfway feasible.

This should be a good bit of fun and hopefully this formula can be a good starting point for some slight tweaks in future seasons.  Now if you’ll excuse me, I have some programming to do.

Edit: Since this has been posted, I have added a tie breaker to my final rankings. The order of which is:

  • W/L Points Rank
  • ANTY Rank
  • TO Margin Rank
  • Alphabetical Order (because I’m lazy like that)
  • starkruzr

    is there some easy XML source for all this data for you to import, or are you going to have to ::shudder:: screenscrape it from somewhere?

    • Ryan Ritter

      Right now, it’s a screenscrape. Not looking forward to it, but I am hoping to find a better import method as the season moves on.

      It’s definitely going to suck, but it still should be fun.

  • http://ndeddiemac.tumblr.com NDEddieMac

    Interesting setup. Once you do get an easier input method, could you run what last year’s final #s would look like? Have you done any sort of test runs? Very interested to see how this goes through the year.

    • Ryan Ritter

      I’ve gotten a few requests on trying to rank last years and I’ll see what I can do. I’ll likely be too busy trying to keep up with this year and sadly I’d have to do a ton of calculations on my own with ANTY and removing all the FCS games too.

      As far as test runs, I’ve done zero, which honestly excites me. This could show just how hard it is to put a ranking formula together or I could actually be onto something. Should be fun as long as the data input doesn’t break me!

  • Pingback: NDtex25: Week 1 » NDtex.com()

  • Pingback: NDtex25: Week 3 » NDtex.com()

  • Pingback: NDtex25: Week 3 » NDtex.com()

  • Pingback: Irish Blogger Gathering: Off the Snide » NDtex.com()

  • Pingback: NDtex25: Week 4 » NDtex.com()

  • Pingback: NDtex25: Week 5 « Her Loyal Sons()