本文目录导读:

我来为您设计一个综合Python案例,分析边路传中成功率,这个案例将包含数据模拟、统计分析、可视化等功能。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import random
from datetime import datetime
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class 边路传中分析系统:
"""边路传中成功率综合分析系统"""
def __init__(self):
self.df = None
self.统计结果 = {}
def 生成模拟数据(self, 球队数=20, 每队比赛数=38):
"""生成模拟的边路传中数据"""
random.seed(42)
np.random.seed(42)
# 球队列表
球队列表 = [f'球队{i:02d}' for i in range(1, 球队数+1)]
# 收集所有数据
所有记录 = []
for 球队 in 球队列表:
# 每支球队的战术风格参数
风格 = random.choice(['进攻型', '均衡型', '防守型'])
for 比赛编号 in range(每队比赛数):
# 根据战术风格调整数据和成功率
if 风格 == '进攻型':
基准传中次数 = np.random.normal(25, 5)
基准成功率 = 0.30
elif 风格 == '均衡型':
基准传中次数 = np.random.normal(18, 4)
基准成功率 = 0.25
else:
基准传中次数 = np.random.normal(12, 3)
基准成功率 = 0.20
# 比赛中的各种情境
for 情境 in range(10):
边路 = random.choice(['左路', '右路'])
比赛阶段 = random.choice(['开局', '中场', '尾声'])
对手强度 = random.choice(['强队', '中游', '弱队'])
# 计算这次传中的成功概率
位置因素 = 0.10 if 边路 == '左路' else 0.08
阶段因素 = 0.01 * ['开局', '中场', '尾声'].index(比赛阶段)
对手因素 = -0.05 if 对手强度 == '强队' else (0.02 if 对手强度 == '弱队' else 0)
成功率 = max(0.05, min(0.8, 基准成功率 +
(位置因素 if random.random() < 0.5 else -位置因素) +
(阶段因素 if random.random() < 0.5 else -阶段因素) +
(对手因素 if random.random() < 0.5 else -对手因素) / 10))
# 生成传中数据
传中次数 = max(1, int(np.random.poisson(基准传中次数/10)))
成功次数 = min(传中次数, int(传中次数 * 成功率 * np.random.uniform(0.8, 1.2)))
所有记录.append({
'球队': 球队,
'战术风格': 风格,
'比赛编号': 比赛编号+1,
'边路': 边路,
'比赛阶段': 比赛阶段,
'对手强度': 对手强度,
'传中次数': 传中次数,
'成功次数': 成功次数,
'成功率': (成功次数/传中次数*100) if 传中次数 > 0 else 0
})
self.df = pd.DataFrame(所有记录)
return self.df
def 基本统计分析(self):
"""进行基本的统计分析"""
球队汇总 = self.df.groupby('球队').agg({
'传中次数': 'sum',
'成功次数': 'sum'
}).reset_index()
球队汇总['平均成功率'] = 球队汇总['成功次数'] / 球队汇总['传中次数'] * 100
# 记录统计结果
self.统计结果['总体统计'] = {
'总传中次数': self.df['传中次数'].sum(),
'总成功次数': self.df['成功次数'].sum(),
'平均成功率': self.df['成功率'].mean(),
'成功率标准差': self.df['成功率'].std()
}
print("=== 基础统计分析 ===")
print(f"总传中次数: {self.统计结果['总体统计']['总传中次数']}")
print(f"总成功次数: {self.统计结果['总体统计']['总成功次数']}")
print(f"平均成功率: {self.统计结果['总体统计']['平均成功率']:.2f}%")
print(f"成功率标准差: {self.统计结果['总体统计']['成功率标准差']:.2f}%")
return 球队汇总
def 边路成功率对比(self):
"""对比不同边路的成功率"""
边路统计 = self.df.groupby('边路').agg({
'传中次数': 'sum',
'成功次数': 'sum'
}).reset_index()
边路统计['成功率'] = 边路统计['成功次数'] / 边路统计['传中次数'] * 100
print("\n=== 边路传中成功率对比 ===")
for row in 边路统计.itertuples():
print(f"{row.边路}: {row.成功率:.2f}%")
return 边路统计
def 战术风格影响分析(self):
"""分析不同战术风格对成功率的影响"""
风格统计 = self.df.groupby('战术风格').agg({
'传中次数': 'mean',
'成功率': 'mean'
}).reset_index()
print("\n=== 战术风格影响分析 ===")
for row in 风格统计.itertuples():
print(f"{row.战术风格}: 平均传中{row.传中次数:.1f}次, 成功率{row.成功率:.2f}%")
return 风格统计
def 比赛情境分析(self):
"""分析比赛情境对成功率的影响"""
# 按边路和比赛阶段交叉分析
交叉分析 = pd.crosstab(
[self.df['边路'], self.df['比赛阶段']],
self.df['对手强度'],
values=self.df['成功率'],
aggfunc='mean'
).round(2)
print("\n=== 比赛情境交叉分析(成功率%) ===")
print(交叉分析)
return 交叉分析
def 假设检验(self):
"""统计显著性检验"""
print("\n=== 统计显著性检验 ===")
# 左右路的t检验
左路 = self.df[self.df['边路'] == '左路']['成功率']
右路 = self.df[self.df['边路'] == '右路']['成功率']
t_stat, p_value = stats.ttest_ind(左路, 右路)
print(f"左路vs右路 - T检验: t统计量={t_stat:.3f}, p值={p_value:.4f}")
print(f" {'差异显著' if p_value < 0.05 else '差异不显著'}")
# 战术风格的方法分析
f_stat, p_value_anova = stats.f_oneway(
self.df[self.df['战术风格'] == '进攻型']['成功率'],
self.df[self.df['战术风格'] == '均衡型']['成功率'],
self.df[self.df['战术风格'] == '防守型']['成功率']
)
print(f"\n战术风格 - ANOVA: F统计量={f_stat:.3f}, p值={p_value_anova:.4f}")
print(f" {'风格影响显著' if p_value_anova < 0.05 else '风格影响不显著'}")
return {'t_stat': t_stat, 'p_value_t': p_value,
'f_stat': f_stat, 'p_value_anova': p_value_anova}
def 可视化分析(self):
"""创建全面的可视化图表"""
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
fig.suptitle('边路传中成功率综合分析', fontsize=16, fontweight='bold')
# 1. 左右路成功率分布箱线图
ax1 = axes[0, 0]
data_plot1 = [self.df[self.df['边路'] == '左路']['成功率'],
self.df[self.df['边路'] == '右路']['成功率']]
bp = ax1.boxplot(data_plot1, labels=['左路', '右路'], patch_artist=True)
for patch, color in zip(bp['boxes'], ['lightcoral', 'lightblue']):
patch.set_facecolor(color)
ax1.set_title('左右路成功率分布对比')
ax1.set_ylabel('成功率 (%)')
ax1.grid(True, alpha=0.3)
# 2. 战术风格成功率比较
ax2 = axes[0, 1]
风格数据 = [self.df[self.df['战术风格'] == '进攻型']['成功率'],
self.df[self.df['战术风格'] == '均衡型']['成功率'],
self.df[self.df['战术风格'] == '防守型']['成功率']]
ax2.boxplot(风格数据, labels=['进攻型', '均衡型', '防守型'],
patch_artist=True, showmeans=True)
ax2.set_title('不同战术风格成功率对比')
ax2.set_ylabel('成功率 (%)')
ax2.grid(True, alpha=0.3)
# 3. 对手强度与成功率热力图
ax3 = axes[1, 0]
对手数据 = self.df.groupby(['对手强度', '边路'])['成功率'].mean().unstack()
sns.heatmap(对手数据, annot=True, fmt='.2f', cmap='RdYlGn',
center=25, ax=ax3, cbar_kws={'label': '成功率(%)'})
ax3.set_title('对手强度与边路成功率热力图')
# 4. 时间段成功率趋势
ax4 = axes[1, 1]
时段数据 = self.df.groupby(['比赛阶段', '边路']).agg({
'成功率': 'mean'
}).reset_index()
pivot_data = 时段数据.pivot(index='比赛阶段', columns='边路', values='成功率')
pivot_data.plot(kind='bar', ax=ax4, color=['lightcoral', 'lightblue'])
ax4.set_title('比赛阶段与边路成功率趋势')
ax4.set_xlabel('比赛阶段')
ax4.set_ylabel('成功率 (%)')
ax4.legend(title='边路')
ax4.grid(True, alpha=0.3, linestyle='--')
ax4.set_xticklabels(pivot_data.index, rotation=0)
plt.tight_layout()
plt.savefig('边路传中分析.png', dpi=300, bbox_inches='tight')
plt.show()
def 输出详细报告(self):
"""输出详细的文本报告"""
报告 = []
报告.append("=" * 60)
报告.append("边路传中成功率综合分析报告")
报告.append(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
报告.append("=" * 60)
# 总体统计
总体 = self.统计结果['总体统计']
报告.append(f"\n【总体数据】")
报告.append(f"总传中次数: {总体['总传中次数']:,}")
报告.append(f"总成功次数: {总体['总成功次数']:,}")
报告.append(f"整体成功率: {总体['平均成功率']:.2f}%")
# 边路对比
报告.append(f"\n【边路对比】")
左路数据 = self.df[self.df['边路'] == '左路']
右路数据 = self.df[self.df['边路'] == '右路']
报告.append(f"左路成功率: {左路数据['成功率'].mean():.2f}%")
报告.append(f"右路成功率: {右路数据['成功率'].mean():.2f}%")
# 风格分析
报告.append(f"\n【战术风格效率】")
for 风格 in ['进攻型', '均衡型', '防守型']:
风格数据 = self.df[self.df['战术风格'] == 风格]
报告.append(f"{风格}: {风格数据['成功率'].mean():.2f}% | "
f"平均传中次数: {风格数据['传中次数'].mean():.1f}")
# 对手强度
报告.append(f"\n【对手强度影响】")
for 对手 in ['强队', '中游', '弱队']:
对手数据 = self.df[self.df['对手强度'] == 对手]
报告.append(f"对阵{对手}: 成功率{对手数据['成功率'].mean():.2f}%")
return "\n".join(报告)
def 运行完整分析(self):
"""运行完整的数据分析流程"""
print("开始生成模拟数据...")
self.生成模拟数据()
print("执行基础统计分析...")
self.基本统计分析()
print("执行边路对比分析...")
self.边路成功率对比()
print("执行战术风格分析...")
self.战术风格影响分析()
print("执行比赛情境分析...")
self.比赛情境分析()
print("执行假设检验...")
self.假设检验()
print("生成可视化图表...")
self.可视化分析()
print("\n生成详细报告...")
报告 = self.输出详细报告()
print(报告)
# 保存报告
with open('传中分析报告.txt', 'w', encoding='utf-8') as f:
f.write(报告)
print("\n分析完成!报告已保存!")
# 主程序
if __name__ == "__main__":
# 创建分析系统实例
analyzer = 边路传中分析系统()
# 运行完整分析
analyzer.运行完整分析()
这个综合Python案例包含了以下重要功能:
主要特点:
数据模拟
- 模拟20支球队、38场比赛的数据
- 包含战术风格、边路、比赛阶段、对手强度等维度
统计分析
- 基础统计指标(均值、标准差等)
- 分组对比分析(左右路、战术风格等)
- 交叉分析(边路×对手强度)
统计检验
- 左右路t检验
- 战术风格ANOVA分析
数据可视化
- 箱线图对比
- 热力图分析
- 时间序列趋势图
报告生成
- 详细的文本报告
- 图形保存为PNG文件
运行结果将显示:
- 左右路的传中成功率对比
- 不同战术风格的影响
- 对手强度的影响
- 统计显著性检验结果
- 可视化图表分析
这个案例综合运用了Pandas数据处理、NumPy数值计算、Matplotlib/Seaborn可视化、SciPy统计检验等Python数据分析核心技能,非常适合作为综合练习。