综合python案例,高速跑动距离对比?

wen python案例 2

Python案例:高速跑动距离对比分析

下面我设计一个足球/田径运动员高速跑动距离对比的完整Python案例,涵盖数据生成、分析、可视化全流程。

综合python案例,高速跑动距离对比?


场景说明

在足球比赛中,"高速跑动距离"(通常指速度 > 5.5 m/s 或 > 19.8 km/h 的跑动距离)是衡量球员体能和战术价值的关键指标,本案例模拟多名球员在不同比赛中的高速跑动数据并进行对比分析。


完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from scipy import stats
# 中文显示设置
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
np.random.seed(42)
# ============ 1. 模拟数据 ============
players = ['李明', '王强', '张伟', '刘洋', '陈晨', '赵磊']
positions = ['前锋', '前锋', '中场', '中场', '后卫', '后卫']
# 每名球员10场比赛的高速跑动距离(单位:米)
data = {
    '李明': np.random.normal(850, 80, 10),   # 前锋,跑动多
    '王强': np.random.normal(920, 90, 10),
    '张伟': np.random.normal(1050, 100, 10), # 中场核心,跑动最多
    '刘洋': np.random.normal(980, 85, 10),
    '陈晨': np.random.normal(620, 60, 10),   # 后卫,相对少
    '赵磊': np.random.normal(700, 70, 10),
}
df = pd.DataFrame(data)
df.index = [f'第{i+1}场' for i in range(10)]
df = df.round(1)
print("=" * 60)
print("各球员高速跑动距离原始数据(米)")
print("=" * 60)
print(df)
# ============ 2. 描述性统计 ============
summary = pd.DataFrame({
    '球员': players,
    '位置': positions,
    '平均距离(m)': [df[p].mean() for p in players],
    '最大距离(m)': [df[p].max() for p in players],
    '最小距离(m)': [df[p].min() for p in players],
    '标准差': [df[p].std() for p in players],
    '总距离(m)': [df[p].sum() for p in players],
}).round(1)
summary = summary.sort_values('平均距离(m)', ascending=False).reset_index(drop=True)
summary.index += 1
print("\n" + "=" * 60)
print("球员高速跑动距离统计汇总")
print("=" * 60)
print(summary.to_string())
# ============ 3. 按位置对比 ============
pos_compare = df.T.groupby(positions).mean().T
pos_mean = pd.Series(
    {pos: df.loc[:, [p for p, ps in zip(players, positions) if ps == pos]].values.mean()
     for pos in set(positions)}
)
print("\n" + "=" * 60)
print("按位置平均高速跑动距离")
print("=" * 60)
for pos, val in pos_mean.sort_values(ascending=False).items():
    print(f"{pos}: {val:.1f} 米")
# ============ 4. 显著性检验(前锋 vs 后卫) ============
forward = df[['李明', '王强']].values.flatten()
defender = df[['陈晨', '赵磊']].values.flatten()
t_stat, p_val = stats.ttest_ind(forward, defender, equal_var=False)
print("\n" + "=" * 60)
print("前锋 vs 后卫 独立样本 t 检验")
print("=" * 60)
print(f"前锋均值: {forward.mean():.1f} m")
print(f"后卫均值: {defender.mean():.1f} m")
print(f"t统计量 = {t_stat:.3f}, p值 = {p_val:.4e}")
print("", "差异显著 (p<0.05)" if p_val < 0.05 else "差异不显著")
# ============ 5. 可视化 ============
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# (1) 各球员平均距离柱状图
ax1 = axes[0, 0]
colors = ['#e74c3c' if p == '前锋' else '#f39c12' if p == '中场' else '#3498db'
          for p in summary['位置']]
bars = ax1.bar(summary['球员'], summary['平均距离(m)'], color=colors, edgecolor='black')
for bar, v in zip(bars, summary['平均距离(m)']):
    ax1.text(bar.get_x() + bar.get_width()/2, v + 10, f'{v:.0f}',
             ha='center', fontsize=10)
ax1.set_title('各球员平均高速跑动距离', fontsize=13)
ax1.set_ylabel('距离 (米)')
ax1.set_ylim(0, 1200)
ax1.axhline(summary['平均距离(m)'].mean(), color='gray',
            linestyle='--', label='全队均值')
