python案例认为上半场会否互交白卷?

wen python案例 17

本文目录导读:

python案例认为上半场会否互交白卷?

  1. 案例一:基于泊松分布的数学建模(理想模拟)
  2. 案例二:基于历史数据的频率统计(实战模拟)
  3. 代码解释与总结
  4. 怎么运行?

这是一个非常有趣的案例!在足球数据统计中,“上半场互交白卷”(0-0) 是一个可以构建在概率模型之上的预测问题。

我们可以通过 Python 结合 泊松分布(Poisson Distribution)历史数据统计 来做一个简单的预测案例。

下面我为你提供两个经典的 Python 案例:

基于泊松分布的数学建模(理想模拟)

这个案例假设每支球队的进球率服从泊松分布,我们通过计算“上半场两队总进球数为 0”的概率来预测。

import math
def poisson_probability(actual, mean):
    """计算泊松分布概率"""
    # 泊松公式: P(x) = (e^-mean) * (mean^x) / x!
    return (math.exp(-mean) * mean**actual) / math.factorial(actual)
def predict_half_time_draw_zero(home_avg, away_avg, half_factor=0.45):
    """
    预测上半场互交白卷的概率
    :param home_avg: 主队场均总进球数 (90分钟)
    :param away_avg: 客队场均总进球数 (90分钟)
    :param half_factor: 上半场进球占比(通常取0.4-0.5,代表上半场节奏较慢)
    """
    # 计算上半场平均预期进球
    home_half_avg = home_avg * half_factor
    away_half_avg = away_avg * half_factor
    # 两队上半场都进0球的概率
    p_home_zero = poisson_probability(0, home_half_avg)
    p_away_zero = poisson_probability(0, away_half_avg)
    # 独立事件相乘
    p_both_zero = p_home_zero * p_away_zero
    return p_both_zero
# 示例:主队场均2.5球,客队场均1.2球
home_total_avg = 2.5
away_total_avg = 1.2
probability = predict_half_time_draw_zero(home_total_avg, away_total_avg)
print(f"预测上半场0-0的概率为: {probability*100:.2f}%")
# 对比:如果两队攻击力都很弱
prob_weak = predict_half_time_draw_zero(0.8, 0.9)
print(f"弱队对阵时上半场0-0的概率为: {prob_weak*100:.2f}%")
# 对比:如果两队攻击力都很强
prob_strong = predict_half_time_draw_zero(2.8, 2.5)
print(f"强队对阵时上半场0-0的概率为: {prob_strong*100:.2f}%")

基于历史数据的频率统计(实战模拟)

这个案例模拟我们有一份过往比赛的数据集(比如英超历史数据),我们直接统计“上半场两队都没进球”的频率,并用 Python 进行简单的前瞻性分析。

import pandas as pd
import numpy as np
# 模拟生成一份历史比赛数据 (假设有 1000 场比赛)
np.random.seed(42)  # 固定随机种子以便结果可复现
# 生成历史数据:包含总进球数和上半场进球数(模拟)
n_matches = 1000
total_goals = np.random.poisson(lam=2.7, size=n_matches)  # 平均总进球数
first_half_goals = np.random.binomial(total_goals, 0.45)  # 上半场进球占比
data = pd.DataFrame({
    'total_goals': total_goals,
    'first_half_goals': first_half_goals
})
# 1. 计算历史中上半场0-0的频率(先验概率)
hist_0_0_freq = (data['first_half_goals'] == 0).mean()
print(f"历史数据中上半场0-0的频率(先验概率): {hist_0_0_freq*100:.2f}%")
# 2. 寻找特征:当两队近期防守好(即总进球少)时,概率是否有变化?
# 假设我们有一个新赛季的球队数据(模拟)
def predict_based_on_team_strength(home_concede_avg, away_score_avg):
    # 逻辑:如果主队防守好(失球少)且客队进攻弱(进球少),则概率高
    # 这里简化为:概率 = 基础概率 + 防守加成
    base_prob = hist_0_0_freq
    # 假设防守好(场均失球<1.0)会提升概率
    adjustment = 0
    if home_concede_avg < 1.0:
        adjustment += 0.05
    if away_score_avg < 1.0:
        adjustment += 0.05
    if (home_concede_avg + away_score_avg) < 2.0:
        adjustment += 0.05
    predicted_prob = min(base_prob + adjustment, 0.5)  # 不超过50%
    return predicted_prob
# 示例预测
# 比赛对阵:曼城(防守好) vs 谢菲联(进攻弱)
prob1 = predict_based_on_team_strength(home_concede_avg=0.8, away_score_avg=0.7)
print(f"预测曼城 vs 谢菲联 上半场0-0概率: {prob1*100:.2f}%")
# 比赛对阵:利物浦(防守一般) vs 阿森纳(进攻强)
prob2 = predict_based_on_team_strength(home_concede_avg=1.2, away_score_avg=2.0)
print(f"预测利物浦 vs 阿森纳 上半场0-0概率: {prob2*100:.2f}%")

代码解释与总结

  1. 泊松分布(案例一):这是业界常用的方法。

    • 核心逻辑:计算“主队上半场进0球”和“客队上半场进0球”的独立概率,然后相乘。
    • 注意:实际中两队进球不独立,但这是基础简化模型。
    • 输出值通常在 20% - 35% 之间,英超历史上上半场0-0的概率大约是 25% - 30%
  2. 历史数据(案例二)

    • 这种方法更贴近实际“数据挖掘”,通过历史频率(先验概率)结合球队当前状态(特征工程,如防守强度、进攻效率)来调整预测。
    • 这里用 np.random 模拟了数据,实际使用中应加载真实数据(如 statsbombfootball-data.co.uk 的CSV)。

怎么运行?

你需要安装 pandasnumpy

pip install pandas numpy

然后把代码复制到 .py 文件或 Jupyter Notebook 中运行即可。

最终结论:这个案例展示了如何用 Python 将足球比赛中的“上半场0-0”事件,从纯粹的猜测变成基于概率的计算。如果两队攻击力较弱或防守稳固,上半场白卷概率会显著升高。

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