本文目录导读:

这是一个非常有趣且实战性很强的数据分析问题,要判断“哪队的防线更稳固可靠”,不能只看“失球数”这一个指标(比如某队失球少可能是因为中场控球强,而不是后卫强)。
我们可以构建一个综合的 Python 数据分析案例,通过计算多个维度的防守指标,并利用加权评分法或雷达图来给球队防线打分。
以下是一个完整的 Python 分析思路和代码示例,假设你有球队的比赛数据(如英超、欧冠等)。
定义“稳固防线”的核心指标
我们选取5个关键指标,量化每支球队的防守表现:
- 场均失球数 (Goals Conceded per Game):越低越好,最直观。
- 被射正次数 (Shots on Target Against per Game):防线是否容易被打穿。
- 抢断成功率 (Tackle Success Rate):防守球员一对一的能力。
- 拦截次数 (Interceptions per Game):预判传球路线、阻断进攻的能力。
- 解围次数 (Clearances per Game):在危险区域化解危机的能力(但要结合控球率看,控球低的队解围会虚高,我们这里直接使用)。
模拟数据(假设有5支球队)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from math import pi
# 模拟 5 支球队的防守数据
data = {
'球队': ['红队', '蓝队', '绿队', '黄队', '紫队'],
'场均失球': [0.8, 1.2, 1.5, 1.0, 1.8], # 越低越好
'被射正次数': [2.5, 3.0, 4.2, 3.5, 5.0], # 越低越好
'抢断成功率': [0.78, 0.72, 0.65, 0.80, 0.60], # 越高越好
'拦截次数': [12, 10, 8, 15, 7], # 越高越好
'解围次数': [18, 15, 22, 20, 25] # 越高越好
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
数据标准化(关键步骤)
因为指标方向不同(有的越大越好,有的越小越好),我们需要统一量纲并调整为同向(所有值越大代表防守越好)。
- 对于“越大越好”的指标(抢断、拦截、解围):使用 Min-Max 归一化。
- 对于“越小越好”的指标(失球、被射正):先取
1/x或max - x再归一化,或者直接取负值后归一化,简单起见,我们用公式:(max - x) / (max - min)。
# 复制一份用于计算
df_norm = df.copy()
# 定义需要正向化处理的列(越小越好 -> 越大越好)
negative_cols = ['场均失球', '被射正次数']
# 定义正向列(越大越好)
positive_cols = ['抢断成功率', '拦截次数', '解围次数']
# 正向化处理:将负向指标转换为正向指标
for col in negative_cols:
max_val = df_norm[col].max()
min_val = df_norm[col].min()
df_norm[col] = (max_val - df_norm[col]) / (max_val - min_val)
# 正向化处理:正向指标直接 Min-Max 归一化
for col in positive_cols:
max_val = df_norm[col].max()
min_val = df_norm[col].min()
df_norm[col] = (df_norm[col] - min_val) / (max_val - min_val)
# 现在所有指标都变成了 [0, 1] 区间,且越接近 1 代表防守表现越好
print("\n标准化后的数据(分数越高=防守越好):")
print(df_norm[['球队'] + negative_cols + positive_cols])
综合评分(加权求和)
假设我们主观认为“抢断成功率”和“场均失球”最重要,给予更高权重。
# 定义权重(请确保权重之和为1)
weights = {
'场均失球': 0.35, # 失球数最重要
'被射正次数': 0.20,
'抢断成功率': 0.25, # 防守硬实力
'拦截次数': 0.10,
'解围次数': 0.10
}
# 计算加权总分
df_norm['防守总分'] = 0
for col, weight in weights.items():
df_norm['防守总分'] += df_norm[col] * weight
# 查看结果
result = df_norm[['球队', '防守总分']].sort_values(by='防守总分', ascending=False)
print("\n综合防守评分排名(满分1分):")
print(result)
可视化:雷达图(最直观比较防线弱点)
雷达图可以让你一眼看出:A队的优势是拦截,B队的短板是被射正。
# 选择要展示的球队(比如红队和蓝队)
teams_to_plot = ['红队', '蓝队']
categories = negative_cols + positive_cols
N = len(categories)
# 设置角度
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1] # 闭合
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
for team in teams_to_plot:
values = df_norm[df_norm['球队'] == team][categories].values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=2, linestyle='solid', label=team)
ax.fill(angles, values, alpha=0.1)
# 设置标签
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
ax.set_ylim(0, 1)'球队防线雷达图 (分数越高越好)', size=15)
plt.legend(loc='upper right')
plt.show()
结果解读示例
- 红队:失球和被射正得分接近1(即失球很少,被射正很少),抢断成功率高。红队防线极其稳固。
- 蓝队:失球得分中等,但拦截得分高,解围得分低。蓝队防线偏向于主动拦截,但在高球解围上可能存在问题。
- 黄队:抢断成功率最高(0.8标准化后接近1),但被射正次数较多。黄队后卫单防能力强,但整体防线容易被拉扯出空间。
- 绿队/紫队:整体得分低,失球多,被射正多,防线问题较大。
如何回答“哪队更稳固”?
不能只看一个指标。 利用上述 Python 案例:
- 看总分:总分最高的球队(如红队)在“失球、被射正、抢断”综合表现最好,数据上最稳固。
- 看极端值:如果黄队总分第二,但“抢断成功率”独一档,说明其防守核心球员极强,但体系有漏洞。
- 看雷达图:如果蓝队的雷达图非常“圆”且靠近外圈,说明它没有明显短板,这是最理想的“稳固”状态。
最终结论公式:
基于对【场均失球、被射正、抢断成功率、拦截、解围】的综合评分,红队以最高总分(X分)被评为本案例中防线最稳固可靠的球队,主要优势在于极低的失球数和被射正频率。
你可以把实际比赛数据(从数据网站如 Understat、FBref 爬取或手动输入)代入这个框架,就能得到科学、量化的防守排名。