综合赛后python案例,主客场因素影响多大?

wen python案例 3

赛后Python案例分析:主客场因素影响评估

下面我用一个完整的Python案例,演示如何量化分析主客场因素对比赛结果的影响,这里以NBA/足球类比赛数据为例(可替换为你的实际数据)。

综合赛后python案例,主客场因素影响多大?

数据准备与特征构造

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score
# 假设数据格式:home_team, away_team, home_score, away_score
# df = pd.read_csv('matches.csv')
# 构造目标变量
df['home_win'] = (df['home_score'] > df['away_score']).astype(int)
df['draw']    = (df['home_score'] == df['away_score']).astype(int)
df['point_diff'] = df['home_score'] - df['away_score']

基础统计:主客场胜率对比

total = len(df)
home_wins = df['home_win'].sum()
draws = df['draw'].sum()
away_wins = total - home_wins - draws
print(f"主胜率: {home_wins/total:.2%}")
print(f"平局率: {draws/total:.2%}")
print(f"客胜率: {away_wins/total:.2%}")

典型结果(NBA):主胜约 58%-60%,客胜约 40%-42%(无平局)。 典型结果(英超):主胜 ~45%,平 ~25%,客胜 ~30%。

👉 主胜率比客胜率高出约 15-20 个百分点,这是主客场因素的最直观体现。

显著性检验:主客场差异是否真实存在

# 单样本t检验:检验主队场均净胜分是否显著>0
t_stat, p_val = stats.ttest_1samp(df['point_diff'], 0)
print(f"t={t_stat:.3f}, p={p_val:.4f}")
# p < 0.001 表示主场优势显著
# 卡方检验:主胜 vs 客胜的分布是否均匀
from scipy.stats import chisquare
chi2, p = chisquare([home_wins, away_wins])
print(f"chi2={chi2:.2f}, p={p:.4f}")

控制球队实力后的净效应(关键!)

直接比较会混淆"主场优势"与"球队实力差异",需用固定效应回归分离:

import statsmodels.formula.api as smf
# 用球队哑变量控制实力,home 系数即为主场净效应
model = smf.ols('point_diff ~ home + C(home_team) + C(away_team)', data=df).fit()
print(model.params['home'])          # 主场净胜分(剔除实力后)
print(model.pvalues['home'])

经验值:

  • NBA:主场净效应约 +2.5 至 +3.0 分
  • 英超/五大联赛:主场净效应约 +0.3 至 +0.4 球
  • 换算成胜率概率提升:约 +8% ~ +12%

逻辑回归量化主场的胜率贡献

X = pd.get_dummies(df[['home_team', 'away_team']], drop_first=True)
X['is_home'] = 1  # 主队视角
y = df['home_win']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
clf = LogisticRegression(max_iter=1000).fit(X_train, y_train)
print(f"AUC: {roc_auc_score(y_test, clf.predict_proba(X_test)[:,1]):.3f}")
# 主队系数取指数 → 主场带来的胜率倍数
odds_ratio = np.exp(clf.coef_[0][X.columns.get_loc('is_home')])
print(f"主场胜率odds比: {odds_ratio:.2f}")

分场景细化影响

# 1) 强队主场 vs 弱队主场
df['strength_diff'] = df.groupby('home_team')['home_win'].transform('mean') \
                    - df.groupby('away_team')['home_win'].transform('mean')
bins = pd.qcut(df['strength_diff'], 4, labels=['弱主','中弱','中强','强主'])
print(df.groupby(bins)['home_win'].mean())
# 结果:强队主场胜率可达 70%+,弱队主场仅 45% 左右
# 2) 背靠背 / 休息天数
df['rest_diff'] = df['home_rest'] - df['away_rest']
print(df.groupby(pd.cut(df['rest_diff'], [-5,-1,0,1,5]))['home_win'].mean())

主客场因素影响量化

维度 影响幅度
主胜率 vs 客胜率 +15~20 个百分点
剔除实力后的净胜分 NBA +2.5~3 分;足球 +0.3~0.4 球
胜率概率提升(控制变量后) +8%~12%
强队主场效应 可放大至 +15% 以上
弱队主场效应 约 +5%,甚至不显著

核心结论:

  1. 主客场因素真实存在且统计显著(p<0.001)。
  2. 但原始胜率差被高估——部分来自"强队恰好主场多"的赛程效应,控制实力后净效应约为原始差距的 60%-70%。
  3. 主场优势在不同运动、不同球队强弱间差异明显:强队更受益于主场,弱队主场红利有限。
  4. 建模时若忽略主客场,模型AUC通常下降 03-0.05,属于必须保留的特征。

如果你能提供实际数据字段(赛种、字段名),我可以把上面的代码改写成可直接运行的版本,并输出你数据的真实主客场影响系数。

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

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