本文目录导读:

我来为您创建一个足球门前抢点射门次数对比的统计案例,这个案例将模拟分析两位前锋的抢点射门数据。
数据准备和可视化分析
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}")
运行结果示例
运行上述代码会生成:
- 详细的表格統計(总射门、射正率、进球率等)
- 折线图展示每轮射门次数变化
- 箱线图对比射门质量分布
- 累计射门和进球的趋势图
- 射门位置热力图可视化
- 综合统计分析报告
这个案例涵盖了足球比赛中抢点射门统计的主要分析维度,可以用来评估球员的抢点能力和射门效率,您可以根据实际数据替换模拟数据,得到真实的分析结果。