进攻效率的量化评估方法(Python案例)
进攻效率的量化评估是体育数据分析(尤其是篮球、足球)的核心问题,下面从指标体系、计算逻辑、Python实现三个层面展开。

进攻效率的核心指标
篮球领域(最成熟的体系)
| 指标 | 含义 | 公式 |
|---|---|---|
| ORtg(进攻效率) | 每100回合得分 | 100 × 得分 / 回合数 |
| PPP(每回合得分) | 单回合产出 | 得分 / 回合数 |
| eFG%(有效命中率) | 考虑三分加权 | (FGM + 0.5×3PM) / FGA |
| TOV%(失误率) | 每回合失误 | TOV / 回合数 |
| ORB%(前场篮板率) | 二次进攻能力 | ORB / (ORB + 对手DRB) |
| FT Rate(罚球率) | 造犯规能力 | FTA / FGA |
四要素模型(Dean Oliver):进攻效率 ≈ eFG% − TOV% + ORB% + FT Rate,这是评估进攻的经典框架。
足球领域
- xG(预期进球):基于射门位置、方式估算进球概率
- xA(预期助攻)、Progressive Passes(推进传球)
- 进攻三区传球成功率、每90分钟射门数(Shots/90)
Python 实现案例
案例1:篮球球队进攻效率(四要素模型)
import pandas as pd
import numpy as np
# 模拟一支球队10场比赛的技术统计
data = {
'game': range(1, 11),
'FGM': [40, 38, 42, 35, 45, 41, 39, 44, 37, 43], # 命中数
'FGA': [85, 88, 80, 90, 82, 86, 84, 81, 89, 83], # 出手数
'3PM': [12, 10, 15, 8, 16, 13, 11, 14, 9, 15], # 三分命中
'FTA': [20, 18, 25, 15, 22, 19, 21, 24, 17, 23], # 罚球出手
'TOV': [14, 16, 12, 18, 11, 15, 13, 12, 17, 14], # 失误
'ORB': [10, 8, 12, 7, 11, 9, 10, 13, 8, 11], # 前场篮板
'OppDRB': [30, 32, 28, 34, 29, 31, 30, 27, 33, 29], # 对手后场篮板
'PTS': [112, 104, 121, 96, 126, 113, 108, 122, 101, 119], # 总得分
'POSS': [98, 102, 95, 105, 96, 100, 99, 94, 103, 97] # 回合数
}
df = pd.DataFrame(data)
# ---- 四要素计算 ----
df['eFG%'] = (df['FGM'] + 0.5 * df['3PM']) / df['FGA']
df['TOV%'] = df['TOV'] / df['POSS']
df['ORB%'] = df['ORB'] / (df['ORB'] + df['OppDRB'])
df['FT_Rate']= df['FTA'] / df['FGA']
# ---- 进攻效率(每100回合得分)----
df['ORtg'] = 100 * df['PTS'] / df['POSS']
# ---- 四要素加权综合评分(标准化后加权)----
def zscore(s): return (s - s.mean()) / s.std()
df['Offense_Score'] = (
zscore(df['eFG%']) * 0.4 +
zscore(-df['TOV%']) * 0.25 + # 失误越低越好
zscore(df['ORB%']) * 0.2 +
zscore(df['FT_Rate']) * 0.15
)
print(df[['game','ORtg','eFG%','TOV%','ORB%','FT_Rate','Offense_Score']].round(3))
print(f"\n赛季平均 ORtg: {df['ORtg'].mean():.2f}")
输出解读:ORTG 越高越好,四要素中 eFG% 权重最大(命中率是进攻核心),TOV% 为负向指标。
案例2:球员级进攻效率(含使用率修正)
单纯看 PPP 会偏向角色球员(出手少、机会好),需结合 Usage%(使用率) 修正。
import pandas as pd
players = pd.DataFrame({
'player': ['A','B','C','D','E'],
'PTS': [28, 18, 12, 22, 8],
'FGA': [20, 14, 8, 16, 5],
'FTA': [8, 4, 2, 6, 1],
'TOV': [4, 2, 1, 3, 1],
'POSS_USED': [45, 35, 20, 40, 12], # 球员参与的回合数
'TEAM_POSS': [100, 100, 100, 100, 100]
})
# 使用率
players['USG%'] = players['POSS_USED'] / players['TEAM_POSS']
# 每回合得分
players['PPP'] = players['PTS'] / players['POSS_USED']
# 真实命中率 TS% = PTS / (2*(FGA + 0.44*FTA))
players['TS%'] = players['PTS'] / (2 * (players['FGA'] + 0.44 * players['FTA']))
# 综合进攻效率:PPP 结合使用率(高使用率下维持高PPP更有价值)
players['Weighted_Eff'] = players['PPP'] * (0.5 + 0.5 * players['USG%'])
print(players[['player','USG%','PPP','TS%','Weighted_Eff']].round(3))
要点:Weighted_Eff 对高使用率球员给予加成,避免“替补刷效率”的偏差。
案例3:足球 xG 进攻效率
import pandas as pd
shots = pd.DataFrame({
'team': ['A','A','A','B','B','B','B'],
'xg': [0.35, 0.10, 0.05, 0.20, 0.08, 0.45, 0.02],
'goal': [1, 0, 0, 0, 1, 1, 0]
})
# 进攻效率:实际进球 vs 预期进球
agg = shots.groupby('team').agg(
shots=('xg','count'),
total_xG=('xg','sum'),
goals=('goal','sum')
)
agg['xG_diff'] = agg['goals'] - agg['total_xG'] # 正=超常发挥
agg['conv_rate'] = agg['goals'] / agg['shots'] # 转化率
print(agg.round(2))
评估框架建议
量化进攻效率应分层递进:
- 基础层:得分/回合(ORtg、PPP)——直观但受节奏影响
- 分解层:四要素 / xG 拆解——定位问题(是投篮差还是失误多?)
- 情境层:结合 使用率、对手强度、垃圾时间过滤——避免偏差
- 模型层:用 RAPM(正则化调整正负值) 或 岭回归 剥离队友影响,得到"独立进攻贡献"
# 简易 RAPM 思路(岭回归剥离队友/对手效应) from sklearn.linear_model import Ridge # X: 每回合球员是否在场的哑变量; y: 每回合得分差 # model = Ridge(alpha=1.0).fit(X, y) # 系数即为调整后的进攻贡献
关键陷阱提醒
| 陷阱 | 说明 | 对策 |
|---|---|---|
| 节奏混淆 | 快节奏球队得分虚高 | 用每100回合、PPP 归一化 |
| 样本量小 | 单场数据波动大 | 滚动平均、贝叶斯收缩 |
| 使用率偏差 | 角色球员效率虚高 | USG% 加权 |
| 对手强度 | 打弱队数据好 | 对手强度调整 |
| 选择性偏差 | 垃圾时间刷数据 | 过滤分差>15分的时段 |
进攻效率量化的核心是 "产出/回合"归一化 + 多维分解 + 情境修正,Python 中用 pandas 做指标计算、用 scikit-learn 做调整模型(Ridge/RAPM),即可构建从基础到进阶的完整评估体系,需要我针对某个具体场景(如某支球队赛季分析、或球员对比)给出完整可运行代码吗?