明智地下注:使用泊松分布预测足球比赛的比分
足球受到所有人的喜爱,其美在于其不可预测的性质。与该游戏密切相关的一件事是它的粉丝,在一场比赛之前就谁将赢得这场比赛进行沉思和辩论。有些球迷甚至在比赛前就猜测得分线。因此,让我们尝试从逻辑上回答其中一些问题。
认识泊松
就像我之前说过的足球是一个无法预测的比赛一样,比赛中的任何时候都可以完全随机地进球,而不依赖于先前的进球或球队或任何其他因素。等一下我说“随机”。因为统计中存在一种分布,用于发现随机发生的事件的概率,所以泊松分布。
假设您的朋友说平均每场比赛有2个进球,是吧?如果正确,那么在一场比赛中看到两个进球的实际机会是多少?这是我们的救援Poisson分布,可以帮助我们找到在固定时间段内观察到“ n”个事件(读取为“ n”个目标)的可能性,因为我们为其提供了发生事件的期望(每个时间段的平均事件)。让我们从数学上看一次
泊松分布
(其中λ =每个时间段的平均事件)
计分机会
现在让我们用这个方程式回答一些问题,但是首先我们需要数据,因此我从Kaggle下载了1872年至2020年的国际足球比赛数据。我们的数据集示例如下所示。
码:
data.head(3)
泊松分布-头
让我们开始寻找90分钟内可以预期的平均目标。
对于这一点,我已经创建了一个单独的数据集滤除在21播放的数据匹配第一世纪(2000至2020年),并加入该home_score和away_score没有找出总。每次比赛中发生的进球数,然后取“总进球数”列的平均值,以获得我们在一场比赛中可以预期的平均进球数。
码:
数据['total_goals'] =数据['home_score'] +数据['away_score']
data ['date'] = data ['date']。apply(lambda x:int(str.split(x,'-')[0]))
rec_data = data.loc [(data ['date']> = 2000)]
rec_data.iloc [[rec_data.total_goals.argmax()]]
打印(rec_data.total_goals.mean())
2.744112130054189
现在将此期望值放入Poissson分布公式中,让我们看看在一场比赛中看到3个进球的实际机会是多少。
哇,只有22%的机会。让我们绘制否定概率。比赛中的进球数以获得更好的画面。
泊松分布
现在,我们可以简单地通过将x的概率与小于x的数字相加来计算看到x或更少的目标的概率,并且只需将其减去1就可以得出在一场比赛中看到超过“ x”个进球的概率。让我们来绘制这个。
等待结束了…
现在假设您有一个不耐烦的朋友,他不想坐整场比赛。然后他在比赛中来找您,问他要等多长时间才能看到目标。哇,这是一个很难回答的问题,但请放心,让他坐满10000场比赛,并记下每个进球之间的时间。显然,他只是在开玩笑,会吓坏了。实际上,我模拟了10000场比赛,并找出了平均时间。
最可能的等待时间是2分钟。但是实际上不等待这个,我想要的是我随机开始观看比赛所需要等待的平均时间。为此,我将使用10000个实例,其中每个实例正在观看10000场比赛,并计算该10000场比赛中目标之间的平均等待时间并报告给我们。最后,我将从每个实例中绘制出这10000个报告,并找出预期的平均等待时间。
看来我们必须等待33分钟左右。但是,我们可能需要等待更多,这是经典的“等待时间悖论”。
预测得分线
最后,让我们来做一个开始的问题,以及最激动人心的问题,即谁将获胜以及确切的比分是多少。
为此,我将使用两支球队之间的历史记录(让他们将其视为主队和客队),并将average_home_score作为主队的预期目标,并以average_away_score作为客队的预期目标,并使用泊松分布。如果团队之间的接触较少,我们将考虑一些因素
HS =主队在整个历史中进球的平均数。
AS =客队在整个历史上进球得分的平均值。
HC =主队在主场比赛中失球的平均值。
AC =客队贡献的客场进球数平均值。
因此,主队的预期得分将计算为(HS + AC)/ 2
因此,客队的预期得分将计算为(AS + HC)/ 2
等待,预期分数不是预期分数。预期得分是我们期望他们在一场比赛中得分的平均数。
码:
将熊猫作为pd导入
将numpy导入为np
从scipy进口统计
def PredictScore():
home_team = input(“输入主队:”)
ht =(''.join(home_team.split()))。lower()
away_team = input(“进入客队:”)
在=(''.join(away_team.split()))。lower()
如果len(data [(data.home_team == ht)&(data.away_team == at)])> 20:
avg_home_score = data [(data.home_team == ht)&(data.away_team == at)]。home_score.mean()
avg_away_score = data [(data.home_team == ht)&(data.away_team == at)]。away_score.mean()
home_goal = int(stats.mode(np.random.poisson(avg_home_score,100000))[0])
away_goal = int(stats.mode(np.random.poisson(avg_away_score,100000))[0])
其他:
avg_home_goal_conceded = data [(data.home_team == ht)]。away_score.mean()
avg_away_goal_scored = data [(data.away_team == at)]。away_score.mean()
away_goal = int(stats.mode(np.random.poisson(1/2 *(avg_home_goal_conceded + avg_away_goal_scored),100000))[0])
avg_away_goal_conceded = data [(data.home_team == at)]。home_score.mean()
avg_home_goal_scored = data [(data.away_team == ht)]。home_score.mean()
home_goal = int(stats.mode(np.random.poisson(1/2 *(avg_away_goal_conceded + avg_home_goal_scored),100000))[0])
avg_total_score = int(stats.mode(
np.random.poisson((data [(data.home_team == ht)&(data.away_team == at)]。total_goals.mean()),100000))[0])
打印(f'预期总目标为{avg_total_score}')
print(f'他们参加了{len(data [(data.home_team == ht)&(data.away_team == at)])比赛')
print(f'总分是{home_team} {home_goal}:{away_goal} {away_team}')
让我们尝试将巴西作为主队,将墨西哥作为客队。
码:
PredictScore()
泊松分布使我们可以预测巴西以2-0的比分获胜。我在网上搜索后发现,他们之间的最后一场比赛是在2018年7月2日进行的,计分线显示巴西以2-0获胜。好吧,我很幸运,你可能没有。
结论
如果您想进一步探索,请不用担心,这是我的代码。此外,这只是预测比赛的一种基本方式,如今,分类算法用于预测结果,而回归算法用于预测得分。但这是另一天的话题,在那之前可以玩得开心。阿迪奥斯!
题库