本文目录导读:

板凳深度”(Bench Depth,即阵容替补实力)的评级打分,在Python数据分析中通常是一个多因子加权模型,核心逻辑是:不仅要看替补球员的数量,更要看替补球员的质量、位置覆盖度以及对主力阵容的替代能力。
以下是一个基于Python的实战案例逻辑拆解,分为数据准备、指标计算和打分模型三个部分。
第一步:定义核心指标(维度)
我们需要从5个维度去量化板凳深度,每个维度设置权重(总和为100分):
- 替补得分/篮板/助攻贡献度(权重 30%):替补场均数据与主力场均数据的比值。
- 位置覆盖度(权重 25%):替补是否在每个位置都有可靠人选(没有短板)。
- 效率值(PER)差值(权重 20%):替补整体效率值与联盟平均水平(通常设定为15)的对比。
- 比赛末节关键得分(权重 15%):衡量替补在“垃圾时间”或主力休息时的抢分能力。
- 伤病/轮换冗余度(权重 10%):当主力缺席时,替补是否具备“即插即用”的同位置顶替能力。
第二步:Python代码实现核心逻辑
import pandas as pd
import numpy as np
# 示例数据:假设这是某支球队的球员数据
data = {
'player': ['SGA', 'Chet', 'J-Dub', 'Giddey', 'Lugo', # 首发
'Wallace', 'Wiggins', 'Dieng', 'Mann', 'Poku'], # 替补
'position': ['PG', 'C', 'SF', 'SG', 'PF', # 首发
'PG', 'SF', 'SG', 'PG', 'PF'], # 替补
'starter': [1, 1, 1, 1, 1, 0, 0, 0, 0, 0], # 1=首发, 0=替补
'points': [30.1, 18.5, 22.0, 12.8, 14.2, # 首发
8.5, 9.1, 6.3, 5.9, 4.2], # 替补
'PER': [29.5, 24.8, 23.1, 17.3, 19.9, # 效率值
16.5, 15.8, 14.2, 13.1, 11.5],
'minutes': [35, 32, 34, 30, 28,
22, 20, 18, 15, 12]
}
df = pd.DataFrame(data)
# ---- 核心评级函数 ----
def bench_depth_score(df):
starters = df[df['starter'] == 1]
bench = df[df['starter'] == 0]
# 1. 得分贡献度(替补/主力)
score_contrib = bench['points'].sum() / starters['points'].sum()
score_contrib_score = min(score_contrib / 0.5, 1.0) * 30 # 替补得分达到主力50%为满分
# 2. 位置覆盖度(检查每个位置是否有替补)
starter_positions = set(starters['position'])
bench_positions = set(bench['position'])
coverage_ratio = len(starter_positions & bench_positions) / len(starter_positions)
coverage_score = coverage_ratio * 25
# 3. 替补效率值(PER)达标率
# 设定联盟平均PER=15,替补PER高于15视为优质替补
bench_per_mean = bench['PER'].mean()
per_efficiency = max(min(bench_per_mean / 15.0, 1.0), 0)
per_score = per_efficiency * 20
# 4. 得分效率(每分钟得分,衡量“微波炉”属性)
bench_pts_per_min = bench['points'].sum() / bench['minutes'].sum()
# 设定一个标准值,比如每分钟0.4分算合格
efficiency_score = min(bench_pts_per_min / 0.5, 1.0) * 15
# 5. 冗余度(同位置替补人数)
redundancy_score = min(len(bench) / len(starters), 1.0) * 10
# 总分
total_score = score_contrib_score + coverage_score + per_score + efficiency_score + redundancy_score
return {
'score': round(total_score, 1),
'details': {
'得分贡献(30分)': round(score_contrib_score, 1),
'位置覆盖(25分)': round(coverage_score, 1),
'PER效率(20分)': round(per_score, 1),
'得分效率(15分)': round(efficiency_score, 1),
'冗余度(10分)': round(redundancy_score, 1)
}
}
# 执行评级
result = bench_depth_score(df)
print(f"总得分: {result['score']} / 100")
print("明细:", result['details'])
# ---- 自动评级(S/A/B/C/D)----
def get_grade(score):
if score >= 85: return 'S级(顶级板凳)'
elif score >= 75: return 'A级(优秀板凳)'
elif score >= 65: return 'B级(合格板凳)'
elif score >= 50: return 'C级(薄弱板凳)'
else: return 'D级(极差板凳)'
grade = get_grade(result['score'])
print(f"评级结果: {grade}")
第三步:实战进阶——考虑“攻防两端”和“化学反应”
在真实的体育分析中,上述代码只是基础版,更科学的模型会引入:
- 净效率值(Net Rating):替补在场时球队的攻防效率差(使用
on/offcourt数据)。 - “死亡五小”/“超级第六人”:单独识别替补中PER>20的球员,给予额外加成。
- 伤病模拟(蒙特卡洛):跑10000次模拟,随机缺阵1-2名主力,看替补能否维持球队胜率。
代码示例(模拟伤病冗余):
# 简单模拟:随机抽掉一名首发,看替补顶上去后得分下降率
import random
def simulate_injury_safety(df, trials=1000):
starters = df[df['starter'] == 1].index.tolist()
safe_count = 0
for _ in range(trials):
injured = random.choice(starters)
injured_player = df.loc[injured]
# 找一个位置匹配的替补顶上
candidates = df[(df['starter'] == 0) & (df['position'] == injured_player['position'])]
if len(candidates) > 0:
# 计算原首发得分 vs 替补得分
drop_rate = 1 - (candidates['points'].max() / injured_player['points'])
if drop_rate < 0.3: # 得分下降不超过30%视为能顶住
safe_count += 1
safety_ratio = safe_count / trials
# 该比例直接作为“冗余度”修正因子
return safety_ratio
第四步:如何应用到实际项目?
在给出一份评级报告时,建议直接输出一个雷达图(使用matplotlib),直观展示五个维度的得分情况。
打分逻辑总结:
| 维度 | 权重 | 计算逻辑 |
|---|---|---|
| 得分贡献 | 30% | 替补总得分 / 主力总得分,达到50%为满分 |
| 位置覆盖 | 25% | 替补能覆盖的主力位置比例 |
| 效率值 | 20% | 替补平均PER / 15(联盟均值) |
| 得分效率 | 15% | 替补每分钟得分 / 0.5(基准值) |
| 冗余度 | 10% | 替补人数 / 主力人数 |
最终评级标准:
- S级(85+):如2023-24赛季的凯尔特人,拥有5名以上PER>15的替补。
- A级(75-84):如掘金,替补有稳定第六人。
- B级(65-74):替补有一定厚度但有明显短板。
- C级(50-64):主力缺阵后胜率会大幅下降。
- D级(<50):典型的“5巨头+边缘人”阵容。
这个模型的核心思想是:数字不会说谎,但权重要根据球队风格调整(例如进攻型球队提高得分权重,防守型球队则要提高防守效率权重),在实际操作中,您可以直接替换上面代码里的data字典为真实的球员场均数据,即可快速得到该球队的板凳深度评级。