python案例如何识别球队的战术风格类型?

wen python案例 2

本文目录导读:

python案例如何识别球队的战术风格类型?

  1. 球队战术风格识别系统
  2. 系统特点

我来提供一个基于足球比赛数据的球队战术风格识别案例,这将使用机器学习方法对球队的比赛数据进行分析和分类。

球队战术风格识别系统

导入必要的库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import warnings
warnings.filterwarnings('ignore')
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

创建模拟数据

def create_team_data():
    """创建模拟的球队战术数据"""
    np.random.seed(42)
    # 模拟20支球队的战术数据
    teams = []
    # 战术风格类型:控球型、反击型、高位逼抢型、防守型
    tactics = ['控球型', '反击型', '高位逼抢型', '防守型']
    for i in range(20):
        team = {
            '球队名称': f'球队{i+1}',
            '赛季': '2023-2024',
            # 进攻数据
            '场均控球率': np.random.uniform(40, 62),
            '场均射门数': np.random.uniform(10, 18),
            '场均传球成功率': np.random.uniform(78, 92),
            '场均关键传球': np.random.uniform(8, 15),
            '场均传中数': np.random.uniform(10, 25),
            '场均突破次数': np.random.uniform(5, 15),
            # 防守数据
            '场均抢断数': np.random.uniform(10, 20),
            '场均拦截数': np.random.uniform(8, 16),
            '场均解围数': np.random.uniform(15, 30),
            '场均犯规数': np.random.uniform(8, 15),
            # 转换数据
            '反击次数占比': np.random.uniform(0.1, 0.4),
            '定位球得分占比': np.random.uniform(0.15, 0.45),
            '进攻三区触球次数': np.random.uniform(20, 45),
            # 比赛结果
            '场均进球': np.random.uniform(0.8, 2.5),
            '场均失球': np.random.uniform(0.5, 1.8),
            '胜率': np.random.uniform(0.3, 0.7)
        }
        teams.append(team)
    # 根据战术特点给数据添加一些规律
    df = pd.DataFrame(teams)
    # 手动标注真实战术类型(用于验证)
    for idx, row in df.iterrows():
        if row['场均控球率'] > 57 and row['场均传球成功率'] > 87:
            df.loc[idx, '真实战术'] = '控球型'
        elif row['反击次数占比'] > 0.3 and row['场均突破次数'] > 10:
            df.loc[idx, '真实战术'] = '反击型'
        elif row['场均抢断数'] > 16 and row['场均犯规数'] > 12:
            df.loc[idx, '真实战术'] = '高位逼抢型'
        else:
            df.loc[idx, '真实战术'] = '防守型'
    return df
# 创建数据
team_data = create_team_data()
print("数据预览:")
print(team_data.head())

数据预处理和特征工程

class TacticalDataProcessor:
    def __init__(self):
        self.scaler = StandardScaler()
        self.pca = PCA(n_components=2)
    def prepare_features(self, data):
        """准备特征矩阵"""
        # 选择特征列
        feature_columns = [
            '场均控球率', '场均射门数', '场均传球成功率', '场均关键传球',
            '场均传中数', '场均突破次数', '场均抢断数', '场均拦截数',
            '场均解围数', '场均犯规数', '反击次数占比', '定位球得分占比',
            '进攻三区触球次数', '场均进球', '场均失球', '胜率'
        ]
        features = data[feature_columns].copy()
        return features
    def scale_features(self, features):
        """标准化特征"""
        return self.scaler.fit_transform(features)
# 数据预处理
processor = TacticalDataProcessor()
features = processor.prepare_features(team_data)
scaled_features = processor.scale_features(features)
print(f"\n特征矩阵形状: {scaled_features.shape}")

聚类分析识别战术类型

# 使用K-means聚类自动识别战术类型
class TacticalClassifier:
    def __init__(self, n_clusters=4):
        self.n_clusters = n_clusters
        self.kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
    def fit_predict(self, data):
        """执行聚类"""
        return self.kmeans.fit_predict(data)
    def analyze_clusters(self, data, labels):
        """分析每个聚类的特征"""
        df_clusters = data.copy()
        df_clusters['聚类'] = labels
        cluster_summary = df_clusters.groupby('聚类').agg({
            '场均控球率': 'mean',
            '场均传球成功率': 'mean',
            '场均抢断数': 'mean',
            '反击次数占比': 'mean',
            '场均突破次数': 'mean',
            '场均犯规数': 'mean',
            '场均进球': 'mean',
            '场均失球': 'mean'
        }).round(2)
        return cluster_summary
# 执行聚类分析
classifier = TacticalClassifier(n_clusters=4)
labels = classifier.fit_predict(scaled_features)
team_data['识别战术'] = labels
# 分析聚类结果
cluster_summary = classifier.analyze_clusters(features, labels)
print("聚类特征分析:")
print(cluster_summary)

