本文目录导读:

我来为您设计一个统计门球短传配合成功率的Python案例,这个案例会包含数据模拟、统计分析、可视化和报告输出。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
import random
from collections import defaultdict
class 门球短传配合分析系统:
def __init__(self):
"""初始化分析系统"""
self.data = None
self.success_rate = 0
def generate_match_data(self, num_passes=100):
"""
生成模拟的门球比赛传球数据
"""
print("正在生成模拟数据...")
# 可能的传球区域
areas = ['前场左路', '前场中路', '前场右路',
'中场左路', '中场中路', '中场右路',
'后场左路', '后场中路', '后场右路']
# 球员编号
players = [f'球员{i:02d}' for i in range(1, 11)]
# 生成传球数据
passes_data = []
for i in range(num_passes):
# 随机生成传球记录
pass_record = {
'传球编号': i + 1,
'传球时间': f'{random.randint(0, 2):02d}:{random.randint(0, 59):02d}:{random.randint(0, 59):02d}',
'传球球员': random.choice(players),
'接球球员': random.choice(players),
'传球区域': random.choice(areas),
'传球距离': round(random.uniform(5, 25), 1), # 5-25米的短传
'接球区域': random.choice(areas),
'是否成功': random.choice([0, 1]), # 0=失败,1=成功
'比赛节次': random.randint(1, 4), # 四节比赛
'进攻方向': random.choice(['左路进攻', '中路进攻', '右路进攻'])
}
# 确保传球球员和接球球员不同
while pass_record['传球球员'] == pass_record['接球球员']:
pass_record['接球球员'] = random.choice(players)
# 根据距离调整成功率(距离越近成功率越高)
if pass_record['传球距离'] < 8:
success_rate = 0.7
elif pass_record['传球距离'] < 15:
success_rate = 0.55
else:
success_rate = 0.4
pass_record['是否成功'] = np.random.choice([1, 0], p=[success_rate, 1-success_rate])
passes_data.append(pass_record)
self.data = pd.DataFrame(passes_data)
return self.data
def calculate_success_rate(self):
"""
计算总体成功率
"""
total_passes = len(self.data)
successful_passes = self.data['是否成功'].sum()
self.success_rate = (successful_passes / total_passes) * 100
print(f"总传球数: {total_passes}")
print(f"成功传球数: {successful_passes}")
print(f"总体成功率: {self.success_rate:.2f}%")
return self.success_rate
def analyze_by_area(self):
"""
按区域分析传球成功率
"""
print("\n=== 按区域分析传球成功率 ===")
area_analysis = self.data.groupby('传球区域').agg({
'是否成功': ['count', 'sum', 'mean']
}).round(3)
area_analysis.columns = ['传球总数', '成功次数', '成功率']
area_analysis['成功率百分比'] = area_analysis['成功率'] * 100
print(area_analysis.to_string())
return area_analysis
def analyze_by_player(self):
"""
按球员分析传球成功率
"""
print("\n=== 按球员分析传球成功率 ===")
player_analysis = self.data.groupby('传球球员').agg({
'是否成功': ['count', 'sum', 'mean']
}).round(3)
player_analysis.columns = ['传球总数', '成功次数', '成功率']
player_analysis['成功率百分比'] = player_analysis['成功率'] * 100
player_analysis = player_analysis.sort_values('成功率百分比', ascending=False)
print(player_analysis.to_string())
return player_analysis
def analyze_by_distance(self):
"""
按距离段分析传球成功率
"""
print("\n=== 按距离段分析传球成功率 ===")
# 划分距离段
bins = [0, 7, 10, 13, 16, 20, 25]
labels = ['5-7m', '7-10m', '10-13m', '13-16m', '16-20m', '20m以上']
self.data['距离段'] = pd.cut(self.data['传球距离'], bins=bins, labels=labels, right=False)
distance_analysis = self.data.groupby('距离段').agg({
'是否成功': ['count', 'sum', 'mean']
}).round(3)
distance_analysis.columns = ['传球总数', '成功次数', '成功率']
distance_analysis['成功率百分比'] = distance_analysis['成功率'] * 100
print(distance_analysis.to_string())
return distance_analysis
def visualize_results(self):
"""
可视化分析结果
"""
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
fig.suptitle('门球短传配合分析报告', fontsize=16, fontweight='bold')
# 1. 各区域传球成功率
area_analysis = self.analyze_by_area()
ax1 = axes[0, 0]
area_analysis['成功率百分比'].plot(kind='bar', ax=ax1, color='skyblue')
ax1.set_title('各区域传球成功率')
ax1.set_xlabel('传球区域')
ax1.set_ylabel('成功率 (%)')
ax1.set_ylim(0, 100)
for i, v in enumerate(area_analysis['成功率百分比']):
ax1.text(i, v + 3, f'{v:.1f}%', ha='center', fontsize=9)
# 2. 球员传球成功率
player_analysis = self.analyze_by_player()
ax2 = axes[0, 1]
player_analysis['成功率百分比'].plot(kind='bar', ax=ax2, color='lightcoral')
ax2.set_title('球员传球成功率')
ax2.set_xlabel('球员')
ax2.set_ylabel('成功率 (%)')
ax2.set_ylim(0, 100)
for i, v in enumerate(player_analysis['成功率百分比']):
ax2.text(i, v + 2, f'{v:.1f}%', ha='center', fontsize=9, rotation=45)
# 3. 距离与成功率关系
distance_analysis = self.analyze_by_distance()
ax3 = axes[1, 0]
ax3.plot(distance_analysis.index, distance_analysis['成功率百分比'],
marker='o', linewidth=2, color='green')
ax3.set_title('传球距离与成功率关系')
ax3.set_xlabel('传球距离')
ax3.set_ylabel('成功率 (%)')
ax3.set_ylim(0, 100)
ax3.grid(True)
# 4. 成功/失败饼图
ax4 = axes[1, 1]
success_count = self.data['是否成功'].sum()
fail_count = len(self.data) - success_count
ax4.pie([success_count, fail_count],
labels=['成功', '失败'],
autopct='%1.1f%%',
colors=['lightgreen', 'lightcoral'],
explode=(0.05, 0))
ax4.set_title('成功/失败比例')
plt.tight_layout()
plt.show()
def generate_report(self):
"""
生成详细的文字报告
"""
print("\n" + "="*60)
print("门球短传配合分析报告")
print("="*60)
# 总体统计
print(f"\n【总体概况】")
print(f"总传球次数: {len(self.data)}")
print(f"平均传球距离: {self.data['传球距离'].mean():.2f}米")
print(f"最大传球距离: {self.data['传球距离'].max()}米")
print(f"最小传球距离: {self.data['传球距离'].min()}米")
# 各节比赛成功率
print(f"\n【各节比赛分析】")
for section in range(1, 5):
section_data = self.data[self.data['比赛节次'] == section]
if len(section_data) > 0:
success_rate = section_data['是否成功'].mean() * 100
print(f"第{section}节: 传球{len(section_data)}次, 成功率{success_rate:.1f}%")
# 进攻方向分析
print(f"\n【进攻方向分析】")
direction_analysis = self.data.groupby('进攻方向').agg({
'是否成功': ['count', 'mean']
}).round(3)
direction_analysis.columns = ['传球总数', '成功率']
direction_analysis['成功率百分比'] = direction_analysis['成功率'] * 100
print(direction_analysis.to_string())
# 找出表现最好的球员
player_analysis = self.analyze_by_player()
top_players = player_analysis[player_analysis['传球总数'] >= 5].head(3)
print(f"\n【最佳传球手】")
for player in top_players.index:
row = top_players.loc[player]
print(f"{player}: {row['成功率百分比']:.1f}%成功率 ({int(row['成功次数'])}次成功/{int(row['传球总数'])}次传球)")
def export_data(self, filename='门球传球数据.csv'):
"""
导出数据到CSV文件
"""
self.data.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"数据已导出到 {filename}")
def run_full_analysis(self, num_passes=100):
"""
运行完整分析流程
"""
# 生成数据
self.generate_match_data(num_passes)
# 计算总体成功率
print("\n" + "="*60)
print("基本统计")
print("="*60)
self.calculate_success_rate()
# 详细分析
area_analysis = self.analyze_by_area()
player_analysis = self.analyze_by_player()
distance_analysis = self.analyze_by_distance()
# 可视化
self.visualize_results()
# 生成报告
self.generate_report()
# 导出数据
self.export_data()
return self.data
# 使用示例
if __name__ == "__main__":
# 创建分析系统实例
analyzer = 门球短传配合分析系统()
# 运行完整分析
data = analyzer.run_full_analysis(num_passes=200)
# 可以直接查看数据
print("\n" + "="*60)
print("数据预览(前10行)")
print("="*60)
print(data.head(10).to_string())
这个案例提供了以下功能:
主要功能
-
数据模拟:自动生成模拟的门球传球数据
-
成功率统计:计算总体成功率和各维度成功率
-
多维度分析:
- 按区域分析(前场、中场、后场)
- 按球员分析
- 按传球距离分析
- 按比赛节次分析
- 按进攻方向分析
-
可视化:生成直观的图表展示分析结果
-
报告生成:输出详细的分析报告
-
数据导出:支持CSV格式导出
分析维度
- 传球区域成功率
- 球员个人成功率
- 距离与成功率关系
- 不同比赛节次的成功率变化
- 进攻方向的成功率
使用说明
运行程序后会自动:
- 生成200次模拟传球数据
- 计算总体成功率
- 分析各维度数据
- 显示可视化图表
- 生成详细报告
您可以根据实际需求调整传球数据数量和分析参数,这个框架可以直接用于实际的比赛数据统计分析。