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

wen python案例 2

本文目录导读:

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

  1. 数据准备和可视化分析
  2. 总射门次数对比
  3. 射门质量对比
  4. 累计射门和进球对比
  5. 射门位置分布热力图
  6. 综合统计报告
  7. 运行结果示例

我来为您创建一个足球门前抢点射门次数对比的统计案例,这个案例将模拟分析两位前锋的抢点射门数据。

数据准备和可视化分析

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号
# 生成模拟数据
np.random.seed(42)
# 创建两名球员的数据
players = ['梅西', 'C罗']
matches = [f'第{i}轮' for i in range(1, 21)]  # 20轮联赛
data = []
for player in players:
    for match in matches:
        # 生成抢点射门数据(包含射正、射偏、被封堵等)
        total_shots = np.random.randint(3, 15)  # 总抢点射门次数
        shots_on_target = int(total_shots * np.random.uniform(0.4, 0.7))  # 射正
        shots_off_target = int((total_shots - shots_on_target) * np.random.uniform(0.3, 0.6))  # 射偏
        shots_blocked = total_shots - shots_on_target - shots_off_target  # 被封堵
        goals = int(shots_on_target * np.random.uniform(0.2, 0.6))  # 进球数
        data.append({
            '球员': player,
            '比赛': match,
            '总射门': total_shots,
            '射正': shots_on_target,
            '射偏': shots_off_target,
            '被封堵': shots_blocked,
            '进球数': goals
        })
df = pd.DataFrame(data)
print("=== 模拟数据预览 ===")
print(df.head(10))
print(f"\n数据维度: {df.shape}")
print(f"数据描述: \n{df.describe()}")

总射门次数对比

# 总射门次数统计
total_shots_by_player = df.groupby('球员')['总射门'].agg(['sum', 'mean', 'std']).round(2)
print("=== 抢点射门总次数对比 ===")
print(total_shots_by_player)
# 折线图展示每轮射门次数变化
fig, ax = plt.subplots(figsize=(12, 6))
for player in players:
    player_data = df[df['球员'] == player]
    ax.plot(player_data['比赛'], player_data['总射门'], 
            marker='o', label=player, linewidth=2)
ax.set_xlabel('比赛轮次', fontsize=12)
ax.set_ylabel('抢点射门次数', fontsize=12)
ax.set_title('每轮比赛抢点射门次数对比', fontsize=14, fontweight='bold')
ax.legend()
ax.grid(True, alpha=0.3)
# 添加平均线
for player in players:
    avg = df[df['球员'] == player]['总射门'].mean()
    ax.axhline(y=avg, linestyle='--', alpha=0.5, 
               label=f'{player}平均: {avg:.2f}')
ax.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

射门质量对比

# 射正率计算
df['射正率'] = df['射正'] / df['总射门'] * 100
df['进球率'] = df['进球数'] / df['总射门'] * 100
# 对比射门质量
quality_stats = df.groupby('球员').agg({
    '射正率': 'mean',
    '进球率': 'mean',
    '进球数': 'sum'
}).round(2)
print("=== 射门质量对比 ===")
print(quality_stats)
# 箱线图展示射正率分布
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 射正率箱线图
sns.boxplot(data=df, x='球员', y='射正率', ax=axes[0])
axes[0].set_title('射正率分布对比', fontsize=12, fontweight='bold')
axes[0].set_ylabel('射正率 (%)')
# 进球率箱线图
sns.boxplot(data=df, x='球员', y='进球率', ax=axes[1])
axes[1].set_title('进球率分布对比', fontsize=12, fontweight='bold')
axes[1].set_ylabel('进球率 (%)')
plt.tight_layout()
plt.show()

累计射门和进球对比

# 计算累计数据
df_sorted = df.sort_values(['球员', '比赛']).reset_index(drop=True)
df_sorted['累计射门'] = df_sorted.groupby('球员')['总射门'].cumsum()
df_sorted['累计进球'] = df_sorted.groupby('球员')['进球数'].cumsum()
# 绘制累计对比图
fig, axes = plt.subplots(2, 1, figsize=(14, 10))
# 累计射门
for player in players:
    player_data = df_sorted[df_sorted['球员'] == player]
    axes[0].plot(player_data['比赛'], player_data['累计射门'], 
                marker='s', label=player, linewidth=2)
axes[0].set_title('累计抢点射门次数对比', fontsize=14, fontweight='bold')
axes[0].set_ylabel('累计射门次数')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# 累计进球
for player in players:
    player_data = df_sorted[df_sorted['球员'] == player]
    axes[1].plot(player_data['比赛'], player_data['累计进球'], 
                marker='^', label=player, linewidth=2)
axes[1].set_title('累计进球数对比', fontsize=14, fontweight='bold')
axes[1].set_xlabel('比赛轮次')
axes[1].set_ylabel('累计进球数')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

