本文目录导读:

- 第一步:定义“球迷影响”的量化指标
- 第二步:数据集准备(假设已有数据)
- 第三步:特征工程(核心步骤)
- 第四步:模型构建(量化影响系数)
- 第五步:因果推断(如果你想回答“如果球迷人数翻倍会怎样?”)
- 第六步:可视化(直观展示)
- 第七步:业务结论提炼(输出报告)
- 注意事项(防坑指南)
量化主队球迷人数(主场优势)对比赛结果的影响,是足球数据分析中的经典课题,由于“球迷人数”是一个动态且复杂的变量,我们需要把它拆解为可量化的指标,并结合机器学习和统计学模型。
以下是完整的Python实战指南,从数据清洗到模型评估,帮你构建一个量化框架。
第一步:定义“球迷影响”的量化指标
不能直接用“人数”本身,因为10万人球场和1万人球场的满座率不同,建议用以下指标:
- 上座率 = 现场人数 / 球场容量。
- 客场压力指数 = 球迷人数 / 客场球队历史平均客场表现。
- 主场氛围强度(衍生变量):结合“上座率”与“比赛时段”(夜场 vs 日场)、“德比属性”(是否同城死敌)交叉生成。
第二步:数据集准备(假设已有数据)
假设你有英超或中超的历史数据,字段包含:
match_id,home_team,away_teamattendance(现场人数)capacity(球场容量)home_score,away_score(比分)date,competition,is_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()
第七步:业务结论提炼(输出报告)
根据模型输出,你可以得出以下量化结论:
- 边际效应:上座率每上升10%,主队获胜的概率提升约X%。
- 非线性阈值:当上座率超过75%时,胜率提升显著加速(可通过分段回归验证)。
- 交互效应:夜场+高上座率的胜率比日场+高上座率高Y%——说明聚光灯下的氛围更压抑客队。
- 德比效应:德比战中的球迷加成是普通比赛的Z倍。
注意事项(防坑指南)
- 多重共线性:
attendance和capacity高度相关,建议直接使用occupancy_rate。 - 时间趋势:需加入时间固定效应(赛季、轮次),防止疫情空场和赛季末摆烂干扰。
- 客场质量:控制“客队实力”必不可少,否则会高估球迷影响。
- 样本量:至少需要3个赛季以上数据(>2000场)才能得到稳定统计。