The box score is the foundational document of basketball statistics. Since its origins in the early days of professional basketball, the box score has served as the primary record of individual and team performance. While modern analytics has...
In This Chapter
- Introduction
- 6.1 Points: The Ultimate Objective
- 6.2 Rebounds: Securing Possessions
- 6.3 Assists: Creating for Others
- 6.4 Steals: Disrupting Opponents
- 6.5 Blocks: Protecting the Rim
- 6.6 Turnovers: The Cost of Possession
- 6.7 Personal Fouls and Disqualifications
- 6.8 Minutes Played: The Foundation of Context
- 6.9 Historical Context and Evolution
- 6.10 Limitations of Counting Statistics
- 6.11 Context-Dependent Interpretation
- 6.12 Practical Applications
- 6.13 Python Implementation: Box Score Analysis
- 6.14 Advanced Box Score Analysis
- 6.15 Chapter Summary
- Chapter 6 Formulas Reference
Chapter 6: Box Score Fundamentals
Introduction
The box score is the foundational document of basketball statistics. Since its origins in the early days of professional basketball, the box score has served as the primary record of individual and team performance. While modern analytics has expanded far beyond these basic counting statistics, understanding box score fundamentals remains essential for any serious basketball analyst. This chapter provides a comprehensive examination of traditional box score statistics, their historical development, proper interpretation, and inherent limitations.
Every basketball analysis begins with the box score. Whether evaluating player performance, comparing historical eras, or building sophisticated statistical models, the counting statistics found in box scores serve as the raw material. Points, rebounds, assists, steals, blocks, turnovers, fouls, and minutes played - these seemingly simple numbers contain a wealth of information when properly understood and contextualized.
This chapter will equip you with the knowledge to read, interpret, and analyze box score statistics with sophistication. We will examine each statistic in depth, explore the historical context that shaped their collection and interpretation, and critically assess their limitations. By the chapter's end, you will understand not only what box score statistics measure but also what they fail to capture.
6.1 Points: The Ultimate Objective
Definition and Calculation
Points represent the most fundamental statistic in basketball - they directly measure scoring, which determines game outcomes. A player's point total equals the sum of:
- Two-point field goals: 2 points each
- Three-point field goals: 3 points each
- Free throws: 1 point each
The formula is straightforward:
$$\text{Points} = (2 \times \text{2PT FGM}) + (3 \times \text{3PT FGM}) + (1 \times \text{FTM})$$
Historical Context
Points have been tracked since basketball's inception in 1891. Dr. James Naismith's original 13 rules established the basic scoring system, though the three-point line was not introduced until the 1979-80 NBA season. This addition fundamentally altered the point distribution in box scores and required analysts to reconsider historical comparisons.
The evolution of scoring provides insight into how the game has changed:
| Era | Average Points Per Game (League) | Notable Trend |
|---|---|---|
| 1950s | 79.5 | Post-shot clock introduction |
| 1960s | 115.3 | Wilt Chamberlain era |
| 1970s | 107.8 | ABA merger, defensive focus |
| 1980s | 108.5 | Showtime Lakers, fast pace |
| 1990s | 101.4 | Hand-checking, physical defense |
| 2000s | 97.2 | Lowest scoring era |
| 2010s | 105.6 | Three-point revolution begins |
| 2020s | 112.1 | Pace and space dominance |
Scoring Efficiency vs. Volume
Raw point totals tell only part of the story. A player who scores 25 points on 25 shot attempts contributes differently than one who scores 25 points on 15 attempts. This distinction led to the development of efficiency metrics, which we will explore in Chapter 7. However, even within box score analysis, examining the breakdown of points reveals important patterns.
Consider two hypothetical performances:
Player A: 30 points (10-20 FG, 2-5 3PT, 8-10 FT) Player B: 30 points (8-15 FG, 4-8 3PT, 6-6 FT)
Player A relied heavily on two-point shots and free throws, suggesting a style focused on attacking the basket. Player B's three-point attempts and perfect free throw shooting indicate a different approach. Both scored identically, but their paths diverged significantly.
Points in Context
Scoring leaders often play on losing teams because high-volume scoring sometimes comes at the expense of team basketball. Historical examples include:
- Allen Iverson (2005-06): Led the league with 33.0 PPG while the 76ers finished 38-44
- Dominique Wilkins (1985-86): Averaged 30.3 PPG on a 50-32 Hawks team that lost in the first round
- Tracy McGrady (2002-03): Led the league with 32.1 PPG while the Magic went 42-40
Conversely, championship teams often feature balanced scoring:
- 2014 San Antonio Spurs: No player averaged more than 21.2 PPG (Tim Duncan), yet they dominated the Finals
- 2004 Detroit Pistons: Ben Wallace led the team with just 9.5 PPG; five players averaged between 12-17 PPG
These examples illustrate why points alone cannot evaluate player value.
6.2 Rebounds: Securing Possessions
Types of Rebounds
Rebounds are divided into two categories based on which team missed the shot:
Offensive Rebounds (OREB): Securing the ball after a teammate's missed shot. Offensive rebounds extend possessions and create additional scoring opportunities. They are generally more valuable than defensive rebounds because they prevent the expected change of possession.
Defensive Rebounds (DREB): Securing the ball after an opponent's missed shot. Defensive rebounds complete the defensive possession and initiate transition opportunities. They are more numerous but less impactful individually because most missed shots are rebounded by the defending team regardless of individual effort.
Total Rebounds (TRB): The sum of offensive and defensive rebounds.
Historical Development
Rebounding statistics evolved significantly over basketball history:
- 1950: NBA begins officially tracking rebounds
- 1973-74: League begins separating offensive and defensive rebounds
- 1997-98: Team rebounds (balls that go out of bounds after missed shots) begin receiving more standardized treatment
The separation of offensive and defensive rebounds represented a crucial analytical advancement. Previously, a player could accumulate rebounds simply by being in position for uncontested defensive boards. The distinction revealed that players like Dennis Rodman excelled at the more difficult task of offensive rebounding.
The Art of Rebounding
Rebounding combines several skills:
- Positioning: Anticipating shot trajectory and establishing position
- Boxing out: Using body position to create space between opponent and basket
- Timing: Jumping at the optimal moment to secure the ball
- Strength: Maintaining position against opposing players
- Ball-handling: Securing the rebound against potential strips
Elite rebounders excel in different ways. Wilt Chamberlain and Bill Russell dominated through size and positioning. Dennis Rodman succeeded through relentless effort, positioning, and an uncanny ability to predict ball trajectory. Andre Drummond combines size with exceptional technique. Understanding a player's rebounding style contextualizes their statistics.
Rebounding Percentage
Simple rebound totals fail to account for opportunity. A player who grabs 10 rebounds in 40 minutes contributes differently than one who grabs 10 in 25 minutes. Rebounding percentage, developed by Dean Oliver, addresses this limitation:
$$\text{OREB\%} = \frac{100 \times \text{OREB} \times (\text{Tm MP} / 5)}{\text{MP} \times (\text{Tm OREB} + \text{Opp DREB})}$$
$$\text{DREB\%} = \frac{100 \times \text{DREB} \times (\text{Tm MP} / 5)}{\text{MP} \times (\text{Tm DREB} + \text{Opp OREB})}$$
These formulas estimate the percentage of available rebounds a player secured while on the court. Dennis Rodman's career 23.4% total rebounding percentage remains the highest in NBA history among players with significant minutes.
Team Rebounding Dynamics
Individual rebounding statistics are influenced by team context:
- Pace: Faster teams create more missed shots and thus more rebounding opportunities
- Shot selection: Teams that take more three-pointers create longer rebounds that centers may not secure
- Defensive scheme: Some systems prioritize transition defense over offensive rebounding
- Teammate positioning: Having multiple strong rebounders can suppress individual totals
Russell Westbrook's triple-double seasons benefited from a team strategy where teammates allowed him to secure uncontested defensive rebounds to initiate fast breaks. His raw rebound totals, while impressive, must be understood within this context.
6.3 Assists: Creating for Others
Definition
An assist is credited to a player who passes the ball to a teammate who then scores, provided the pass directly contributed to the basket. The definition seems simple but creates significant interpretation challenges.
The Subjectivity Problem
Unlike points and rebounds, assists involve subjective judgment. Different scorekeepers apply different standards:
- How much dribbling can occur between the pass and shot?
- Does a pass that leads to a foul and subsequent free throws count?
- What constitutes "directly contributing" to a basket?
Studies have shown that home teams receive more assists than road teams, suggesting scorer bias. The "home cooking" phenomenon means that assist totals are not perfectly comparable across venues.
Historical Leaders
The assist has been tracked since 1946-47, but interpretation standards have evolved:
| Player | Career Assists | Era | Context |
|---|---|---|---|
| John Stockton | 15,806 | 1984-2003 | Pick-and-roll perfection with Malone |
| Jason Kidd | 12,091 | 1994-2013 | Triple-double threat, transition maestro |
| Chris Paul | 11,894* | 2005-present | Efficiency-focused point guard |
| Magic Johnson | 10,141 | 1979-1991, 1996 | Showtime Lakers, revolutionary size |
| Oscar Robertson | 9,887 | 1960-1974 | Original triple-double threat |
*As of 2024
Assist-to-Turnover Ratio
Raw assist totals favor players with high usage rates who handle the ball frequently. The assist-to-turnover ratio provides better insight into passing efficiency:
$$\text{AST/TO Ratio} = \frac{\text{Assists}}{\text{Turnovers}}$$
Chris Paul's career 4.03 AST/TO ratio is the highest in NBA history among players with at least 5 assists per game. This demonstrates not just his playmaking ability but his decision-making excellence.
Potential Assists and Assist Opportunities
Modern tracking data has revealed the limitations of traditional assist statistics. A player might make the perfect pass, but if the shooter misses, no assist is recorded. "Potential assists" count passes that lead to shot attempts, providing a more complete picture of playmaking.
Similarly, "assist opportunities" examine how often a player's passes create open shots, regardless of outcome. These advanced metrics, while beyond traditional box scores, emerged from recognizing assist statistics' limitations.
6.4 Steals: Disrupting Opponents
Definition and Value
A steal is recorded when a defensive player takes the ball from an opponent, causing a turnover. Steals combine defensive value with transition opportunity creation - they simultaneously end an opponent's possession and often lead to fast-break points.
Historical Context
Steals were not officially tracked until 1973-74, meaning historical comparisons with pre-1974 players are impossible. This gap affects our understanding of defensive players from earlier eras.
Steal Leaders
| Player | Career Steals | Steals Per Game | Era |
|---|---|---|---|
| John Stockton | 3,265 | 2.17 | 1984-2003 |
| Jason Kidd | 2,684 | 1.93 | 1994-2013 |
| Michael Jordan | 2,514 | 2.35 | 1984-2003 |
| Gary Payton | 2,445 | 1.77 | 1990-2007 |
| Chris Paul | 2,544* | 2.11 | 2005-present |
*As of 2024
Limitations of Steal Statistics
Steals present several interpretive challenges:
-
Gambling vs. discipline: Players who gamble for steals may generate turnovers but leave their team vulnerable when attempts fail. A player with many steals and poor team defense may be hurting more than helping.
-
Position bias: Guards handle the ball more frequently and thus have more steal opportunities. Comparing steals across positions requires adjustment.
-
System dependence: Aggressive defensive schemes generate more steals but may surrender easier baskets. Conservative schemes accept fewer steals in exchange for better positioning.
-
Opponent quality: Playing against careless ball-handlers inflates steal totals.
Steals in Context
The 2004 Detroit Pistons won the championship while ranking just 10th in team steals. Their defensive success came through disciplined positioning and forcing difficult shots, not gambling for turnovers. This illustrates that steal totals alone do not measure defensive value.
6.5 Blocks: Protecting the Rim
Definition
A block is recorded when a defensive player deflects an opponent's field goal attempt, preventing it from reaching the basket. Blocks represent the most visible form of rim protection.
Historical Tracking
Like steals, blocks were not officially tracked until 1973-74. Bill Russell's shot-blocking prowess can only be estimated from film study and contemporary accounts. Some historians estimate Russell blocked 8-10 shots per game during his prime - numbers that would shatter modern records if verifiable.
Career Leaders
| Player | Career Blocks | Blocks Per Game | Height |
|---|---|---|---|
| Hakeem Olajuwon | 3,830 | 3.09 | 7'0" |
| Dikembe Mutombo | 3,289 | 2.75 | 7'2" |
| Kareem Abdul-Jabbar | 3,189 | 2.57 | 7'2" |
| Mark Eaton | 3,064 | 3.50 | 7'4" |
| Tim Duncan | 3,020 | 2.17 | 6'11" |
Block Limitations
Block statistics have significant limitations:
-
Altered shots: Many defended shots are altered but not blocked. A defender who changes a shooter's trajectory, causing a miss, receives no statistical credit.
-
Position dependence: Centers block more shots than guards, making cross-position comparisons meaningless without adjustment.
-
Recovery: A blocked shot that remains in play may be recovered by the offense, negating much of the block's value.
-
Goaltending: Illegal blocks are not counted, meaning some players' totals would be higher if they played differently.
-
Defensive scheme: Some systems funnel drivers toward shot-blockers, inflating individual totals through team design.
Block Percentage
Like rebounding percentage, block percentage estimates the percentage of opponent two-point attempts blocked while a player was on the court:
$$\text{BLK\%} = \frac{100 \times \text{BLK} \times (\text{Tm MP} / 5)}{\text{MP} \times (\text{Opp 2PA})}$$
This rate-based measure allows fairer comparisons across different minutes totals and team contexts.
6.6 Turnovers: The Cost of Possession
Definition
A turnover occurs when the offensive team loses possession without attempting a shot. Turnovers include:
- Live-ball turnovers: Steals, interceptions
- Dead-ball turnovers: Traveling, out of bounds, offensive fouls, violations
Historical Tracking
Individual turnovers were not tracked until 1977-78. Team turnovers were recorded earlier, but attributing them to specific players was not standardized.
Turnover Context
Not all turnovers are equal:
- Turnover location: A turnover at halfcourt differs from one in the frontcourt
- Game situation: A late-game turnover in a close game is more costly
- Alternative outcome: A risky pass attempt that fails may be preferable to a contested shot
High-assist players typically have more turnovers because they handle the ball more frequently. LeBron James leads in career turnovers not because he is careless but because his playmaking role creates turnover opportunities.
Assist-to-Turnover Ratio Revisited
The AST/TO ratio contextualizes playmaking efficiency:
| Player | Career AST | Career TO | AST/TO Ratio |
|---|---|---|---|
| Chris Paul | 11,894 | 2,954 | 4.03 |
| John Stockton | 15,806 | 4,244 | 3.72 |
| Muggsy Bogues | 6,726 | 2,118 | 3.18 |
| Steve Nash | 10,335 | 3,478 | 2.97 |
| Magic Johnson | 10,141 | 3,506 | 2.89 |
6.7 Personal Fouls and Disqualifications
Foul Types
Personal fouls encompass various infractions:
- Shooting fouls: Contact during shot attempts
- Non-shooting fouls: Contact away from the ball or before shot attempts
- Offensive fouls: Charging, illegal screens
- Flagrant fouls: Excessive or unnecessary contact
- Technical fouls: Unsportsmanlike conduct
Foul Limits and Disqualifications
NBA players are disqualified (fouled out) after six personal fouls. This limit affects player usage, as coaches must balance a player's effectiveness against foul trouble risk.
Foul Context
Fouls have complex interpretations:
-
Defensive aggressiveness: Some fouls result from aggressive defense that disrupts opponents. Strategically fouling poor free throw shooters is a legitimate tactic.
-
Positioning failures: Fouls may indicate defensive breakdowns or poor positioning.
-
Officiating variance: Different referees have different standards. Some games feature more whistles than others.
-
Rule changes: Hand-checking rules, freedom of movement emphasis, and other changes affect foul rates across eras.
Fouls Per Game
Examining fouls per 36 minutes provides insight into playing style:
| Player | Career PF/36 | Playing Style |
|---|---|---|
| Shaquille O'Neal | 4.4 | Physical post presence |
| Dennis Rodman | 4.1 | Aggressive rebounding |
| Draymond Green | 3.9 | Versatile defender |
| Charles Oakley | 4.0 | Enforcer role |
6.8 Minutes Played: The Foundation of Context
Importance of Minutes
Minutes played serves as the denominator for per-minute statistics. Without minutes context, raw totals are nearly meaningless. A player who scores 20 points in 40 minutes performs differently than one who scores 20 in 25 minutes.
Minutes Distribution Patterns
Minutes distribution reveals coaching decisions and player roles:
- Stars: Typically play 32-38 minutes in the modern NBA
- Role players: Usually 20-28 minutes
- Rotation players: 10-20 minutes
- Deep bench: Fewer than 10 minutes
Historical patterns differed significantly. In the 1960s, star players routinely played 45+ minutes per game. Wilt Chamberlain averaged 48.5 minutes per game in 1961-62 - meaning he played every minute of every game, including overtime.
Load Management
Modern analytics has revealed the importance of rest and recovery. Minutes restrictions have become common for star players, complicating historical comparisons. A player who averages 25 PPG in 32 minutes likely has different per-minute production than one who averaged 25 PPG in 40 minutes during an earlier era.
Per-36 Minutes Statistics
To compare players with different minutes totals, analysts often use per-36 minute statistics:
$$\text{Per-36 Stat} = \frac{\text{Stat Total}}{\text{Minutes Played}} \times 36$$
This normalization allows fairer comparisons but introduces its own limitations:
- Small sample sizes for low-minute players create volatility
- Players who play more minutes may tire, reducing efficiency
- Per-minute rates may not scale linearly with increased playing time
6.9 Historical Context and Evolution
The Pre-Statistical Era (1891-1946)
Basketball's first decades had minimal statistical tracking. Points were recorded, but other statistics were inconsistent or absent. Historical research has reconstructed some records, but gaps remain.
The Early NBA Era (1946-1973)
The NBA began tracking basic statistics from its founding: - 1946: Points, field goals attempted/made, free throws attempted/made - 1950: Rebounds added - 1969-70: Assists begin consistent tracking (earlier data exists but is incomplete)
The Modern Era (1973-present)
The 1973-74 season marked a statistical watershed: - Offensive and defensive rebounds separated - Steals and blocks begin official tracking - Turnovers tracking improved
The Three-Point Era (1979-present)
The three-point line's introduction fundamentally changed scoring distribution. Comparing pre-1979 scoring to modern stats requires acknowledging this structural change.
The Analytics Revolution (2000s-present)
Advanced statistics, player tracking, and sophisticated analysis have revealed box score limitations. Yet box scores remain foundational, providing the raw data for more complex calculations.
6.10 Limitations of Counting Statistics
What Box Scores Miss
Traditional box scores fail to capture numerous important elements:
-
Defense: Beyond steals and blocks, defensive contribution is invisible. A player who consistently contests shots, directs traffic, and communicates switches receives no statistical credit.
-
Off-ball movement: Setting screens, spacing the floor, and cutting without receiving the ball are untracked.
-
Quality of shot creation: A player who creates an open shot for a teammate who then dribbles into a contested shot receives the same assist credit as one whose pass leads directly to an easy bucket.
-
Decision-making: Choosing not to shoot is often the right decision but generates no positive statistics.
-
Leadership and communication: Intangible contributions remain unmeasured.
-
Context: Game situation, opponent quality, and teammate quality are not reflected.
The Rebound Example
Consider two players who each grab 10 rebounds in a game:
Player A: - 3 offensive rebounds, contested - 7 defensive rebounds, contested - Excellent box-out technique - Created two second-chance points
Player B: - 0 offensive rebounds - 10 defensive rebounds, 8 uncontested - Teammates box out for him - No second-chance involvement
Their box scores appear identical, but their contributions differ dramatically. Only watching the game reveals this distinction.
Counting Statistics and Team Success
High counting statistics do not guarantee team success. The 2015-16 Golden State Warriors won 73 games without any player leading the league in a major statistical category. Championship teams often feature balanced contributions rather than statistical dominance.
Conversely, players with excellent statistics sometimes fail to impact winning. The concept of "empty stats" - numbers accumulated without proportional team success - emerged from recognizing this disconnect.
6.11 Context-Dependent Interpretation
Pace Adjustments
Teams play at different paces, affecting counting statistics. A player on a fast-paced team has more opportunities to accumulate stats. Per-possession statistics address this:
$$\text{Points per 100 possessions} = \frac{\text{Points}}{\text{Possessions}} \times 100$$
Era Adjustments
Comparing across eras requires acknowledging structural differences: - Rule changes affect scoring opportunities - Three-point line introduction changed point distribution - Pace has varied significantly across decades - Athletic and skill development has improved
Team Context
A player's role affects their statistics: - Primary scorers take more shots - Point guards accumulate more assists - Centers grab more rebounds - System requirements affect individual numbers
Opponent Quality
Playing against weaker opponents inflates statistics. Schedule strength varies across teams and seasons.
6.12 Practical Applications
Using Box Scores Effectively
Despite limitations, box scores remain valuable when properly interpreted:
- Identify roles: Statistics reveal player responsibilities
- Track trends: Game-to-game or season-to-season changes indicate development
- Compare contemporaries: Within-era comparisons minimize structural differences
- Establish baselines: Box scores provide starting points for deeper analysis
Red Flags in Box Score Analysis
Certain patterns suggest limitations in counting statistics:
- High scoring with poor team offense
- Many rebounds but poor team rebounding
- High assists with many turnovers
- Strong individual stats with team failure
Combining Statistics
No single statistic tells the complete story. Analyzing multiple statistics together provides better insight:
- Points + efficiency metrics reveal scoring value
- Rebounds + rebounding percentage show true impact
- Assists + turnovers indicate playmaking efficiency
- Steals + blocks + defensive rating measure defensive value
6.13 Python Implementation: Box Score Analysis
The following code demonstrates box score analysis techniques. Complete implementations are available in the accompanying code file.
Basic Box Score Data Structure
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Sample box score data structure
box_score_columns = [
'player', 'team', 'minutes', 'points', 'fgm', 'fga',
'fg3m', 'fg3a', 'ftm', 'fta', 'oreb', 'dreb', 'treb',
'assists', 'steals', 'blocks', 'turnovers', 'pf'
]
# Example game data
game_data = {
'player': ['LeBron James', 'Anthony Davis', 'Austin Reaves'],
'team': ['LAL', 'LAL', 'LAL'],
'minutes': [36, 34, 32],
'points': [28, 24, 18],
'fgm': [10, 9, 7],
'fga': [18, 16, 14],
'fg3m': [2, 1, 3],
'fg3a': [5, 3, 7],
'ftm': [6, 5, 1],
'fta': [8, 6, 2],
'oreb': [1, 3, 0],
'dreb': [7, 9, 3],
'treb': [8, 12, 3],
'assists': [9, 3, 5],
'steals': [2, 1, 1],
'blocks': [1, 2, 0],
'turnovers': [3, 2, 1],
'pf': [2, 4, 3]
}
df = pd.DataFrame(game_data)
Per-36 Minutes Calculation
def calculate_per_36(df, stat_columns):
"""
Calculate per-36 minute statistics.
Args:
df: DataFrame with player statistics
stat_columns: List of columns to normalize
Returns:
DataFrame with per-36 statistics added
"""
result_df = df.copy()
for col in stat_columns:
result_df[f'{col}_per36'] = (df[col] / df['minutes']) * 36
return result_df
# Apply to counting statistics
counting_stats = ['points', 'treb', 'assists', 'steals', 'blocks', 'turnovers']
df_per36 = calculate_per_36(df, counting_stats)
Efficiency Calculations
def calculate_efficiency_metrics(df):
"""
Calculate basic efficiency metrics from box score data.
Args:
df: DataFrame with box score statistics
Returns:
DataFrame with efficiency metrics added
"""
result_df = df.copy()
# Field goal percentage
result_df['fg_pct'] = df['fgm'] / df['fga']
# Three-point percentage
result_df['fg3_pct'] = df['fg3m'] / df['fg3a']
# Free throw percentage
result_df['ft_pct'] = df['ftm'] / df['fta']
# True shooting percentage
result_df['ts_pct'] = df['points'] / (2 * (df['fga'] + 0.44 * df['fta']))
# Effective field goal percentage
result_df['efg_pct'] = (df['fgm'] + 0.5 * df['fg3m']) / df['fga']
# Assist to turnover ratio
result_df['ast_to_ratio'] = df['assists'] / df['turnovers'].replace(0, np.nan)
return result_df
Visualization Functions
def plot_box_score_comparison(df, player_col='player', stats_to_plot=None):
"""
Create a radar chart comparing player box score statistics.
Args:
df: DataFrame with player statistics
player_col: Column containing player names
stats_to_plot: List of statistics to include (default: main counting stats)
"""
if stats_to_plot is None:
stats_to_plot = ['points', 'treb', 'assists', 'steals', 'blocks']
# Normalize statistics to 0-1 scale for comparison
df_norm = df.copy()
for stat in stats_to_plot:
max_val = df[stat].max()
if max_val > 0:
df_norm[stat] = df[stat] / max_val
# Number of statistics
num_stats = len(stats_to_plot)
# Compute angle for each stat
angles = [n / float(num_stats) * 2 * np.pi for n in range(num_stats)]
angles += angles[:1] # Complete the circle
# Create plot
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(polar=True))
colors = plt.cm.Set2(np.linspace(0, 1, len(df)))
for idx, (_, row) in enumerate(df_norm.iterrows()):
values = [row[stat] for stat in stats_to_plot]
values += values[:1] # Complete the circle
ax.plot(angles, values, 'o-', linewidth=2,
label=row[player_col], color=colors[idx])
ax.fill(angles, values, alpha=0.25, color=colors[idx])
ax.set_xticks(angles[:-1])
ax.set_xticklabels(stats_to_plot)
ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))
plt.title('Box Score Comparison')
plt.tight_layout()
return fig, ax
Game Score Calculation
def calculate_game_score(df):
"""
Calculate John Hollinger's Game Score metric.
Game Score = PTS + 0.4*FGM - 0.7*FGA - 0.4*(FTA-FTM) + 0.7*OREB
+ 0.3*DREB + STL + 0.7*AST + 0.7*BLK - 0.4*PF - TOV
Args:
df: DataFrame with box score statistics
Returns:
Series with Game Score for each player
"""
game_score = (
df['points']
+ 0.4 * df['fgm']
- 0.7 * df['fga']
- 0.4 * (df['fta'] - df['ftm'])
+ 0.7 * df['oreb']
+ 0.3 * df['dreb']
+ df['steals']
+ 0.7 * df['assists']
+ 0.7 * df['blocks']
- 0.4 * df['pf']
- df['turnovers']
)
return game_score
6.14 Advanced Box Score Analysis
Identifying Player Types
Box score patterns reveal player roles:
def classify_player_type(df):
"""
Classify players based on box score patterns.
Args:
df: DataFrame with box score statistics
Returns:
Series with player type classifications
"""
classifications = []
for _, row in df.iterrows():
minutes = row['minutes']
if minutes < 10:
classifications.append('Limited Minutes')
continue
# Normalize to per-36
pts_36 = (row['points'] / minutes) * 36
reb_36 = (row['treb'] / minutes) * 36
ast_36 = (row['assists'] / minutes) * 36
# Classification logic
if pts_36 >= 20 and ast_36 >= 6:
classifications.append('Primary Ball Handler/Scorer')
elif pts_36 >= 20:
classifications.append('Primary Scorer')
elif ast_36 >= 8:
classifications.append('Primary Playmaker')
elif reb_36 >= 10:
classifications.append('Primary Rebounder')
elif pts_36 >= 15 and reb_36 >= 6:
classifications.append('Stretch Big')
else:
classifications.append('Role Player')
return pd.Series(classifications, index=df.index)
Historical Comparison
def era_adjust_statistics(stats, from_year, to_year=2024, pace_data=None):
"""
Adjust statistics for pace differences across eras.
Args:
stats: Dictionary of player statistics
from_year: Season year of the statistics
to_year: Target year for adjustment
pace_data: Dictionary mapping years to league average pace
Returns:
Dictionary with era-adjusted statistics
"""
# Sample pace data (possessions per game)
if pace_data is None:
pace_data = {
1960: 126.0, 1970: 112.7, 1980: 103.1, 1990: 98.3,
2000: 93.1, 2010: 95.0, 2020: 100.3, 2024: 99.2
}
# Find closest years in pace data
from_pace = pace_data.get(from_year, 100)
to_pace = pace_data.get(to_year, 100)
# Calculate adjustment factor
adjustment = to_pace / from_pace
# Adjust counting statistics
adjusted_stats = {}
counting_categories = ['points', 'rebounds', 'assists', 'steals', 'blocks']
for key, value in stats.items():
if key in counting_categories:
adjusted_stats[key] = value * adjustment
else:
adjusted_stats[key] = value
return adjusted_stats
6.15 Chapter Summary
Box score statistics form the foundation of basketball analysis. Points, rebounds, assists, steals, blocks, turnovers, fouls, and minutes played each capture important aspects of player performance. However, each statistic has limitations that careful analysts must acknowledge.
Key principles for box score analysis:
-
Context matters: Raw numbers mean little without understanding minutes, pace, team role, and era.
-
Combine multiple statistics: No single number captures complete player value.
-
Acknowledge limitations: Box scores miss defense, off-ball contributions, and decision-making quality.
-
Use appropriate comparisons: Compare players within similar contexts when possible.
-
Verify with film: Statistics suggest patterns; video reveals truth.
-
Understand historical evolution: Statistical tracking has changed, affecting comparisons.
The next chapter will build upon these fundamentals, introducing efficiency metrics that address some counting statistics' limitations. True shooting percentage, player efficiency rating, and other measures attempt to synthesize box score data into more meaningful evaluations.
Chapter 6 Formulas Reference
| Statistic | Formula |
|---|---|
| Points | $2 \times \text{2PT FGM} + 3 \times \text{3PT FGM} + \text{FTM}$ |
| Total Rebounds | $\text{OREB} + \text{DREB}$ |
| OREB% | $\frac{100 \times \text{OREB} \times (\text{Tm MP}/5)}{\text{MP} \times (\text{Tm OREB} + \text{Opp DREB})}$ |
| DREB% | $\frac{100 \times \text{DREB} \times (\text{Tm MP}/5)}{\text{MP} \times (\text{Tm DREB} + \text{Opp OREB})}$ |
| AST/TO Ratio | $\frac{\text{Assists}}{\text{Turnovers}}$ |
| BLK% | $\frac{100 \times \text{BLK} \times (\text{Tm MP}/5)}{\text{MP} \times \text{Opp 2PA}}$ |
| Per-36 Stat | $\frac{\text{Stat}}{\text{Minutes}} \times 36$ |
| True Shooting % | $\frac{\text{PTS}}{2 \times (\text{FGA} + 0.44 \times \text{FTA})}$ |
| Effective FG% | $\frac{\text{FGM} + 0.5 \times \text{3PM}}{\text{FGA}}$ |
| Game Score | $\text{PTS} + 0.4 \times \text{FGM} - 0.7 \times \text{FGA} - 0.4 \times (\text{FTA}-\text{FTM}) + 0.7 \times \text{OREB} + 0.3 \times \text{DREB} + \text{STL} + 0.7 \times \text{AST} + 0.7 \times \text{BLK} - 0.4 \times \text{PF} - \text{TOV}$ |
Continue to Chapter 7: Efficiency Metrics and Rate Statistics