Case Study 1: The Golden State Warriors' Offensive Revolution (2015-2019)
Executive Summary
The Golden State Warriors' dynasty from 2015-2019 fundamentally transformed NBA offensive philosophy. Through innovative spacing, unprecedented three-point volume, and a motion-based system that maximized player movement and ball distribution, the Warriors achieved historically elite offensive ratings while reshaping league-wide strategic thinking. This case study analyzes the quantitative foundations of their offensive success.
Background
Team Context
- Core Players: Stephen Curry, Klay Thompson, Draymond Green, Andre Iguodala (2015-2016), Kevin Durant (2016-2019)
- Head Coach: Steve Kerr
- Championships: 3 (2015, 2017, 2018)
- Finals Appearances: 5 consecutive (2015-2019)
Historical Offensive Performance
| Season | Offensive Rating | League Rank | eFG% | Pace |
|---|---|---|---|---|
| 2014-15 | 111.6 | 2nd | 53.3% | 98.3 |
| 2015-16 | 114.5 | 1st | 56.3% | 99.3 |
| 2016-17 | 115.9 | 1st | 56.3% | 99.5 |
| 2017-18 | 113.5 | 1st | 55.5% | 99.8 |
| 2018-19 | 115.5 | 1st | 55.0% | 100.9 |
Analytical Framework
1. Three-Point Revolution
The Warriors pioneered high-volume, high-efficiency three-point shooting at an unprecedented scale.
Three-Point Statistics (2015-16 Season)
Team 3PA per game: 31.6 (highest in NBA history at the time)
Team 3P%: 41.6% (highest in NBA)
Curry 3PA: 11.2 per game
Curry 3P%: 45.4% (402 makes, NBA record)
Thompson 3PA: 8.1 per game
Thompson 3P%: 42.5%
Expected Value Analysis
League average 2PT%: 48.3% -> EV = 0.966 points per shot
League average 3PT%: 35.4% -> EV = 1.062 points per shot
Warriors 3PT%: 41.6% -> EV = 1.248 points per shot
Warriors advantage per 3PA: +0.186 points vs league average
Season impact (31.6 3PA x 82 games x 0.186): ~482 points of added value
Code Implementation: Three-Point Impact Analysis
def calculate_three_point_advantage(team_3p_pct, team_3pa_per_game,
league_3p_pct=0.354, games=82):
"""
Calculate total point advantage from three-point shooting.
"""
team_ev_per_3pa = team_3p_pct * 3
league_ev_per_3pa = league_3p_pct * 3
advantage_per_shot = team_ev_per_3pa - league_ev_per_3pa
total_3pa = team_3pa_per_game * games
total_advantage = total_3pa * advantage_per_shot
return {
'team_ev_per_3pa': round(team_ev_per_3pa, 3),
'league_ev_per_3pa': round(league_ev_per_3pa, 3),
'advantage_per_shot': round(advantage_per_shot, 3),
'total_season_advantage': round(total_advantage, 1)
}
# Warriors 2015-16 analysis
warriors_3pt = calculate_three_point_advantage(0.416, 31.6)
print(f"Three-point advantage: {warriors_3pt['total_season_advantage']} points")
2. Spacing and Gravity Effects
The Warriors' five-out offense created unprecedented spacing challenges for defenses.
Spacing Metrics (2015-16) - Average player spacing: 14.2 feet (league avg: 12.8 feet) - Players beyond 3PT line on average possession: 3.2 (league avg: 2.4) - Drives per game: 52.3 (league avg: 46.8) - Points in paint: 47.2 per game
Curry's Gravity Analysis
Stephen Curry's shooting gravity fundamentally changed defensive positioning:
def calculate_shooter_gravity(player_3p_pct, player_3pa_per_game,
team_paint_points_with, team_paint_points_without,
league_avg_3p_pct=0.354):
"""
Estimate a shooter's gravity effect on team offense.
"""
# Direct shooting value
expected_3pt_points = player_3pa_per_game * player_3p_pct * 3
league_expected = player_3pa_per_game * league_avg_3p_pct * 3
direct_value = expected_3pt_points - league_expected
# Indirect gravity value (paint points difference)
gravity_value = team_paint_points_with - team_paint_points_without
return {
'direct_shooting_value': round(direct_value, 2),
'gravity_value': round(gravity_value, 2),
'total_offensive_impact': round(direct_value + gravity_value, 2)
}
# Curry's gravity analysis
curry_gravity = calculate_shooter_gravity(
player_3p_pct=0.454,
player_3pa_per_game=11.2,
team_paint_points_with=49.8, # With Curry on court
team_paint_points_without=42.1 # With Curry off court
)
3. Ball Movement and Assist Networks
The Warriors' motion offense created a distinctive passing network.
Ball Movement Statistics
Passes per game: 318.5 (league-leading)
Average touch time: 2.24 seconds (3rd lowest in NBA)
Assist rate: 67.2% of made baskets assisted
Secondary assists per game: 12.4 (estimate from tracking)
Network Analysis
The Warriors' assist network showed distinctive characteristics:
| Player | Assists | Potential Assists | Out-Degree Centrality |
|---|---|---|---|
| Green | 7.4 | 12.1 | 0.42 |
| Curry | 6.7 | 10.8 | 0.38 |
| Iguodala | 4.2 | 7.5 | 0.31 |
| Thompson | 2.1 | 4.2 | 0.18 |
| Bogut | 2.6 | 5.1 | 0.22 |
Network Entropy Calculation
import numpy as np
def calculate_assist_network_entropy(assist_distribution):
"""
Calculate network entropy from assist distribution.
Higher values indicate more distributed playmaking.
"""
total_assists = sum(assist_distribution)
probs = [a / total_assists for a in assist_distribution]
entropy = -sum(p * np.log(p) if p > 0 else 0 for p in probs)
max_entropy = np.log(len(assist_distribution))
normalized_entropy = entropy / max_entropy
return {
'entropy': round(entropy, 3),
'normalized_entropy': round(normalized_entropy, 3),
'interpretation': 'Distributed' if normalized_entropy > 0.8 else 'Concentrated'
}
warriors_assists = [7.4, 6.7, 4.2, 2.1, 2.6] # Starters
entropy_result = calculate_assist_network_entropy(warriors_assists)
# Result: normalized_entropy = 0.87 -> Highly distributed offense
4. Play Type Efficiency
Warriors Play Type Breakdown (2015-16)
| Play Type | Frequency | PPP | League Avg PPP | vs League |
|---|---|---|---|---|
| Transition | 17.2% | 1.18 | 1.12 | +0.06 |
| Spot-Up | 21.3% | 1.08 | 0.96 | +0.12 |
| P&R Ball Handler | 15.8% | 0.98 | 0.87 | +0.11 |
| Cut | 8.4% | 1.32 | 1.24 | +0.08 |
| Off Screen | 6.2% | 1.05 | 0.95 | +0.10 |
| Isolation | 5.8% | 0.96 | 0.87 | +0.09 |
Play Type Versatility Index Calculation
def calculate_play_type_versatility(team_play_types, league_averages):
"""
Calculate Play Type Versatility Index.
"""
weighted_sum = 0
total_freq = 0
for play_type, data in team_play_types.items():
freq = data['frequency']
team_ppp = data['ppp']
league_ppp = league_averages.get(play_type, 1.0)
relative_efficiency = team_ppp / league_ppp
weighted_sum += freq * relative_efficiency
total_freq += freq
ptv_index = (weighted_sum / total_freq) * 100
return round(ptv_index, 1)
warriors_play_types = {
'transition': {'frequency': 0.172, 'ppp': 1.18},
'spot_up': {'frequency': 0.213, 'ppp': 1.08},
'pnr_bh': {'frequency': 0.158, 'ppp': 0.98},
'cut': {'frequency': 0.084, 'ppp': 1.32},
'off_screen': {'frequency': 0.062, 'ppp': 1.05},
'isolation': {'frequency': 0.058, 'ppp': 0.96}
}
league_avg = {
'transition': 1.12, 'spot_up': 0.96, 'pnr_bh': 0.87,
'cut': 1.24, 'off_screen': 0.95, 'isolation': 0.87
}
ptv = calculate_play_type_versatility(warriors_play_types, league_avg)
# Result: 109.2 (elite versatility)
5. The "Death Lineup" Analysis
The Warriors' small-ball "Death Lineup" featuring Curry-Thompson-Iguodala-Barnes-Green (later Curry-Thompson-Iguodala-Durant-Green) represented peak offensive innovation.
Death Lineup Statistics (2015-16) - Net Rating: +25.4 per 100 possessions - Offensive Rating: 123.8 - Defensive Rating: 98.4 - Minutes: 281
Why It Worked: Analytical Breakdown
- Five Shooters: All five players shot above 33% from three
- Defensive Switching: All five could guard multiple positions
- Pace: Lineup averaged 106.2 possessions per 48 (fastest in NBA)
- Spacing: Average player distance 15.8 feet
def analyze_small_ball_lineup(lineup_stats, traditional_lineup_stats):
"""
Compare small-ball lineup to traditional lineup.
"""
advantages = {
'spacing_advantage': lineup_stats['avg_spacing'] - traditional_lineup_stats['avg_spacing'],
'pace_advantage': lineup_stats['pace'] - traditional_lineup_stats['pace'],
'three_pt_shooters': lineup_stats['shooters_above_33'] - traditional_lineup_stats['shooters_above_33'],
'net_rating_diff': lineup_stats['net_rating'] - traditional_lineup_stats['net_rating']
}
# Calculate expected point differential per game
possessions_diff = advantages['pace_advantage'] / 48 * 48 # Per game
return advantages
death_lineup = {
'avg_spacing': 15.8,
'pace': 106.2,
'shooters_above_33': 5,
'net_rating': 25.4
}
traditional_lineup = {
'avg_spacing': 13.2,
'pace': 97.5,
'shooters_above_33': 3,
'net_rating': 8.2
}
comparison = analyze_small_ball_lineup(death_lineup, traditional_lineup)
Key Insights
Insight 1: Volume and Efficiency Are Not Mutually Exclusive
The Warriors disproved the conventional wisdom that high volume necessarily decreases efficiency. Their 31.6 three-point attempts per game came at 41.6% accuracy.
Insight 2: System Over Individual Stars
While Curry and Thompson were elite shooters, the system's success came from integrating their skills with: - Draymond Green's playmaking from the post/elbow - Motion principles creating open shots - Pace that prevented defenses from setting up
Insight 3: Defense Enables Offense
The Warriors' transition offense (1.18 PPP) was fueled by their defense: - 5.2 steals per game creating fast breaks - 44.8 defensive rebounds per game starting transition - Opponent turnovers: 15.8 per game
Insight 4: Offensive Rebounding Trade-off
The Warriors accepted lower offensive rebounding (23.1%, league average 25.8%) in exchange for: - Better transition defense (players running back instead of crashing boards) - More three-point attempts (longer rebounds harder to secure) - This was a strategic choice, not a weakness
League-Wide Impact
The Warriors' success catalyzed league-wide changes:
Three-Point Attempt Growth | Season | League 3PA/Game | Increase | |--------|-----------------|----------| | 2014-15 | 22.4 | - | | 2015-16 | 24.1 | +7.6% | | 2016-17 | 27.0 | +12.0% | | 2017-18 | 29.0 | +7.4% | | 2018-19 | 32.0 | +10.3% | | 2019-20 | 34.1 | +6.6% |
Pace Increase League average pace increased from 93.9 (2014-15) to 100.3 (2019-20), directly influenced by the Warriors' success.
Conclusions
The Warriors' offensive system succeeded through:
- Elite shooting at unprecedented volume (three-point revolution)
- System design that maximized spacing and ball movement
- Player selection prioritizing shooting and versatility
- Pace optimization enabling transition opportunities
- Strategic trade-offs accepting offensive rebounding decline
Their success fundamentally altered how NBA teams construct rosters and design offenses, making their 2015-2019 run one of the most influential periods in basketball history.
Discussion Questions
-
Could the Warriors' system work without historically elite shooters like Curry and Thompson? What minimum shooting thresholds would be required?
-
How did teams eventually find defensive solutions to the Warriors' offense? Analyze the adjustments made by the 2016 Cavaliers and 2019 Raptors.
-
Calculate the expected value trade-off between the Warriors' spacing system and a traditional offense with a dominant post player.
-
How would the Warriors' offensive principles translate to international basketball with different three-point line distances?
References
- NBA Stats (2015-2019). Official NBA tracking data.
- Goldsberry, K. (2019). SprawlBall: A Visual Tour of the New Era of the NBA.
- Pelton, K. (2017). "How the Warriors broke basketball." ESPN Analytics.
- Second Spectrum tracking data (2015-2019).