别傻傻的猜2021欧洲杯赛果,AI都帮你分析好了!
由于2020年疫情的影响,欧洲杯延期到了今年举行,24支劲旅将在31天内,展开51场精彩对决。作为与奥运会、世界杯比肩的世界顶级三大体育赛事之一,四年一届的欧洲杯吸引了全世界球迷的目光。
欧足联为纪念欧洲杯60周年,本届赛事将采无主办国的巡回赛方式在欧洲的12个国家13个城市举行:丹麦哥本哈根、比利时布鲁塞尔、匈牙利布达佩斯、荷兰阿姆斯特丹、爱尔兰都柏林、罗马尼亚布加勒斯特、苏格兰格拉斯哥、西班牙毕尔巴鄂、阿塞拜疆巴库、德国慕尼黑、意大利罗马、俄罗斯圣彼得堡、英格兰伦敦。其中半决赛和决赛都将在伦敦的温布利球场举行。
本届比赛的参赛球队共24支,分成6个小组,每个小组前两名和4支成绩最好的第三名球队晋级16强,随后是淘汏赛,直至决出最后冠军。
分组情况如下:
- A组:土耳其、意大利、威尔士、瑞士。
- B组:丹麦、芬兰、比利时、俄罗斯。
- C组:荷兰、乌克兰、奥地利、北马其顿。
- D组:英格兰、克罗地亚、捷克、苏格兰。
- E组:西班牙、瑞典、波兰、斯洛伐克。
- F组:德国、法国、葡萄牙、匈牙利。
作为一名AI攻城狮和球迷,我采用了 AI开发平台ModelArts 对各参赛队伍的实力情况进行分析,并结合数据挖掘、机器学习等人工智能技能来分析和预测欧洲杯赛果。
数据准备
采用的数据包括但不限于:历史比赛数据、球员德转身价、伤病情况(含新冠确诊)、小组积分、天气、比赛场地等。
首先来分析历史比赛数据
从Kaggle下载了从1872年到2021年5月28日的所有比赛数据,包括FIFA世界杯、世界杯预选赛、欧洲杯、友谊赛等,共 42105 场比赛的数据。 数据网址:https://www.kaggle.com/martj42/international-football-results-from-1872-to-2017
from modelarts.session import Session
sess = Session()
bucket_path="modelarts-labs-bj4/2021EurCup/results.csv"
sess.download_data(bucket_path=bucket_path, path="./results.csv")
Successfully download file modelarts-labs-bj4/2021EurCup/results.csv from OBS to local ./results.csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
df = pd.read_csv('results.csv')
#数据集包含场次总数
df.shape[0]
42105
查看前五5场比赛数据
df.head(5)
date | home_team | away_team | home_score | away_score | tournament | city | country | neutral | |
---|---|---|---|---|---|---|---|---|---|
0 | 1872-11-30 | Scotland | England | 0 | 0 | Friendly | Glasgow | Scotland | False |
1 | 1873-03-08 | England | Scotland | 4 | 2 | Friendly | London | England | False |
2 | 1874-03-07 | Scotland | England | 2 | 1 | Friendly | Glasgow | Scotland | False |
3 | 1875-03-06 | England | Scotland | 2 | 2 | Friendly | London | England | False |
4 | 1876-03-04 | Scotland | England | 3 | 0 | Friendly | Glasgow | Scotland | False |
查看最近五场比赛数据
df.tail(5)
date | home_team | away_team | home_score | away_score | tournament | city | country | neutral | |
---|---|---|---|---|---|---|---|---|---|
42100 | 2021-05-25 | Indonesia | Afghanistan | 2 | 3 | Friendly | Dubai | United Arab Emirates | True |
42101 | 2021-05-25 | Oman | Thailand | 1 | 0 | Friendly | Dubai | United Arab Emirates | True |
42102 | 2021-05-27 | Turkey | Azerbaijan | 2 | 1 | Friendly | Alanya | Turkey | False |
42103 | 2021-05-28 | Bahrain | Malaysia | 2 | 0 | Friendly | Riffa | Bahrain | False |
42104 | 2021-05-28 | Italy | San Marino | 7 | 0 | Friendly | Cagliari | Italy | False |
可以看到,该数据集包含的数据列的信息如下:
- date - 比赛日期
- home_team - 主队名称
- away_team - 客队名称
- home_score - 主队进球数 (不含点球)
- away_score - 客队进球数 (不含点球)
- tournament - 比赛名称
- city - 比赛所在城市
- country - 比赛所在国家/地区
- neutral - TRUE/FALSE 比赛是否在中立场地进行
数据处理
接下来,在每场比赛后面增加胜利队伍和净胜球两列,以方便后面的统计处理。
#增加获胜队伍列
winners = []
for i, row in df.iterrows():
if row['home_score'] > row['away_score']:
winners.append(row['home_team'])
elif row['home_score'] < row['away_score']:
winners.append(row['away_team'])
else:
winners.append('Draw')
df['winner'] = winners
#增加净胜球列
df['diff_score'] = np.absolute(df['home_score'] - df['away_score'])
df.tail(5)
date | home_team | away_team | home_score | away_score | tournament | city | country | neutral | winner | diff_score | |
---|---|---|---|---|---|---|---|---|---|---|---|
42100 | 2021-05-25 | Indonesia | Afghanistan | 2 | 3 | Friendly | Dubai | United Arab Emirates | True | Afghanistan | 1 |
42101 | 2021-05-25 | Oman | Thailand | 1 | 0 | Friendly | Dubai | United Arab Emirates | True | Oman | 1 |
42102 | 2021-05-27 | Turkey | Azerbaijan | 2 | 1 | Friendly | Alanya | Turkey | False | Turkey | 1 |
42103 | 2021-05-28 | Bahrain | Malaysia | 2 | 0 | Friendly | Riffa | Bahrain | False | Bahrain | 2 |
42104 | 2021-05-28 | Italy | San Marino | 7 | 0 | Friendly | Cagliari | Italy | False | Italy | 7 |
历史上欧洲杯战绩分析
首先获取全部欧洲杯决赛阶段的比赛数据
df_EURO = df[df['tournament']=='UEFA Euro']
df_EURO.head(5)
date | home_team | away_team | home_score | away_score | tournament | city | country | neutral | winner | diff_score | |
---|---|---|---|---|---|---|---|---|---|---|---|
4747 | 1960-07-06 | Czechoslovakia | Russia | 0 | 3 | UEFA Euro | Marseille | France | True | Russia | 3 |
4748 | 1960-07-06 | France | Yugoslavia | 4 | 5 | UEFA Euro | Paris | France | False | Yugoslavia | 1 |
4750 | 1960-07-09 | France | Czechoslovakia | 0 | 2 | UEFA Euro | Marseille | France | False | Czechoslovakia | 2 |
4755 | 1960-07-10 | Russia | Yugoslavia | 2 | 1 | UEFA Euro | Paris | France | True | Russia | 1 |
5644 | 1964-06-17 | Denmark | Russia | 0 | 3 | UEFA Euro | Barcelona | Spain | True | Russia | 3 |
历届欧洲杯决赛阶段全部场次
df_EURO.shape[0]
286
1. 按照各个国家球队在欧洲杯上胜利场数排名
s = df_EURO.groupby('winner')['winner'].count()
s.sort_values(ascending=False, inplace=True)
s.drop(labels=['Draw'], inplace=True)
s.sort_values(ascending=True, inplace=True)
plt.axes(facecolor='azure')
plt.grid(True, color='mistyrose')
s.tail(10).plot(kind='barh', figsize=(10,6), color='tomato', title='胜场数排名最多的10支队伍')
<matplotlib.axes._subplots.AxesSubplot at 0x7f2dadb8c860>
2. 按照各个国家球队在欧洲杯上进球数排名
column_update = ['team', 'score']
df_score_home = df_EURO[['home_team', 'home_score']]
df_score_home.columns = column_update
df_score_away = df_EURO[['away_team', 'away_score']]
df_score_away.columns = column_update
df_score = pd.concat([df_score_home,df_score_away], ignore_index=True)
s_score = df_score.groupby('team')['score'].sum()
s_score.sort_values(ascending=True, inplace=True)
plt.axes(facecolor='azure')
plt.grid(True, color='mistyrose')
s_score.tail(10).plot(kind='barh', figsize=(10,6), color='orange', title='进球数最多的10支队伍')
<matplotlib.axes._subplots.AxesSubplot at 0x7f2dab79c9b0>
3. 按照各个国家球队在欧洲杯上净胜球球数排名
df_score_diff = df_EURO[['winner', 'diff_score']]
d_score = df_score_diff.groupby('winner')['diff_score'].sum()
d_score.sort_values(ascending=True, inplace=True)
plt.axes(facecolor='azure')
plt.grid(True, color='mistyrose')
d_score.tail(10).plot(kind='barh', figsize=(10,6), color='orange', title='净胜球数最多的10支队伍')
<matplotlib.axes._subplots.AxesSubplot at 0x7f2dab7313c8>
按照历史比赛数据分析,本届欧洲杯夺冠热门来自这8支球队:德国、法国、西班牙、荷兰、葡萄牙、意大利、俄罗斯、英格兰。
球队对阵胜负分析
从总数据中提取出参加本届比赛的24支球队间相互进行的比赛。
teams = ["Turkey", "Italy", "Wales", "Switzerland",
"Denmark", "Belgium", "Finland", "Russia",
"Netherlands", "Ukraine", "Austria", "North Macedonia",
"England", "Scotland", "Czech Republic", "Croatia",
"Spain", "Sweden", "Poland", "Slovakia",
"France", "Germany", "Hungary", "Portugal"]
df_all = df[(df['home_team'].isin(teams))&(df['away_team'].isin(teams))]
#24支球队间相互进行的历史比赛总场数
df_all.shape[0]
4577
以西班牙 VS 德国为例,通过定义函数,返回两支球队历史对阵胜负情况
def team_vs(df,teamA,teamB):
df_AB = df[(df['home_team'].isin([teamA,teamB]))&(df['away_team'].isin([teamA,teamB]))]
print('双方历史上共交手次数:')
print(df_AB.shape[0])
result = df_AB.groupby('winner')['winner'].count()
print('胜负情况如下')
result.sort_values(ascending=False, inplace=True)
print(result)
return result
team_vs(df_all,'Spain','Germany')
双方历史上共交手次数:
25
胜负情况如下
winner
Germany 9
Spain 8
Draw 8
Name: winner, dtype: int64
winner
Germany 9
Spain 8
Draw 8
Name: winner, dtype: int64
定义函数,用柱状图表示西班牙队和德国队历史对阵胜负情况
def team_vs_plot(df,teamA,teamB):
result = team_vs(df,teamA,teamB)
title = teamA + ' vs ' +teamB
plt.axes(facecolor='azure')
plt.grid(True, color='mistyrose')
result.plot(kind='bar', color='orange', title=title)
team_vs_plot(df_all,'Spain','Germany')
双方历史上共交手次数:
25
胜负情况如下
winner
Germany 9
Spain 8
Draw 8
Name: winner, dtype: int64
如上所示,历史上西班牙队与德国队共交手25次,其中德国获胜9次,西班牙获胜8次,两队打平8次。两队历史上几乎是平手,德国稍占上风。
实战预测分析(意大利 VS 土耳其)
按照以上对方法,我们来预测下北京时间6月12日凌晨3点在罗马举行的揭幕战揭幕战比赛,意大利对阵土耳其。
1.历史比赛数据分析:
# 首先我们来看下两队在历史上的全部对阵情况
team_vs_plot(df_all,'Italy','Turkey')
双方历史上共交手次数:
10
胜负情况如下
winner
Italy 7
Draw 3
Name: winner, dtype: int64
根据结果所示,两队历史上共交手10次,意大利获胜7次,双方打平3次。意大利占据绝对领先。
接下来我们来看下两队在欧洲杯历史上的对阵情况。
team_vs_plot(df_EURO,'Italy','Turkey')
双方历史上共交手次数:
1
胜负情况如下
winner
Italy 1
Name: winner, dtype: int64
两队在欧洲杯历史上仅交手过1次,意大利获胜。
2.球员德转身价:
按照最新德转市场公布的欧洲杯球队身价榜,意大利:7.64亿欧元,土耳其:3.25亿欧元,意大利有明显优势。
3.比赛场地:
揭幕战将在意大利罗马进行,意大利占有主场优势。
4.结果预测--------> 揭幕战意大利获胜!
</br>
后续将持续采用AI算法、数据分析等手段来对2021年欧洲杯比赛结果进行预测,如:- 增加数据内容,如:球员身价、伤病情况、天气情况、FIFA排名数据等。
- 使用机器学习算法,如线性回归、逻辑回归、决策树、随机森林等。
- 进行数据特征工程,对不同的数据设置权重,加入到AI算法中训练。
- 欢迎大家自由发挥,使用各种AI方法来分析,并预测出每场赛果,及欧洲杯冠军。
- 点赞
- 收藏
- 关注作者
评论(0)