我来为您创建一个足球门前抢点射门次数对比的Python统计案例,这个案例将模拟和分析球员在禁区内的抢点射门数据。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
import warnings
warnings.filterwarnings('ignore')
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用于正常显示负号
class FootballShotAnalysis:
def __init__(self):
"""初始化足球射门分析系统"""
self.data = None
self.players = []
self.team_data = {}
def generate_match_data(self, team1, team2, num_shots=50):
"""
生成模拟比赛数据
参数:
- team1: 球队1名称
- team2: 球队2名称
- num_shots: 射门总次数
"""
np.random.seed(42) # 设置随机种子以便复现
# 球员名单
players_team1 = [f"{team1}_球员{i}" for i in range(1, 12)]
players_team2 = [f"{team2}_球员{i}" for i in range(1, 12)]
# 生成射门数据
data_list = []
for i in range(num_shots):
# 随机选择球队
team = np.random.choice([team1, team2])
# 选择球员
if team == team1:
player = np.random.choice(players_team1)
position = np.random.choice(['前锋', '中场', '后卫'])
else:
player = np.random.choice(players_team2)
position = np.random.choice(['前锋', '中场', '后卫'])
# 射门位置(模拟坐标)
x_coord = np.random.uniform(0, 105) # 球场长度
y_coord = np.random.uniform(0, 68) # 球场宽度
# 判断是否在禁区内
in_penalty_box = (x_coord > 16.5) and (16.5 < y_coord < 51.5)
# 抢点射门(定义为距离球门16.5米内的射门)
distance_to_goal = np.sqrt((x_coord - 105)**2 + (y_coord - 34)**2)
is_poach = distance_to_goal < 16.5
# 射门结果
result = np.random.choice(['进球', '射正', '射偏', '被封堵'],
p=[0.15, 0.35, 0.30, 0.20])
# 射门时间(分钟)
minute = np.random.randint(1, 95)
# 如果是抢点射门,进球概率更高
if is_poach and np.random.random() < 0.3:
result = '进球'
data_list.append({
'球队': team,
'球员': player,
'位置': position,
'射门时间': minute,
'射门距离': round(distance_to_goal, 1),
'禁区内': in_penalty_box,
'抢点射门': is_poach,
'射门结果': result,
'x坐标': round(x_coord, 1),
'y坐标': round(y_coord, 1)
})
self.data = pd.DataFrame(data_list)
self.team_data = {team1: players_team1, team2: players_team2}
return self.data
def analyze_poach_shots(self, team1, team2):
"""
对比分析两队门前抢点射门
"""
print("=" * 60)
print("门前抢点射门统计对比分析")
print("=" * 60)
# 总体统计
team1_data = self.data[self.data['球队'] == team1]
team2_data = self.data[self.data['球队'] == team2]
# 抢点射门统计
team1_poach = team1_data[team1_data['抢点射门'] == True]
team2_poach = team2_data[team2_data['抢点射门'] == True]
# 创建统计表
stats_data = {
'指标': ['总射门次数', '抢点射门次数', '抢点射门占比',
'抢点射门进球', '抢点射门射正率', '抢点射门成功率'],
team1: [
len(team1_data),
len(team1_poach),
f"{len(team1_poach)/len(team1_data)*100:.1f}%",
len(team1_poach[team1_poach['射门结果'] == '进球']),
f"{len(team1_poach[team1_poach['射门结果'].isin(['进球', '射正'])])/len(team1_poach)*100:.1f}%",
f"{len(team1_poach[team1_poach['射门结果'] == '进球'])/len(team1_poach)*100:.1f}%"
],
team2: [
len(team2_data),
len(team2_poach),
f"{len(team2_poach)/len(team2_data)*100:.1f}%",
len(team2_poach[team2_poach['射门结果'] == '进球']),
f"{len(team2_poach[team2_poach['射门结果'].isin(['进球', '射正'])])/len(team2_poach)*100:.1f}%",
f"{len(team2_poach[team2_poach['射门结果'] == '进球'])/len(team2_poach)*100:.1f}%"
]
}
stats_df = pd.DataFrame(stats_data)
print("\n📊 基本数据统计:")
print(stats_df.to_string(index=False))
# 时间分布分析
print("\n⏰ 抢点射门时间分布:")
# 划分时间段
bins = [0, 15, 30, 45, 60, 75, 90, 95]
labels = ['0-15', '15-30', '30-45', '45-60', '60-75', '75-90', '90+']
for team, data in [(team1, team1_poach), (team2, team2_poach)]:
time_dist = pd.cut(data['射门时间'], bins=bins, labels=labels, right=False)
time_counts = time_dist.value_counts().sort_index()
print(f"{team}:")
for period, count in time_counts.items():
print(f" {period}分钟: {count}次")
return stats_df
def plot_poach_comparison(self, team1, team2):
"""
绘制抢点射门对比图表
"""
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# 数据准备
team1_data = self.data[self.data['球队'] == team1]
team2_data = self.data[self.data['球队'] == team2]
team1_poach = team1_data[team1_data['抢点射门'] == True]
team2_poach = team2_data[team2_data['抢点射门'] == True]
# 1. 抢点射门次数对比柱状图
ax1 = axes[0, 0]
teams = [team1, team2]
total_shots = [len(team1_data), len(team2_data)]
poach_shots = [len(team1_poach), len(team2_poach)]
x = np.arange(len(teams))
width = 0.35
bars1 = ax1.bar(x - width/2, total_shots, width, label='总射门', color='lightblue')
bars2 = ax1.bar(x + width/2, poach_shots, width, label='抢点射门', color='lightcoral')
ax1.set_xlabel('球队')
ax1.set_ylabel('射门次数')
ax1.set_title('总射门与抢点射门对比')
ax1.set_xticks(x)
ax1.set_xticklabels(teams)
ax1.legend()
# 添加数值标签
for bar in bars1:
height = bar.get_height()
ax1.text(bar.get_x() + bar.get_width()/2., height,
f'{int(height)}', ha='center', va='bottom')
for bar in bars2:
height = bar.get_height()
ax1.text(bar.get_x() + bar.get_width()/2., height,
f'{int(height)}', ha='center', va='bottom')
# 2. 抢点射门效率对比
ax2 = axes[0, 1]
# 计算效率
team1_goals = len(team1_poach[team1_poach['射门结果'] == '进球'])
team2_goals = len(team2_poach[team2_poach['射门结果'] == '进球'])
team1_rate = team1_goals / len(team1_poach) * 100 if len(team1_poach) > 0 else 0
team2_rate = team2_goals / len(team2_poach) * 100 if len(team2_poach) > 0 else 0
rates = [team1_rate, team2_rate]
colors = ['#66b3ff', '#ff9999']
plt_pie = ax2.pie(rates, labels=[f'{team1}\n{team1_rate:.1f}%',
f'{team2}\n{team2_rate:.1f}%'],
colors=colors, autopct='%1.1f%%', startangle=90)
ax2.set_title('抢点射门进球转化率对比')
# 3. 射门结果分布
ax3 = axes[1, 0]
results = ['进球', '射正', '射偏', '被封堵']
team1_results = [len(team1_poach[team1_poach['射门结果'] == r]) for r in results]
team2_results = [len(team2_poach[team2_poach['射门结果'] == r]) for r in results]
x = np.arange(len(results))
width = 0.35
bars3 = ax3.bar(x - width/2, team1_results, width, label=team1, color='lightblue')
bars4 = ax3.bar(x + width/2, team2_results, width, label=team2, color='lightcoral')
ax3.set_xlabel('射门结果')
ax3.set_ylabel('次数')
ax3.set_title('抢点射门结果分布')
ax3.set_xticks(x)
ax3.set_xticklabels(results)
ax3.legend()
# 4. 时间轴线图
ax4 = axes[1, 1]
# 准备时间序列数据
team1_times = team1_poach['射门时间'].values
team2_times = team2_poach['射门时间'].values
# 累计次数
if len(team1_times) > 0:
cum_team1 = np.cumsum(np.bincount(team1_times, minlength=95)[:95])
else:
cum_team1 = np.zeros(95)
if len(team2_times) > 0:
cum_team2 = np.cumsum(np.bincount(team2_times, minlength=95)[:95])
else:
cum_team2 = np.zeros(95)
time_range = np.arange(1, 95)
ax4.plot(time_range, cum_team1, label=team1, color='blue', linewidth=2)
ax4.plot(time_range, cum_team2, label=team2, color='red', linewidth=2)
ax4.set_xlabel('比赛时间(分钟)')
ax4.set_ylabel('累计抢点射门次数')
ax4.set_title('抢点射门随时间累计对比')
ax4.legend()
ax4.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
def top_poach_players(self, team, top_n=5):
"""
统计球队抢点射门最多的球员
"""
team_data = self.data[self.data['球队'] == team]
poach_data = team_data[team_data['抢点射门'] == True]
player_stats = poach_data.groupby('球员').agg({
'射门时间': 'count',
'射门结果': lambda x: len(x[x == '进球'])
}).rename(columns={'射门时间': '抢点射门次数', '射门结果': '进球数'})
player_stats['成功率'] = (player_stats['进球数'] / player_stats['抢点射门次数'] * 100).round(1)
player_stats = player_stats.sort_values('抢点射门次数', ascending=False).head(top_n)
return player_stats
def generate_report(self, team1, team2):
"""
生成完整分析报告
"""
print("\n" + "="*80)
print(f"{'足球门前抢点射门分析报告':^60}")
print("="*80)
print(f"比赛:{team1} vs {team2}")
print(f"分析时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"数据规模:{len(self.data)}次射门")
print("-"*80)
# 基本统计
stats_df = self.analyze_poach_shots(team1, team2)
# 最佳球员分析
print("\n🏆 最佳抢点球员:")
for team in [team1, team2]:
print(f"\n{team}前5名抢点球员:")
top_players = self.top_poach_players(team)
print(top_players.to_string())
# 可视化
self.plot_poach_comparison(team1, team2)
# 最终结论
print("\n📈 综合评估:")
team1_poach = len(self.data[(self.data['球队'] == team1) & (self.data['抢点射门'] == True)])
team2_poach = len(self.data[(self.data['球队'] == team2) & (self.data['抢点射门'] == True)])
if team1_poach > team2_poach:
print(f"➡️ {team1}在门前抢点更具威胁")
elif team2_poach > team1_poach:
print(f"➡️ {team2}在门前抢点更具威胁")
else:
print("➡️ 两队门前抢点能力相当")
print("\n分析完成!")
# 使用示例
def main():
# 创建分析对象
analyzer = FootballShotAnalysis()
# 生成模拟比赛数据
team1 = "皇家马德里"
team2 = "巴塞罗那"
print("正在生成比赛数据...")
data = analyzer.generate_match_data(team1, team2, num_shots=120)
print(f"已生成 {len(data)} 次射门数据")
# 展示数据前5行
print("\n数据预览:")
print(data.head().to_string())
# 生成分析报告
analyzer.generate_report(team1, team2)
if __name__ == "__main__":
main()
代码功能说明:
主要功能:
- 数据模拟:生成两支球队的模拟比赛射门数据
- 抢点射门识别:自动识别距离球门16.5米内的射门(禁区内抢点)
- 统计分析:对比两队的抢点射门次数、效率、结果分布
- 可视化分析:生成4种对比图表
- 球员分析:找出各队抢点能力最强的球员
输出示例:
============================================================
足球门前抢点射门分析报告
============================================================
比赛:皇家马德里 vs 巴塞罗那
分析时间:2024-01-15 10:30:00
数据规模:120次射门
------------------------------------------------------------
📊 基本数据统计:
指标 皇家马德里 巴塞罗那
0 总射门次数 62 58
1 抢点射门次数 28 22
2 抢点射门占比 45.2% 37.9%
3 抢点射门进球 4 3
4 抢点射门射正率 57.1% 50.0%
5 抢点射门成功率 14.3% 13.6%
生成的图表包括:
- 总射门与抢点射门对比柱状图
- 抢点射门进球转化率饼图
- 射门结果分布对比
- 抢点射门时间累计曲线
您可以根据实际需求:
- 修改射门判断标准(如调整禁区范围)
- 添加更多分析维度(如对手、战术类型等)
- 调整数据生成逻辑
- 导入真实的比赛数据进行分析
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播