python案例如何量化主队球迷人数影响?

wen python案例 3

本文目录导读:

python案例如何量化主队球迷人数影响?

  1. 问题定义与变量设计
  2. 数据模拟(因为没有真实数据)
  3. 探索性分析
  4. 回归模型:量化影响
  5. 机器学习:非线性影响
  6. 因果推断:处理内生性
  7. 实用建议
  8. 真实数据来源推荐
  9. 完整结论示例

这是一个很有意思的体育数据分析问题,量化主队球迷人数对比赛结果的影响,通常需要结合体育经济学、统计学和机器学习的方法。

由于直接获取精确的“球迷人数”很困难(球场容量固定,但实际到场人数和影响力不同),我们通常用上座率、观众人数或客场球迷比例作为代理变量。

以下是一个完整的Python案例流程,涵盖数据模拟、特征工程、建模和因果推断思路。


问题定义与变量设计

目标:量化主队球迷人数(或上座率)对主队胜率/净胜球的影响。

核心变量:

  • 自变量:attendance(主队球迷人数)、capacity(球场容量)、attendance_rate(上座率)
  • 因变量:home_win(是否获胜)、goal_diff(净胜球)
  • 控制变量:球队实力差(Elo评分)、近期状态、休息天数、天气、是否德比等

难点:球迷人数与球队实力高度相关(强队吸引更多球迷),存在内生性,需要控制变量或使用工具变量。


数据模拟(因为没有真实数据)

import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
import matplotlib.pyplot as plt
import seaborn as sns
np.random.seed(42)
n = 2000
# 模拟球队实力(Elo差)
elo_diff = np.random.normal(0, 100, n)
# 球迷人数:受球队实力、球场容量、随机因素影响
capacity = np.random.choice([30000, 40000, 50000, 60000], n)
attendance_rate = 0.6 + 0.3 * (elo_diff / 200) + np.random.normal(0, 0.1, n)
attendance_rate = np.clip(attendance_rate, 0.3, 1.0)
attendance = (capacity * attendance_rate).astype(int)
# 主队胜率:受实力差 + 球迷人数 + 噪声影响
# 真实模型:logit(p) = 0.01*elo_diff + 0.00002*attendance
logit_p = 0.01 * elo_diff + 0.00002 * attendance - 0.5
p_home_win = 1 / (1 + np.exp(-logit_p))
home_win = np.random.binomial(1, p_home_win)
# 净胜球
goal_diff = 0.02 * elo_diff + 0.00003 * attendance + np.random.normal(0, 1.5, n)
df = pd.DataFrame({
    'elo_diff': elo_diff,
    'capacity': capacity,
    'attendance': attendance,
    'attendance_rate': attendance_rate,
    'home_win': home_win,
    'goal_diff': goal_diff
})
print(df.describe())

探索性分析

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# 上座率 vs 胜率
df['att_bin'] = pd.qcut(df['attendance_rate'], 5)
win_by_att = df.groupby('att_bin')['home_win'].mean()
win_by_att.plot(kind='bar', ax=axes[0], color='steelblue')
axes[0].set_title('上座率分箱 vs 主队胜率')
axes[0].set_ylabel('胜率')
# 球迷人数 vs 净胜球
sns.regplot(data=df, x='attendance', y='goal_diff', ax=axes[1], scatter_kws={'alpha':0.2})
axes[1].set_title('球迷人数 vs 净胜球')
plt.tight_layout()
plt.show()

回归模型:量化影响

1 线性概率模型(LPM)

X = df[['elo_diff', 'attendance']]
X = sm.add_constant(X)
y = df['home_win']
model = sm.Logit(y, X).fit()
print(model.summary())
# 边际效应:球迷每增加1000人,胜率变化多少
mfx = model.get_margeff()
print(mfx.summary())

2 净胜球模型(OLS)

X2 = sm.add_constant(df[['elo_diff', 'attendance']])
model_ols = sm.OLS(df['goal_diff'], X2).fit()
print(model_ols.summary())
# 解释:attendance系数 = 每增加1名球迷,净胜球增加多少

结果解读示例:

  • attendance 系数为 0.00003 → 每增加1000名球迷,净胜球增加 0.03
  • 若满场比半场多2万人 → 净胜球增加 0.6,相当于显著主场优势

机器学习:非线性影响

features = ['elo_diff', 'attendance', 'capacity', 'attendance_rate']
X_train, X_test, y_train, y_test = train_test_split(
    df[features], df['home_win'], test_size=0.2, random_state=42
)
clf = GradientBoostingClassifier(n_estimators=200, max_depth=3, random_state=42)
clf.fit(X_train, y_train)
pred = clf.predict_proba(X_test)[:, 1]
print(f"AUC: {roc_auc_score(y_test, pred):.3f}")
# 特征重要性
importance = pd.Series(clf.feature_importances_, index=features).sort_values()
importance.plot(kind='barh', title='特征重要性')
plt.show()
# 部分依赖图:球迷人数的非线性影响
from sklearn.inspection import PartialDependenceDisplay
PartialDependenceDisplay.from_estimator(clf, X_train, ['attendance'])
plt.show()

因果推断:处理内生性

球迷人数与球队实力相关,直接回归有偏,可用工具变量或固定效应。

工具变量(IV)

用球场容量作为工具变量(容量影响上座人数,但不直接影响比赛结果,除非容量本身代表俱乐部财力)。

from linearmodels.iv import IV2SLS
df['const'] = 1
iv_model = IV2SLS(
    df['goal_diff'],           # 因变量
    df[['const', 'elo_diff']], # 外生变量
    df['attendance'],          # 内生变量
    df['capacity']             # 工具变量
).fit()
print(iv_model.summary)

固定效应(控制球队)

如果有面板数据(多赛季),加入球队固定效应:

# 假设有 team_id 和 season
# df['team_fe'] = df['team_id']
# 使用 within 估计或加入哑变量

断点回归

如果球场有容量上限,当接近满座时,球迷人数受容量限制,可构造断点。


实用建议

问题 解决方案
球迷人数与实力共线 控制Elo、近期战绩、转会投入
反向因果(赢球吸引球迷) 使用赛前售票数据而非赛后统计
数据获取难 用上座率、电视收视率、社交媒体讨论量作代理
非线性 用GAM、随机森林、分位数回归
异质性 分联赛、分球队档次、分比赛重要性

真实数据来源推荐

  • Football-Data.co.uk:历史比赛结果+赔率
  • Transfermarkt:球队身价、观众人数
  • Kaggle:European Soccer Database
  • API-Football:实时上座数据

完整结论示例

在控制球队实力差后,主队球迷人数每增加10,000人,主队胜率提升约 2个百分点(p<0.01),净胜球增加约 28,上座率从60%提升到90%时,主场优势相当于Elo评分提升约 25分,工具变量回归显示因果效应略小于OLS估计,说明部分相关性来自强队吸引更多球迷。


如果你能提供具体数据(如某个联赛的CSV),我可以帮你写针对性的分析代码,你也可以告诉我关注的是胜率、进球数还是盘口,我调整模型设计。

上一篇综合赛后python案例,控球率低反而赢球?

下一篇当前分类已是最新一篇

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