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

wen python案例 1

本文目录导读:

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

  1. 核心思路:用“主场优势”作为代理变量
  2. 案例 1:使用线性回归量化空场与满场的胜率差异(以英超为例)
  3. 案例 2:使用泊松回归量化进球数影响(更精确的足球模型)
  4. 案例 3:进阶 - 用支持向量回归(SVR)或XGBoost捕捉非线性影响
  5. 案例 4:量化具体数值——“1万球迷等于多少个进球?”
  6. 数据处理建议:

量化主队球迷人数对比赛结果的影响,在体育数据分析和博彩行业中是一个经典问题,由于没有精确的现场逐人计数统计,通常是通过替代指标(Proxy)回归模型来间接量化。

以下是几个主流的量化思路和Python实战案例,从简单到复杂排列:

核心思路:用“主场优势”作为代理变量

球迷的影响是“主场优势”的最大组成部分之一,我们可以量化“主场优势”的百分比,并进一步分析在无观众(空场)有观众情况下的差异,以此来剥离出球迷的具体影响力。


案例 1:使用线性回归量化空场与满场的胜率差异(以英超为例)

这是最直接的量化方式,利用疫情期间(2020-2021)的空场比赛数据,与常规赛季进行对比。

逻辑: 如果球迷影响巨大,那么空场时主队胜率会显著下降,平局或客队胜率会上升。

import pandas as pd
import numpy as np
import statsmodels.api as sm
# 假设数据格式: [season, matchday, home_team, away_team, home_goals, away_goals, crowd_pct]
# crowd_pct: 1.0 代表满场,0.0 代表空场(COVID期间)
data = pd.DataFrame({
    'season': ['2018-19']*100 + ['2019-20']*100 + ['2020-21']*100 + ['2021-22']*100,
    'home_goals': np.random.poisson(1.5, 400),
    'away_goals': np.random.poisson(1.2, 400),
    # 核心:空场设为0,满场设为1(模拟数据)
    'has_crowd': [1]*300 + [0]*100
})
# 计算每场比赛的结果特征
data['home_win'] = (data['home_goals'] > data['away_goals']).astype(int)
data['total_goals'] = data['home_goals'] + data['away_goals']
# --- 量化1:对主队胜率的影响 ---
import statsmodels.formula.api as smf
# 使用Logistic回归(因为胜负是二分类)
model = smf.logit("home_win ~ has_crowd", data=data).fit()
print(model.summary())
# 输出解释:has_crowd的系数显著为正,意味着有球迷时主队获胜的几率比(Odds)更高。
# 可以计算:exp(coef) 即为几率比(Odds Ratio)。
odds_ratio = np.exp(model.params['has_crowd'])
print(f"有球迷时,主队获胜的几率比是空场时的 {odds_ratio:.2f} 倍")

案例 2:使用泊松回归量化进球数影响(更精确的足球模型)

足球进球是计数数据,使用泊松回归(Poisson Regression)更合理,我们可以将上座率作为连续变量(0%~100%)纳入模型,不仅看胜负,还看进球数的变化。

逻辑: 主场球迷会给主队进攻端增加“气势力”,同时给客队造成“客场压力”。

# 转向泊松回归,预测进球数
# 需要将每场比赛拆分成两个观测值(主队视角和客队视角)
df_home = data[['home_team', 'away_team', 'home_goals', 'has_crowd']].copy()
df_home.columns = ['team', 'opponent', 'goals', 'has_crowd']
df_home['is_home'] = 1
df_away = data[['away_team', 'home_team', 'away_goals', 'has_crowd']].copy()
df_away.columns = ['team', 'opponent', 'goals', 'has_crowd']
df_away['is_home'] = 0
df_model = pd.concat([df_home, df_away], ignore_index=True)
# 使用Statsmodels的GLM(广义线性模型)
import statsmodels.api as sm
model_poisson = sm.GLM(
    df_model['goals'],
    sm.add_constant(df_model[['has_crowd', 'is_home']]),
    family=sm.families.Poisson()
).fit()
print(model_poisson.summary())
# 解释:
# is_home系数 = 平时主场优势带来的进攻增益
# has_crowd系数 = 球迷每增加1%(1.0为满场),对进球数的边际影响。
# 若系数为0.12,则满场比空场多 exp(0.12) - 1 ≈ 12.7% 的进球概率强度。

