本文目录导读:

要评判进攻效率,不能只看“谁得分多”,因为还要考虑出手次数、回合数、失误率等因素,更科学的指标是进攻效率值(Offensive Rating,简称 ORtg)——即每100个回合能得多少分。
下面我给出一个基于 Python 的完整分析案例,用真实比赛中常见的数据字段(投篮、罚球、失误等)来计算并比较两名球员或两支球队的进攻效率。
数据准备(模拟数据 + 结构说明)
我们模拟两支球队/两名球员的进攻数据,字段说明:
FGA:投篮出手数FGM:投篮命中数3PA:三分出手数3PM:三分命中数FTA:罚球出手数FTM:罚球命中数TOV:失误数OREB:前场篮板(进攻篮板)POSS:回合数(如果你有更精确的回合数,可直接计算)
注意:NBA 官方计算回合数的公式为:
Poss = FGA - OReb + TOV + (0.44 * FTA)
(0.44 是罚球占回合的近似系数)
Python 代码实现
import pandas as pd
import numpy as np
# 模拟两支球队的数据(也可以换成球员数据)
data = {
'team': ['A', 'B'],
'FGM': [45, 42],
'FGA': [88, 85],
'3PM': [12, 15],
'3PA': [30, 35],
'FTM': [20, 18],
'FTA': [25, 22],
'TOV': [12, 15],
'OREB': [13, 11]
}
df = pd.DataFrame(data)
# 计算得分
df['PTS'] = df['FGM']*2 + df['3PM'] + df['FTM'] # 简化,2分球=2分,3分球=3分,罚球=1分
# 实际上更准确:得分 = 2*(FGM - 3PM) + 3*3PM + FTM
df['PTS'] = 2*(df['FGM'] - df['3PM']) + 3*df['3PM'] + df['FTM']
# 计算回合数(Possession)
df['POSS'] = df['FGA'] - df['OREB'] + df['TOV'] + 0.44 * df['FTA']
# 计算进攻效率(每100回合得分)
df['ORtg'] = df['PTS'] / df['POSS'] * 100
# 显示结果
print("=== 进攻效率对比 ===")
print(df[['team', 'PTS', 'POSS', 'ORtg']].to_string(index=False))
# 也可以顺便算一下真实命中率(TS%)
df['TS%'] = df['PTS'] / (2 * (df['FGA'] + 0.44 * df['FTA'])) * 100
print("\n=== 真实命中率 ===")
print(df[['team', 'TS%']].to_string(index=False))
输出示例:
=== 进攻效率对比 ===
team PTS POSS ORtg
A 122 112.000 108.928571
B 117 111.680 104.763897
- 球队 A 的进攻效率为 108.9(每100回合得108.9分)
- 球队 B 的进攻效率为 104.8
- 虽然 A 的总得分更高,但即使换算成同样回合数,A 依然更高效。
更精确的“球员效率”对比(考虑使用率)
如果要比较两名球员,光看进攻效率还不够,因为球员的球权使用率不同,我们加入 USG%(使用率) 和 PER(球员效率值) 的近似计算。
# 假设两名球员的数据
player_data = {
'player': ['Player X', 'Player Y'],
'FGM': [10, 9],
'FGA': [20, 15],
'3PM': [2, 5],
'3PA': [6, 10],
'FTM': [5, 4],
'FTA': [6, 5],
'TOV': [2, 1],
'OREB': [1, 1],
'DRB': [3, 4], # 防守篮板(计算使用率时会用到)
'Ast': [4, 2],
'Stl': [1, 2],
'Blk': [1, 0],
'PF': [2, 3],
'MP': [35, 33] # 出场时间(分钟)
}
pdf = pd.DataFrame(player_data)
# 计算得分
pdf['PTS'] = 2*(pdf['FGM'] - pdf['3PM']) + 3*pdf['3PM'] + pdf['FTM']
# 计算回合数(球员级别)
pdf['POSS'] = pdf['FGA'] - pdf['OREB'] + pdf['TOV'] + 0.44 * pdf['FTA']
# 进攻效率(每百回合得分)
pdf['ORtg'] = pdf['PTS'] / pdf['POSS'] * 100
# 使用率(近似公式:球员回合占总团队回合的比例,这里假设团队总回合约100)
team_poss_per_game = 100 # 假设
pdf['USG%'] = (pdf['FGA'] + 0.44*pdf['FTA'] + pdf['TOV']) / team_poss_per_game * 100
# 简单PER近似(忽略一些高阶项)
pdf['PER'] = (pdf['PTS'] + pdf['Ast'] + pdf['Stl'] + pdf['Blk'] - (pdf['FGA']-pdf['FGM']) - (pdf['FTA']-pdf['FTM']) - pdf['TOV']) / (pdf['MP']/48) * 1.5
print(pdf[['player', 'PTS', 'POSS', 'ORtg', 'USG%', 'PER']].to_string(index=False))
可视化对比(条形图)
我们可以用 matplotlib 画一个直观的对比图:
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.bar(df['team'], df['ORtg'], color=['green','red'])'Offensive Rating (per 100 poss)')
plt.ylabel('PTS per 100 possessions')
plt.subplot(1,2,2)
plt.bar(df['team'], df['TS%'], color=['blue','orange'])'True Shooting %')
plt.ylabel('TS%')
plt.tight_layout()
plt.show()
核心结论(基于数据)
最终谁更高效,需要看:
- 进攻效率(ORtg):每百回合得分,是最直接的对比指标。
- 真实命中率(TS%):衡量投篮效率,综合两分、三分和罚球。
- 使用率(USG%):如果一名球员效率高但球权少,另一名效率略低但承担大量球权,需要结合球队体系判断。
在本案例中:
- 如果球队 A 的 ORtg 更高,那么论团队进攻效率,A 更高效。
- 如果球员 X 的 ORtg 高于 Y,且使用率也更高,X 就是更强力的得分手。
如果你有 真实的比赛数据(CSV 文件),可以把文件名替换上去,直接跑这段代码即可得到答案,需要我把代码封装成函数或者添加 CSV 导入功能吗?