python案例认为一周双赛影响有多大?

wen python案例 5

用Python分析"一周双赛"对球队表现的影响

下面是一个完整的案例,展示如何用Python量化"一周双赛"(一周内踢两场比赛)对球队战绩的影响。

python案例认为一周双赛影响有多大?

分析思路

核心问题是:同一支球队,在休息时间短(一周双赛)vs 休息时间充足时,表现是否有显著差异?

关键设计:

  1. 控制变量:只看同一支球队,避免强弱队差异
  2. 定义双赛:两场比赛间隔 ≤ 4 天(约3-4天休息)
  3. 对比指标:胜率、场均积分、进球、失球、净胜球
  4. 统计检验:用 t 检验 / 卡方检验判断差异是否显著

模拟数据构建

import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(42)
# 模拟一支球队两个赛季的比赛数据
def generate_matches(n=76):
    dates = pd.date_range('2023-08-01', periods=n, freq='5D')  # 平均5天一场
    # 人为加入一些"一周双赛":随机把某些比赛间隔缩短
    adjusted = [dates[0]]
    for i in range(1, n):
        gap = np.random.choice([3, 4, 7, 10], p=[0.25, 0.15, 0.45, 0.15])
        adjusted.append(adjusted[-1] + pd.Timedelta(days=gap))
    rows = []
    for i, d in enumerate(adjusted):
        rest = (d - adjusted[i-1]).days if i > 0 else 7
        # 核心假设:休息少 -> 表现下降
        base_goals = 1.5 if rest >= 6 else 1.1
        base_conceded = 1.0 if rest >= 6 else 1.3
        goals = np.random.poisson(base_goals)
        conceded = np.random.poisson(base_conceded)
        pts = 3 if goals > conceded else (1 if goals == conceded else 0)
        rows.append({'date': d, 'rest_days': rest, 'goals': goals,
                     'conceded': conceded, 'points': pts,
                     'win': int(goals > conceded)})
    return pd.DataFrame(rows)
df = generate_matches()

分组对比

# 定义双赛:休息 ≤ 4 天
df['is_congested'] = df['rest_days'] <= 4
df = df.iloc[1:]  # 去掉第一场(无休息数据)
summary = df.groupby('is_congested').agg(
    场次=('points', 'size'),
    场均积分=('points', 'mean'),
    胜率=('win', 'mean'),
    场均进球=('goals', 'mean'),
    场均失球=('conceded', 'mean'),
)
summary['净胜球'] = summary['场均进球'] - summary['场均失球']
print(summary.round(3))

输出示例:

               场次   场均积分   胜率   场均进球  场均失球  净胜球
is_congested
False            47     1.660  0.511    1.532    0.979  0.553
True             28     1.036  0.286    1.107    1.321 -0.214

显著性检验

normal = df[~df['is_congested']]
congested = df[df['is_congested']]
# 1. 场均积分差异(t检验)
t, p = stats.ttest_ind(normal['points'], congested['points'])
print(f"积分差异: t={t:.3f}, p={p:.4f}")
# 2. 胜率差异(卡方检验)
table = pd.crosstab(df['is_congested'], df['win'])
chi2, p2, _, _ = stats.chi2_contingency(table)
print(f"胜率差异: chi2={chi2:.3f}, p={p2:.4f}")

若 p < 0.05,说明双赛带来的表现下滑统计显著,而非偶然波动。

可视化

fig, axes = plt.subplots(1, 3, figsize=(14, 4))
df.boxplot(column='points', by='is_congested', ax=axes[0])
axes[0].set_title('场均积分分布')
axes[0].set_xlabel('是否双赛')
df.boxplot(column='goals', by='is_congested', ax=axes[1])
axes[1].set_title('进球分布')
# 休息天数与积分的散点+趋势
axes[2].scatter(df['rest_days'], df['points'], alpha=0.4)
z = np.polyfit(df['rest_days'], df['points'], 1)
axes[2].plot(sorted(df['rest_days']), np.polyval(z, sorted(df['rest_days'])), 'r-')
axes[2].set_title('休息天数 vs 积分')
plt.tight_layout()
plt.show()

进阶:控制对手强度

上面的分析忽略了对手实力这一混杂因素(双赛往往发生在赛程密集期,对手也可能强弱不一),更严谨的做法:

import statsmodels.formula.api as smf
# 用对手排名作为协变量
df['opp_rank'] = np.random.randint(1, 21, len(df))  # 模拟对手排名
model = smf.ols('points ~ is_congested + opp_rank', data=df).fit()
print(model.summary())

看 is_congested 的系数和 p 值,即为排除对手强度后双赛的净效应。

典型结论(基于真实足球数据的经验)

在真实联赛数据中,多数研究发现的规律:

指标 双赛 vs 正常 说明
场均积分 下降约 3–0.5 分 影响中等
胜率 下降约 8–15 个百分点 有明显但非决定性
失球 增加更明显 体能影响防守 > 进攻
强队 vs 弱队 强队受影响更小 阵容深度是关键
赛季末 影响放大 累积疲劳

关键提醒

  1. 样本量要够:单队一赛季双赛可能只有 10–20 场,统计功效低,建议合并多队/多赛季。
  2. 区分主客场:双赛若含客场长途奔波,影响更大,应作为交互项。
  3. "一周双赛"定义:间隔 3 天 vs 4 天效果不同,建议做敏感性分析。
  4. 因果 vs 相关:赛程密集常与杯赛/欧战同期,球队可能主动轮换,需注意选择性偏差。

需要我把这个案例改成真实数据接口(如 football-data.org API)或加入多队面板回归的完整代码吗?

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