repak shawahb
si vis pacem, para rectum

^

   

rsw@jfet.org


blogroll

       
Wed, 14 Nov 2007

moooooooore powerrrrrrrrrr

...rankings.

I was bored and decided to write some code to produce NFL power rankings. Perhaps one of my perenially disappointed faithful readers might care to peruse. (Gautham actually suggested splitting the offensive and defensive power rankings; previously I'd only looked at overall power rankings, which I present below.)

First, a little explanation: these are split offensive and defensive power rankings; in other words, normalized rankings by points for and points against considering the record of the opposition as given by the same ranking. My assumption here is that my rankings should be zero-sum when offense and defense are combined. That is, every (adjusted) point counted towards an offense is counted precisely the same against the opposing defense. The rankings are determined as follows:

  1. Rank offenses and defenses by adding up points for and points against. Normalize to a 0-100 scale, with 100 being most points for and least points against.
  2. Given the above rankings, normalize the points scored: pnorm = pscore * (1 - (offensive_rating - opposing_defensive_rating)). Note that this is zero-sum, since the defensive rating for the team on defense is used against the offensive rating of the team on offense.
  3. Repeat the above, but this time use the rankings returned in the last step. Continue iterating until the algorithm converges on a set of rankings. These are now both perfectly self-consistent (that is, using the rankings to normalize the scores yields exactly the same rankings) and zero-sum (all points counted for a defense are also counted against an offense).

Note that this is very much a discrete feedback system, and as such is subject to instability. To ameliorate this problem, we add a "gain" term as such: pnorm = pscore * (1 - gain*(offensive_rating - opposing_defensive_rating)), where gain < 1. While monitoring the state variables, we experiment with gain until we get close to the largest value that yields a stable system, in this case 1/4. Yes, this is hacky. Bite me, Hippo.

Finally, using approximately the same algorithm (details if you insist), I do the same thing for total performance, taking into account win/loss, point differential, defensive performance, and home field advantage.

So now we have a mess of numbers. What are they? Well, in one sentence, they are normalized offensive and defensive ratings adjusted for relative strength of schedule. How, relative? Well, we look at the difference between the opposing defense and our offense (or vice-versa), not our defense versus the league average or some such. Think of it this way: if the worst team in the league had to play a bunch of mediocre teams, those would be hard-fought wins; conversely, the best team in the league should have little trouble with those same teams. Relative strength of schedule takes this into account.

Here are the numbers:

combined                offense                 defense
NWE	100.000        	NWE	100.000		PIT	100.000
GNB	88.877        	DAL	83.321		SEA	89.290
DAL	85.341        	IND	72.842		TAM	85.638
IND	83.189        	CLE	67.917		NWE	84.650
PIT	80.843        	PIT	64.065		GNB	83.451
JAC	66.579        	GNB	58.556		IND	81.508
TEN	66.043        	DET	54.766		TEN	76.748
DET	64.926        	CIN	54.511		BUF	70.769
NYG	63.272        	NYG	53.387		JAC	66.878
SDG	56.904        	SDG	51.525		KAN	59.164
TAM	53.994        	HOU	49.478		BAL	56.930
SEA	53.481        	NOR	48.993		PHI	56.024
WAS	52.787        	ARI	41.471		SDG	53.106
CLE	51.385        	PHI	40.369		CAR	51.544
BUF	50.391        	JAC	38.916		CHI	51.263
PHI	43.508        	SEA	37.553		MIN	49.928
CHI	41.806        	TEN	36.275		NYG	49.785
HOU	40.583        	WAS	34.992		ATL	49.339
ARI	40.051        	MIA	34.039		WAS	49.119
DEN	39.732        	MIN	32.003		DAL	45.858
NOR	39.701        	CHI	29.441		OAK	43.484
KAN	38.975        	TAM	29.306		ARI	36.620
CAR	38.408        	DEN	28.936		SFO	30.923
BAL	36.894        	NYJ	26.355		DET	23.899
MIN	32.504        	OAK	23.123		NYJ	21.136
CIN	31.475        	CAR	21.660		NOR	19.135
ATL	26.070        	BUF	17.196		HOU	18.749
OAK	15.436        	KAN	15.675		DEN	15.649
SFO	13.263        	ATL	15.238		MIA	7.479
NYJ	6.447        	BAL	14.313		STL	6.008
STL	3.783        	STL	14.185		CIN	5.766
MIA	0.000        	SFO	0.000		CLE	0.000

Sucks for Cleveland that they have a terrible defense, since their offense pretty much rocks...

I'll keep these updated weekly until the end of the season.

Edit: here's the code if you want to play with it yourself.


[ permalink | 0 comments (add one you lazy bastard!) ]

writebacks (add one you lazy bastard!)




post a comment:

Save name/email/&c
Name:
URL/Email: [http://... or mailto:you@wherever] (optional)
Title: (optional)
Comments:
Key:
(Required)