(本次分析)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张图,下面只展示其中的几张。

同样,如果你喜欢巴西队或者其他球队,也可以使用上面的代码进行分析。

通过以上功能可以快速分析两支球队的历史胜负情况。 当然,有些球队很少遇到,或者最近几年没有遇到,所以分析结果可能不好用。

当然,数据分析只是历史情况,足球是圆的,场地瞬息万变。 比如现在阿根廷危在旦夕,梅西慌了……

预测

这届世界杯真的是太冷门了:

最后,这是我的上帝预测。 年年都有黑马,尤其是今年,预测不准确,就等着啪啪打脸吧。

当然,其实在我心里,我希望是这样的。 怎么样,给坚强的心竖个大拇指吧~~

特别说明:以上数据分析纯属个人学习。 预测结果可能与实际情况存在较大偏差,不能用于其他用途。