ax1.legend()
# (2) 箱线图 - 展示分布
ax2 = axes[0, 1]
bp = ax2.boxplot([df[p] for p in players], labels=players, patch_artist=True)
for patch, p_pos in zip(bp['boxes'], positions):
    patch.set_facecolor('#e74c3c' if p_pos == '前锋' else
                        '#f39c12' if p_pos == '中场' else '#3498db')
    patch.set_alpha(0.6)
ax2.set_title('各球员跑动距离分布(箱线图)', fontsize=13)
ax2.set_ylabel('距离 (米)')
ax2.grid(axis='y', alpha=0.3)
# (3) 折线图 - 各球员10场趋势
ax3 = axes[1, 0]
for p in players:
    ax3.plot(range(1, 11), df[p], marker='o', markersize=4, label=p, alpha=0.8)
ax3.set_title('10场比赛高速跑动距离趋势', fontsize=13)
ax3.set_xlabel('场次')
ax3.set_ylabel('距离 (米)')
ax3.legend(ncol=3, fontsize=9)
ax3.grid(alpha=0.3)
# (4) 按位置平均距离对比
ax4 = axes[1, 1]
pos_sorted = pos_mean.sort_values(ascending=False)
bars = ax4.bar(pos_sorted.index, pos_sorted.values,
               color=['#f39c12', '#e74c3c', '#3498db'], edgecolor='black')
for bar, v in zip(bars, pos_sorted.values):
    ax4.text(bar.get_x() + bar.get_width()/2, v + 10, f'{v:.0f}',
             ha='center', fontsize=11, fontweight='bold')
ax4.set_title('按位置平均高速跑动距离', fontsize=13)
ax4.set_ylabel('距离 (米)')
ax4.set_ylim(0, 1200)
plt.tight_layout()
plt.savefig('high_speed_running_compare.png', dpi=120, bbox_inches='tight')
plt.show()
# ============ 6. 输出结论 ============
print("\n" + "=" * 60)
print("分析结论")
print("=" * 60)
best = summary.iloc[0]
print(f"① 跑动王: {best['球员']}({best['位置']}),平均 {best['平均距离(m)']:.1f} 米/场")
print(f"② 位置规律: 中场 > 前锋 > 后卫,符合足球战术常识")
print(f"③ 稳定性最佳: {summary.loc[summary['标准差'].idxmin(), '球员']}"
      f"(标准差 {summary['标准差'].min():.1f})")
print(f"④ 前锋与后卫差异: p={p_val:.4e},"
      f"{'具有统计学显著性' if p_val < 0.05 else '无显著性'}")

运行结果示例

============================================================
球员高速跑动距离统计汇总
============================================================
   球员  位置  平均距离(m)  最大距离(m)  最小距离(m)   标准差  总距离(m)
1  张伟  中场     1041.6     1193.5      883.6   103.2   10416.0
2  刘洋  中场      982.3     1089.1      850.7    83.5    9823.0
3  王强  前锋      939.9     1080.4      786.3    98.7    9399.0
4  李明  前锋      856.2      986.4      720.1    77.2    8562.0
5  赵磊  后卫      694.5      810.2      601.3    68.4    6945.0
6  陈晨  后卫      622.8      692.5      540.1    55.9    6228.0
============================================================
前锋 vs 后卫 独立样本 t 检验
============================================================
前锋均值: 898.1 m
后卫均值: 658.7 m
t统计量 = 10.472, p值 = 1.23e-13
 差异显著 (p<0.05)

关键分析点

维度 方法 说明
横向对比 平均距离柱状图 快速识别跑动能力差异
稳定性 标准差/箱线图 说明球员表现是否稳定
趋势 折线图 观察状态起伏
位置规律 分组均值 中场 > 前锋 > 后卫
科学性 t 检验 判断差异是否显著

可扩展方向

  1. 接入真实数据:如 FIFA/OPTA、Catapult GPS 数据(CSV读取 pd.read_csv)
  2. 速度分档:按 19.8–25.2 km/h(高速)与 >25.2 km/h(冲刺)分层统计
  3. 时序分析:用分钟级数据画出跑动强度热力图
  4. 球队对比:把 players 换成两支球队,做两样本对比
  5. 机器学习:用 sklearn 根据跑动数据聚类球员类型

如果需要我针对某支具体球队的真实数据格式或加入冲刺跑/总跑动距离的多指标对比,可以继续说明。

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