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

wen python案例 2

本文目录导读:

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

  1. 核心方法(按难度排序)
  2. Python实战案例(核心方法)
  3. 实操注意事项(避免犯大错)
  4. 商业结论输出(你最终要写进报告的)
  5. 总结代码速查表

量化主队球迷人数对比赛结果(或其他指标)的影响,在体育数据分析中非常常见,由于主队球迷人数(现场观众)与主队胜率高度相关(且存在内生性),直接做简单回归会得出“球迷多所以赢球多”的误导结论。

以下是6个核心量化方法,从简单到复杂,最后附上Python代码实战案例(以足球为例)。


核心方法(按难度排序)

描述性统计与可视化(相关性分析)

目的:初步观察趋势。 做法:计算主队球迷人数与主队胜率、净胜球的皮尔逊相关系数,并绘制散点图。

多元线性回归(控制变量)

目的:剔除球队实力差异。 做法:控制球队历史排名、身价、近期战绩等因素,单独看观众人数的回归系数。

面板数据固定效应(最常用)

目的:消除球队自身特质(如豪门球迷基数大且总赢球)。 做法:使用球队固定效应,比较同一支球队在“主场人多”和“主场人少”时的表现差异。

工具变量法(破解内生性)

目的:解决“球迷是因比赛精彩才来,还是来了比赛才精彩”的问题。 做法:用“天气”“当地是否节假日”作为工具变量,因为天气好/放假会带来更多观众,但不直接影响比赛结果。

分位点回归

目的:观察不同比赛阶段的影响。 做法:看球迷数量对比赛0-15分钟进球率的影响(早期进球往往能锁定胜局)。

机器学习特征重要性

目的:验证非线性影响。 做法:用随机森林/XGBoost,输入球迷人数、主客场等特征,输出胜率,查看特征重要性。


Python实战案例(核心方法)

数据准备(模拟数据,包含内生性)

假设你有历史比赛数据:attendance(场均观众),home_team_rating(主队身价),away_team_rating(客队身价),result(主队赢=1,平/负=0)。

import pandas as pd
import numpy as np
import statsmodels.api as sm
from linearmodels.panel import PanelOLS
import matplotlib.pyplot as plt
import seaborn as sns
# 模拟数据(50支球队,每队10个主场)
np.random.seed(42)
teams = [f'Team_{i}' for i in range(50)]
n_seasons = 10
data = []
for team in teams:
    for season in range(n_seasons):
        # 球队实力(随机)
        strength = np.random.normal(0, 1)
        # 球迷人数:受球队实力和随机误差影响(内生性来源)
        attendance = 30000 + 5000*strength + np.random.normal(0, 3000)
        # 比赛结果:受球队实力和球迷额外激励(真实效应)
        win_prob = 1 / (1 + np.exp(-(0.5*strength - 0.3*strength_away + 0.00002*(attendance-30000))))
        result = np.random.binomial(1, win_prob)
        data.append({
            'team': team, 
            'season': season,
            'strength': strength,  # 主队实力
            'attendance': attendance,
            'win': result
        })
df = pd.DataFrame(data)
# 增加客队实力变量(简化,假设为0)
df['opp_strength'] = np.random.normal(0, 1, len(df))

方法1:简单线性回归(会得到误导性结果)

X = sm.add_constant(df[['attendance', 'strength', 'opp_strength']])
y = df['win']
model = sm.OLS(y, X).fit()
print(model.summary())

结果解读:你会发现attendance的系数显著为正,但这混入了球队实力的影响(强队球迷多且容易赢)。


方法2:固定效应(剔除球队个体差异)

from linearmodels.panel import PanelOLS
# 设置面板索引
df = df.set_index(['team', 'season'])
# 固定效应模型(控制球队自身特质)
exog = sm.add_constant(df[['attendance', 'strength', 'opp_strength']])
fe_model = PanelOLS(df['win'], exog, entity_effects=True).fit(cov_type='clustered', cluster_entity=True)
print(fe_model)

