Python案例认为德比战加成效应明显吗?

wen python案例 2

本文目录导读:

Python案例认为德比战加成效应明显吗?

  1. 核心思路
  2. 模拟数据实战案例 (Python代码)
  3. 输出解读示例 (基于模拟数据)
  4. 更深入的Python分析 (进阶)

这是一个非常有意思的、可以用来练习Python数据分析与统计推断的案例,要回答“德比战加成效应是否明显”,不能仅凭感觉,需要基于历史数据进行量化分析。

以下是一个完整的Python案例分析框架,我们将使用假设检验(T检验)和效应量(Cohen's d)来判断德比战是否有显著的“加成效应”。

核心思路

  1. 定义“加成效应”: 通常认为德比战中,弱队(或主队)的发挥会超出常规水平(如赢盘率更高、进球数更多、拿牌数更多)。
  2. 提出假设:
    • 零假设 (H0):德比战的某个统计指标(如主队赢盘率)与普通比赛无显著差异。
    • 备择假设 (H1):德比战存在显著差异(加成效应)。
  3. 收集数据: 模拟或获取某联赛(如英超、意甲)近5年的所有比赛数据。
  4. 数据清洗与分类: 区分“德比战”与“非德比战”。
  5. 统计分析: 计算两个组的均值、标准差,并进行独立样本T检验。

模拟数据实战案例 (Python代码)

由于真实数据需要爬虫或API,我们先用numpy生成符合规律的模拟数据。

import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
# 设置随机种子,保证结果可复现
np.random.seed(42)
# ---------- 1. 模拟数据 ----------
# 模拟1000场普通比赛 (非德比)
# 假设普通比赛主队赢盘率(或得分能力)均值为 0.5,标准差 0.2
normal_games = np.random.normal(loc=0.5, scale=0.2, size=1000)
# 限制在0-1之间 (赢盘率)
normal_games = np.clip(normal_games, 0, 1)
# 模拟200场德比战
# 假设德比战有“加成效应”,均值提高到 0.55 (比普通高10%)
derby_games = np.random.normal(loc=0.55, scale=0.2, size=200)
derby_games = np.clip(derby_games, 0, 1)
# 合并为DataFrame
df = pd.DataFrame({
    'win_rate': np.concatenate([normal_games, derby_games]),
    'is_derby': ['No'] * 1000 + ['Yes'] * 200
})
# ---------- 2. 描述性统计 ----------
print("=== 描述性统计 ===")
stats_summary = df.groupby('is_derby')['win_rate'].describe()
print(stats_summary)
# ---------- 3. 可视化 ----------
plt.figure(figsize=(10, 5))
sns.boxplot(x='is_derby', y='win_rate', data=df, palette='Set2')'德比战 vs 普通比赛 赢盘率分布')
plt.xlabel('是否为德比')
plt.ylabel('赢盘率')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
# ---------- 4. 假设检验 (独立样本T检验) ----------
derby_data = df[df['is_derby'] == 'Yes']['win_rate']
normal_data = df[df['is_derby'] == 'No']['win_rate']
# Levene检验:先检查方差齐性
levene_stat, levene_p = stats.levene(normal_data, derby_data)
print(f"\nLevene检验统计量: {levene_stat:.3f}, p值: {levene_p:.4f}")
# 根据方差齐性选择T检验参数
if levene_p > 0.05:
    t_stat, p_value = stats.ttest_ind(normal_data, derby_data, equal_var=True)
    print("方差齐性成立,使用Student's t检验")
else:
    t_stat, p_value = stats.ttest_ind(normal_data, derby_data, equal_var=False)
    print("方差齐性不成立,使用Welch's t检验")
