`S_"adj"(T) = (S(T))/(SoS(T,S))`

This adjusted statistic is a way of normalizing statistics between teams when they have played different opponents.

One shortcoming of this approach is that the Strength of Schedule is itself based upon the unadjusted statistic:

`SoS(T,S) = (1/(n*m)) sum_(i="opponents"(T))^n sum_(j="opponents"(i))^m (j ne T) S(j)`

So to some extent this measure is biased by the quality of a team's opponents' opponents' opponents (if you can follow that!). This bias may not be significant -- certainly by the middle of the season, the third-level opponents for a given team is a pretty big set, so there's going to be overlap between most teams. But each team's opponents will be dominated by their conference teams, and there are sizable differences in strength between conferences, so it may be significant.

The obvious way to eliminate this bias is to use the

*adjusted*statistic in the SoS calculation. The whole purpose of the adjusted statistic is to normalize away these biases.

`SoS(T,S) = (1/(n*m)) sum_(i="opponents"(T))^n sum_(j="opponents"(i))^m (j ne T) S_"adj"(j)`

However, we've now created a circular definition! The adjusted statistic for a team depends upon it's opponents' opponents adjusted statistic -- and their adjusted statistic depends upon other teams, and so on.

But just because the definition is circular doesn't mean we can't compute its value. One approach to do this is to guess some initial value for the adjusted statistic (say, the unadjusted value) and then recalculate all the adjusted statistics. The values will change and then we can repeat until we converge on an answer. We do have to add one more constraint to ensure convergence to a single set of values -- for this post I'll require that the adjusted statistics sum to 1 (but there are other constraints that also work).

Let's take a look at how this works. For this experiment, we have a small league of three teams. They've all played each other once, and here are their unadjusted statistics for 3 point shooting:

Team | Unadj |
---|---|

Blue | 34% |

Gold | 24% |

Silver | 30% |

Now we will calculate the Strength of Schedule for each team. Since each team has played each other once, their opponents' opponents are each of the other two teams. (I'll wait while you confirm that.) We'll use the Unadjusted statistic as our first guess for the Adjusted statistic, so the SoS is just the average of the other two teams.

Team | Unadj | SoS(1) |
---|---|---|

Blue | 34% | 0.27 |

Gold | 24% | 0.32 |

Silver | 30% | 0.29 |

The Adjusted Statistic is then the Unadjusted Statistic divided by the SoS.

Team | Unadj | SoS(1) | Adj(1) |
---|---|---|---|

Blue | 34% | 0.27 | 1.26 |

Gold | 24% | 0.32 | 0.75 |

Silver | 30% | 0.29 | 1.03 |

Finally, we take the Adjusted Statistic and normalize it so that it sums to one to create the Normalized Adjusted Statistic:

Team | Unadj | SoS(1) | Adj(1) | Nadj(1) |
---|---|---|---|---|

Blue | 0.34 | 0.27 | 1.26 | 0.41 |

Gold | 0.24 | 0.32 | 0.75 | 0.25 |

Silver | 0.3 | 0.29 | 1.03 | 0.34 |

Now let's repeat that calculation again for a second iteration.

Team | Unadj | SoS(1) | Adj(1) | Nadj(1) | SoS(2) | Adj(2) | Nadj(2) |
---|---|---|---|---|---|---|---|

Blue | 0.34 | 0.27 | 1.26 | 0.41 | 0.29 | 1.16 | 0.43 |

Gold | 0.24 | 0.32 | 0.75 | 0.25 | 0.38 | 0.64 | 0.24 |

Silver | 0.3 | 0.29 | 1.03 | 0.34 | 0.33 | 0.91 | 0.34 |

The Normalized Adjusted Statistics still changed a little bit, so let's do a third iteration.

Team | Unadj | SoS(1) | Adj(1) | Nadj(1) | SoS(2) | Adj(2) | Nadj(2) | SoS(3) | Adj(3) | Nadj(3) |
---|---|---|---|---|---|---|---|---|---|---|

Blue | 0.34 | 0.27 | 1.26 | 0.41 | 0.29 | 1.16 | 0.43 | 0.29 | 1.19 | 0.44 |

Gold | 0.24 | 0.32 | 0.75 | 0.25 | 0.38 | 0.64 | 0.24 | 0.38 | 0.63 | 0.23 |

Silver | 0.3 | 0.29 | 1.03 | 0.34 | 0.33 | 0.91 | 0.34 | 0.33 | 0.90 | 0.33 |

Still a

*little*bit of change, so we do another iteration.

Team | Unadj | SoS(1) | Adj(1) | Nadj(1) | SoS(2) | Adj(2) | Nadj(2) | SoS(3) | Adj(3) | Nadj(3) | SoS(4) | Adj(4) | Nadj(4) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|

Blue | 0.34 | 0.27 | 1.26 | 0.41 | 0.29 | 1.16 | 0.43 | 0.29 | 1.19 | 0.44 | 0.28 | 1.21 | 0.44 |

Gold | 0.24 | 0.32 | 0.75 | 0.25 | 0.38 | 0.64 | 0.24 | 0.38 | 0.63 | 0.23 | 0.38 | 0.62 | 0.23 |

Silver | 0.3 | 0.29 | 1.03 | 0.34 | 0.33 | 0.91 | 0.34 | 0.33 | 0.90 | 0.33 | 0.33 | 0.90 | 0.33 |

And voila! The Normalized Adjusted Statistics (and the SoS) have converged (at least to two decimal places). And a good thing, too, because that table was getting very wide. If you compare the adjusted statistics to the unadjusted statistics, you see that Blue is a much better 3 point shooting team than the unadjusted statistic shows, Gold is slightly worse, and Silver slightly better.

So there you have it -- a method for adjusting a non-symmetric statistic to account for strength of schedule, and a way to compute it. In the next post, I'll share some thoughts on how to create an efficient implementation of this method.