Methodology

Data Source & Smoothing

Game-by-game offensive and defensive ratings are sourced from NBA.com via the nba_api library. Raw ratings are smoothed using a 5-game rolling average to reveal underlying trends while filtering out single-game noise.

Consistency (Rugosity)

Consistency is measured using rugosity—a metric borrowed from ecology and geography that quantifies how "jagged" or volatile a time series is. Rugosity is calculated as the arc-to-chord ratio: the total path length of the rating curve divided by the straight-line distance from start to end.

Rugosity Formula Rugosity = Path Length / Chord Length
Path Length Σ √[(xi+1 - xi)² + (yi+1 - yi)²]   for i = 1 to n-1
Chord Length √[(xn - x1)² + (yn - y1)²]

Interpretation:

  • Rugosity = 1.0 — Perfectly straight line (maximum consistency)
  • Rugosity < 1.15 — Highly consistent performance
  • Rugosity 1.15 - 1.35 — Moderate variation
  • Rugosity > 1.35 — Volatile, unpredictable performance

Tier Classification

Teams are grouped into tiers based on net rating (offensive rating minus defensive rating). Thresholds:

  • Contenders — Net Rating > +6.0
  • Legit Threats — Net Rating > +3.5
  • Dangerous — Net Rating > +1.5
  • Play-In — Net Rating > -1.5
  • Up-and-Coming — Net Rating > -4.0
  • Rebuild — Net Rating > -7.0
  • Tank — Net Rating ≤ -7.0

4D Matrix Classification

Teams are classified using a 4-dimensional matrix based on their position relative to league medians:

  • Offense Rating: Above or below league median
  • Defense Rating: Above or below league median (lower is better)
  • Offensive Consistency: Rugosity above or below median
  • Defensive Consistency: Rugosity above or below median

This creates 16 possible matrix positions (24), each with a unique label.

Trend Modifiers

Team labels can be modified based on significant trends:

  • Significant trends (>1σ) add modifiers like (↑O) or (↓D)
  • Overwhelming trends (>1.5σ) override the matrix label entirely