2018年世界杯小组赛已经如火如荼的进行着。上一篇我用Python分析了4W游戏。基于2018年世界杯冠军是……,我们继续分析世界杯32强球队的实力,从而进一步分析世界杯夺冠热门球队。河东三十年,河西三十年,为了世界杯,这个时间可能够4年了。之前的冷门让天台本就人头攒动,跳水的股市让天台更加混乱。在文章开始之前,我想提醒大家:赌球有风险,看球一定要过瘾。这篇文章的重点是通过分析32强之间的比赛,通过历史数据来预测夺冠热门球队。本次分析的数据来自Kaggle,里面有1872年到今年的数据,包括世界杯比赛,世界杯预选赛、亚洲杯、欧洲杯、国家间友谊赛等,共约4万场。这次的环境是:Window7系统Python3.6JupyterNotebookpandasversion0.22.0先来看一下资料:importpandasaspdimportmatplotlib.pyplotasplt%matplotlibinlineplt.style.use('ggplot')#解决matplotlib显示中文plt的问题.rcParams['font.sans-serif']=['SimHei']#指定默认字体plt.rcParams['axes.unicode_minus']=False#解决保存图片显示为负号'-'的问题作为一个正方形df=pd.read_csv('results.csv')df.head()该数据集中包含的数据列的信息如下:DateHomeTeamNameAwayTeamNameHomeTeamGoals(excludingPenalties)A??wayTeamGoals(excludingPenalts)MatchTypeMatchCityMatchCountryNeutral结果如下:获取所有世界杯比赛的数据(包括预选赛)新建一个数据列,包含获胜球队的信息并获取所有世界杯比赛的数据,包括预选赛。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)]结果如下:世界杯战绩分析(含预选赛)根据之前的文章,在世界杯历史上,实力最强的五支球队分别是德国、阿根廷、巴西、法国、西班牙。接下来,我们将比赛范围扩大到世界杯预选赛,分析5支球队之间的比赛。team_top5=['德国','阿根廷','巴西','法国','西班牙']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.shapeout:(43,10)在世界杯历史上,5支球队共进行了43场比赛。分析43场比赛后,5支球队的排名如下:(ascending=False,inplace=True)s_FIFA_top5.plot(kind='bar',figsize=(10,6),title='TopFiveinWorldCup')结果如下:接下来重点分析这5个进球的球队,在世界杯,两两比赛的结果。首先自定义两个函数获取两队的胜场数和自定义绘图函数。代码如下:#自定义函数,返回两队胜场数defteam_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()returns_win_team#如果你想得到这个的源码文章,请关注公众号“Python数据之道”,在公众号后台#回复“代码”,谢谢支持。#Defteam_vs_plot(df,team_A,team_B,ax):s_win_FIFA=team_vs(df,team_A,team_B)title=team_A+'vs'+team_Bs_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,'巴西','德国',ax=ax1)team_vs_plot(df_FIFA_all,'巴西','阿根廷',ax=ax2)team_vs_plot(df_FIFA_all,'巴西','法国',ax=ax3)team_vs_plot(df_FIFA_all,'巴西','西班牙',ax=ax4)#如果想获取本文源码,请关注公众号“Python数据方式”,在公众号后台#回复“代码”,谢谢支持。#setmaintitleofthefiguregeplt.suptitle('BrazilvsotherTop4teamsinWorldCup',fontsize=14,fontweight='bold',x=0.5,y=0.94)plt.show()结果如下:统计现象1:世界杯和胜负数如下(不计平局):巴西1:1德国,巴西6:3阿根廷,巴西1:2法国,巴西3:1西班牙巴西队,输赢难判……德国vs其他3支球队代码与2.1部分相同,结果如下:统计现象2:世界杯战绩,统计胜场数如下(不计平局):德国4:1阿根廷,德国2:1法国、德国2:1西班牙德国在这5个进球的球队中,赢球优势比较明显。阿根廷vs其他2队代码与2.1部分类似,结果如下:统计现象3:世界杯战绩,胜场数统计如下(不包括平局):阿根廷2:0法国,阿根廷1:0西班牙不过,阿根廷输给了巴西和德国。西班牙对法国。综合总结:从历届世界杯的表现来看,通过分析5强的两两交手,发现德国队的表现最好,其次是巴西队和阿根廷队。不错。考虑到历届世界杯的数据,时间跨度非常大,很多球队都发生了很大的变化。对于球队的真实情况,可以选择近几年的比赛和不同级别的比赛,分析效果可能会更好。接下来重点分析包括2014年以来所有比赛的情况。2014年以来所有比赛的战绩对比。首先,时间选择在2014年之后(含2014年),与现在的时间比较接近。相对而言,球队的构成发生了些许变化。当然,这里的时间选择对结果是有影响的。我们可以探讨这个因素的影响。自2014年以来所有球队输赢的所有比赛概览:df['date']=pd.to_datetime(df['date'])df['year']=df['date'].dt.yeardf_since_2014=df[df['year']>=2014]df_since_2014.shape自2014年以来,有超过3600场比赛。分析完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='Top50inalltournamentsince2014')从上面图片2014年以来,墨西哥、法国、德国、葡萄牙、巴西、比利时、韩国和西班牙表现相对较好。结果与您的预期不同吗?在6月17日的小组赛中,德国输给了墨西哥,看来也不无道理。不过这次主要还是要考虑32强之间的对抗,这样更能体现现实。2014年以来各项赛事前32名球队一览:team_list=['俄罗斯','德国','巴西','葡萄牙','阿根廷','比利时','波兰','法国','西班牙','秘鲁','瑞士','英格兰','哥伦比亚','墨西哥','乌拉圭','克罗地亚','丹麦','冰岛','哥斯达黎加','瑞典','突尼斯','埃及','塞内加尔','伊朗','塞尔维亚','尼日利亚','澳大利亚','日本','摩洛哥','巴拿马','大韩民国','沙特阿拉伯']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='Top32inalltournamentssince2014')#plt.ylabel('')从上图来看,从2014年开始,巴西、法国、葡萄牙、阿根廷、墨西哥、比利时、德国、西班牙、英国位列前9。让我们分析一下前9名的结果:team_top9=['巴西','法国','葡萄牙','阿根廷','墨西哥','比利时','德国','西班牙','英格兰']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=真)s_top9。plot(kind='bar',figsize=(10,6),title='Top9inalltournamentssince2014')查看统计了哪些类型的比赛: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='percentageoftournament',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:tournamentConfederationsCup3FIFAWorldCup6EqualFAUE2FIFAUE2C:tournament,dtype:int64剔除友谊赛后,比赛类型分布如下:剔除友谊赛后,9强赛情况如下:从概览可以看出,是否剔除友谊赛(Friendly)对排名还是有影响的。另外,剔除友谊赛后,总场次较少(只有13场),部分9强之间的球队没有比赛,或者没有赢球。此数据更受限于分析。当然,是否应该将友谊赛排除在分析之外应该值得商榷。九强两队对决一览这里,我们将在后续分析中使用包括友谊赛在内的数据,对九强两队的两两对决进行分析,看看哪支球队的胜率更高。首先自定义几个函数,方便分析。自定义获取球队某年至今胜率函数:#自定义获取球队某年至今胜率函数defprobability(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=0ifs.get(team_A)isNooneelses.get(team_A)s_A_win=s_team_A/s.sum()s_team_B=0ifs.get(team_B)isNoneelses.get(team_B)s_B_win=s_team_B/s.sum()s_draw=1-s_A_win-s_B_winprob.append(year)prob.append(s_A_win)prob.append(s_B_win)prob.append(s_draw)returnprob自定义为获取两队历史胜率比较函数:#Defhis_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'))foryrinlist(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'))returndf_team自定义两队历史胜率绘图函数:#自定义两队历史胜率绘图函数defteam_plot(df,year_start,year_end,team_A,team_B,斧头):team_A_vs_team_B=team_A+'_vs_'+team_Byear')[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_B=teamf,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张图,下面就放几张他们的照片吧。同样,如果你喜欢巴西队或者其他球队,也可以使用上面的代码进行分析。通过以上功能可以快速分析两支球队的历史胜负情况。当然,有些球队很少遇到,或者最近几年没有遇到,所以分析结果可能不好用。当然,数据分析只是历史情况,足球是圆的,场地瞬息万变。比如阿根廷现在岌岌可危,梅西慌了……预测这届世界杯真的太过分了:意大利,荷兰,小组赛连阿根廷都没进。还不是最终绝杀,差点就要送出初凉了,不过现在看来大部分血量都回到了最后,还是放上我的大神预测吧。年年都有黑马,尤其是今年,预测不准确,就等着啪啪打脸吧。当然,其实在我心里,我希望是这样的。怎么样,给坚强的心竖个大拇指吧~~特别说明:以上数据分析,纯属个人学习。预测结果可能与实际情况存在较大偏差,不能用于其他用途。
