Strength of Schedule (SOS) measures how difficult a team's set of opponents is, allowing fair comparison of records achieved against different competition levels.
Why SOS Matters
Application
Impact
Team Comparison
Two 10-6 teams aren't equal if one faced playoffs teams, other faced bottom-feeders
Prediction Models
Future opponent quality affects win projections
Draft Order
SOS is NFL tiebreaker for teams with same record
Metric Adjustment
EPA, yards, etc. need opponent context
Calculation Methods
1. Simple Opponent Win %
SOS = Average(Opponent Win Percentages)
Easy to calculate
Circular dependency issue
2. Second-Order SOS
Combined SOS = 0.67 × First-Order + 0.33 × Second-Order
Teams in strong divisions:
- Face tough opponents 6 times (division games)
- 35% of schedule is division games
- Same-place finishers affect remaining schedule
Common Mistakes
Mistake
Correction
Comparing records without SOS
Always check opponent quality
Using only past SOS for predictions
Include future opponents
Treating all SOS methods equally
Different methods for different purposes
Ignoring division weighting
Division games happen twice
Quick Implementation
def simple_sos(team, games, records):
"""Calculate basic SOS."""
opponents = get_opponents(team, games)
return mean([records[opp]['win_pct'] for opp in opponents])
def adjust_wins(wins, games, sos):
"""Adjust wins for SOS."""
adjustment = (sos - 0.5) * games * 0.16
return wins + adjustment
The Circularity Problem
Issue: To know A's SOS, need B's record, but B's record includes game vs A
Solutions:
1. Exclude head-to-head games
2. Use second-order (opponents' opponents)
3. Iterative methods (Colley Matrix)
4. Regression-based ratings
Decision Framework
Question
Recommended Method
Quick comparison
Simple opponent win %
Predictions
Rating-based SOS
Official standings
Second-order (NFL method)
Efficiency adjustment
Pythagorean or rating-based
Key Numbers
Average NFL SOS: 0.500 (by definition)
SOS range: Typically 0.44-0.56
Division games: 6 per team (35% of schedule)
Adjustment factor: ~0.16 wins per 0.01 SOS difference
Remember
Context is everything - Records without SOS are incomplete
Multiple methods exist - Choose based on application
Future matters - Past SOS explains, future SOS predicts