战术风格特征描述函数

def describe_tactical_style(team_stats):
    """
    根据球队统计数据描述战术风格
    Parameters:
    team_stats: 包含球队统计数据的字典或DataFrame行
    Returns:
    str: 战术风格描述
    """
    descriptions = []
    # 分析控球特点
    if team_stats['场均控球率'] > 57:
        descriptions.append("高控球率球队,擅长控制比赛节奏")
    elif team_stats['场均控球率'] < 45:
        descriptions.append("低控球率球队,更喜欢直接高效的打法")
    else:
        descriptions.append("控球率适中,打法较为均衡")
    # 分析进攻方式
    if team_stats['场均传中数'] > 20:
        descriptions.append("大量使用边路传中")
    if team_stats['场均突破次数'] > 12:
        descriptions.append("擅长个人突破制造机会")
    if team_stats['场均关键传球'] > 12:
        descriptions.append("拥有出色的创造机会能力")
    # 分析防守风格
    if team_stats['场均抢断数'] > 16:
        descriptions.append("防守积极,球权争夺激烈")
    if team_stats['场均犯规数'] > 12:
        descriptions.append("防守强度大,战术犯规较多")
    if team_stats['场均解围数'] > 25:
        descriptions.append("擅长摆大巴式防守")
    # 分析比赛策略
    if team_stats['反击次数占比'] > 0.3:
        descriptions.append("主要依靠反击得分")
    if team_stats['定位球得分占比'] > 0.35:
        descriptions.append("定位球战术丰富")
    return ';'.join(descriptions)
# 为每支球队生成战术描述
team_data['战术描述'] = team_data.apply(describe_tactical_style, axis=1)

可视化分析

def visualize_tactical_analysis(data, scaled_data, labels):
    """可视化战术分析结果"""
    # 创建图表
    fig, axes = plt.subplots(2, 2, figsize=(15, 12))
    # 1. 战术类型分布饼图
    ax1 = axes[0, 0]
    style_counts = data['真实战术'].value_counts()
    colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']
    ax1.pie(style_counts.values, labels=style_counts.index, autopct='%1.1f%%',
            colors=colors, startangle=90)
    ax1.set_title('球队战术类型分布', fontsize=14)
    # 2. 降维可视化
    ax2 = axes[0, 1]
    pca_data = processor.pca.fit_transform(scaled_data)
    scatter = ax2.scatter(pca_data[:, 0], pca_data[:, 1], 
                         c=labels, cmap='viridis', s=100, alpha=0.8)
    ax2.set_xlabel('PC1')
    ax2.set_ylabel('PC2')
    ax2.set_title('球队战术聚类可视化 (PCA)', fontsize=14)
    plt.colorbar(scatter, ax=ax2)
    # 3. 关键指标雷达图(示例)
    ax3 = axes[1, 0]
    ax3.axis('off')  # 隐藏坐标轴
    # 4. 战术特征对比图
    ax4 = axes[1, 1]
    avg_metrics = ['场均控球率', '场均射门数', '场均传球成功率', 
                   '场均抢断数', '反击次数占比']
    avg_values = [data[col].mean() for col in avg_metrics]
    ax4.bar(avg_metrics, avg_values, color='skyblue', alpha=0.7)
    ax4.set_title('球队平均战术指标', fontsize=14)
    ax4.set_xticklabels(avg_metrics, rotation=45)
    ax4.set_ylabel('平均值')
    plt.tight_layout()
    plt.show()
# 执行可视化
visualize_tactical_analysis(team_data, scaled_features, labels)

机器学习分类模型

def train_tactical_classifier(data):
    """训练战术分类器"""
    # 选择特征
    feature_columns = [
        '场均控球率', '场均射门数', '场均传球成功率', '场均关键传球',
        '场均传中数', '场均突破次数', '场均抢断数', '场均拦截数',
        '场均解围数', '场均犯规数', '反击次数占比', '定位球得分占比',
        '进攻三区触球次数', '场均进球', '场均失球', '胜率'
    ]
    X = data[feature_columns]
    y = data['真实战术']
    # 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3, random_state=42, stratify=y
    )
    # 存储标签编码
    self.label_mapping = {label: i for i, label in enumerate(y.unique())}
    self.inverse_mapping = {i: label for label, i in self.label_mapping.items()}
    # 训练模型
    model = RandomForestClassifier(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)
    # 预测
    y_pred = model.predict(X_test)
    # 评估
    print("分类模型评估:")
    print(classification_report(y_test, y_pred))
    return model
# 训练分类器
classifier_model = train_tactical_classifier(team_data)

单支球队战术分析函数

