综合python案例,中场绞杀夺回球权对比?

wen python案例 4

我来为您设计一个足球数据分析的Python综合案例,专门分析中场绞杀(中场高压逼抢)夺回球权的效果对比。

综合python案例,中场绞杀夺回球权对比?

足球中场绞杀数据分析系统

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class MidfieldPressAnalyzer:
    """
    中场绞杀(高压逼抢)数据分析系统
    """
    def __init__(self):
        self.data = None
        self.summary_stats = {}
    def generate_match_data(self, n_matches=50):
        """
        生成模拟比赛数据
        包含常规防守和中场绞杀两种策略
        """
        np.random.seed(42)
        matches = []
        for i in range(n_matches):
            # 基础比赛信息
            match_id = f"MATCH_{i+1:03d}"
            # 中场绞杀指标(0-100)
            press_intensity = np.random.normal(60, 15)  # 逼抢强度
            press_intensity = np.clip(press_intensity, 20, 100)
            # 是否采用中场绞杀策略(强度>70视为绞杀)
            is_press_tactic = press_intensity > 70
            # 中场区域数据
            midfield_duels = np.random.poisson(25)  # 中场对抗次数
            duel_wins = np.random.binomial(midfield_duels, 0.45 + press_intensity/500)
            # 抢断和拦截
            tackles = np.random.poisson(8 + press_intensity/10)
            interceptions = np.random.poisson(10 + press_intensity/12)
            # 犯规和黄牌(高压逼抢容易犯规)
            fouls = np.random.poisson(8 + press_intensity/20)
            yellow_cards = np.random.poisson(1.5 + press_intensity/40)
            # 失球和丢球权
            possession_lost = np.random.poisson(12)  # 中场丢球
            regained_possession = np.random.poisson(5 + press_intensity/15)
            # 比赛结果影响
            goals_scored = np.random.poisson(1.2 + duel_wins/50)
            goals_conceded = np.random.poisson(1.0 + (100-press_intensity)/80)
            # 控球率影响
            possession = 45 + press_intensity/10 + np.random.normal(0, 5)
            possession = np.clip(possession, 35, 70)
            matches.append({
                'match_id': match_id,
                'press_intensity': press_intensity,
                'is_press_tactic': is_press_tactic,
                'midfield_duels': midfield_duels,
                'duel_wins': duel_wins,
                'duel_win_rate': duel_wins / midfield_duels * 100 if midfield_duels > 0 else 0,
                'tackles': tackles,
                'interceptions': interceptions,
                'fouls': fouls,
                'yellow_cards': yellow_cards,
                'possession_lost': possession_lost,
                'regained_possession': regained_possession,
                'possession': possession,
                'goals_scored': goals_scored,
                'goals_conceded': goals_conceded,
                'result_points': 3 if goals_scored > goals_conceded else (1 if goals_scored == goals_conceded else 0)
            })
        self.data = pd.DataFrame(matches)
        return self.data
    def analyze_press_effectiveness(self):
        """
        分析中场绞杀有效性
        """
        # 策略对比
        press_groups = self.data.groupby('is_press_tactic')
        self.summary_stats['tactic_comparison'] = pd.DataFrame({
            '常规防守': {
                '中场对抗胜率': press_groups['duel_win_rate'].mean().get(False, 0),
                '抢断数': press_groups['tackles'].mean().get(False, 0),
                '拦截数': press_groups['interceptions'].mean().get(False, 0),
                '夺回球权': press_groups['regained_possession'].mean().get(False, 0),
                '场均积分': press_groups['result_points'].mean().get(False, 0),
                '犯规数': press_groups['fouls'].mean().get(False, 0),
                '黄牌数': press_groups['yellow_cards'].mean().get(False, 0)
            },
            '中场绞杀': {
                '中场对抗胜率': press_groups['duel_win_rate'].mean().get(True, 0),
                '抢断数': press_groups['tackles'].mean().get(True, 0),
                '拦截数': press_groups['interceptions'].mean().get(True, 0),
                '夺回球权': press_groups['regained_possession'].mean().get(True, 0),
                '场均积分': press_groups['result_points'].mean().get(True, 0),
                '犯规数': press_groups['fouls'].mean().get(True, 0),
                '黄牌数': press_groups['yellow_cards'].mean().get(True, 0)
            }
        }).T
        return self.summary_stats['tactic_comparison']
    def statistical_significance_test(self):
        """
        统计显著性检验(T检验)
        """
        press_tactics = self.data[self.data['is_press_tactic'] == True]
        normal_tactics = self.data[self.data['is_press_tactic'] == False]
        tests = {}
        metrics = ['duel_win_rate', 'tackles', 'interceptions', 
                   'regained_possession', 'result_points']
        for metric in metrics:
            t_stat, p_value = stats.ttest_ind(press_tactics[metric], 
                                             normal_tactics[metric])
            tests[metric] = {
                't_statistic': t_stat,
                'p_value': p_value,
                'significant': p_value < 0.05
            }
        self.summary_stats['significance_test'] = tests
        return tests
    def calculate_win_value(self):
        """
        计算球权价值分析
        """
        # 每夺回一次球权能带来的进球转化率
        valuable_data = self.data.copy()
        # 计算效率指标
        valuable_data['regain_efficiency'] = valuable_data['regained_possession'] / \
                                            valuable_data['midfield_duels']
        valuable_data['goals_per_regain'] = valuable_data['goals_scored'] / \
                                           valuable_data['regained_possession'].replace(0, 1)
        # 相关性分析
        correlations = valuable_data[['regained_possession', 'goals_scored', 
                                     'possession', 'result_points']].corr()
        self.summary_stats['correlation_matrix'] = correlations
        return correlations
    def create_visualizations(self):
        """
        创建可视化图表
        """
        fig, axes = plt.subplots(2, 3, figsize=(18, 12))
        # 1. 中场对抗胜率对比
        press_groups = self.data.groupby('is_press_tactic')
        win_rates = [press_groups['duel_win_rate'].mean().get(False, 0),
                    press_groups['duel_win_rate'].mean().get(True, 0)]
        axes[0,0].bar(['常规防守', '中场绞杀'], win_rates, 
                     color=['#3498db', '#e74c3c'], alpha=0.7)
        axes[0,0].set_title('中场对抗胜率对比', fontsize=12, fontweight='bold')
        axes[0,0].set_ylabel('胜率 (%)')
        axes[0,0].set_ylim(0, 100)
        # 2. 球权夺回效率
        regain_stats = [press_groups['regained_possession'].mean().get(False, 0),
                       press_groups['regained_possession'].mean().get(True, 0)]
        axes[0,1].bar(['常规防守', '中场绞杀'], regain_stats,
                     color=['#3498db', '#e74c3c'], alpha=0.7)
        axes[0,1].set_title('场均夺回球权次数', fontsize=12, fontweight='bold')
        axes[0,1].set_ylabel('次数')
        # 3. 比赛结果对比
        points = [press_groups['result_points'].mean().get(False, 0),
                 press_groups['result_points'].mean().get(True, 0)]
        axes[0,2].bar(['常规防守', '中场绞杀'], points,
                     color=['#3498db', '#e74c3c'], alpha=0.7)
        axes[0,2].set_title('场均积分对比', fontsize=12, fontweight='bold')
        axes[0,2].set_ylabel('积分')
        # 4. 逼抢强度与胜率散点图
        axes[1,0].scatter(self.data['press_intensity'], 
                         self.data['duel_win_rate'],
                         c=self.data['result_points'], cmap='RdYlGn',
                         alpha=0.6, s=80)
        axes[1,0].set_xlabel('逼抢强度')
        axes[1,0].set_ylabel('对抗胜率 (%)')
        axes[1,0].set_title('逼抢强度与对抗胜率关系', fontsize=12, fontweight='bold')
        axes[1,0].axvline(x=70, color='red', linestyle='--', label='绞杀阈值')
        axes[1,0].legend()
        # 5. 犯规风险评估
        fouls_style = [press_groups['fouls'].mean().get(False, 0),
                      press_groups['fouls'].mean().get(True, 0)]
        axes[1,1].bar(['常规防守', '中场绞杀'], fouls_style,
                     color=['#3498db', '#e74c3c'], alpha=0.7)
        axes[1,1].set_title('场均犯规次数', fontsize=12, fontweight='bold')
        axes[1,1].set_ylabel('犯规次数')
        # 6. 相关性热力图
        corr_data = self.data[['press_intensity', 'duel_win_rate', 
                              'regained_possession', 'result_points']].corr()
        sns.heatmap(corr_data, annot=True, cmap='coolwarm', 
                   ax=axes[1,2], cbar_kws={'label': '相关系数'})
        axes[1,2].set_title('关键指标相关性', fontsize=12, fontweight='bold')
        plt.suptitle('中场绞杀效果综合分析', fontsize=16, fontweight='bold')
        plt.tight_layout()
        plt.show()
        return fig
    def generate_report(self):
        """
        生成完整分析报告
        """
        self.analyze_press_effectiveness()
        significance = self.statistical_significance_test()
        correlations = self.calculate_win_value()
        report = """
        ================================================
        中场绞杀战术效果评估报告
        ================================================
        1. 战术效果对比
        -------------------------------
        """
        for tactic in self.summary_stats['tactic_comparison'].index:
            report += f"\n{tactic}:\n"
            for metric, value in self.summary_stats['tactic_comparison'].loc[tactic].items():
                report += f"  {metric}: {value:.2f}\n"
        report += """
        2. 统计显著性检验
        -------------------------------
        """
        for metric, result in significance.items():
            sig_mark = "✅" if result['significant'] else "❌"
            report += f"  {metric}: p值={result['p_value']:.4f} {sig_mark}\n"
        report += """
        3. 球权价值分析
        -------------------------------
        """
        key_metric = correlations['goals_scored']['regained_possession']
        report += f"  夺回球权与进球的相关系数: {key_metric:.4f}\n"
        if key_metric > 0.7:
            report += "   中场夺回球权与进球高度正相关,绞杀策略极具价值\n"
        elif key_metric > 0.5:
            report += "   中场夺回球权与进球中度正相关,绞杀策略有价值\n"
        else:
            report += "   相关性一般,需结合其他战术\n"
        # 建议
        report += """
        4. 战术建议
        -------------------------------
        """
        press_mean = self.data[self.data['is_press_tactic']]['regained_possession'].mean()
        normal_mean = self.data[~self.data['is_press_tactic']]['regained_possession'].mean()
        if press_mean > normal_mean * 1.3:
            report += "  🔥 强烈建议采用中场绞杀战术,提升球权夺得效率\n"
        elif press_mean > normal_mean * 1.1:
            report += "  📊 建议选择性采用中场绞杀,权衡战术风险\n"
        else:
            report += "  ⚠️ 中场绞杀效果不明显,需优化逼抢策略\n"
        # 风险提示
        fouls_press = self.data[self.data['is_press_tactic']]['fouls'].mean()
        fouls_normal = self.data[~self.data['is_press_tactic']]['fouls'].mean()
        if fouls_press > fouls_normal * 1.2:
            report += f"  ⚠️ 注意:中场绞杀增加{fouls_press/fouls_normal*100-100:.0f}%犯规风险,需训练控制尺度\n"
        report += """
        ================================================
        报告生成时间: {}
        ================================================
        """.format(pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S'))
        return report
    def save_report(self, filename='midfield_press_report.txt'):
        """保存报告到文件"""
        report = self.generate_report()
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(report)
        print(f"报告已保存至: {filename}")
# 使用示例
if __name__ == "__main__":
    # 初始化分析器
    analyzer = MidfieldPressAnalyzer()
    # 生成模拟数据
    data = analyzer.generate_match_data(n_matches=60)
    print("数据生成完成")
    # 运行分析
    analyzer.analyze_press_effectiveness()
    analyzer.statistical_significance_test()
    analyzer.calculate_win_value()
    # 生成可视化
    analyzer.create_visualizations()
    # 输出报告
    print(analyzer.generate_report())
    # 保存报告
    analyzer.save_report()

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