本文目录导读:

我来为您设计一个综合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数据分析核心技能,非常适合作为综合练习。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播