案例 3:进阶 - 用支持向量回归(SVR)或XGBoost捕捉非线性影响

如果只是线性回归,可能无法捕捉“球迷在比赛最后10分钟对落后球队的影响”或“死忠看台位置的影响”,此时可以用机器学习模型。

逻辑: 引入更多特征(如两队排名差、比赛重要性、赛程密度等),训练模型预测胜平负,然后看上座率这个特征在模型中的SHAP值

# 假设有更丰富的数据特征
# 特征:上座率、主客场、周中赛、主队前一场体能消耗、德比战等等
# 使用XGBoost预测主队是否赢球
import xgboost as xgb
import shap
# 构建特征矩阵 X(假设已经处理好数据)
X = pd.DataFrame({
    'attendance_pct': np.random.rand(500),  # 0~1之间的上座率
    'home_team_rank_diff': np.random.randint(-10, 10, 500),
    'is_derby': np.random.randint(0, 2, 500),
    'days_since_last_match': np.random.randint(3, 10, 500)
})
y = np.random.randint(0, 2, 500)  # 1代表主队获胜
model = xgb.XGBClassifier()
model.fit(X, y)
# 使用SHAP解释模型
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
# 查看‘上座率’特征的重要性
shap.summary_plot(shap_values, X, plot_type="bar")
# 或者查看具体的SHAP依赖图(看是否是非线性的)
shap.dependence_plot("attendance_pct", shap_values, X)

案例 4:量化具体数值——“1万球迷等于多少个进球?”

这是一个非常落地的问题,我们可以通过计算水平对比得出“球迷对裁判施压”或“对球队士气”的等效数值。

# 假设我们已经建立了泊松回归模型(参考案例2)
# 模型参数假设为:
# Intercept (截距): 0.2 (基础进攻强度)
# has_crowd (球迷系数): 0.15
# is_home (主场优势其他因素,如场地熟悉度): 0.25
# 量化过程:
# 如果一个球员的能力值(例如当前前锋状态评分)每增加0.1,进球强度增加0.05。
# 球迷带来的效果(0.15)相当于前锋状态分提升了 0.15 / 0.05 * 0.1 = 0.3 分。
# 更直观的:进球数通常基于泊松分布 lambda = exp(XB)。
# 满场(1.0)的 lambda = exp(0.2 + 0.15 + 0.25) = exp(0.6) = 1.82
# 空场(0.0)的 lambda = exp(0.2 + 0.0 + 0.25) = exp(0.45) = 1.57
print(f"满场预计进球: {np.exp(0.6):.2f}")
print(f"空场预计进球: {np.exp(0.45):.2f}")
print(f"1万满场球迷额外带来了 {np.exp(0.6) - np.exp(0.45):.2f} 个进球数")

数据处理建议:

  1. 数据来源:需要抓取或购买联赛官方数据(如英超、NBA官方API)。
  2. “球员”噪音:在回归时,一定要控制球队强弱(例如用Elo评级或联赛排名),否则强队主场球迷多和弱队主场球迷少会混淆变量。
  3. 时间维度:注意赛季尺度,冬窗转会会改变球队实力,赛季末保级队球迷的“第12人”作用会呈指数级上升(非线性),要考虑加入“比赛重要性”交互项。

Python量化的核心在于变量分离,通常最稳妥的方案是:

  1. statsmodelsLogistic回归(看胜率)。
  2. 泊松回归(看进球数)。
  3. SHAP值(看非线性复杂影响)。

最终输出建议用比值比(Odds Ratio)边际进球数(Marginal Goals)来向业务方(如教练组或博彩公司)解释量化结果。

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