我来设计一个综合Python案例,用于量化中卫组合的默契度,这个案例会整合多个维度的数据分析和处理:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
from sklearn.preprocessing import StandardScaler
from sklearn.metrics.pairwise import cosine_similarity
import warnings
warnings.filterwarnings('ignore')
class DefenderPartnershipAnalyzer:
"""
中卫组合默契度分析系统
通过多个维度量化中卫搭档的默契程度
"""
def __init__(self):
self.data = None
self.scores = {}
def generate_sample_data(self, n_matches=50):
"""
生成模拟比赛数据
包含传球、防守、跑位、交流等维度
"""
np.random.seed(42)
# 中卫组合
defenders = [
('Van Dijk', 'Matip'),
('Stones', 'Dias'),
('Ramos', 'Varane'),
('Pique', 'Lenglet')
]
matches = []
for match_id in range(1, n_matches+1):
for defender_pair in defenders:
d1, d2 = defender_pair
# 基础默契指标
base_sync = np.random.normal(75, 8)
# 传球配合
pass_attempts = np.random.randint(30, 60)
pass_completions = int(pass_attempts * (0.75 + np.random.normal(0, 0.05)))
key_passes = np.random.randint(5, 15)
# 防守协同
defensive_actions = np.random.randint(15, 30)
combined_tackles = int(defensive_actions * np.random.uniform(0.2, 0.4))
interceptions = np.random.randint(5, 15)
clearances = np.random.randint(10, 20)
# 位置协同
offside_traps = np.random.randint(0, 5)
offside_trap_success = np.random.uniform(0.3, 0.8)
# 跑动配合
d1_distance = np.random.uniform(8, 12) # km
d2_distance = np.random.uniform(8, 12)
distance_difference = abs(d1_distance - d2_distance)
# 沟通交流
communications = np.random.randint(20, 50)
successful_communications = int(communications * np.random.uniform(0.6, 0.9))
# 比赛结果
goals_conceded = np.random.poisson(1.2)
clean_sheet = 1 if goals_conceded == 0 else 0
match_result = np.random.choice(['win', 'draw', 'loss'], p=[0.5, 0.3, 0.2])
matches.append({
'match_id': match_id,
'defender_pair': f'{d1} & {d2}',
'd1_name': d1,
'd2_name': d2,
'pass_attempts': pass_attempts,
'pass_completions': pass_completions,
'pass_accuracy': pass_completions / pass_attempts * 100,
'key_passes': key_passes,
'defensive_actions': defensive_actions,
'combined_tackles': combined_tackles,
'interceptions': interceptions,
'clearances': clearances,
'offside_traps': offside_traps,
'offside_trap_success_rate': offside_trap_success * 100,
'd1_distance': d1_distance,
'd2_distance': d2_distance,
'distance_difference': distance_difference,
'communications': communications,
'successful_communications': successful_communications,
'communication_accuracy': successful_communications / communications * 100,
'goals_conceded': goals_conceded,
'clean_sheet': clean_sheet,
'match_result': match_result,
'base_sync': base_sync,
'defensive_solidity': 100 - goals_conceded * 20 + clean_sheet * 15
})
self.data = pd.DataFrame(matches)
return self.data
def calculate_pass_coordination(self):
"""传球配合默契度"""
df = self.data.groupby('defender_pair').agg({
'pass_accuracy': 'mean',
'key_passes': 'mean',
'pass_completions': 'sum'
}).reset_index()
# 标准化后计算综合得分
scaler = StandardScaler()
df['pass_score'] = scaler.fit_transform(df[['pass_accuracy', 'key_passes']]).mean(axis=1) * 50 + 50
df['pass_score'] = df['pass_score'].clip(0, 100)
return df[['defender_pair', 'pass_score', 'pass_accuracy', 'key_passes']]
def calculate_defensive_coordination(self):
"""防守协同默契度"""
df = self.data.groupby('defender_pair').agg({
'combined_tackles': 'mean',
'interceptions': 'mean',
'clearances': 'mean',
'defensive_solidity': 'mean'
}).reset_index()
# 权重分配
weights = {
'combined_tackles': 0.3,
'interceptions': 0.3,
'clearances': 0.2,
'defensive_solidity': 0.2
}
df['defensive_score'] = 0
for col, weight in weights.items():
if col == 'defensive_solidity':
df['defensive_score'] += df[col] * weight
else:
normalized = (df[col] - df[col].min()) / (df[col].max() - df[col].min()) * 100
df['defensive_score'] += normalized * weight
return df[['defender_pair', 'defensive_score', 'combined_tackles', 'interceptions', 'clearances']]
def calculate_positional_sync(self):
"""位置协同默契度"""
df = self.data.groupby('defender_pair').agg({
'offside_trap_success_rate': 'mean',
'distance_difference': 'mean',
'd1_distance': 'mean',
'd2_distance': 'mean'
}).reset_index()
# 位置同步性:距离差异越小越好
df['positional_sync'] = 100 - (df['distance_difference'] / 2 * 100)
# 越位陷阱成功率
df['positional_sync'] = 0.5 * df['positional_sync'] + 0.5 * df['offside_trap_success_rate']
# 限制在0-100范围
df['positional_sync'] = df['positional_sync'].clip(0, 100)
return df[['defender_pair', 'positional_sync', 'offside_trap_success_rate', 'distance_difference']]
def calculate_communication_quality(self):
"""沟通质量默契度"""
df = self.data.groupby('defender_pair').agg({
'communication_accuracy': 'mean',
'communications': 'sum'
}).reset_index()
# 沟通量和准确度综合评估
scaler = StandardScaler()
df['communication_score'] = scaler.fit_transform(
df[['communication_accuracy', 'communications']]
).mean(axis=1) * 50 + 50
df['communication_score'] = df['communication_score'].clip(0, 100)
return df[['defender_pair', 'communication_score', 'communication_accuracy', 'communications']]
def calculate_tactical_synergy(self):
"""战术执行同步性(基于比赛结果)"""
df = self.data.groupby('defender_pair').agg({
'clean_sheet': 'mean',
'goals_conceded': 'mean',
'base_sync': 'mean'
}).reset_index()
# 综合战术效果
df['tactical_score'] = (
df['clean_sheet'] * 40 +
(1 - df['goals_conceded'] / 5) * 30 +
df['base_sync'] / 100 * 30
)
df['tactical_score'] = df['tactical_score'].clip(0, 100)
return df[['defender_pair', 'tactical_score', 'clean_sheet', 'goals_conceded']]
def comprehensive_sync_score(self):
"""综合默契度评分(加权平均)"""
print("\n" + "="*80)
print("中卫组合默契度综合分析报告")
print("="*80)
# 计算各个维度的分数
pass_score = self.calculate_pass_coordination()
defensive_score = self.calculate_defensive_coordination()
positional_sync = self.calculate_positional_sync()
communication_score = self.calculate_communication_quality()
tactical_score = self.calculate_tactical_synergy()
# 合并所有分数
final_df = pass_score[['defender_pair', 'pass_score']].merge(
defensive_score[['defender_pair', 'defensive_score']], on='defender_pair'
).merge(
positional_sync[['defender_pair', 'positional_sync']], on='defender_pair'
).merge(
communication_score[['defender_pair', 'communication_score']], on='defender_pair'
).merge(
tactical_score[['defender_pair', 'tactical_score']], on='defender_pair'
)
# 权重配置(可调整)
weights = {
'pass_score': 0.25,
'defensive_score': 0.3,
'positional_sync': 0.2,
'communication_score': 0.1,
'tactical_score': 0.15
}
# 计算综合得分
final_df['final_sync_score'] = sum(
final_df[col] * weight for col, weight in weights.items()
)
# 评级
def get_grade(score):
if score >= 85: return 'S级(配合默契)'
elif score >= 70: return 'A级(配合良好)'
elif score >= 55: return 'B级(基本联系)'
else: return 'C级(需要提升)'
final_df['grade'] = final_df['final_sync_score'].apply(get_grade)
# 排序
final_df = final_df.sort_values('final_sync_score', ascending=False)
# 输出结果
print("\n中卫组合默契度排行:")
print("-"*80)
for idx, row in final_df.iterrows():
print(f"\n组合: {row['defender_pair']}")
print(f"综合得分: {row['final_sync_score']:.2f} | 评级: {row['grade']}")
print(f"传球配合: {row['pass_score']:.2f} | 防守协同: {row['defensive_score']:.2f} "
f"| 位置同步: {row['positional_sync']:.2f} | 沟通质量: {row['communication_score']:.2f} "
f"| 战术执行: {row['tactical_score']:.2f}")
# 保存结果
self.final_df = final_df
return final_df
def visualize_sync_analysis(self):
"""可视化分析"""
if not hasattr(self, 'final_df'):
print("请先运行综合分析")
return
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
# 1. 雷达图
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 雷达图数据
categories = ['传球配合', '防守协同', '位置同步', '沟通质量', '战术执行']
cat_vars = ['pass_score', 'defensive_score', 'positional_sync',
'communication_score', 'tactical_score']
for idx, (ax, (pair, row)) in enumerate(zip(axes.flatten(), self.final_df.iterrows())):
# 雷达图
if idx < 4:
values = [row[col] for col in cat_vars]
values += values[:1]
angles = np.linspace(0, 2*np.pi, len(cat_vars), endpoint=False).tolist()
angles += angles[:1]
ax.plot(angles, values, 'o-', linewidth=2, color='blue' if idx==0 else 'green')
ax.fill(angles, values, alpha=0.25)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories, fontsize=8)
ax.set_ylim(0, 100)
ax.set_title(f"{pair} - 得分:{row['final_sync_score']:.1f}", fontsize=10)
ax.grid(True)
plt.suptitle('中卫组合默契度雷达图', fontsize=16, y=1.02)
plt.tight_layout()
plt.savefig('defender_sync_radar.png', dpi=150, bbox_inches='tight')
plt.show()
# 2. 柱状图
fig, ax = plt.subplots(figsize=(10, 6))
pairs = self.final_df['defender_pair']
scores = self.final_df['final_sync_score']
colors = ['blue' if score >= 80 else 'green' if score >= 70 else 'orange' for score in scores]
bars = ax.bar(pairs, scores, color=colors)
ax.set_ylabel('默契度得分')
ax.set_title('中卫组合综合默契度对比')
ax.set_ylim(0, 100)
# 添加数据标签
for bar, score in zip(bars, scores):
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 2,
f'{score:.1f}', ha='center', fontweight='bold')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('defender_sync_comparison.png', dpi=150)
plt.show()
# 3. 热力图
fig, ax = plt.subplots(figsize=(10, 8))
heatmap_data = self.final_df[['defender_pair'] + cat_vars].set_index('defender_pair')
sns.heatmap(heatmap_data, annot=True, fmt='.1f', cmap='YlOrRd', ax=ax)
ax.set_title('中卫组合各维度默契度热力图')
plt.tight_layout()
plt.savefig('defender_sync_heatmap.png', dpi=150)
plt.show()
def identify_improvement_areas(self, pair_name):
"""识别特定组合的改进空间"""
if not hasattr(self, 'final_df'):
print("请先运行综合分析")
return
pair_data = self.final_df[self.final_df['defender_pair'] == pair_name]
if pair_data.empty:
print(f"未找到组合: {pair_name}")
return
print(f"\n{pair_name} 改进分析:")
print("-"*40)
cols = ['pass_score', 'defensive_score', 'positional_sync',
'communication_score', 'tactical_score']
labels = ['传球配合', '防守协同', '位置同步', '沟通质量', '战术执行']
# 找出较弱维度
for col, label in zip(cols, labels):
value = pair_data[col].values[0]
avg = self.final_df[col].mean()
if value < avg:
diff = avg - value
print(f"📉 {label}低于平均值 {diff:.2f}分,需要重点提升")
else:
diff = value - avg
print(f"📈 {label}高于平均值 {diff:.2f}分")
def predict_success_rate(self):
"""
预测组合成功率(基于历史数据)
"""
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
# 准备特征
features = [
'pass_accuracy', 'key_passes', 'combined_tackles',
'interceptions', 'clearances', 'offside_trap_success_rate',
'communication_accuracy', 'distance_difference'
]
X = self.data[features]
y = self.data['defensive_solidity']
# 训练模型
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 预测
predictions = model.predict(X_test)
# 评估
from sklearn.metrics import r2_score, mean_squared_error
r2 = r2_score(y_test, predictions)
mse = mean_squared_error(y_test, predictions)
print(f"\n模型预测能力评估:")
print(f"R²分数: {r2:.4f} (接近1表示预测能力好)")
print(f"MSE: {mse:.2f}")
# 特征重要性
feature_importance = pd.Series(
model.feature_importances_,
index=features
).sort_values(ascending=False)
print("\n影响防守稳固性的关键因素:")
for feature, importance in feature_importance.iteritems():
print(f" {feature}: {importance:.3f}")
return model
# 主程序
def main():
# 创建分析器
analyzer = DefenderPartnershipAnalyzer()
# 生成模拟数据
print("生成模拟比赛数据...")
data = analyzer.generate_sample_data(n_matches=100)
print(f"共 {len(data)} 条比赛记录")
# 运行综合分析
results = analyzer.comprehensive_sync_score()
# 可视化
analyzer.visualize_sync_analysis()
# 针对特定组合分析
analyzer.identify_improvement_areas('Van Dijk & Matip')
# 预测模型
analyzer.predict_success_rate()
# 输出分析总结
print("\n" + "="*80)
print("分析总结")
print("="*80)
print("本次分析综合了以下维度:")
print("1. 传球配合默契度")
print("2. 防守协同能力")
print("3. 位置同步性")
print("4. 沟通质量")
print("5. 战术执行效果")
print("\n量化指标采用0-100分制,权重可根据实际需求调整")
# 保存结果
if hasattr(analyzer, 'final_df'):
analyzer.final_df.to_csv('defender_sync_analysis.csv', index=False)
print("\n分析结果已保存至 defender_sync_analysis.csv")
if __name__ == "__main__":
main()
主要功能特点:
-
多维度分析:
- 传球配合默契度
- 防守协同能力
- 位置同步性
- 沟通质量
- 战术执行效果
-
综合评分系统:
- 采用加权平均算法
- 可自定义权重
- 输出各维度明细分数
-
数据可视化:
- 雷达图展示各维度表现
- 柱状图对比组合
- 热力图显示细节
-
智能分析:
- 机器学习预测
- 特征重要性分析
- 针对性改进建议
-
实用功能:
- 自动生成报告
- 数据导出
- 组合横向对比
使用场景:
- 教练团队评估中卫搭档
- 转会市场球员评价
- 战术调整数据支持
- 球员训练效果追踪
这个框架可以被扩展用于实际数据分析,只需替换数据源和调整参数即可。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播