Usage Rate (USG%)
Usage Rate (USG%): The Complete Guide
Usage Rate is a fundamental basketball statistic that measures what percentage of team plays a player "uses" while on the court. In modern basketball analytics, understanding usage is critical for evaluating player roles, offensive workload, and contextualizing efficiency metrics. This comprehensive guide explores everything you need to know about Usage Rate, from its mathematical foundation to its strategic implications and relationship with performance.
What is Usage Rate (USG%)?
Usage Rate (USG%), also known as Usage Percentage, estimates the percentage of team plays a player is involved in while they're on the floor. Specifically, it measures the proportion of possessions that end with the player taking a field goal attempt, getting to the free throw line, or committing a turnover.
The key features of Usage Rate include:
- Team Play Percentage: USG% represents the share of team offensive possessions a player consumes
- Offensive Load Indicator: Higher usage indicates a player handles more of the team's offensive burden
- Role Definition: Usage clearly distinguishes primary scorers from role players
- Efficiency Context: Essential for interpreting scoring efficiency metrics like True Shooting Percentage
- Per-Minute Basis: Calculated only for possessions when the player is on the court
Unlike volume stats like points per game, Usage Rate provides context-aware measurement that accounts for team pace, playing time, and opportunity. A player scoring 25 points per game on 30% usage is dramatically different from one scoring the same on 35% usage.
The Usage Rate Formula
The standard formula for calculating Usage Rate is:
USG% = 100 × [(FGA + 0.44 × FTA + TOV) × (Team_MP / 5)] / [MP × (Team_FGA + 0.44 × Team_FTA + Team_TOV)]
Where:
- FGA: Player's Field Goal Attempts
- FTA: Player's Free Throw Attempts
- TOV: Player's Turnovers
- MP: Player's Minutes Played
- Team_MP: Team's total minutes played (typically 240 for a full game)
- Team_FGA: Team's total Field Goal Attempts
- Team_FTA: Team's total Free Throw Attempts
- Team_TOV: Team's total Turnovers
Understanding the 0.44 Multiplier
The constant 0.44 appears in the formula because not all free throw attempts represent the end of a possession. The factor approximates that roughly 44% of free throw attempts result from shooting fouls (ending possessions), while the rest come from and-one situations, technical fouls, or flagrant fouls that don't end possessions. This adjustment prevents double-counting plays.
Alternative Formula
An equivalent, simplified formula often used is:
USG% = 100 × (Player_Plays / Team_Plays_While_On_Court)
Where Player_Plays = FGA + 0.44 × FTA + TOV
This version makes it clearer that usage is simply the player's share of team plays during their time on court.
Interpreting Usage Rate: What the Numbers Mean
Understanding Usage Rate benchmarks helps contextualize player roles and offensive responsibilities:
Elite High-Usage Tier (32%+)
- Role: Primary offensive engines and isolation scorers
- Description: These players dominate their team's offense, often creating shots for themselves
- Examples: Russell Westbrook (2016-17: 41.7%), James Harden (2018-19: 40.5%), Luka Doncic (2019-20: 36.5%)
- Context: Extremely rare; sustained high usage requires exceptional skill and stamina
- Risk: Potential efficiency decline, fatigue, and predictability for defenses
High-Usage Tier (28-32%)
- Role: Primary scoring options and offensive focal points
- Description: Star players who carry significant offensive load
- Examples: Kevin Durant, Damian Lillard, Joel Embiid
- Context: Typical usage for All-Star level scorers and MVP candidates
- Balance: Sweet spot where elite players maximize production without severe efficiency penalty
Moderate-High Usage Tier (24-28%)
- Role: Secondary stars and high-level scoring options
- Description: Players who score consistently but share offensive duties
- Examples: Second options on championship teams, efficient scoring wings
- Context: Quality starters who contribute significant offense without dominating possessions
- Efficiency: Often maintain higher efficiency than ultra-high usage players
Average Usage Tier (20-24%)
- Role: Complementary scorers and versatile starters
- Description: League-average usage, indicating balanced offensive contribution
- Examples: Third/fourth options, two-way players, role player starters
- Context: The mathematical average is approximately 20% (100% divided by 5 players)
- Value: Players maintaining efficiency at this usage are solid contributors
Low Usage Tier (15-20%)
- Role: Role players, spot-up shooters, defensive specialists
- Description: Players with limited offensive responsibilities
- Examples: 3-and-D wings, backup centers, defensive-minded guards
- Context: Below-average offensive involvement, often by design
- Expectation: Should maintain high efficiency with limited touches
Minimal Usage Tier (Below 15%)
- Role: Deep bench players, extremely limited offensive contributors
- Description: Players rarely involved in offensive plays
- Examples: End-of-bench specialists, defensive-only players
- Context: Typically short-minute players or those with very specific roles
- Note: Efficiency stats at this level can be unreliable due to small sample size
What High Usage Means
High Usage Rate (above 28-30%) has several important implications:
Offensive Burden and Responsibility
High-usage players carry enormous offensive responsibility. They're expected to create offense when team sets break down, generate points in isolation, and perform in clutch situations. This requires exceptional skill, basketball IQ, and physical conditioning.
Difficulty of Scoring
As usage increases, maintaining efficiency becomes exponentially harder. High-usage players face:
- More defensive attention (double-teams, blitzes, top defenders)
- Lower quality shot opportunities (contested shots, end-of-clock situations)
- Greater fatigue over the course of games and seasons
- Pressure to create rather than receive open looks
Team Context Dependency
High usage can indicate either exceptional talent or lack of supporting cast. Evaluating why a player has high usage matters:
- Positive Context: Elite player surrounded by role players (LeBron on 2018 Cavaliers)
- Negative Context: Good player forced into excessive role due to team weakness
Efficiency Expectations
The relationship between usage and efficiency is generally inverse. Players maintaining elite efficiency (TS% above 60%) with high usage (30%+) are exceptionally rare and valuable. Examples include Stephen Curry's 2015-16 season (32.6 USG%, 66.9 TS%) and Nikola Jokic's recent MVP campaigns.
What Low Usage Means
Low Usage Rate (below 20%) has distinct characteristics and implications:
Role Player Identity
Low-usage players typically have specialized, complementary roles. They might excel at:
- Spot-up shooting (catch-and-shoot specialists)
- Defensive prowess (focus energy on defense rather than offense)
- Screen-setting and rolling (centers in pick-and-roll systems)
- Transition finishing (athletes who score in limited opportunities)
Efficiency Expectations
Low-usage players should demonstrate high efficiency. With fewer offensive responsibilities and typically better shot quality (open looks, assisted shots), they're expected to convert at high rates. A low-usage player with poor efficiency provides minimal value.
Scalability Questions
A critical question for low-usage players: Can they maintain efficiency if given more offensive responsibility? Some players are role players because they can't handle higher usage, while others are efficient stars waiting for opportunity.
Team Value
Low-usage players are crucial for team success. Championship teams need players who contribute without demanding touches, allowing stars to dominate possessions while maintaining team efficiency.
Relationship Between Usage Rate and Efficiency
The relationship between usage and efficiency is one of basketball's most important analytical concepts:
The Usage-Efficiency Curve
Generally, as usage increases, efficiency decreases. This inverse relationship exists because:
- Shot Quality Degradation: Higher usage means fewer assisted shots and more self-created attempts
- Defensive Attention: Teams key defensive strategies on high-usage players
- Fatigue Factor: Offensive burden leads to physical and mental fatigue
- Difficult Situations: High-usage players inherit end-of-clock and broken-play situations
Elite Efficiency at High Usage
Players who maintain elite efficiency while operating at high usage are the league's most valuable offensive talents. Historical examples include:
- Stephen Curry (2015-16): 32.6 USG%, 66.9 TS% - Revolutionary efficiency at high volume
- Nikola Jokic (2021-22): 31.9 USG%, 66.1 TS% - Center dominance with unprecedented efficiency
- LeBron James (2012-13): 30.3 USG%, 64.0 TS% - Peak combination of volume and efficiency
- Kevin Durant (Multiple Seasons): Consistently high usage with 60%+ TS%
These performances are exceptional precisely because they defy the typical usage-efficiency tradeoff.
The Importance of Context
When evaluating the usage-efficiency relationship, consider:
- League Context: League-wide efficiency has increased over time; adjust expectations by era
- Team Context: Spacing, talent around the player, and offensive system matter enormously
- Role Context: Is high usage by choice (elite player) or necessity (weak supporting cast)?
- Positional Context: Centers typically have higher efficiency but lower usage; guards show opposite pattern
Usage Rate and True Shooting Percentage
True Shooting Percentage (TS%) and Usage Rate together provide powerful insights:
- High Usage + High TS%: Elite offensive player (MVP candidates)
- High Usage + Average TS%: High-volume scorer, moderate efficiency (good but not elite)
- High Usage + Low TS%: Volume scorer with efficiency concerns (potential negative impact)
- Low Usage + High TS%: Efficient role player (valuable but limited ceiling)
- Low Usage + Low TS%: Limited value player (shouldn't be in rotation)
Historical Usage Rate Leaders
Throughout NBA history, certain players and seasons have defined what extreme usage looks like:
Single-Season Usage Rate Records
- Russell Westbrook (2016-17): 41.7% - Highest usage in modern NBA history during MVP season averaging a triple-double
- James Harden (2018-19): 40.5% - Historic scoring season with 36.1 PPG
- Russell Westbrook (2014-15): 38.4% - Without Kevin Durant for much of season
- Kobe Bryant (2005-06): 38.7% - Including his 81-point game, carrying weak Lakers roster
- Allen Iverson (2005-06): 38.0% - Peak usage for one of history's most ball-dominant guards
- DeMarcus Cousins (2016-17): 37.8% - Offensive focal point on struggling Kings
- Joel Embiid (2022-23): 37.0% - Modern center with guard-like usage
- Luka Doncic (2019-20): 36.5% - Sophomore season as Mavericks' offensive engine
Career Usage Rate Leaders (Minimum 10,000 Minutes)
- Russell Westbrook: 33.2% - Sustained high usage throughout career
- Allen Iverson: 31.9% - Defined high-usage guard play in 2000s
- Michael Jordan: 33.3% - Dominated possessions during Bulls' dynasty
- DeMarcus Cousins: 31.4% - Offensive centerpiece before injuries
- Kobe Bryant: 31.2% - Career-long primary scorer
- James Harden: 30.5% - Modern high-usage offensive system builder
- Jerry Stackhouse: 30.4% - High-volume scorer of late 1990s/early 2000s
- Joel Embiid: 31.8% - Modern center with unprecedented usage (career ongoing)
Notable Observations
The historical usage leaders reveal interesting patterns:
- Peak usage seasons often coincide with weak supporting casts requiring one player to carry offense
- Modern analytics has questioned extreme usage, with teams preferring balanced attacks
- The highest career usage rates typically belong to guards and wings, not centers
- MVP seasons don't always feature highest usage—efficiency at moderate-high usage often wins
- Recent era shows more players capable of handling 30%+ usage compared to earlier decades
Usage Rate Norms by Position
Usage Rate varies significantly by position due to role differences and offensive responsibilities:
Point Guards
Typical Range: 20-28%
- Role Variation: Traditional facilitators (lower usage) vs. score-first guards (higher usage)
- Modern Trend: Increase in high-usage point guards (Luka, Trae Young, Damian Lillard)
- Elite Examples: Russell Westbrook (33%+), James Harden (30%+), Luka Doncic (35%+)
- Pass-First Examples: Chris Paul (24-26%), Ricky Rubio (18-22%)
- Context: Usage doesn't fully capture playmaking; assist percentage provides additional context
Shooting Guards
Typical Range: 19-26%
- Role Variation: Primary scorers (higher) vs. 3-and-D wings (lower)
- Elite Examples: Kobe Bryant (31%+), Devin Booker (30%+), Donovan Mitchell (28-30%)
- Role Player Examples: Klay Thompson (20-22%), Danny Green (15-18%)
- Context: Position increasingly blends with small forward in positionless basketball
Small Forwards
Typical Range: 20-27%
- Role Variation: Most positionally diverse, from role players to primary scorers
- Elite Examples: LeBron James (30-32%), Kevin Durant (29-32%), Kawhi Leonard (28-31%)
- Role Player Examples: Robert Covington (17-19%), P.J. Tucker (12-15%)
- Context: Position flexibility means wide usage variance
Power Forwards
Typical Range: 18-25%
- Role Variation: Stretch fours (moderate) vs. traditional post players (lower)
- Modern Stars: Giannis Antetokounmpo (35%+), Zion Williamson (28-30%)
- Traditional Bigs: Draymond Green (15-17%), Al Horford (18-20%)
- Context: Position evolving rapidly; modern PFs increasingly perimeter-oriented
Centers
Typical Range: 17-24%
- Traditionally Lowest Usage: Centers historically deferred to guards and forwards
- Modern Exception: Joel Embiid (34-37%), Nikola Jokic (30-32%)
- Traditional Centers: Rudy Gobert (15-18%), Clint Capela (16-18%)
- Role Players: Rim-running centers often below 20%
- Context: Low usage often paired with high efficiency (alley-oops, putbacks)
Positional Trends
Modern basketball has disrupted traditional positional usage patterns:
- Rise of "point forwards" and "point centers" increases big man usage
- Positionless basketball makes strict positional categories less meaningful
- Three-point revolution has increased perimeter player usage
- Decline of traditional post-up centers reduces center usage overall
Python Code Examples
Example 1: Calculating Usage Rate
import pandas as pd
import numpy as np
def calculate_usage_rate(player_stats, team_stats):
"""
Calculate Usage Rate (USG%) for a player.
Parameters:
player_stats: dict with player statistics
team_stats: dict with team statistics
Returns:
float: Player's Usage Rate as percentage
"""
# Player plays
player_plays = (player_stats['fga'] +
0.44 * player_stats['fta'] +
player_stats['tov'])
# Team plays while player is on court
# Adjust team stats for the portion of time player was on court
team_mp = team_stats['mp'] # Total team minutes (usually 240 for full game)
player_mp = player_stats['mp']
team_plays = (team_stats['fga'] +
0.44 * team_stats['fta'] +
team_stats['tov'])
# Calculate usage rate
usg = 100 * ((player_plays * (team_mp / 5)) / (player_mp * team_plays))
return usg
# Example usage
player = {
'name': 'Luka Doncic',
'mp': 2616, # Minutes played
'fga': 1674, # Field goal attempts
'fta': 568, # Free throw attempts
'tov': 297 # Turnovers
}
team = {
'mp': 19780, # Team total minutes (82 games × 240 minutes)
'fga': 7156, # Team field goal attempts
'fta': 1876, # Team free throw attempts
'tov': 1156 # Team turnovers
}
usage = calculate_usage_rate(player, team)
print(f"{player['name']}'s Usage Rate: {usage:.1f}%")
# Example 2: Calculate for multiple players
def calculate_team_usage(players_df):
"""
Calculate usage rate for all players on a team.
Parameters:
players_df: DataFrame with columns ['Player', 'MP', 'FGA', 'FTA', 'TOV']
Returns:
DataFrame with added USG% column
"""
# Calculate team totals
team_mp = 240 * 82 # Full season
team_fga = players_df['FGA'].sum()
team_fta = players_df['FTA'].sum()
team_tov = players_df['TOV'].sum()
# Calculate usage for each player
def calc_usg(row):
player_plays = row['FGA'] + 0.44 * row['FTA'] + row['TOV']
team_plays = team_fga + 0.44 * team_fta + team_tov
return 100 * ((player_plays * (team_mp / 5)) / (row['MP'] * team_plays))
players_df['USG%'] = players_df.apply(calc_usg, axis=1)
return players_df
# Sample team data
team_data = pd.DataFrame({
'Player': ['Luka Doncic', 'Kyrie Irving', 'Derrick Jones Jr.',
'Daniel Gafford', 'P.J. Washington'],
'MP': [2616, 2287, 2054, 1678, 2134],
'FGA': [1674, 1423, 543, 412, 867],
'FTA': [568, 389, 156, 234, 198],
'TOV': [297, 178, 87, 94, 123]
})
team_usage = calculate_team_usage(team_data)
print("\nTeam Usage Rates:")
print(team_usage.sort_values('USG%', ascending=False).to_string(index=False))
# Verify usage rates sum appropriately
print(f"\nNote: Individual usage rates don't sum to 100% because they're calculated per player's minutes")
Example 2: Usage vs Efficiency Analysis
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
# Sample data: Top NBA players with usage and efficiency metrics
player_data = pd.DataFrame({
'Player': ['Luka Doncic', 'Joel Embiid', 'Nikola Jokic', 'Giannis Antetokounmpo',
'Stephen Curry', 'Kevin Durant', 'LeBron James', 'Damian Lillard',
'Devin Booker', 'Jayson Tatum', 'Trae Young', 'Donovan Mitchell',
'De\'Aaron Fox', 'Anthony Edwards', 'Tyrese Haliburton'],
'USG%': [36.5, 37.0, 31.9, 35.2, 32.6, 29.8, 29.5, 30.2,
30.1, 29.4, 34.1, 30.8, 29.7, 28.9, 23.5],
'TS%': [57.8, 61.0, 66.1, 64.5, 66.9, 65.3, 62.4, 59.3,
61.4, 59.8, 60.2, 58.9, 60.4, 59.0, 64.1],
'PPG': [28.4, 33.1, 26.4, 31.1, 30.1, 29.1, 27.2, 28.8,
27.1, 26.9, 26.2, 28.3, 25.7, 25.9, 20.1],
'Position': ['PG', 'C', 'C', 'PF', 'PG', 'SF', 'SF', 'PG',
'SG', 'SF', 'PG', 'SG', 'PG', 'SG', 'PG']
})
# Create scatter plot
plt.figure(figsize=(14, 9))
scatter = plt.scatter(player_data['USG%'], player_data['TS%'],
s=player_data['PPG']*15, alpha=0.6,
c=player_data['PPG'], cmap='RdYlGn',
edgecolors='black', linewidth=1.5)
# Add player labels
for idx, row in player_data.iterrows():
plt.annotate(row['Player'],
(row['USG%'], row['TS%']),
xytext=(5, 5), textcoords='offset points',
fontsize=8, alpha=0.8)
# Add regression line
z = np.polyfit(player_data['USG%'], player_data['TS%'], 1)
p = np.poly1d(z)
x_line = np.linspace(player_data['USG%'].min(), player_data['USG%'].max(), 100)
plt.plot(x_line, p(x_line), "r--", alpha=0.8, linewidth=2, label='Trend Line')
# Calculate correlation
correlation = player_data['USG%'].corr(player_data['TS%'])
# Add reference lines
plt.axhline(y=60, color='green', linestyle='--', alpha=0.3, label='Elite TS% (60%)')
plt.axvline(x=30, color='blue', linestyle='--', alpha=0.3, label='High Usage (30%)')
# Customize plot
plt.xlabel('Usage Rate (USG%)', fontsize=13, fontweight='bold')
plt.ylabel('True Shooting Percentage (TS%)', fontsize=13, fontweight='bold')
plt.title('Usage Rate vs True Shooting Percentage\nPoint size represents PPG',
fontsize=15, fontweight='bold', pad=20)
plt.grid(alpha=0.3)
plt.legend(loc='upper right', fontsize=10)
# Add correlation text
plt.text(0.02, 0.98, f'Correlation: {correlation:.3f}',
transform=plt.gca().transAxes,
fontsize=11, verticalalignment='top',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.7))
# Add colorbar
cbar = plt.colorbar(scatter, label='Points Per Game')
cbar.set_label('Points Per Game', fontsize=11, fontweight='bold')
plt.tight_layout()
plt.savefig('usage_vs_efficiency.png', dpi=300, bbox_inches='tight')
plt.show()
# Statistical analysis
print("Usage vs Efficiency Analysis")
print("="*50)
print(f"Correlation coefficient: {correlation:.3f}")
# Find elite performers (high usage + high efficiency)
elite = player_data[(player_data['USG%'] > 30) & (player_data['TS%'] > 62)]
print(f"\nElite Performers (>30% USG, >62% TS%):")
print(elite[['Player', 'USG%', 'TS%', 'PPG']].to_string(index=False))
# Find high-volume, lower efficiency
volume_scorers = player_data[(player_data['USG%'] > 30) & (player_data['TS%'] < 60)]
print(f"\nHigh-Volume Scorers (<60% TS%):")
print(volume_scorers[['Player', 'USG%', 'TS%', 'PPG']].to_string(index=False))
Example 3: Historical Usage Trends
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Historical usage rate data for elite scorers
historical_usage = pd.DataFrame({
'Season': [2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024],
'LeBron James': [30.7, 30.3, 31.5, 31.6, 31.6, 31.1, 30.5, 30.8, 29.5, 30.2, 28.9],
'Kevin Durant': [32.8, 31.4, 29.2, 31.7, 30.6, 31.9, 29.8, 30.1, 31.2, 30.5, 29.8],
'Stephen Curry': [28.3, 32.6, 31.5, 32.6, 32.7, 33.5, 31.1, 32.8, 32.6, 32.1, 31.8],
'James Harden': [29.1, 32.4, 34.0, 34.2, 40.5, 36.6, 34.4, 33.8, 33.1, 32.9, 31.7],
'Giannis Antetokounmpo': [21.9, 24.4, 28.4, 30.6, 32.7, 35.2, 34.6, 35.1, 33.8, 34.5, 35.0],
'Luka Doncic': [None, None, None, None, 31.7, 36.5, 36.0, 35.8, 36.3, 36.8, 36.5],
})
# Reshape data for plotting
usage_long = historical_usage.melt(id_vars=['Season'],
var_name='Player',
value_name='USG%')
usage_long = usage_long.dropna()
# Create line plot
plt.figure(figsize=(14, 8))
for player in usage_long['Player'].unique():
player_data = usage_long[usage_long['Player'] == player]
plt.plot(player_data['Season'], player_data['USG%'],
marker='o', linewidth=2.5, markersize=7, label=player, alpha=0.8)
# Add reference lines
plt.axhline(y=30, color='red', linestyle='--', alpha=0.4, linewidth=1.5,
label='High Usage Threshold (30%)')
plt.axhline(y=35, color='darkred', linestyle='--', alpha=0.4, linewidth=1.5,
label='Elite Usage Threshold (35%)')
# Customize plot
plt.xlabel('Season', fontsize=13, fontweight='bold')
plt.ylabel('Usage Rate (USG%)', fontsize=13, fontweight='bold')
plt.title('Historical Usage Rate Trends: NBA Superstars (2014-2024)',
fontsize=15, fontweight='bold', pad=20)
plt.legend(loc='upper left', fontsize=10, framealpha=0.9)
plt.grid(alpha=0.3, linestyle='--')
plt.xticks(range(2014, 2025))
plt.ylim(20, 42)
plt.tight_layout()
plt.savefig('historical_usage_trends.png', dpi=300, bbox_inches='tight')
plt.show()
# Calculate statistics
print("Career Usage Statistics (2014-2024)")
print("="*60)
for player in historical_usage.columns[1:]:
player_usage = historical_usage[player].dropna()
print(f"\n{player}:")
print(f" Average USG%: {player_usage.mean():.1f}%")
print(f" Peak USG%: {player_usage.max():.1f}% (Season {historical_usage.loc[player_usage.idxmax(), 'Season']:.0f})")
print(f" Lowest USG%: {player_usage.min():.1f}%")
print(f" Std Dev: {player_usage.std():.2f}")
Example 4: Position-Based Usage Analysis
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Sample data by position
position_data = pd.DataFrame({
'Player': ['Luka Doncic', 'Trae Young', 'Damian Lillard', 'Tyrese Haliburton',
'Devin Booker', 'Donovan Mitchell', 'Anthony Edwards', 'Klay Thompson',
'LeBron James', 'Kevin Durant', 'Kawhi Leonard', 'Jayson Tatum',
'Giannis Antetokounmpo', 'Zion Williamson', 'Julius Randle', 'Draymond Green',
'Joel Embiid', 'Nikola Jokic', 'Anthony Davis', 'Bam Adebayo', 'Rudy Gobert'],
'Position': ['PG', 'PG', 'PG', 'PG',
'SG', 'SG', 'SG', 'SG',
'SF', 'SF', 'SF', 'SF',
'PF', 'PF', 'PF', 'PF',
'C', 'C', 'C', 'C', 'C'],
'USG%': [36.5, 34.1, 30.2, 23.5,
30.1, 30.8, 28.9, 21.4,
29.5, 29.8, 31.2, 29.4,
35.2, 30.8, 28.1, 15.7,
37.0, 31.9, 28.5, 22.4, 16.8],
'TS%': [57.8, 60.2, 59.3, 64.1,
61.4, 58.9, 59.0, 66.2,
62.4, 65.3, 63.8, 59.8,
64.5, 60.9, 56.8, 61.2,
61.0, 66.1, 61.8, 60.5, 66.7]
})
# Create figure with subplots
fig, axes = plt.subplots(1, 2, figsize=(16, 7))
# Box plot of usage by position
sns.boxplot(data=position_data, x='Position', y='USG%', ax=axes[0], palette='Set2')
sns.swarmplot(data=position_data, x='Position', y='USG%', ax=axes[0],
color='black', alpha=0.5, size=6)
axes[0].axhline(y=20, color='red', linestyle='--', alpha=0.5, label='League Average (~20%)')
axes[0].set_xlabel('Position', fontsize=12, fontweight='bold')
axes[0].set_ylabel('Usage Rate (USG%)', fontsize=12, fontweight='bold')
axes[0].set_title('Usage Rate Distribution by Position', fontsize=13, fontweight='bold')
axes[0].legend()
axes[0].grid(axis='y', alpha=0.3)
# Grouped bar chart showing average usage by position
position_avg = position_data.groupby('Position')['USG%'].agg(['mean', 'std']).reset_index()
position_avg = position_avg.sort_values('mean', ascending=False)
bars = axes[1].bar(position_avg['Position'], position_avg['mean'],
yerr=position_avg['std'], capsize=5, alpha=0.7,
color=['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc'])
axes[1].axhline(y=20, color='red', linestyle='--', alpha=0.5, linewidth=2,
label='League Average (~20%)')
axes[1].set_xlabel('Position', fontsize=12, fontweight='bold')
axes[1].set_ylabel('Average Usage Rate (USG%)', fontsize=12, fontweight='bold')
axes[1].set_title('Average Usage Rate by Position (with Std Dev)',
fontsize=13, fontweight='bold')
axes[1].legend()
axes[1].grid(axis='y', alpha=0.3)
# Add value labels on bars
for bar in bars:
height = bar.get_height()
axes[1].text(bar.get_x() + bar.get_width()/2., height,
f'{height:.1f}%', ha='center', va='bottom', fontweight='bold')
plt.tight_layout()
plt.savefig('usage_by_position.png', dpi=300, bbox_inches='tight')
plt.show()
# Statistical summary by position
print("Usage Rate Statistics by Position")
print("="*70)
position_summary = position_data.groupby('Position').agg({
'USG%': ['count', 'mean', 'std', 'min', 'max'],
'TS%': 'mean'
}).round(2)
print(position_summary)
# ANOVA test
from scipy import stats as sp_stats
positions = [position_data[position_data['Position'] == pos]['USG%'].values
for pos in ['PG', 'SG', 'SF', 'PF', 'C']]
f_stat, p_value = sp_stats.f_oneway(*positions)
print(f"\nANOVA Test Results:")
print(f"F-statistic: {f_stat:.3f}")
print(f"P-value: {p_value:.4f}")
print(f"Significant difference: {'Yes' if p_value < 0.05 else 'No'}")
R Code Examples
Example 1: Calculating Usage Rate in R
library(dplyr)
library(ggplot2)
# Function to calculate usage rate
calculate_usage_rate <- function(player_stats, team_stats) {
# Player plays
player_plays <- player_stats$fga + 0.44 * player_stats$fta + player_stats$tov
# Team plays
team_plays <- team_stats$fga + 0.44 * team_stats$fta + team_stats$tov
# Usage rate calculation
usg <- 100 * ((player_plays * (team_stats$mp / 5)) /
(player_stats$mp * team_plays))
return(usg)
}
# Example: Single player
player <- list(
name = "Luka Doncic",
mp = 2616,
fga = 1674,
fta = 568,
tov = 297
)
team <- list(
mp = 19780, # 82 games × 240 minutes
fga = 7156,
fta = 1876,
tov = 1156
)
usage <- calculate_usage_rate(player, team)
cat(sprintf("%s's Usage Rate: %.1f%%\n", player$name, usage))
# Example: Calculate for multiple players
players_df <- data.frame(
Player = c("Luka Doncic", "Kyrie Irving", "Derrick Jones Jr.",
"Daniel Gafford", "P.J. Washington"),
MP = c(2616, 2287, 2054, 1678, 2134),
FGA = c(1674, 1423, 543, 412, 867),
FTA = c(568, 389, 156, 234, 198),
TOV = c(297, 178, 87, 94, 123)
)
# Calculate team totals
team_mp <- 240 * 82
team_fga <- sum(players_df$FGA)
team_fta <- sum(players_df$FTA)
team_tov <- sum(players_df$TOV)
# Calculate usage for each player
players_df$USG <- sapply(1:nrow(players_df), function(i) {
player_plays <- players_df$FGA[i] + 0.44 * players_df$FTA[i] + players_df$TOV[i]
team_plays <- team_fga + 0.44 * team_fta + team_tov
100 * ((player_plays * (team_mp / 5)) / (players_df$MP[i] * team_plays))
})
# Display results
players_df %>%
arrange(desc(USG)) %>%
select(Player, USG) %>%
mutate(USG = round(USG, 1)) %>%
print()
Example 2: Usage vs Efficiency Visualization in R
library(dplyr)
library(ggplot2)
library(ggrepel)
# Create sample data
player_metrics <- data.frame(
Player = c("Luka Doncic", "Joel Embiid", "Nikola Jokic", "Giannis Antetokounmpo",
"Stephen Curry", "Kevin Durant", "LeBron James", "Damian Lillard",
"Devin Booker", "Jayson Tatum", "Trae Young", "Donovan Mitchell",
"De'Aaron Fox", "Anthony Edwards", "Tyrese Haliburton"),
USG = c(36.5, 37.0, 31.9, 35.2, 32.6, 29.8, 29.5, 30.2,
30.1, 29.4, 34.1, 30.8, 29.7, 28.9, 23.5),
TS = c(57.8, 61.0, 66.1, 64.5, 66.9, 65.3, 62.4, 59.3,
61.4, 59.8, 60.2, 58.9, 60.4, 59.0, 64.1),
PPG = c(28.4, 33.1, 26.4, 31.1, 30.1, 29.1, 27.2, 28.8,
27.1, 26.9, 26.2, 28.3, 25.7, 25.9, 20.1),
Position = c("PG", "C", "C", "PF", "PG", "SF", "SF", "PG",
"SG", "SF", "PG", "SG", "PG", "SG", "PG")
)
# Create scatter plot with regression line
ggplot(player_metrics, aes(x = USG, y = TS)) +
geom_smooth(method = "lm", se = TRUE, color = "red",
fill = "pink", alpha = 0.3, linetype = "dashed") +
geom_point(aes(size = PPG, color = Position), alpha = 0.7) +
geom_text_repel(aes(label = Player), size = 3,
max.overlaps = 15, box.padding = 0.5) +
geom_hline(yintercept = 60, linetype = "dashed",
color = "darkgreen", alpha = 0.5) +
geom_vline(xintercept = 30, linetype = "dashed",
color = "darkblue", alpha = 0.5) +
scale_size_continuous(range = c(4, 12), name = "Points Per Game") +
scale_color_brewer(palette = "Set1") +
labs(
title = "Usage Rate vs True Shooting Percentage",
subtitle = "Elite efficiency at high usage is rare and valuable",
x = "Usage Rate (USG%)",
y = "True Shooting Percentage (TS%)",
color = "Position"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 15, face = "bold"),
plot.subtitle = element_text(size = 11),
axis.title = element_text(size = 12, face = "bold"),
legend.position = "right"
)
# Calculate correlation
correlation <- cor(player_metrics$USG, player_metrics$TS)
cat(sprintf("\nCorrelation between USG%% and TS%%: %.3f\n", correlation))
# Identify elite performers
elite <- player_metrics %>%
filter(USG > 30, TS > 62) %>%
arrange(desc(TS))
cat("\nElite Performers (>30% USG, >62% TS%):\n")
print(elite %>% select(Player, USG, TS, PPG))
Example 3: Historical Usage Trends in R
library(dplyr)
library(ggplot2)
library(tidyr)
# Create historical data
usage_history <- data.frame(
Season = 2014:2024,
LeBron_James = c(30.7, 30.3, 31.5, 31.6, 31.6, 31.1, 30.5, 30.8, 29.5, 30.2, 28.9),
Kevin_Durant = c(32.8, 31.4, 29.2, 31.7, 30.6, 31.9, 29.8, 30.1, 31.2, 30.5, 29.8),
Stephen_Curry = c(28.3, 32.6, 31.5, 32.6, 32.7, 33.5, 31.1, 32.8, 32.6, 32.1, 31.8),
James_Harden = c(29.1, 32.4, 34.0, 34.2, 40.5, 36.6, 34.4, 33.8, 33.1, 32.9, 31.7),
Giannis_Antetokounmpo = c(21.9, 24.4, 28.4, 30.6, 32.7, 35.2, 34.6, 35.1, 33.8, 34.5, 35.0)
)
# Reshape to long format
usage_long <- usage_history %>%
pivot_longer(cols = -Season, names_to = "Player", values_to = "USG") %>%
mutate(Player = gsub("_", " ", Player))
# Create line plot
ggplot(usage_long, aes(x = Season, y = USG, color = Player, group = Player)) +
geom_line(size = 1.3) +
geom_point(size = 3) +
geom_hline(yintercept = 30, linetype = "dashed",
color = "red", alpha = 0.5, size = 1) +
geom_hline(yintercept = 35, linetype = "dashed",
color = "darkred", alpha = 0.5, size = 1) +
annotate("text", x = 2014.5, y = 30.5, label = "High Usage (30%)",
color = "red", size = 3.5, hjust = 0) +
annotate("text", x = 2014.5, y = 35.5, label = "Elite Usage (35%)",
color = "darkred", size = 3.5, hjust = 0) +
scale_x_continuous(breaks = 2014:2024) +
scale_color_manual(values = c("#552583", "#006BB6", "#1D428A",
"#CE1141", "#00471B")) +
labs(
title = "Historical Usage Rate Trends: NBA Superstars (2014-2024)",
subtitle = "Tracking offensive load across a decade",
x = "Season",
y = "Usage Rate (USG%)",
color = "Player"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold"),
plot.subtitle = element_text(size = 11),
axis.title = element_text(size = 12, face = "bold"),
legend.position = "bottom",
panel.grid.minor = element_blank()
)
# Summary statistics
usage_summary <- usage_long %>%
group_by(Player) %>%
summarise(
Avg_USG = mean(USG, na.rm = TRUE),
Max_USG = max(USG, na.rm = TRUE),
Min_USG = min(USG, na.rm = TRUE),
SD_USG = sd(USG, na.rm = TRUE)
) %>%
arrange(desc(Avg_USG))
cat("\nCareer Usage Statistics (2014-2024):\n")
print(usage_summary, n = Inf)
Example 4: Positional Usage Analysis in R
library(dplyr)
library(ggplot2)
library(tidyr)
# Create position-based data
position_usage <- data.frame(
Player = c("Luka Doncic", "Trae Young", "Damian Lillard", "Tyrese Haliburton",
"Devin Booker", "Donovan Mitchell", "Anthony Edwards", "Klay Thompson",
"LeBron James", "Kevin Durant", "Kawhi Leonard", "Jayson Tatum",
"Giannis Antetokounmpo", "Zion Williamson", "Julius Randle", "Draymond Green",
"Joel Embiid", "Nikola Jokic", "Anthony Davis", "Bam Adebayo", "Rudy Gobert"),
Position = c("PG", "PG", "PG", "PG",
"SG", "SG", "SG", "SG",
"SF", "SF", "SF", "SF",
"PF", "PF", "PF", "PF",
"C", "C", "C", "C", "C"),
USG = c(36.5, 34.1, 30.2, 23.5,
30.1, 30.8, 28.9, 21.4,
29.5, 29.8, 31.2, 29.4,
35.2, 30.8, 28.1, 15.7,
37.0, 31.9, 28.5, 22.4, 16.8),
TS = c(57.8, 60.2, 59.3, 64.1,
61.4, 58.9, 59.0, 66.2,
62.4, 65.3, 63.8, 59.8,
64.5, 60.9, 56.8, 61.2,
61.0, 66.1, 61.8, 60.5, 66.7)
)
# Order positions
position_usage$Position <- factor(position_usage$Position,
levels = c("PG", "SG", "SF", "PF", "C"))
# Create boxplot with individual points
ggplot(position_usage, aes(x = Position, y = USG, fill = Position)) +
geom_boxplot(alpha = 0.6, outlier.shape = NA) +
geom_jitter(width = 0.2, size = 3, alpha = 0.6) +
geom_hline(yintercept = 20, linetype = "dashed",
color = "red", size = 1, alpha = 0.7) +
scale_fill_brewer(palette = "Set2") +
labs(
title = "Usage Rate Distribution by Position",
subtitle = "Point guards and centers show highest variance",
x = "Position",
y = "Usage Rate (USG%)"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold"),
plot.subtitle = element_text(size = 11),
axis.title = element_text(size = 12, face = "bold"),
legend.position = "none"
)
# Statistical summary
position_summary <- position_usage %>%
group_by(Position) %>%
summarise(
Count = n(),
Mean_USG = mean(USG),
Median_USG = median(USG),
SD_USG = sd(USG),
Min_USG = min(USG),
Max_USG = max(USG),
Mean_TS = mean(TS)
) %>%
arrange(desc(Mean_USG))
cat("\nUsage Rate Statistics by Position:\n")
print(position_summary, n = Inf)
# ANOVA test
anova_result <- aov(USG ~ Position, data = position_usage)
cat("\nANOVA Test Results:\n")
print(summary(anova_result))
# Pairwise comparisons
cat("\nTukey's HSD Post-hoc Test:\n")
print(TukeyHSD(anova_result))
Conclusion
Usage Rate is an essential metric for understanding player roles, offensive responsibilities, and contextualizing efficiency in basketball analytics. While a single number, USG% reveals profound insights about how teams distribute offensive opportunities and how players handle increased workloads.
Key takeaways about Usage Rate:
- Context is Critical: Usage must be interpreted alongside efficiency metrics, particularly True Shooting Percentage, to assess true offensive value
- Inverse Efficiency Relationship: Generally, higher usage correlates with lower efficiency, making players who defy this trend exceptionally valuable
- Role Indicator: Usage clearly delineates primary scorers (30%+) from complementary players (20-25%) and role players (below 20%)
- Position Variance: Modern basketball shows increasing usage for guards and centers, challenging traditional positional norms
- Historical Evolution: The analytics era has brought more awareness to usage optimization, with teams sometimes limiting star usage to preserve efficiency
- Scalability Questions: For low-usage players, the critical question is whether efficiency would sustain at higher usage levels
For analysts and fans, Usage Rate provides crucial context that raw volume statistics miss. A player averaging 25 points per game at 35% usage is fundamentally different from one averaging the same at 28% usage—the latter is more efficient and potentially more valuable. Similarly, role players with 18% usage maintaining 65% True Shooting are doing exactly what elite teams need.
As basketball continues evolving toward optimized offensive systems, Usage Rate will remain central to understanding how teams allocate possessions and which players can shoulder offensive burdens while maintaining efficiency. The metric's simplicity belies its analytical power, making it an indispensable tool for anyone seeking to understand modern basketball.