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

wen python案例 2

本文目录导读:

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

  1. 第一步:定义“球迷影响”的量化指标
  2. 第二步:数据集准备(假设已有数据)
  3. 第三步:特征工程(核心步骤)
  4. 第四步:模型构建(量化影响系数)
  5. 第五步:因果推断(如果你想回答“如果球迷人数翻倍会怎样?”)
  6. 第六步:可视化(直观展示)
  7. 第七步:业务结论提炼(输出报告)
  8. 注意事项(防坑指南)

量化主队球迷人数(主场优势)对比赛结果的影响,是足球数据分析中的经典课题,由于“球迷人数”是一个动态且复杂的变量,我们需要把它拆解为可量化的指标,并结合机器学习和统计学模型。

以下是完整的Python实战指南,从数据清洗到模型评估,帮你构建一个量化框架。


第一步:定义“球迷影响”的量化指标

不能直接用“人数”本身,因为10万人球场和1万人球场的满座率不同,建议用以下指标:

  1. 上座率 = 现场人数 / 球场容量。
  2. 客场压力指数 = 球迷人数 / 客场球队历史平均客场表现。
  3. 主场氛围强度(衍生变量):结合“上座率”与“比赛时段”(夜场 vs 日场)、“德比属性”(是否同城死敌)交叉生成。

第二步:数据集准备(假设已有数据)

假设你有英超或中超的历史数据,字段包含:

  • match_idhome_teamaway_team
  • attendance(现场人数)
  • capacity(球场容量)
  • home_scoreaway_score(比分)
  • datecompetitionis_derby(是否德比)

我们生成一个模拟数据集用于演示:

import pandas as pd
import numpy as np
# 生成模拟数据(实际使用时替换为真实数据)
np.random.seed(42)
n = 5000
data = pd.DataFrame({
    'match_id': range(n),
    'attendance': np.random.randint(10000, 75000, n),
    'capacity': np.random.randint(18000, 80000, n),
    'home_score': np.random.poisson(1.5, n),
    'away_score': np.random.poisson(1.2, n),
    'is_derby': np.random.choice([0, 1], n, p=[0.9, 0.1]),
    'kickoff_time': np.random.choice(['day', 'night'], n, p=[0.5, 0.5]),
    'home_avg_points': np.random.uniform(0.5, 2.5, n),  # 主队赛季场均积分
    'away_avg_points': np.random.uniform(0.5, 2.5, n),
})

第三步:特征工程(核心步骤)

量化球迷影响的关键是构造交互特征归一化

# 1. 基础指标:上座率
data['occupancy_rate'] = data['attendance'] / data['capacity']
# 2. 球迷数量相对强度:主队球迷占球场比例(假设主队球迷占全场的85%)
data['home_fan_ratio'] = 0.85  # 固定比例,实际可微调
data['effective_home_fans'] = data['attendance'] * data['home_fan_ratio']
# 3. 相对实力校正:球迷影响应结合球队实力看,弱队的主场更依赖球迷
data['weighted_home_adv'] = data['occupancy_rate'] * (1 / (data['home_avg_points'] + 0.1))
# 4. 时间交互:夜店+高上座 vs 日场+低上座
data['night_x_occ'] = data['kickoff_time'].apply(lambda x: 1 if x == 'night' else 0) * data['occupancy_rate']
# 5. 德比加成
data['derby_x_occ'] = data['is_derby'] * data['occupancy_rate']
# 6. 目标变量:胜平负(主队视角)
data['home_win'] = (data['home_score'] > data['away_score']).astype(int)
data['home_draw'] = (data['home_score'] == data['away_score']).astype(int)
data['home_lose'] = (data['home_score'] < data['away_score']).astype(int)

第四步:模型构建(量化影响系数)

这里对比两种方法,你可以按需选择。

方法A:线性概率模型(可解释性强)

import statsmodels.api as sm
# 自变量(核心是上座率和交互项)
X = data[['occupancy_rate', 'night_x_occ', 'derby_x_occ', 'home_avg_points', 'away_avg_points']]
X = sm.add_constant(X)
y = data['home_win']
# 使用logit模型(因变量是0/1)
model = sm.Logit(y, X).fit()
print(model.summary())

输出解释

  • occupancy_rate的系数:每增加1%的上座率,主队赢球的概率变化多少,比如系数为0.3,意味着上座率从60%提升到70%(增加0.1),则赢球概率增加约0.03(3%)。

方法B:随机森林 + 特征重要性(非线性捕捉)

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
features = ['occupancy_rate', 'night_x_occ', 'derby_x_occ', 'home_avg_points', 'away_avg_points', 'effective_home_fans']
X = data[features]
y = data['home_win']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
rf = RandomForestClassifier(n_estimators=200, random_state=42)
rf.fit(X_train, y_train)
# 特征重要性
importance = pd.DataFrame({'feature': features, 'importance': rf.feature_importances_})
print(importance.sort_values('importance', ascending=False))

输出解释occupancy_rate的重要性较高,说明球迷上座率对预测主队胜负有显著贡献。


第五步:因果推断(如果你想回答“如果球迷人数翻倍会怎样?”)

简单回归只是相关性,要量化“因果影响”,推荐使用双重差分(DID)工具变量法,因为空场(如2020年疫情)是一个天然实验:

# 假设有疫情前后数据
# 'is_empty_stadium' = 1 表示空场比赛
# 构造交互项:空场 * 主场
# DID模型
data['treated'] = data['is_empty_stadium']  # 空场 = 处理组
data['post'] = (data['date'] > '2020-03-01').astype(int)  # 疫情后
data['did_interaction'] = data['treated'] * data['post']
# 回归:
# y = home_win ~ treated + post + did_interaction + 控制变量

结果解读did_interaction的系数就是“球迷减少对主队胜率的因果影响”,如果系数为负,说明有球迷时主队赢球率更高。


第六步:可视化(直观展示)

import matplotlib.pyplot as plt
import seaborn as sns
# 1. 箱线图:不同上座率区间的胜率
data['occ_group'] = pd.cut(data['occupancy_rate'], bins=[0, 0.4, 0.6, 0.8, 1.0], labels=['低', '中低', '中高', '高'])
sns.barplot(x='occ_group', y='home_win', data=data)'上座率 vs 主队胜率')
plt.show()
# 2. 散点图 + 拟合线
sns.lmplot(x='attendance', y='home_score', data=data, scatter_kws={'alpha':0.1})'场均进球 vs 到场球迷数')
plt.show()

第七步:业务结论提炼(输出报告)

根据模型输出,你可以得出以下量化结论:

  1. 边际效应:上座率每上升10%,主队获胜的概率提升约X%。
  2. 非线性阈值:当上座率超过75%时,胜率提升显著加速(可通过分段回归验证)。
  3. 交互效应:夜场+高上座率的胜率比日场+高上座率高Y%——说明聚光灯下的氛围更压抑客队。
  4. 德比效应:德比战中的球迷加成是普通比赛的Z倍。

注意事项(防坑指南)

  • 多重共线性attendancecapacity高度相关,建议直接使用occupancy_rate
  • 时间趋势:需加入时间固定效应(赛季、轮次),防止疫情空场和赛季末摆烂干扰。
  • 客场质量:控制“客队实力”必不可少,否则会高估球迷影响。
  • 样本量:至少需要3个赛季以上数据(>2000场)才能得到稳定统计。

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