(本次分析)2018年世界杯小组赛夺冠热门球队分析
(本次分析)2018年世界杯小组赛夺冠热门球队分析
日期:2023/03/04 11:10作者:佚名人气:
导读:强的本次实力情况,以便能够更进一步分析本次世界杯的分析夺冠热门球队。强之间的年世比赛,透过历史数据来预测夺冠热门球队。界杯获取所有世界杯比赛的小组析数据(含预选赛)支球队,在世界杯上,赛夺两两对阵时的冠热胜负情况。在世界杯上的门球战绩,统计获胜场数如下(不含平局):在世界杯上的队分战绩,统计获胜场数如下(不含平局):在世界杯上的本次战绩,统计获胜场数如下(不含平局):这里,分析我们后续分析采用包含友谊赛的年世数据,来分别分析9强之间两两对阵的界杯情况,看看哪支球队的小组析胜率更高些。本届世界杯真的赛夺是爆冷太多:...“
2018年世界杯小组赛已经如火如荼地进行。 在上一篇文章的基础上,我们继续分析世界杯32强球队的实力,从而进一步分析世界杯夺冠热门球队。
河东三十年,河西三十年,为了世界杯,这个时间可能够4年了。 之前的冷门让天台本就人头攒动,跳水的股市让天台更加混乱。
在文章开始之前,我想提醒大家:赌球有风险,看球一定要过瘾。 本文的重点是通过分析32强之间的比赛和历史数据来预测夺冠热门球队。
本次分析的数据来自Kaggle,包括从1872年到今年的数据,包括世界杯比赛、世界杯预选赛、亚洲杯、欧洲杯、国家间友谊赛等,共约4万场。
这次的环境是:
我们先来看看数据:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
# 解决matplotlib显示中文问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
df = pd.read_csv('results.csv')
df.head()
该数据集中包含的数据列信息如下:
结果如下:
获取所有世界杯比赛的数据(包括预选赛)
创建一个新的数据列,包含有关获胜球队的信息,并获取所有世界杯比赛的数据,包括预选赛。
mask = df['home_score'] - df['away_score']
df.loc[mask > 0, 'win_team'] = df.loc[mask > 0, 'home_team']
df.loc[mask < 0, 'win_team'] = df.loc[mask < 0, 'away_team']
df.loc[mask == 0, 'win_team'] = 'Draw'
df_FIFA_all = df[df['tournament'].str.contains('FIFA', regex=True)]
结果如下:
世界杯战绩分析(含预选赛)
从上一篇文章来看,在世界杯历史上,实力最强的五支球队分别是德国、阿根廷、巴西、法国和西班牙。
接下来,我们将比赛范围扩大到世界杯预选赛,分析五支球队之间的比赛。
team_top5 = ['Germany', 'Argentina', 'Brazil', 'France', 'Spain']
df_FIFA_top5 = df_FIFA_all[(df_FIFA_all['home_team'].isin(team_top5))&
(df_FIFA_all['away_team'].isin(team_top5))]
df_FIFA_top5.shape
out:
(43, 10)
在世界杯历史上,5支球队共进行了43场比赛。
分析完这43场比赛,5支球队的胜负排名如下:
s_FIFA_top5 = df_FIFA_top5.groupby('win_team')['win_team'].count()
s_FIFA_top5.drop('Draw', inplace=True)
s_FIFA_top5.sort_values(ascending=False, inplace=True)
s_FIFA_top5.plot(kind='bar', figsize=(10,6), title='Top Five in World Cup')
结果如下:
接下来我们重点分析一下这五支球队在世界杯上交手时的胜负情况。
首先自定义两个函数世界杯小组赛0比0怎么算,分别获取两支球队的胜场数和自定义绘图函数。 代码如下:
# 自定义函数,返回两支球队获胜场数情况
def team_vs(df,team_A,team_B):
df_team_A_B = df[(df['home_team'].isin([team_A,team_B]))&
(df['away_team'].isin([team_A,team_B]))]
s_win_team = df_team_A_B.groupby('win_team')['win_team'].count()
return s_win_team
# 如需获取本文源代码,请关注公众号“Python数据之道”,
# 在公众号后台回复 “code” ,谢谢大家支持。
# 自定义函数,两支球队在世界杯的对阵胜负情况制图
def team_vs_plot(df,team_A,team_B,ax):
s_win_FIFA = team_vs(df,team_A,team_B)
title = team_A + ' vs ' +team_B
s_win_FIFA.plot(kind='bar', ax =ax)
ax.set_xlabel('')
ax.set_title(title,fontdict={ 'fontsize':10})
ax.set_xticklabels(s_win_FIFA.index, rotation=20)
基于以上函数,对世界杯战绩的分析结果如下:
巴西 vs 其他 4 支球队
f, axes = plt.subplots(figsize=(10,10), ncols=2, nrows=2)
ax1, ax2,ax3,ax4 = axes.ravel()
team_vs_plot(df_FIFA_all,'Brazil','Germany',ax=ax1)
team_vs_plot(df_FIFA_all,'Brazil','Argentina',ax=ax2)
team_vs_plot(df_FIFA_all,'Brazil','France',ax=ax3)
team_vs_plot(df_FIFA_all,'Brazil','Spain',ax=ax4)
# 如需获取本文源代码,请关注公众号“Python数据之道”,
# 在公众号后台回复 “code” ,谢谢大家支持。
# set main title of the figure
plt.suptitle('Brazil vs other Top 4 teams in World Cup', fontsize=14, fontweight='bold', x=0.5, y=0.94)
plt.show()
结果如下:
统计现象一:
世界杯战绩,胜场数统计如下(不包括平局):
巴西1:1德国,巴西6:3阿根廷,巴西1:2法国,巴西3:1西班牙
巴西队,输赢难判……
德国 vs 其他 3 支球队
代码与2.1部分类似,结果如下:
统计现象2:
世界杯战绩,胜场数统计如下(不包括平局):
德国4:1阿根廷,德国2:1法国,德国2:1西班牙
在这五支球队中,德国的胜率优势比较明显。
阿根廷 vs 其他 2 支球队
代码与2.1部分类似,结果如下:
统计现象3:
世界杯战绩,胜场数统计如下(不包括平局):
阿根廷2:0法国,阿根廷1:0西班牙
但是阿根廷输给了巴西和德国
西班牙对法国
综合小结:从历届世界杯的表现来看,分析前五名的两两比赛后发现,德国队的表现最好,其次是巴西队和阿根廷队。
考虑到历届世界杯的数据,时间跨度非常大,很多球队都发生了很大的变化。
对于球队的真实情况,可以选择近几年的比赛和不同级别的比赛,分析效果可能会更好。
接下来着重分析包括2014年以来所有比赛的情况。
2014年以来各项赛事成绩对比
首先,时间选择在2014年之后(含2014年),与现在的时间比较接近。 相对而言,球队的构成发生了些许变化。
当然,这里的时间选择对结果是有影响的。 我们可以探讨这个因素的影响。
自 2014 年以来所有球队的所有比赛输赢概览:
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df_since_2014 = df[df['year']>=2014]
df_since_2014.shape
自 2014 年以来,已经进行了 3,600 多场比赛。 分析了3600多场比赛,胜负数如下:
s_all = df_since_2014.groupby('win_team')['win_team'].count()
s_all.drop('Draw', inplace=True)
s_all.sort_values(ascending=True, inplace=True)
s_all.tail(50).plot(kind='barh', figsize=(8,16), tick_label='',title='Top 50 in all tournament since 2014')
从上图可以看出,自2014年以来,墨西哥、法国、德国、葡萄牙、巴西、比利时、韩国和西班牙的表现相对较好。
结果与您的预期不同吗? 在6月17日的小组赛中,德国输给了墨西哥,看来也不无道理。
不过这次主要还是要考虑32强之间的对抗,这样更能体现现实。
2014年以来各项赛事32强对战概览:
team_list = ['Russia', 'Germany', 'Brazil', 'Portugal', 'Argentina', 'Belgium', 'Poland', 'France',
'Spain', 'Peru', 'Switzerland', 'England', 'Colombia', 'Mexico', 'Uruguay', 'Croatia',
'Denmark', 'Iceland', 'Costa Rica', 'Sweden', 'Tunisia', 'Egypt', 'Senegal', 'Iran',
'Serbia', 'Nigeria', 'Australia', 'Japan', 'Morocco', 'Panama', 'Korea Republic', 'Saudi Arabia']
df_top32 = df_since_2014[(df_since_2014['home_team'].isin(team_list))&(df_since_2014['away_team'].isin(team_list))]
s_top32 = df_top32.groupby('win_team')['win_team'].count()
s_top32.drop('Draw', inplace=True)
s_top32.sort_values(ascending=True, inplace=True)
s_top32.plot(kind='barh', figsize=(8,12), tick_label='',title='Top 32 in all tournament since 2014')
# plt.ylabel('')
从上图可以看出,自2014年以来,巴西、法国、葡萄牙、阿根廷、墨西哥、比利时、德国、西班牙和英国位居前9。
让我们来分析一下前9名的结果:
team_top9 = [ 'Brazil', 'France', 'Portugal',
'Argentina','Mexico','Belgium',
'Germany','Spain','England']
df_top9 = df_since_2014[(df_since_2014['home_team'].isin(team_top9))&
(df_since_2014['away_team'].isin(team_top9))]
df_top9.shape
自2014年以来,9强之间共进行了44场比赛(包括友谊赛)。
一般来说,比赛的场次不会太多,根据这些数据进行分析,对结果的影响可能会比较大。
前九名排名如下:
s_top9 = df_top9.groupby('win_team')['win_team'].count()
s_top9.drop('Draw', inplace=True)
s_top9.sort_values(ascending=False, inplace=True)
s_top9.plot(kind='bar', figsize=(10,6), title='Top 9 in all tournament since 2014')
让我们看看统计了哪些类型的游戏:
s_tournament = df_top9.groupby('tournament')['tournament'].count()
s_tournament_percentage = s_tournament/s_tournament.sum()
# s_tournament_percentage.sort_values(ascending=False, inplace=True)
s_tournament_percentage.tail(20).plot(kind='pie', figsize=(10,10), autopct='%.1f%%',
startangle=150, title='percentage of tournament', label='',
labeldistance=1.25, pctdistance=1.08)
从以上来看,友谊赛的比重还是比较大的。 考虑到友谊赛在某些情况下可能无法准确反映球队的真实水平,而友谊赛占比赛的比重较大,我们先剔除友谊赛再看结果。
排除友谊赛后,2014 年以来的前 32 名概览:
df_top9_no_friendly = df_top9[df_top9['tournament']!= 'Friendly']
df_top9_no_friendly.groupby('tournament')['tournament'].count()
out:
tournament
Confederations Cup 3
FIFA World Cup 6
FIFA World Cup qualification 2
UEFA Euro 2
Name: tournament, dtype: int64
剔除友谊赛后,比赛类型分布如下:
剔除友谊赛后,9强赛如下:
从概览可以看出,是否排除友谊赛(Friendly)对排名还是有影响的。
另外,剔除友谊赛后世界杯小组赛0比0怎么算,总场次较少(只有13场),部分9强之间的球队没有比赛,或者没有赢球。 此数据更受限于分析。
当然,是否应该将友谊赛排除在分析之外应该值得商榷。
九强二二赛结果一览
在此,我们后续分析使用包括友谊赛在内的数据,分析9强之间的两两对决,看看哪支球队的胜率更高。
首先自定义几个函数,方便分析。 自定义获取球队某年至今的胜率函数:
# 自定义获取球队某年至今获胜比例函数
def probability(df,year,team_A,team_B):
prob = []
df_year = df[df['year']>= year]
s = team_vs(df_year,team_A,team_B)
s_team_A = 0 if s.get(team_A) is None else s.get(team_A)
s_A_win = s_team_A/s.sum()
s_team_B = 0 if s.get(team_B) is None else s.get(team_B)
s_B_win = s_team_B/s.sum()
s_draw = 1 - s_A_win - s_B_win
prob.append(year)
prob.append(s_A_win)
prob.append(s_B_win)
prob.append(s_draw)
return prob
自定义比较函数,获取两队历史胜场:
# 自定义获取两支球队历史获胜情况对比函数
def his_team_data(df,year_start,year_end,team_A,team_B):
row_team = []
# df_team = pd.DataFrame(columns=('year', 'team_A_win', 'team_B_win', 'draw'))
for yr in list(range(year_start,year_end+1)):
team_A_vs_team_B = probability(df,yr,team_A,team_B)
row_team.append(team_A_vs_team_B)
team_A_win = team_A + '_win_percentage'
team_B_win = team_B + '_win_percentage'
df_team = pd.DataFrame(row_team, columns=('year', team_A_win, team_B_win, 'draw_percentage'))
return df_team
自定义两支球队历史胜场的图表功能:
# 自定义两支球队历史获胜情况制图函数
def team_plot(df,year_start,year_end,team_A,team_B,ax):
team_A_vs_team_B = team_A + '_vs_' + team_B
team_A_vs_team_B = his_team_data(df,year_start,year_end,team_A,team_B)
title = team_A + ' vs ' + team_B
columns = [team_A+'_win_percentage',team_B+'_win_percentage','draw_percentage']
team_A_vs_team_B.set_index('year')[columns].plot(kind='line',figsize=(10,6), title=title,ax=ax)
这些函数有什么用? 首先我们来分析一下巴西对阵德国的情况,如下:
team_A = 'Brazil'
team_B = 'Germany'
f, axes = plt.subplots(figsize=(6,12), ncols=1, nrows=2)
ax1, ax2 = axes.ravel()
team_plot(df,1930,2016,team_A,team_B,ax1)
ax1.set_xlabel('')
team_plot(df,2000,2016,team_A,team_B,ax2)
ax2.set_title('')
plt.show()
上图中,x轴代表两队从某年至今的胜负情况(数据集包含2018年的部分比赛数据)。
比如2012对应的是德国和巴西从2012年到现在的输赢情况。 因此,时间越早,两队的比赛场次就越大,数据曲线的波动可能会更小。
但是,由于团队的构成是不断变化的,越早的数据,其分析价值越弱。 因此,选择合适的年份进行分析非常重要。
有童鞋说,如果我要同时分析德国和其他8支球队怎么办?
这里,使用上面的函数也很快,代码如下:
team_A = 'Germany'
for team in ['France','Portugal', 'Argentina','Mexico','Belgium','Brazil','Spain','England']:
team_B = team
f, axes = plt.subplots(figsize=(6,12), ncols=1, nrows=2)
ax1, ax2 = axes.ravel()
team_plot(df,1930,2016,team_A,team_B,ax1)
ax1.set_xlabel('')
team_plot(df,2000,2016,team_A,team_B,ax2)
ax2.set_title('')
plt.show()
运行上面的代码后,会绘制出8张图,下面只展示其中的几张。
同样,如果你喜欢巴西队或者其他球队,也可以使用上面的代码进行分析。
通过以上功能可以快速分析两支球队的历史胜负情况。 当然,有些球队很少遇到,或者最近几年没有遇到,所以分析结果可能不好用。
当然,数据分析只是历史情况,足球是圆的,场地瞬息万变。 比如现在阿根廷危在旦夕,梅西慌了……
预测
这届世界杯真的是太冷门了:
最后,这是我的上帝预测。 年年都有黑马,尤其是今年,预测不准确,就等着啪啪打脸吧。
当然,其实在我心里,我希望是这样的。 怎么样,给坚强的心竖个大拇指吧~~
特别说明:以上数据分析纯属个人学习。 预测结果可能与实际情况存在较大偏差,不能用于其他用途。