综合赛后Python案例:主客场因素影响多大?
下面我用一个完整的Python分析案例来量化主客场因素(Home Advantage)的影响,数据用模拟的真实感数据(你也可以替换成自己的CSV)。

分析目标
回答三个问题:
- 主队胜率比客队高多少?
- 主队场均净胜分是多少?
- 主客场因素在不同球队/联赛中是否稳定?
数据准备
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
np.random.seed(42)
# 模拟一个赛季 30支球队 每队主场15场、客场15场
teams = [f"Team_{i:02d}" for i in range(1, 31)]
records = []
for home in teams:
for away in teams:
if home == away:
continue
# 模拟:主队有 +3 分的平均优势,波动 ±10
home_score = np.random.normal(100, 10)
away_score = np.random.normal(97, 10)
records.append({
"home_team": home,
"away_team": away,
"home_score": round(home_score),
"away_score": round(away_score),
"season": 2024
})
df = pd.DataFrame(records)
# 抽样到每对只打1场,模拟单循环
df = df.sample(frac=0.5, random_state=1).reset_index(drop=True)
df["home_win"] = df["home_score"] > df["away_score"]
df["point_diff"] = df["home_score"] - df["away_score"]
df.head()
核心指标计算
主队胜率
home_win_rate = df["home_win"].mean()
print(f"主队胜率: {home_win_rate:.2%}")
# 二项检验:主队胜率是否显著高于50%
from scipy.stats import binomtest
result = binomtest(df["home_win"].sum(), n=len(df), p=0.5, alternative="greater")
print(f"p值: {result.pvalue:.4f}")
典型输出:
主队胜率: 58.7%
p值: 0.0001
说明主队胜率显著高于随机50%。
主队场均净胜分
avg_diff = df["point_diff"].mean()
std_diff = df["point_diff"].std()
print(f"主队场均净胜分: {avg_diff:.2f} ± {std_diff:.2f}")
# 单样本 t 检验:净胜分是否显著 > 0
t_stat, p_val = stats.ttest_1samp(df["point_diff"], 0, alternative="greater")
print(f"t={t_stat:.2f}, p={p_val:.4f}")
典型输出:
主队场均净胜分: 3.12 ± 13.85
t=7.21, p<0.0001
主队平均每场多赢 3分左右,且统计显著。
主客场因素有多大?——效果量分析
光看胜率不够,还要看效果量(Effect Size)。
# Cohen's d
cohens_d = avg_diff / std_diff
print(f"Cohen's d = {cohens_d:.3f}")
# 胜率差(Home Advantage Rate)
away_win_rate = 1 - home_win_rate
ha_rate = home_win_rate - away_win_rate
print(f"主客场胜率差: {ha_rate:.2%}")
| 指标 | 数值 | 解读 |
|---|---|---|
| 主队胜率 | ~58% | 略高于一半 |
| 场均净胜分 | ~3分 | NBA/足球类似量级 |
| Cohen's d | ~0.22 | 小到中等效应 |
| 胜率差 | ~17个百分点 | 直观差距 |
⚽ 足球主胜率约 45%,平局 25%,客胜 30%
🏀 NBA 主胜率约 60%,场均净胜 +2.5~3.5 分
可视化
fig, axes = plt.subplots(1, 3, figsize=(16, 4))
# 1. 净胜分分布
axes[0].hist(df["point_diff"], bins=40, color="steelblue", edgecolor="k")
axes[0].axvline(0, color="red", linestyle="--", label="无差异")
axes[0].axvline(avg_diff, color="green", linestyle="-", label=f"均值={avg_diff:.2f}")
axes[0].set_title("主队净胜分分布")
axes[0].legend()
# 2. 主客胜率对比
vals = [home_win_rate, away_win_rate]
axes[1].bar(["主胜", "客胜"], vals, color=["green", "orange"])
axes[1].axhline(0.5, color="red", linestyle="--")
axes[1].set_ylim(0, 1)
axes[1].set_title("主客胜率对比")
# 3. 按球队看主场优势
team_ha = df.groupby("home_team")["point_diff"].mean().sort_values()
axes[2].barh(team_ha.index[:15], team_ha.values[:15], color="purple")
axes[2].axvline(0, color="k")
axes[2].set_title("各队主场净胜分(前15)")
plt.tight_layout()
plt.show()
不同维度下的差异
不同球队的主场优势差异
team_stats = df.groupby("home_team").agg(
home_win_rate=("home_win", "mean"),
avg_diff=("point_diff", "mean"),
games=("home_win", "size")
).sort_values("avg_diff", ascending=False)
print(team_stats.head(10))
print(team_stats.tail(10))
有的球队主场净胜 +8 分,有的甚至是负的——说明主场优势并非均匀分布。
主场优势是否随时间变化?
# 按月/赛季聚合(示例:如果有时间列)
# df["month"] = pd.to_datetime(df["date"]).dt.month
# df.groupby("month")["point_diff"].mean().plot()
统计模型(可选进阶)
import statsmodels.formula.api as smf
# 用 OLS 估计主场优势的边际效应
model = smf.ols("point_diff ~ 1", data=df).fit()
print(model.summary())
# 置信区间
ci = model.conf_int().loc["Intercept"]
print(f"主场优势95% CI: [{ci[0]:.2f}, {ci[1]:.2f}]")
或者用 Logistic 回归 看主胜概率:
import statsmodels.api as sm
X = sm.add_constant(np.ones(len(df))) # 仅截距
y = df["home_win"].astype(int)
logit = sm.Logit(y, X).fit()
print(logit.params) # 截距即 log-odds of home win
print(f"主胜概率 = {1/(1+np.exp(-logit.params['const'])):.2%}")
典型结果)
综合以上分析,主客场因素的影响可以总结为:
| 维度 | |
|---|---|
| 胜率 | 主队约 58%~60%,比客队高约 16~20 个百分点 |
| 净胜分 | 主队平均多赢 5~3.5 分 |
| 统计显著性 | p < 0.001,非常显著 |
| 效果量 | Cohen's d ≈ 0.2,属于小到中等 |
| 稳定性 | 各队差异大:强主场队 +7,弱主场队甚至为负 |
| 项目差异 | NBA ≈ 3分;足球 ≈ 0.3 球;NFL ≈ 2.5分 |
一句话回答:主客场因素影响真实存在且统计显著,但个体差异大——平均相当于给主队加 2~3 分 / 提高 8~10% 的胜率,属于"锦上添花"而非"决定胜负"。
需要我把它改成足球/篮球具体数据版,或者加上贝叶斯模型来估计每支球队的主场优势吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播