结果解读:此时attendance的系数会大幅缩小,因为它只反映同一支球队在不同上座率下的表现差异,如果系数仍然显著且为正(如0.00005),说明每增加1000名观众,主队胜率提升约5%。


方法3:工具变量法(用“周末”作为工具变量)

from linearmodels.iv import IV2SLS
# 构造工具变量:是否为周末(周末观众多,但不直接影响实力)
df['is_weekend'] = np.random.choice([0, 1], size=len(df), p=[0.7, 0.3])  # 模拟
df['attendance_iv'] = df['attendance'] * df['is_weekend']  # 交互项作为工具变量
# 第一阶段:用工具变量预测 attendance (简化,实际需两阶段)
# 直接使用 IV2SLS 类
formula = 'win ~ strength + opp_strength + [attendance ~ is_weekend]'
iv_model = IV2SLS.from_formula(formula, data=df.reset_index()).fit()
print(iv_model.summary)

结果解读:工具变量的结果与OLS差异大,说明内生性严重,如果工具变量有效,该系数才是“球迷真正推动比赛结果”的无偏估计。


方法4:分不同比赛阶段(时间效应)

如果想看球迷人数对上半场的影响,你可以将 win 替换为 first_half_goals(上半场进球数),再用负二项回归(泊松回归的扩展)分析。

import statsmodels.discrete.discrete_model as dm
# 假设有上半场进球数
df['first_half_goals'] = np.random.poisson(0.5 + 0.00001*df['attendance'])
# 泊松回归
model_poisson = dm.Poisson(df['first_half_goals'], sm.add_constant(df[['attendance', 'strength']])).fit()
print(model_poisson.summary())

结果解读:负二项或泊松回归的系数表示“每增加一个单位观众,进球数的对数变化”,若系数为0.00002,则每增加10000观众,上半场进球数增加约20%。


方法5:机器学习(XGBoost特征重要性)

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
X = df[['attendance', 'strength', 'opp_strength', 'is_weekend']]
y = df['win']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = RandomForestClassifier(n_estimators=200)
model.fit(X_train, y_train)
# 特征重要性
importances = pd.Series(model.feature_importances_, index=X.columns).sort_values(ascending=False)
print(importances)
# 边际效应:SHAP 值
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)

结果解读attendance 的SHAP值在低值时对胜率影响为负,高值时为正,且呈非线性关系,说明存在“临界点”(比如超过4万人带来额外优势)。


实操注意事项(避免犯大错)

  1. 必须控制球队实力:不带控制变量的回归就是耍流氓。
  2. 球迷人数存在“反向因果”:强强对话球迷多,比赛也激烈,必须用工具变量或固定效应。
  3. 使用对数形式:观众人数呈长尾分布,建议使用 np.log(attendance) 进行回归,此时系数解释为“弹性”(观众增加1%,胜率提升X%)。
  4. 引入交互项:看球迷影响是否在弱队身上更明显(爆冷效应)。attendance * strength 的交互项。

商业结论输出(你最终要写进报告的)

如果经过固定效应模型后,系数为 00001

  • 含义:在同一支球队内,观众每增加10,000人,主队获胜概率提高约10%(在基础胜率50%附近)。
  • 折现价值:假设球队平均主场比赛带来200万欧元收入(门票+周边),额外增加1万观众带来的胜率提升,可能转化为额外1-2个积分,对应下赛季赞助费增加50万欧元——这就是球迷影响力货币化

总结代码速查表

方法 代码核心 适用场景
简单回归 sm.OLS 粗略看看
面板固定 PanelOLS 学术论文首选
工具变量 IV2SLS 应对内生性
泊松回归 dm.Poisson 计算进球数影响
XGBoost+SHAP shap 非线性检测

在实际操作中,建议至少跑固定效应 + 工具变量两种,如果系数方向一致,结论就非常扎实了。

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