Python案例:分析输球方的进步空间
下面我用一个完整的Python案例来演示如何从比赛数据中分析输球方还有哪些进步空间,这个案例用足球比赛数据作为示例(也适用于篮球、电竞等对抗性比赛)。

案例背景
假设我们有一场足球比赛的详细技术统计数据,需要分析输球方(假设为客队)在哪些方面存在不足,从而找到进步空间。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# ============ 1. 构造比赛数据 ============
data = {
'指标': ['控球率(%)', '射门次数', '射正次数', '传球成功率(%)',
'抢断次数', '犯规次数', '角球次数', '越位次数', '跑动距离(km)'],
'主队(胜)': [58, 16, 7, 87, 14, 10, 8, 2, 112],
'客队(负)': [42, 9, 2, 78, 18, 16, 3, 5, 105]
}
df = pd.DataFrame(data)
df['差值'] = df['客队(负)'] - df['主队(胜)']
df['差距率(%)'] = (df['差值'] / df['主队(胜)'] * 100).round(1)
print("=" * 60)
print("比赛技术统计对比")
print("=" * 60)
print(df.to_string(index=False))
输出示例:
指标 主队(胜) 客队(负) 差值 差距率(%)
控球率(%) 58 42 -16 -27.6
射门次数 16 9 -7 -43.8
射正次数 7 2 -5 -71.4
传球成功率(%) 87 78 -9 -10.3
抢断次数 14 18 +4 +28.6
犯规次数 10 16 +6 +60.0
角球次数 8 3 -5 -62.5
越位次数 2 5 +3 +150.0
跑动距离(km) 112 105 -7 -6.3
识别进步空间的分析逻辑
# ============ 2. 定义分析规则 ============
def analyze_weakness(row):
"""根据指标差异,判断进步空间类型"""
indicator = row['指标']
diff = row['差值']
gap_rate = row['差距率(%)']
# 对于"越多越好"的指标
positive_indicators = ['控球率(%)', '射门次数', '射正次数', '传球成功率(%)',
'抢断次数', '角球次数', '跑动距离(km)']
# 对于"越少越好"的指标
negative_indicators = ['犯规次数', '越位次数']
if indicator in positive_indicators and diff < 0:
return f"⬇ 不足(落后{abs(gap_rate)}%)"
elif indicator in negative_indicators and diff > 0:
return f"⚠ 过多(高出{gap_rate}%)"
else:
return "✅ 表现良好"
df['评价'] = df.apply(analyze_weakness, axis=1)
print("\n" + "=" * 60)
print("输球方各指标评价")
print("=" * 60)
print(df[['指标', '主队(胜)', '客队(负)', '差距率(%)', '评价']].to_string(index=False))
输出示例:
指标 主队(胜) 客队(负) 差距率(%) 评价
控球率(%) 58 42 -27.6 ⬇ 不足(落后27.6%)
射门次数 16 9 -43.8 ⬇ 不足(落后43.8%)
射正次数 7 2 -71.4 ⬇ 不足(落后71.4%)
传球成功率(%) 87 78 -10.3 ⬇ 不足(落后10.3%)
抢断次数 14 18 +28.6 ✅ 表现良好
犯规次数 10 16 +60.0 ⚠ 过多(高出60.0%)
角球次数 8 3 -62.5 ⬇ 不足(落后62.5%)
越位次数 2 5 +150.0 ⚠ 过多(高出150.0%)
跑动距离(km) 112 105 -6.3 ⬇ 不足(落后6.3%)
按优先级排序(进步空间从大到小)
# ============ 3. 计算"进步空间得分" ============
# 差距越大、权重越高,则进步空间越大
weights = {
'射正次数': 5, '射门次数': 4, '控球率(%)': 3, '传球成功率(%)': 3,
'角球次数': 2, '跑动距离(km)': 2, '抢断次数': 1,
'犯规次数': 3, '越位次数': 2
}
df['权重'] = df['指标'].map(weights)
df['进步空间得分'] = (df['差距率(%)'].abs() * df['权重'] / 10).round(1)
# 只保留需要改进的指标
improvements = df[df['评价'] != "✅ 表现良好"].sort_values(
by='进步空间得分', ascending=False
)
print("\n" + "=" * 60)
print("输球方进步空间优先级排序")
print("=" * 60)
print(improvements[['指标', '差距率(%)', '权重', '进步空间得分', '评价']].to_string(index=False))
输出示例:
指标 差距率(%) 权重 进步空间得分 评价
射正次数 -71.4 5 35.7 ⬇ 不足(落后71.4%)
射门次数 -43.8 4 17.5 ⬇ 不足(落后43.8%)
犯规次数 +60.0 3 18.0 ⚠ 过多(高出60.0%)
角球次数 -62.5 2 12.5 ⬇ 不足(落后62.5%)
越位次数 +150.0 2 30.0 ⚠ 过多(高出150.0%)
控球率(%) -27.6 3 8.3 ⬇ 不足(落后27.6%)
传球成功率(%) -10.3 3 3.1 ⬇ 不足(落后10.3%)
跑动距离(km) -6.3 2 1.3 ⬇ 不足(落后6.3%)
可视化展示
# ============ 4. 可视化 ============
fig, axes = plt.subplots(1, 2, figsize=(15, 6))
# 图1:雷达图对比
from matplotlib import pyplot as plt
categories = df['指标'].tolist()
N = len(categories)
angles = [n / float(N) * 2 * np.pi for n in range(N)]
angles += angles[:1]
fig1 = plt.figure(figsize=(7, 7))
ax = plt.subplot(111, polar=True)
values_home = df['主队(胜)'].tolist() + [df['主队(胜)'].tolist()[0]]
values_away = df['客队(负)'].tolist() + [df['客队(负)'].tolist()[0]]
# 归一化到0-1便于雷达图展示(按最大值标准化)
max_vals = df[['主队(胜)', '客队(负)']].max(axis=1).tolist()
values_home = [v/m for v, m in zip(df['主队(胜)'].tolist(), max_vals)] + \
[df['主队(胜)'].tolist()[0]/max_vals[0]]
values_away = [v/m for v, m in zip(df['客队(负)'].tolist(), max_vals)] + \
[df['客队(负)'].tolist()[0]/max_vals[0]]
ax.plot(angles, values_home, 'o-', linewidth=2, label='主队(胜)', color='green')
ax.fill(angles, values_home, alpha=0.25, color='green')
ax.plot(angles, values_away, 'o-', linewidth=2, label='客队(负)', color='red')
ax.fill(angles, values_away, alpha=0.25, color='red')
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories, fontsize=10)
ax.set_title('双方技术统计雷达图对比', fontsize=14, pad=20)
ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))
plt.tight_layout()
plt.show()
自动生成分析报告
# ============ 5. 生成进步空间分析报告 ============
def generate_report(improvements_df):
report = []
report.append("=" * 60)
report.append("输球方进步空间分析报告")
report.append("=" * 60)
# 分类
attack = improvements_df[improvements_df['指标'].isin(
['射门次数', '射正次数', '角球次数', '控球率(%)'])]
defense = improvements_df[improvements_df['指标'].isin(
['抢断次数', '犯规次数', '越位次数'])]
physical = improvements_df[improvements_df['指标'].isin(
['跑动距离(km)', '传球成功率(%)'])]
report.append("\n【一、进攻端】")
for _, row in attack.iterrows():
report.append(f" • {row['指标']}:{row['评价']},建议加强进攻组织与终结效率")
report.append("\n【二、防守与纪律】")
for _, row in defense.iterrows():
report.append(f" • {row['指标']}:{row['评价']},注意动作规范与站位")
report.append("\n【三、体能与技战术】")
for _, row in physical.iterrows():
report.append(f" • {row['指标']}:{row['评价']},需提升跑动积极性与传球质量")
report.append("\n【改进优先级TOP3】")
top3 = improvements_df.nlargest(3, '进步空间得分')
for i, (_, row) in enumerate(top3.iterrows(), 1):
report.append(f" {i}. {row['指标']}(进步空间得分:{row['进步空间得分']})")
return "\n".join(report)
print("\n" + generate_report(improvements))
输出示例:
============================================================
输球方进步空间分析报告
============================================================
【一、进攻端】
• 射正次数:⬇ 不足(落后71.4%),建议加强进攻组织与终结效率
• 射门次数:⬇ 不足(落后43.8%),建议加强进攻组织与终结效率
• 角球次数:⬇ 不足(落后62.5%),建议加强进攻组织与终结效率
• 控球率(%):⬇ 不足(落后27.6%),建议加强进攻组织与终结效率
【二、防守与纪律】
• 犯规次数:⚠ 过多(高出60.0%),注意动作规范与站位
• 越位次数:⚠ 过多(高出150.0%),注意动作规范与站位
【三、体能与技战术】
• 传球成功率(%):⬇ 不足(落后10.3%),需提升跑动积极性与传球质量
• 跑动距离(km):⬇ 不足(落后6.3%),需提升跑动积极性与传球质量
【改进优先级TOP3】
1. 射正次数(进步空间得分:35.7)
2. 越位次数(进步空间得分:30.0)
3. 犯规次数(进步空间得分:18.0)
核心结论与方法论
| 分析维度 | 判断方法 | 进步空间含义 |
|---|---|---|
| 进攻效率 | 射门/射正/角球落后 | 提升前场创造力和终结能力 |
| 控球组织 | 控球率、传球成功率低 | 加强中场控制与传球质量 |
| 防守纪律 | 犯规、越位过多 | 改善防守站位和战术理解 |
| 体能储备 | 跑动距离落后 | 加强体能训练 |
| 对抗强度 | 抢断数据 | 该项已占优,可保持 |
扩展思路
- 引入更细的数据:如球员个人跑动热图、传球网络、xG(预期进球)等。
- 使用机器学习:用历史比赛数据训练模型,预测哪些指标提升最可能带来胜利。
- 时间维度分析:分时间段统计(如上下半场),找出体能下降或注意力涣散的节点。
- 对手针对性分析:结合球队风格,判断差距是"能力差距"还是"战术克制"。
一句话总结:这个案例的核心思想是——把输球方的各项技术统计与胜方对比,通过差值和权重计算进步空间得分,再按进攻/防守/体能等维度分类排序,从而量化地指出"该从哪里改、先改什么"。
如果你有具体的比赛数据(比如篮球、电竞、羽毛球),我可以帮你套用同样的分析框架。