def analyze_single_team(team_stats):
    """
    分析单支球队的战术风格
    Parameters:
    team_stats: 字典,包含球队的统计数据
    Returns:
    dict: 包含战术分析结果
    """
    result = {
        '风格描述': [],
        '强度评分': {},
        '建议': []
    }
    # 计算各项战术能力评分(0-100)
    # 控球能力评分
    possession_score = min(100, (team_stats['场均控球率'] / 65) * 100)
    result['强度评分']['控球'] = round(possession_score, 1)
    # 进攻能力评分
    attack_score = min(100, (team_stats['场均射门数'] / 20) * 100)
    result['强度评分']['进攻'] = round(attack_score, 1)
    # 防守能力评分
    defense_score = min(100, (20 / max(team_stats['场均失球'], 1)) * 50)
    result['强度评分']['防守'] = round(defense_score, 1)
    # 反击能力评分
    counter_score = min(100, (team_stats['反击次数占比'] / 0.4) * 100)
    result['强度评分']['反击'] = round(counter_score, 1)
    # 生成具体建议
    if team_stats['场均控球率'] > 60:
        result['建议'].append("增加中场控制力度,创造更多进攻机会")
    elif team_stats['场均控球率'] < 42:
        result['建议'].append("加强中场组织能力,提高控球率")
    if team_stats['场均射门数'] < 12:
        result['建议'].append("增加射门次数,提高进攻效率")
    if team_stats['场均失球'] > 1.5:
        result['建议'].append("加强后防线,减少失球")
    if team_stats['反击次数占比'] > 0.3:
        result['建议'].append("继续保持快速反击战术,提高效率")
    return result
# 示例分析
sample_team = team_data.iloc[0]
analysis_result = analyze_single_team(sample_team)
print("\n球队战术分析结果:")
print(f"球队:{sample_team['球队名称']}")
print(f"风格描述:{describe_tactical_style(sample_team)}")
print(f"能力评分:{analysis_result['强度评分']}")
print("战术建议:")
for suggestion in analysis_result['建议']:
    print(f"- {suggestion}")

结果输出与导出

def export_tactical_analysis(data):
    """导出战术分析结果"""
    # 添加战术分类标签
    def assign_tactical_label(row):
        if row['场均控球率'] > 57:
            return '控球型'
        elif row['反击次数占比'] > 0.3:
            return '反击型'
        elif row['场均抢断数'] > 16:
            return '高位逼抢型'
        else:
            return '防守型'
    data['战术类型'] = data.apply(assign_tactical_label, axis=1)
    # 生成详细报告
    report = data[[
        '球队名称', '真实战术', '识别战术', '场均控球率',
        '场均进球', '场均失球', '战术描述'
    ]].copy()
    report['识别战术'] = report['识别战术'].map({
        0: '保守型', 1: '进攻型', 2: '稳健型', 3: '均衡型'
    })
    # 保存到CSV
    report.to_csv('球队战术分析结果.csv', index=False, encoding='utf-8-sig')
    print("战术分析结果已保存到 '球队战术分析结果.csv'")
    # 生成综合报告
    print("\n=== 球队战术分析综合报告 ===")
    print(f"总球队数:{len(data)}")
    print(f"战术类型分布:")
    style_distribution = data['真实战术'].value_counts()
    for tactic, count in style_distribution.items():
        print(f"  {tactic}: {count}支 ({count/len(data)*100:.1f}%)")
    return report
# 生成最终报告
final_report = export_tactical_analysis(team_data)
print("\n最终分析报告预览:")
print(final_report.head())

完整使用示例

if __name__ == "__main__":
    print("=== 球队战术风格识别系统 ===")
    # 1. 创建/加载数据
    team_data = create_team_data()
    # 2. 数据预处理
    processor = TacticalDataProcessor()
    features = processor.prepare_features(team_data)
    scaled_features = processor.scale_features(features)
    # 3. 聚类分析
    classifier = TacticalClassifier(n_clusters=4)
    labels = classifier.fit_predict(scaled_features)
    team_data['自动识别战术'] = labels
    # 4. 生成战术描述
    team_data['战术描述'] = team_data.apply(describe_tactical_style, axis=1)
    # 5. 可视化分析
    visualize_tactical_analysis(team_data, scaled_features, labels)
    # 6. 训练机器学习模型
    model = train_tactical_classifier(team_data)
    # 7. 输出最终结果
    final_report = export_tactical_analysis(team_data)
    print("\n系统分析完成!")

系统特点

  1. 多维分析:从控球、进攻、防守、转换等多个维度分析战术
  2. 自动分类:使用K-means聚类自动识别战术类型
  3. 机器学习:Random Forest分类器用于战术预测
  4. 可视化:直观展示分析结果
  5. 可扩展性:可以根据需要增加更多战术指标

这个系统可以帮助教练团队分析对手的战术风格,制定针对性的比赛策略,实际应用中,可以根据具体需求调整特征和算法参数。

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