综合python案例,边路传中成功率对比?

wen python案例 1

本文目录导读:

综合python案例,边路传中成功率对比?

  1. 主要特点:
  2. 运行结果将显示:

我来为您设计一个综合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文件

运行结果将显示:

  1. 左右路的传中成功率对比
  2. 不同战术风格的影响
  3. 对手强度的影响
  4. 统计显著性检验结果
  5. 可视化图表分析

这个案例综合运用了Pandas数据处理、NumPy数值计算、Matplotlib/Seaborn可视化、SciPy统计检验等Python数据分析核心技能,非常适合作为综合练习。

抱歉,评论功能暂时关闭!