综合Python案例,哪队的防线更稳固可靠?

wen python案例 2

本文目录导读:

综合Python案例,哪队的防线更稳固可靠?

  1. 定义“稳固防线”的核心指标
  2. 模拟数据(假设有5支球队)
  3. 数据标准化(关键步骤)
  4. 综合评分(加权求和)
  5. 可视化:雷达图(最直观比较防线弱点)
  6. 结果解读示例
  7. 总结:如何回答“哪队更稳固”?

这是一个非常有趣且实战性很强的数据分析问题,要判断“哪队的防线更稳固可靠”,不能只看“失球数”这一个指标(比如某队失球少可能是因为中场控球强,而不是后卫强)。

我们可以构建一个综合的 Python 数据分析案例,通过计算多个维度的防守指标,并利用加权评分法雷达图来给球队防线打分。

以下是一个完整的 Python 分析思路和代码示例,假设你有球队的比赛数据(如英超、欧冠等)。

定义“稳固防线”的核心指标

我们选取5个关键指标,量化每支球队的防守表现:

  1. 场均失球数 (Goals Conceded per Game):越低越好,最直观。
  2. 被射正次数 (Shots on Target Against per Game):防线是否容易被打穿。
  3. 抢断成功率 (Tackle Success Rate):防守球员一对一的能力。
  4. 拦截次数 (Interceptions per Game):预判传球路线、阻断进攻的能力。
  5. 解围次数 (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/xmax - 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 案例:

  1. 看总分:总分最高的球队(如红队)在“失球、被射正、抢断”综合表现最好,数据上最稳固
  2. 看极端值:如果黄队总分第二,但“抢断成功率”独一档,说明其防守核心球员极强,但体系有漏洞。
  3. 看雷达图:如果蓝队的雷达图非常“圆”且靠近外圈,说明它没有明显短板,这是最理想的“稳固”状态。

最终结论公式:

基于对【场均失球、被射正、抢断成功率、拦截、解围】的综合评分,红队以最高总分(X分)被评为本案例中防线最稳固可靠的球队,主要优势在于极低的失球数和被射正频率。

你可以把实际比赛数据(从数据网站如 Understat、FBref 爬取或手动输入)代入这个框架,就能得到科学、量化的防守排名。

抱歉,评论功能暂时关闭!