Inspired by a post by sw293 in one of my long-past stats threads from 2006, I re-implemented his/her Offensive Power Rankings algorithm. Essentially, it tries to determine approximately how much each team, on average, contributed to their alliance.

In essence, it looks at a team’s accumulated score over the course of a weekend as a sum of the offensive power ratings of all the other teams, multiplied by the number of times that team was paired with each team.

Example: 1565’s first match at GTR was with 2198 and 1870, and they played 8 matches total. The ‘…’ would be all their other alliance partners through qualifying, multiplied each time by how many times they were allied with them.

Once you arrange the scores of all the teams from a regional in this way, then you end up with N equations (one big sum of scores per team) and N unknowns (the offensive power ratings). This can be solved to find out the OPRs.

Without further ado, here they are for GTR. I’ll be doing other regionals in the very near future.

These power rankings were a great help in 2006. (very accurate and very predictive) Of course they did not predict the exact outcome of matches, but it certainly let a team know what they were up against and who they were partnered with. It was a big part of our Championship scouting routine in 2006.

The penalties are such a huge factor this year, unless you find a way to account for them, this formula won’t accurately reflect a teams offensive ability.

Exactly correct. These shouldn’t be used as the be-all end-all of scouting, but perhaps as pointers to find gems in the rough. There are many things that can happen in this game (and in other years) that aren’t encapsulated in a simple number.

This is actually better then a team’s offensive ability. It shows a teams point contribution. If a team is consistently penalized, they will have a lower OPR then a team that scores the same points per match but does so without penalties. You would obviously want the latter on your alliance.

Another interesting thing is that a team that constantly gets in the way of it’s alliance parters would have a lower OPR then one that scores the same number of points but allows it’s alliance partners to live to their full potential.

Just finished the complete list. This includes every single 2nd-week and later regional. The first-week regionals have slightly different formatting for match results, and I couldn’t include them easily. At least based on this analysis, we finally have an answer for the question: “Is anyone CLOSE to 1114?”. The answer: no.

It had funny formatting, but upon thinking about it some more, I don’t think it should badly affect my program’s ability to read it. I’ll put it in and re-do them.

In fact, I can think of a way I should be able to get the week 1 regionals working as well.

Check this thread again in 10 minutes, I should have an updated one up.

“Red1 <tab> Red2 <tab> red3 <tab> blue1 <tab> blue2 <tab> blue3 <tab> redscore <tab> bluescore <line feed or carriage return or end of line or whatever>” is all I need. That’d be great. CSV is good too, I’m not particular about the delimiter.

Okay I somewhat understand how this is all calculated but I am guessing that somebody has already made an excel file to calculate all this? I tried to download one from '06 but the link was broken so can somebody please upload a new one? Thanks.

Could you help me make sure I understand the linear algebra involved?

I understand that p is what we’re looking to find, or the average number of points a team contributes per match. s and M we can calculate from the results coming from each regional. Since Mp = s, we can conclude that p = (M-1)s (where M-1 denotes M inverse). It seems to me from thinking about it that M is symmetric, and as such M = M-1. Is that actually the case?

I’ll probably try to write a program to take a csv dump and spit out rankings if I understand the math.

M is indeed symmetric. M*[j] indicates how many matches team i played with team j. Therefore, it makes sense that M*[j] = M[j]*.

I don’t think the inverse of a symmetric matrix is necessarily symmetric. The transpose of a symmetric matrix M would be equal to its non-transpose, but I don’t think that carries for symmetry. To prove that M-1 is not necessarily equal to M for a symmetric matrix, just think of the symmetric matrix 2I, where I is the identity matrix.

If (M)-1 = (M) for symmetric matrices like you are proposing, and we know MM-1 = I for any matrix and its inverse, then (2I)(2I) must equal I, but this is not the case.

I didn’t have to write the matrix solver myself, I used a library I found online. If there are any tricks it used, I’m not aware of them.***

You’re right. For some reason, I was thinking of the transpose rather than the inverse. I’ll see how I handle the inversion of the matrix when I get there. In the meantime, I’m working through the easy stuff: reading the csv and making and populating s and M.

Just an FYI…all of the match data is NOT included from the Peachtree regional. The scoring system failed so all of the elimination matches and many of the qualifying matches from Saturday are not included. As an example…team 343 finished 12-4 at that regional. We are still shown as 5-3 on the Blue Alliance. That means there are eight matches not accounted for on us alone. That would/could be the same for many of the other teams who attended Peachtree.

Is there anybody that has that manual data? Can it be manually entered into the Blue Alliance?