Key Takeaways: Strength of Schedule

One-Page Reference


Core Concept

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
  • First-order: Your opponents' records
  • Second-order: Your opponents' opponents' records
  • NFL's official tiebreaker method

3. Rating-Based SOS

SOS = Average(Opponent Power Ratings)
  • Uses sophisticated team ratings
  • Avoids some circularity

4. Pythagorean SOS

SOS = Average(Opponent Pythagorean Expectations)
  • Uses points scored/allowed
  • Better captures true team quality

Key Formulas

SOS-Adjusted Wins

adjustment = (SOS - 0.5) × 16 × games / 100
adjusted_wins = actual_wins + adjustment

Expected Win Probability

rating_diff = team_rating - opponent_rating + HFA
win_prob = 1 / (1 + 10^(-rating_diff / 8))

Typical SOS Ranges

Description SOS Value
Hardest schedule 0.54-0.58
Above average 0.51-0.54
League average 0.50
Below average 0.46-0.49
Easiest schedule 0.42-0.46

Past vs Future SOS

Type Use Case
Past SOS Evaluating current record quality
Future SOS Projecting final record, playoff odds
Combined Full-season difficulty assessment

Division Effects

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

  1. Context is everything - Records without SOS are incomplete
  2. Multiple methods exist - Choose based on application
  3. Future matters - Past SOS explains, future SOS predicts
  4. Division effects - NFL scheduling creates systematic patterns
  5. Adjust metrics - EPA, efficiency need opponent context