python案例统计门前抢点射门次数对比?

wen python案例 3

统计门前抢点射门次数对比

下面用 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. 模拟射门数据 ==========
np.random.seed(42)
# 模拟球员A和球员B的射门记录
data = {
    '球员': ['球员A']*60 + ['球员B']*60,
    '射门类型': (
        # 球员A:抢点射门占比高
        list(np.random.choice(['门前抢点', '远射', '头球', '单刀'], 60,
                              p=[0.5, 0.2, 0.2, 0.1])) +
        # 球员B:抢点射门占比低
        list(np.random.choice(['门前抢点', '远射', '头球', '单刀'], 60,
                              p=[0.3, 0.35, 0.25, 0.1]))
    ),
    '是否进球': (
        list(np.random.choice([1, 0], 60, p=[0.35, 0.65])) +
        list(np.random.choice([1, 0], 60, p=[0.25, 0.75]))
    )
}
df = pd.DataFrame(data)
# ========== 2. 统计门前抢点射门次数 ==========
# 筛选门前抢点射门
qiangdian = df[df['射门类型'] == '门前抢点']
# 按球员统计抢点次数
count_by_player = qiangdian.groupby('球员').size().reset_index(name='抢点射门次数')
# 统计总射门次数、抢点进球数
total_shots = df.groupby('球员').size().reset_index(name='总射门次数')
goals = qiangdian.groupby('球员')['是否进球'].sum().reset_index(name='抢点进球数')
# 合并统计结果
summary = count_by_player.merge(total_shots, on='球员') \
                        .merge(goals, on='球员')
summary['抢点占比'] = (summary['抢点射门次数'] / summary['总射门次数'] * 100).round(1)
summary['抢点转化率'] = (summary['抢点进球数'] / summary['抢点射门次数'] * 100).round(1)
print("========== 门前抢点射门统计对比 ==========")
print(summary.to_string(index=False))
# ========== 3. 可视化对比 ==========
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
players = summary['球员']
colors = ['#4C72B0', '#DD8452']
# 图1:抢点射门次数
axes[0].bar(players, summary['抢点射门次数'], color=colors)
axes[0].set_title('门前抢点射门次数对比')
axes[0].set_ylabel('次数')
for i, v in enumerate(summary['抢点射门次数']):
    axes[0].text(i, v + 0.5, str(v), ha='center', fontweight='bold')
# 图2:抢点射门占比
axes[1].bar(players, summary['抢点占比'], color=colors)
axes[1].set_title('抢点射门占比(%)')
axes[1].set_ylabel('占比 (%)')
for i, v in enumerate(summary['抢点占比']):
    axes[1].text(i, v + 0.5, f'{v}%', ha='center', fontweight='bold')
# 图3:抢点转化率
axes[2].bar(players, summary['抢点转化率'], color=colors)
axes[2].set_title('抢点射门转化率(%)')
axes[2].set_ylabel('转化率 (%)')
for i, v in enumerate(summary['抢点转化率']):
    axes[2].text(i, v + 0.5, f'{v}%', ha='center', fontweight='bold')
plt.tight_layout()
plt.savefig('抢点射门对比.png', dpi=100)
plt.show()
# ========== 4. 全部射门类型分布对比 ==========
type_dist = df.groupby(['球员', '射门类型']).size().unstack(fill_value=0)
print("\n========== 射门类型分布 ==========")
print(type_dist)
type_dist.plot(kind='bar', figsize=(10, 5), colormap='Set2')'两名球员射门类型分布对比')
plt.ylabel('次数')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

输出示例

========== 门前抢点射门统计对比 ==========
  球员  抢点射门次数  总射门次数  抢点进球数  抢点占比  抢点转化率
球员A        32        60        12    53.3      37.5
球员B        18        60         4    30.0      22.2

代码说明

步骤 功能 关键代码
数据生成 模拟真实场景 np.random.choice 按概率生成射门类型
数据筛选 提取抢点射门 df[df['射门类型']=='门前抢点']
分组统计 按球员聚合 groupby('球员').size() / .sum()
指标计算 占比与转化率 抢点次数/总次数、进球数/抢点次数
可视化 三图对比 + 类型分布 matplotlib 柱状图

关键指标解读

  • 抢点次数:反映球员前插意识和跑位能力
  • 抢点占比:说明该球员在进攻中更依赖门前抢点
  • 抢点转化率:衡量抢点射门的把握机会能力

💡 提示:实际应用中可将 df 替换为真实比赛数据表(如 StatsBomb、Opta 数据),只需保证有「球员、射门类型、是否进球」三列即可复用此代码。

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