射门位置分布热力图

# 模拟射门位置数据(假设使用场地的相对位置)
from collections import Counter
def generate_shot_locations(player, n_shots):
    """生成模拟的射门位置"""
    locations = []
    # 根据球员特点生成不同区域的射门位置
    if player == '梅西':
        # 梅西更多在禁区弧顶附近
        for _ in range(n_shots):
            x = np.random.uniform(0.3, 0.7)
            y = np.random.normal(0.15, 0.1)
            locations.append((x, max(0.05, min(0.25, y))))
    else:
        # C罗更多在禁区内抢点
        for _ in range(n_shots):
            x = np.random.uniform(0.4, 0.8)
            y = np.random.normal(0.12, 0.08)
            locations.append((x, max(0.05, min(0.2, y))))
    return locations
# 生成两名球员的射门位置
all_locations = {}
for player in players:
    player_shots = df[df['球员'] == player]['总射门'].sum()
    all_locations[player] = generate_shot_locations(player, player_shots)
# 绘制射门位置热力图
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
for i, player in enumerate(players):
    locations = np.array(all_locations[player])
    # 创建热力图
    heatmap, xedges, yedges = np.histogram2d(locations[:, 0], locations[:, 1], 
                                             bins=20, range=[[0, 1], [0, 0.4]])
    im = axes[i].imshow(heatmap.T, origin='lower', 
                        extent=[0, 1, 0, 0.4],
                        aspect='auto', cmap='OrRd')
    # 添加球场标记
    axes[i].axhline(y=0.25, color='blue', linestyle='--', alpha=0.5)  # 禁区线
    axes[i].axhline(y=0.35, color='blue', linestyle='--', alpha=0.5)  # 球门线
    axes[i].plot(0.5, 0.15, 'go', markersize=10)  # 球门位置
    axes[i].set_title(f'{player} 射门位置分布', fontsize=12, fontweight='bold')
    axes[i].set_xlabel('横向位置')
    axes[i].set_ylabel('纵向位置')
    plt.colorbar(im, ax=axes[i], label='射门次数')
plt.tight_layout()
plt.show()

综合统计报告

# 生成综合统计报告
print("=" * 50)
print("          抢点射门综合统计报告")
print("=" * 50)
for player in players:
    player_df = df[df['球员'] == player]
    print(f"\n--- {player} 统计 ---")
    print(f"总射门次数: {player_df['总射门'].sum()} 次")
    print(f"场均射门: {player_df['总射门'].mean():.2f} 次/场")
    print(f"总射正: {player_df['射正'].sum()} 次")
    print(f"总进球: {player_df['进球数'].sum()} 个")
    print(f"射正率: {player_df['射正'].sum()/player_df['总射门'].sum()*100:.1f}%")
    print(f"进球率: {player_df['进球数'].sum()/player_df['总射门'].sum()*100:.1f}%")
    print(f"(每进一球所需射门: {player_df['总射门'].sum()/player_df['进球数'].sum():.1f} 次)")
    # 最佳场次
    best_match = player_df.loc[player_df['进球数'].idxmax()]
    print(f"最佳场次: {best_match['比赛']} (进 {best_match['进球数']} 球)")
# 最终对比总结
print("\n" + "=" * 50)
print("          最终对比分析")
print("=" * 50)
# 计算差值
messi_stats = df[df['球员'] == '梅西']['总射门'].sum()
ronaldo_stats = df[df['球员'] == 'C罗']['总射门'].sum()
if messi_stats > ronaldo_stats:
    diff = messi_stats - ronaldo_stats
    print(f"梅西总抢点射门次数更多,多 {diff} 次")
else:
    diff = ronaldo_stats - messi_stats
    print(f"C罗总抢点射门次数更多,多 {diff} 次")
# 进球效率比较
messi_goals = df[df['球员'] == '梅西']['进球数'].sum()
ronaldo_goals = df[df['球员'] == 'C罗']['进球数'].sum()
if messi_goals/20 > ronaldo_goals/20:
    print(f"梅西场均进球更高:{messi_goals/20:.2f} vs {ronaldo_goals/20:.2f}")
else:
    print(f"C罗场均进球更高:{ronaldo_goals/20:.2f} vs {messi_goals/20:.2f}")

运行结果示例

运行上述代码会生成:

  1. 详细的表格統計(总射门、射正率、进球率等)
  2. 折线图展示每轮射门次数变化
  3. 箱线图对比射门质量分布
  4. 累计射门和进球的趋势图
  5. 射门位置热力图可视化
  6. 综合统计分析报告

这个案例涵盖了足球比赛中抢点射门统计的主要分析维度,可以用来评估球员的抢点能力和射门效率,您可以根据实际数据替换模拟数据,得到真实的分析结果。

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