Previously, I simulated every game via my play-by-play simulator to estimate the chances of each team in each round of this year's NBA playoffs.
While simulation is the most flexible technique, as it allows for all kinds of customization (adding/removing players, tweaking lineup minutes, quantifying individual locations' home court advantage, factoring in weather for outdoor sports), it's rigid in its specificity in that it can't be generalized outside of the exact conditions scripted to the simulator.
A math or stats based model, on the other hand, can approximate more general projections, such as matching up any two teams overall.
So I took the output of each possible matchup combination to go backwards and build a Simple Rating System (SRS). This technique can be used over a normal schedule where every team doesn't play one another (like they did in my simulations) using some linear algebra (additional resources on this at the end of this post). This also is the new adapted methodology to the matrix component of my original MDS Model.
First I set up a matrix of every simulated outcome:
Team | MIL | ORL | IND | MIA | BOS | PHI | TOR | BKN | LAL | POR | HOU | OKC | DEN | UTA | LAC | DAL |
MIL | 0.0 | 6.2 | 6.0 | 0.4 | 3.6 | 4.8 | 2.4 | 6.5 | 3.3 | 4.9 | 2.7 | 2.3 | 4.1 | 3.6 | 1.2 | 2.0 |
ORL | -6.2 | 0.0 | -0.8 | -6.5 | -3.5 | -1.1 | -3.9 | 0.2 | -3.7 | -1.7 | -3.2 | -3.4 | -0.5 | -2.6 | -4.0 | -4.1 |
IND | -6.0 | 0.8 | 0.0 | -5.6 | -3.2 | -0.6 | -3.3 | 0.1 | -4.6 | -1.9 | -3.5 | -4.4 | -1.9 | -2.4 | -4.6 | -3.5 |
MIA | -0.4 | 6.5 | 5.6 | 0.0 | 2.4 | 5.5 | 1.9 | 4.9 | 2.0 | 4.8 | 2.1 | 0.7 | 4.6 | 3.6 | 0.2 | 2.7 |
BOS | -3.6 | 3.5 | 3.2 | -2.4 | 0.0 | 2.4 | -0.7 | 3.4 | -0.4 | 3.1 | 0.4 | -2.3 | 0.7 | 0.4 | -1.9 | -1.7 |
PHI | -4.8 | 1.1 | 0.6 | -5.5 | -2.4 | 0.0 | -4.3 | 0.6 | -2.4 | 0.2 | -2.7 | -3.6 | -1.0 | -2.8 | -4.8 | -3.8 |
TOR | -2.4 | 3.9 | 3.3 | -1.9 | 0.7 | 4.3 | 0.0 | 5.9 | 0.6 | 2.4 | 0.7 | -0.8 | 2.1 | 0.8 | -1.0 | 0.8 |
BKN | -6.5 | -0.2 | -0.1 | -4.9 | -3.4 | -0.6 | -5.9 | 0.0 | -4.4 | -1.2 | -4.2 | -4.7 | -1.6 | -3.3 | -5.4 | -4.6 |
LAL | -3.3 | 3.7 | 4.6 | -2.0 | 0.4 | 2.4 | -0.6 | 4.4 | 0.0 | 2.0 | 0.2 | -1.5 | 2.3 | 0.6 | -1.4 | -0.5 |
POR | -4.9 | 1.7 | 1.9 | -4.8 | -3.1 | -0.2 | -2.4 | 1.2 | -2.0 | 0.0 | -1.9 | -3.3 | -0.1 | -1.6 | -4.3 | -2.7 |
HOU | -2.7 | 3.2 | 3.5 | -2.1 | -0.4 | 2.7 | -0.7 | 4.2 | -0.2 | 1.9 | 0.0 | -0.9 | 0.3 | 1.1 | -2.0 | 0.1 |
OKC | -2.3 | 3.4 | 4.4 | -0.7 | 2.3 | 3.6 | 0.8 | 4.7 | 1.5 | 3.3 | 0.9 | 0.0 | 4.2 | 2.6 | -0.7 | 0.7 |
DEN | -4.1 | 0.5 | 1.9 | -4.6 | -0.7 | 1.0 | -2.1 | 1.6 | -2.3 | 0.1 | -0.3 | -4.2 | 0.0 | -0.6 | -4.3 | -2.7 |
UTA | -3.6 | 2.6 | 2.4 | -3.6 | -0.4 | 2.8 | -0.8 | 3.3 | -0.6 | 1.6 | -1.1 | -2.6 | 0.6 | 0.0 | -3.0 | -0.8 |
LAC | -1.2 | 4.0 | 4.6 | -0.2 | 1.9 | 4.8 | 1.0 | 5.4 | 1.4 | 4.3 | 2.0 | 0.7 | 4.3 | 3.0 | 0.0 | 1.7 |
DAL | -2.0 | 4.1 | 3.5 | -2.7 | 1.7 | 3.8 | -0.8 | 4.6 | 0.5 | 2.7 | -0.1 | -0.7 | 2.7 | 0.8 | -1.7 | 0.0 |
Note how some of these results are intransitive, just like real life:
- BOS beats HOU by 0.4
- HOU beats DAL by 0.1
- DAL beats BOS by 1.7
Next I set up a "Win Matrix", with the total number of games played/simulated along the hypotenuse:
(Team A, Team B) =
MOV if Team A beat Team B;
else if Team A = Team B then # games played;
else 0
Team | MIL | ORL | IND | MIA | BOS | PHI | TOR | BKN | LAL | POR | HOU | OKC | DEN | UTA | LAC | DAL |
MIL | 15.0 | 6.2 | 6.0 | 0.4 | 3.6 | 4.8 | 2.4 | 6.5 | 3.3 | 4.9 | 2.7 | 2.3 | 4.1 | 3.6 | 1.2 | 2.0 |
ORL | 0.0 | 15.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.2 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
IND | 0.0 | 0.8 | 15.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.1 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
MIA | 0.0 | 6.5 | 5.6 | 15.0 | 2.4 | 5.5 | 1.9 | 4.9 | 2.0 | 4.8 | 2.1 | 0.7 | 4.6 | 3.6 | 0.2 | 2.7 |
BOS | 0.0 | 3.5 | 3.2 | 0.0 | 15.0 | 2.4 | 0.0 | 3.4 | 0.0 | 3.1 | 0.4 | 0.0 | 0.7 | 0.4 | 0.0 | 0.0 |
PHI | 0.0 | 1.1 | 0.6 | 0.0 | 0.0 | 15.0 | 0.0 | 0.6 | 0.0 | 0.2 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
TOR | 0.0 | 3.9 | 3.3 | 0.0 | 0.7 | 4.3 | 15.0 | 5.9 | 0.6 | 2.4 | 0.7 | 0.0 | 2.1 | 0.8 | 0.0 | 0.8 |
BKN | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 15.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
LAL | 0.0 | 3.7 | 4.6 | 0.0 | 0.4 | 2.4 | 0.0 | 4.4 | 15.0 | 2.0 | 0.2 | 0.0 | 2.3 | 0.6 | 0.0 | 0.0 |
POR | 0.0 | 1.7 | 1.9 | 0.0 | 0.0 | 0.0 | 0.0 | 1.2 | 0.0 | 15.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
HOU | 0.0 | 3.2 | 3.5 | 0.0 | 0.0 | 2.7 | 0.0 | 4.2 | 0.0 | 1.9 | 15.0 | 0.0 | 0.3 | 1.1 | 0.0 | 0.1 |
OKC | 0.0 | 3.4 | 4.4 | 0.0 | 2.3 | 3.6 | 0.8 | 4.7 | 1.5 | 3.3 | 0.9 | 15.0 | 4.2 | 2.6 | 0.0 | 0.7 |
DEN | 0.0 | 0.5 | 1.9 | 0.0 | 0.0 | 1.0 | 0.0 | 1.6 | 0.0 | 0.1 | 0.0 | 0.0 | 15.0 | 0.0 | 0.0 | 0.0 |
UTA | 0.0 | 2.6 | 2.4 | 0.0 | 0.0 | 2.8 | 0.0 | 3.3 | 0.0 | 1.6 | 0.0 | 0.0 | 0.6 | 15.0 | 0.0 | 0.0 |
LAC | 0.0 | 4.0 | 4.6 | 0.0 | 1.9 | 4.8 | 1.0 | 5.4 | 1.4 | 4.3 | 2.0 | 0.7 | 4.3 | 3.0 | 15.0 | 1.7 |
DAL | 0.0 | 4.1 | 3.5 | 0.0 | 1.7 | 3.8 | 0.0 | 4.6 | 0.5 | 2.7 | 0.0 | 0.0 | 2.7 | 0.8 | 0.0 | 15.0 |
Next I take the inverse of this matrix (which is only invertible after enough games have been played such that every team is connected to one another by a graph network):
Win' = Win-1
I then multiply this by the total margin of victory (MOV) over all games played:
Rating = Win' * MOV
Team | MIL | ORL | IND | MIA | BOS | PHI | TOR | BKN | LAL | POR | HOU | OKC | DEN | UTA | LAC | DAL | MOV | mmult |
MIL | 0.07 | -0.01 | -0.01 | 0.00 | -0.01 | 0.00 | -0.01 | 0.00 | -0.01 | -0.01 | -0.01 | -0.01 | -0.01 | -0.01 | -0.01 | -0.01 | 54.0 | 3.83 |
ORL | 0.00 | 0.07 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | -45.1 | -2.96 |
IND | 0.00 | 0.00 | 0.07 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | -44.7 | -2.79 |
MIA | 0.00 | -0.01 | -0.01 | 0.07 | -0.01 | -0.01 | -0.01 | 0.00 | -0.01 | -0.01 | -0.01 | 0.00 | -0.01 | -0.01 | 0.00 | -0.01 | 47.0 | 4.44 |
BOS | 0.00 | -0.01 | -0.01 | 0.00 | 0.07 | -0.01 | 0.00 | -0.01 | 0.00 | -0.01 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 4.1 | 2.69 |
PHI | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.07 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | -35.4 | -1.88 |
TOR | 0.00 | -0.01 | -0.01 | 0.00 | 0.00 | -0.02 | 0.07 | -0.02 | 0.00 | -0.01 | 0.00 | 0.00 | -0.01 | 0.00 | 0.00 | 0.00 | 19.5 | 3.99 |
BKN | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.07 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | -51.1 | -3.41 |
LAL | 0.00 | -0.01 | -0.02 | 0.00 | 0.00 | -0.01 | 0.00 | -0.02 | 0.07 | -0.01 | 0.00 | 0.00 | -0.01 | 0.00 | 0.00 | 0.00 | 11.3 | 3.63 |
POR | 0.00 | -0.01 | -0.01 | 0.00 | 0.00 | 0.00 | 0.00 | -0.01 | 0.00 | 0.07 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | -26.4 | -0.80 |
HOU | 0.00 | -0.01 | -0.01 | 0.00 | 0.00 | -0.01 | 0.00 | -0.02 | 0.00 | -0.01 | 0.07 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 8.0 | 3.03 |
OKC | 0.00 | 0.00 | -0.01 | 0.00 | -0.01 | -0.01 | 0.00 | -0.01 | -0.01 | -0.01 | 0.00 | 0.07 | -0.02 | -0.01 | 0.00 | 0.00 | 28.7 | 3.52 |
DEN | 0.00 | 0.00 | -0.01 | 0.00 | 0.00 | 0.00 | 0.00 | -0.01 | 0.00 | 0.00 | 0.00 | 0.00 | 0.07 | 0.00 | 0.00 | 0.00 | -20.8 | -0.45 |
UTA | 0.00 | -0.01 | -0.01 | 0.00 | 0.00 | -0.01 | 0.00 | -0.01 | 0.00 | -0.01 | 0.00 | 0.00 | 0.00 | 0.07 | 0.00 | 0.00 | -3.3 | 1.94 |
LAC | 0.00 | 0.00 | -0.01 | 0.00 | -0.01 | -0.01 | 0.00 | -0.01 | -0.01 | -0.01 | -0.01 | 0.00 | -0.01 | -0.01 | 0.07 | -0.01 | 37.7 | 4.04 |
DAL | 0.00 | -0.01 | -0.01 | 0.00 | -0.01 | -0.01 | 0.00 | -0.01 | 0.00 | -0.01 | 0.00 | 0.00 | -0.01 | 0.00 | 0.00 | 0.07 | 16.4 | 3.77 |
This now gives me a rating over the games won in the simulations. However, it doesn't account for losses (or lack thereof); obviously the more you win, the less you lose - but if your losses are all close, then you should get credit for that. Thus I do the same process by just transposing the initial win matrix:
Loss = WinT
This results in the following ratings set, where I average the win and loss ratings:
Team | MMult | Matrix Rank | WMatrix | LMatrix |
MIA | 3.74 | 1 | 4.44 | 3.04 |
MIL | 3.72 | 2 | 3.83 | 3.60 |
LAC | 3.11 | 3 | 4.04 | 2.19 |
OKC | 2.32 | 4 | 3.52 | 1.11 |
TOR | 2.05 | 5 | 3.99 | 0.12 |
DAL | 1.76 | 6 | 3.77 | -0.24 |
LAL | 1.44 | 7 | 3.63 | -0.76 |
HOU | 1.09 | 8 | 3.03 | -0.85 |
BOS | 0.61 | 9 | 2.69 | -1.47 |
UTA | -0.18 | 10 | 1.94 | -2.30 |
DEN | -2.18 | 11 | -0.45 | -3.91 |
POR | -2.37 | 12 | -0.80 | -3.94 |
PHI | -3.12 | 13 | -1.88 | -4.37 |
IND | -3.51 | 14 | -2.79 | -4.23 |
ORL | -3.68 | 15 | -2.96 | -4.39 |
BKN | -4.10 | 16 | -3.41 | -4.78 |
Interestingly, this method has Miami by a hair as the best team - compared to Milwaukee's, their simulated MOV was higher over ORL, PHI, DEN, UTA, and DAL, and they only project to lose to Milwaukee by 0.4 points (51.2% win probability in a single game).
These are designed to be centered around 0 (in this case, 0 is the average playoff team, not average NBA team). With the lack of transitivity shown earlier, these ratings won't exactly approximate the simulated results of each matchup (MIL projects to beat ORL by 7.4 points by these ratings, yet 6.2 points in their simulations). But they allow for a much easier direct comparison of the strength of each team.
Resources
Pro Football Reference matrix description
Visual guide by Ed Feng
In depth dissertation by Kenneth Massey
No comments:
Post a Comment