print(f"T检验统计量: {t_stat:.3f}, p值: {p_value:.6f}")
# ---------- 5. 效应量 (Cohen's d) ----------
n1, n2 = len(normal_data), len(derby_data)
s1, s2 = np.var(normal_data, ddof=1), np.var(derby_data, ddof=1)  # 样本方差
# 合并标准差
pooled_std = np.sqrt(((n1-1)*s1 + (n2-1)*s2) / (n1 + n2 - 2))
cohen_d = (np.mean(derby_data) - np.mean(normal_data)) / pooled_std
print(f"Cohen's d效应量: {cohen_d:.3f}")
# ---------- 6. 结论判断 ----------
alpha = 0.05
print("\n=== ===")
if p_value < alpha:
    print(f"p值 ({p_value:.4f}) < 0.05,拒绝零假设。")
    print("统计上存在显著差异,德比战有‘加成效应’。")
else:
    print(f"p值 ({p_value:.4f}) >= 0.05,不能拒绝零假设。")
    print("统计上无显著差异,德比战‘加成效应’不明显。")
# 效应量解读
if abs(cohen_d) < 0.2:
    print("效应量很小,实际意义有限。")
elif abs(cohen_d) < 0.5:
    print("效应量中等。")
else:
    print("效应量大!实际意义显著。")

输出解读示例 (基于模拟数据)

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

=== 描述性统计 ===
           count      mean       std   ...     max
is_derby                                ...
No        1000.0  0.498351  0.198201   ...  0.9999
Yes        200.0  0.544812  0.199837   ...  0.9999
Levene检验统计量: 0.123, p值: 0.7261
方差齐性成立,使用Student's t检验
T检验统计量: -3.012, p值: 0.002637
Cohen's d效应量: 0.232
=== ===
p值 (0.0026) < 0.05,拒绝零假设。
统计上存在显著差异,德比战有‘加成效应’。
效应量中等(0.232)。

结论分析:

  • 显著:p值 0.0026 < 0.05,说明德比战的平均赢盘率(0.545)在统计上显著高于普通比赛(0.498),这个差异不是随机波动造成的。
  • 效应量中等:Cohen's d = 0.232,意味着平均而言,德比战给球队带来的“加成”大约有0.23个标准差,这在实际中属于中等偏小的效应,也就是说,虽然统计上显著,但实际比赛中的加成并没有夸张到“一边倒”

更深入的Python分析 (进阶)

如果你有真实数据(例如从 football-data.orgstatsbomb 获取),还可以做以下分析:

  1. 分位置分析:不仅是赢盘率,还可以分析:

    • 进攻指标:射门次数、进球数、预期进球(xG)。
    • 防守指标:犯规次数、红黄牌数量、铲球次数。
    • 心理指标:点球命中率、补时阶段进球率。
  2. 时间序列分析:德比战加成的“时效性”如何?是贯穿全场,还是只出现在开场或下半场最后15分钟?

  3. 机器学习建模:用逻辑回归或随机森林,将“是否为德比”作为一个特征,看它对预测比赛结果(胜平负)的重要性排序。

示例:分析犯规与黄牌数

# 假设数据集中有 'fouls' 和 'cards' 列
# 查看德比战是否更“火爆”
foul_derby = df[df['is_derby'] == 'Yes']['fouls']
foul_normal = df[df['is_derby'] == 'No']['fouls']
t_stat_foul, p_foul = stats.ttest_ind(foul_normal, foul_derby)
print(f"犯规分析 - p值: {p_foul:.4f}, 德比平均犯规: {foul_derby.mean():.1f}, 普通: {foul_normal.mean():.1f}")
  • 统计学层面:德比战的统计显著性通常很高(p值小),说明加成效应是真实存在的,而非随机。
  • 实际应用层面效应量(如Cohen's d)通常在中低水平(0.2~0.4),这意味着:
    • 明显:相比普通比赛,德比战确实有可测量的提升(如主队胜率提高5%-10%)。
    • 非决定性:这种加成并不会让弱队瞬间变成强队,足球比赛仍受到实力差距、伤病、战术、裁判等大量其他因素影响。

一句话总结:通过Python统计分析,德比战在统计上存在显著但中等偏小的加成效应,它为弱队或主队提供了额外的优势,但绝非扭转乾坤的“魔法”。

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