python案例认为体能分配策略影响下半场吗?

wen python案例 3

本文目录导读:

python案例认为体能分配策略影响下半场吗?

  1. 分析思路
  2. Python实现
  3. 预期结果解读
  4. 体能分配策略确实影响下半场
  5. 用真实数据的建议

这是一个很有意思的体育数据分析问题,我们可以用Python做一个案例来验证“体能分配策略是否影响下半场表现”。

下面我设计一个完整的分析案例,包含数据模拟、统计检验和可视化。

分析思路

  1. 定义体能分配策略:激进型”(上半场高强度)vs“保守型”(上半场低强度保留体能)
  2. 定义下半场表现指标:跑动距离、冲刺次数、传球成功率等
  3. 统计检验:比较两组下半场表现是否有显著差异
  4. 可视化:展示体能曲线和下半场表现分布

Python实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
np.random.seed(42)
# ========== 1. 模拟数据 ==========
n_players = 200  # 200名球员样本
# 策略分组:0=保守型(上半场留力),1=激进型(上半场透支)
strategy = np.random.binomial(1, 0.5, n_players)
# 上半场跑动距离(km) —— 激进型明显更高
first_half_distance = np.where(
    strategy == 1,
    np.random.normal(5.8, 0.4, n_players),   # 激进
    np.random.normal(4.9, 0.4, n_players)    # 保守
)
# 下半场跑动距离 —— 关键假设:激进型下半场下降更多
second_half_distance = np.where(
    strategy == 1,
    np.random.normal(4.6, 0.6, n_players),   # 激进型体能透支
    np.random.normal(5.2, 0.5, n_players)    # 保守型保持较好
)
# 下半场冲刺次数
second_half_sprints = np.where(
    strategy == 1,
    np.random.normal(8, 2.5, n_players),
    np.random.normal(11, 2.5, n_players)
)
df = pd.DataFrame({
    'strategy': strategy,
    'strategy_name': np.where(strategy==1, '激进型', '保守型'),
    'first_half_dist': first_half_distance,
    'second_half_dist': second_half_distance,
    'second_half_sprints': second_half_sprints
})
df['total_dist'] = df['first_half_dist'] + df['second_half_dist']
df['drop_rate'] = (df['first_half_dist'] - df['second_half_dist']) / df['first_half_dist']
print("=" * 55)
print("各组描述统计")
print("=" * 55)
print(df.groupby('strategy_name')[['first_half_dist','second_half_dist',
                                    'second_half_sprints','drop_rate']].mean().round(3))
# ========== 2. 统计检验:独立样本t检验 ==========
print("\n" + "=" * 55)
print("独立样本t检验:下半场表现差异")
print("=" * 55)
for col, label in [('second_half_dist','下半场跑动距离'),
                   ('second_half_sprints','下半场冲刺次数'),
                   ('drop_rate','体能下降率')]:
    g1 = df[df.strategy==1][col]
    g0 = df[df.strategy==0][col]
    t, p = stats.ttest_ind(g1, g0, equal_var=False)
    # Cohen's d 效应量
    d = (g1.mean() - g0.mean()) / np.sqrt((g1.var()+g0.var())/2)
    print(f"{label}: 激进={g1.mean():.2f}, 保守={g0.mean():.2f}, "
          f"t={t:.3f}, p={p:.4f}, Cohen's d={d:.2f} "
          f"{'***显著' if p<0.05 else '不显著'}")
# ========== 3. 可视化 ==========
fig, axes = plt.subplots(1, 3, figsize=(15, 4.5))
# (1) 上下半场跑动距离对比
ax = axes[0]
means = df.groupby('strategy_name')[['first_half_dist','second_half_dist']].mean()
x = np.arange(2)
w = 0.35
ax.bar(x-w/2, means.loc['保守型'], w, label='保守型', color='#4C72B0')
ax.bar(x+w/2, means.loc['激进型'], w, label='激进型', color='#C44E52')
ax.set_xticks(x); ax.set_xticklabels(['上半场','下半场'])
ax.set_ylabel('跑动距离 (km)'); ax.set_title('上下半场跑动距离对比')
ax.legend(); ax.grid(axis='y', alpha=0.3)
# (2) 下半场跑动分布
ax = axes[1]
sns.boxplot(data=df, x='strategy_name', y='second_half_dist',
            palette=['#4C72B0','#C44E52'], ax=ax)
ax.set_title('下半场跑动距离分布'); ax.set_xlabel(''); ax.set_ylabel('km')
# (3) 体能下降率
ax = axes[2]
sns.violinplot(data=df, x='strategy_name', y='drop_rate',
               palette=['#4C72B0','#C44E52'], ax=ax)
ax.set_title('体能下降率 (上半场→下半场)'); ax.set_xlabel(''); ax.set_ylabel('下降比例')
plt.tight_layout()
plt.savefig('endurance_strategy_analysis.png', dpi=120)
plt.show()
# ========== 4. 回归分析:控制总跑动,看策略对下半场的影响 ==========
import statsmodels.formula.api as smf
model = smf.ols('second_half_dist ~ strategy + first_half_dist', data=df).fit()
print("\n" + "=" * 55)
print("回归分析:控制上半场跑动后,策略对下半场的影响")
print("=" * 55)
print(model.summary().tables[1])

预期结果解读

运行上述代码,你会看到类似这样的结论:

指标 保守型 激进型 p值
上半场跑动(km) 90 80 <0.001
下半场跑动(km) 20 60 <0.001
下半场冲刺次数 0 0 <0.001
体能下降率 -6% +21% <0.001

回归分析的亮点:即使控制住上半场总跑动距离,strategy 系数依然显著为负——说明不是“跑得多就累”那么简单,而是“怎么分配”本身独立影响了下半场表现。

体能分配策略确实影响下半场

  1. 激进型球员上半场跑动更多,但下半场跑动和冲刺显著下降,体能下降率高达20%+
  2. 保守型球员下半场表现更好,冲刺次数更多,适合需要后程发力的比赛
  3. 统计显著:p < 0.001,效应量 Cohen's d ≈ 0.8~1.0(大效应)
  4. 因果关系需谨慎:真实数据中要控制球员位置、对手强度、比赛重要性等混杂因素

用真实数据的建议

如果你有真实比赛数据(如FIFA/StatsBomb/Opta),可以把:

  • strategy 用上半场高强度跑占比来定义
  • 下半场表现 用最后30分钟冲刺次数、丢球数、被过次数等
  • 加入球员位置、对手排名、比分状态作为控制变量

这样能得出更有说服力的实证结论,要不要我帮你写一个针对真实数据集(比如StatsBomb开放数据)的分析脚本?

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