社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python分析4W场球赛后,你Pick哪只夺冠热门球队?(附:扫盲指南)

中国统计网 • 7 年前 • 620 次点击  


比赛已经开始,我们不妨用 Python 来对参赛队伍的实力情况进行分析,并大胆的预测下本届世界杯的夺冠热门球队吧!

通过数据分析,可以发现很多有趣的结果,比如:

  • 找出哪些队伍是首次进入世界杯的黑马队伍

  • 找出2018年32强中之前已经进入过世界杯,但在世界杯上没有赢得过一场比赛的队伍

当然,我们本次的主要任务是要通过数据分析来预测2018年世界杯的夺冠热门队伍。

本次分析的数据来源于 Kaggle, 包含从 1872 年到今年的数据,包括世界杯比赛、世界杯预选赛、亚洲杯、欧洲杯、国家之间的友谊赛等比赛,一共大约 40000 场比赛的情况。

本次的环境为

  • window 7 系统

  • python 3.6

  • Jupyter Notebook

  • pandas version 0.22.0

先来看看数据的情况:

import pandas as pdimport matplotlib.pyplot as plt%matplotlib inlineplt.style.use('ggplot')df = pd.read_csv('results.csv')df.head()

该数据集包含的数据列的信息如下:

  • 日期

  • 主队名称

  • 客队名称

  • 主队进球数 (不含点球)

  • 客队进球数 (不含点球)

  • 比赛的类型

  • 比赛所在城市

  • 比赛所在国家

  • 是否中立

结果如下:

1、 获取所有世界杯比赛的数据(不含预选赛)

df_FIFA_all = df[df['tournament'].str.contains('FIFA', regex=True)]df_FIFA = df_FIFA_all[df_FIFA_all['tournament']=='FIFA World Cup']df_FIFA.head()

结果如下:

数据做一个初步整理

df_FIFA.loc[:,'date'] = pd.to_datetime(df_FIFA.loc[:,'date'])df_FIFA['year'] = df_FIFA['date'].dt.yeardf_FIFA['diff_score'] = df_FIFA['home_score']-df_FIFA['away_score']df_FIFA['win_team'] = ''df_FIFA['diff_score'] = pd.to_numeric(df_FIFA['diff_score'])

创建一个新的列数据,包含获胜队伍的信息

# The first method to get the winnersdf_FIFA.loc[df_FIFA['diff_score']> 0, 'win_team'] = df_FIFA.loc[df_FIFA['diff_score']> 0, 'home_team']df_FIFA.loc[df_FIFA['diff_score']< 0, 'win_team'] = df_FIFA.loc[df_FIFA['diff_score']< 0, 'away_team']df_FIFA.loc[df_FIFA['diff_score']== 0, 'win_team'] = 'Draw'df_FIFA.head()# The second method to get the winnersdef find_win_team(df):    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')    return winnersdf_FIFA['winner'] = find_win_team(df_FIFA)df_FIFA.head()

结果如下:

2、 获取世界杯所有比赛的前20强数据情况

2.1 获取世界杯所有比赛获胜场数最多的前20强数据

s = df_FIFA.groupby('win_team')['win_team'].count()s.sort_values(ascending=False, inplace=True)s.drop(labels=['Draw'], inplace=True)

用pandas可视化如下:

柱状图

s.head(20).plot(kind='bar', figsize=(10,6), title='Top 20 Winners of World Cup')

水平柱状图

s.sort_values(ascending=True,inplace=True)s.tail(20).plot(kind='barh', figsize=(10,6), title='Top 20 Winners of World Cup')

饼图

s_percentage = s/s.sum()s_percentages_percentage.tail(20).plot(kind='pie', figsize=(10,10), autopct='%.1f%%',                           startangle=173, title='Top 20 Winners of World Cup', label='')


分析结论1:

从赢球场数来看,巴西、德国、意大利、阿根廷四支球队实力最强。


通过上面的分析,我们还可以来查看部分国家的获胜情况

s.get('China', default = 'NA')s.get('Japan', default = 'NA')s.get('Korea DPR', default = 'NA')s.get('Korea Republic', default = 'NA')s.get('Egypt', default = 'NA')

运行结果分别是 ‘NA’,4,1,5,‘NA’。

从结果来看,中国队,在世界杯比赛上(不含预选赛)还没有赢过。当然,本次世界杯的黑马-埃及队,之前两度进入世界杯上,但也没有赢过~~

上面分析的是赢球场数的情况,下面我们来看下进球总数情况。

2.2 各个国家队进球总数量情况

df_score_home = df_FIFA[['home_team', 'home_score']]column_update = ['team', 'score']df_score_home.columns = column_updatedf_score_away = df_FIFA[['away_team', 'away_score']]df_score_away.columns = column_updatedf_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=False, inplace=True)s_score.sort_values(ascending=True, inplace=True)s_score.tail(20).plot(kind='barh', figsize=(10,6), title='Top 20 in Total Scores of World Cup')


分析结论2:

从进球总数量来看,德国、巴西、阿根廷、意大利四支球队实力最强。


上面分析的是自1872年以来的所有球队的数据情况,下面,我们重点来分析下2018年世界杯32强的数据情况。

3、2018年世界杯32强分析

2018年世界杯的分组情况如下:

第一组:俄罗斯、德国、巴西、葡萄牙、阿根廷、比利时、波兰、法国

第二组:西班牙、秘鲁、瑞士、英格兰、哥伦比亚、墨西哥、乌拉圭、克罗地亚

第三组:丹麦、冰岛、哥斯达黎加、瑞典、突尼斯、埃及、塞内加尔、伊朗

第四组:塞尔维亚、尼日利亚、澳大利亚、日本、摩洛哥、巴拿马、韩国、沙特阿拉伯

获取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']for item in team_list:    if item not in s_score.index:        print(item)out:IcelandPanama

通过上述分析可知,冰岛队和巴拿马队是首次打入世界杯的。

由于冰岛队和巴拿马队是首次进入世界杯,所以这里的32强数据,事实上是没有这两支队伍的历史数据的。

df_top32 = df_FIFA[(df_FIFA['home_team'].isin(team_list))&(df_FIFA['away_team'].isin(team_list))]

3.1 自1872年以来,32强数据情况

赢球场数情况

s_32 = df_top32.groupby('win_team')['win_team'].count()s_32.sort_values(ascending=False, inplace=True)s_32.drop(labels=['Draw'], inplace=True)s_32.sort_values(ascending=True,inplace=True)s_32.plot(kind='barh', figsize=(8,12), title='Top 32 of World Cup since year 1872')

进球数据情况

df_score_home_32 = df_top32[['home_team', 'home_score']]column_update = ['team', 'score']df_score_home_32.columns = column_updatedf_score_away_32 = df_top32[['away_team', 'away_score']]df_score_away_32.columns = column_updatedf_score_32 = pd.concat([df_score_home_32,df_score_away_32], ignore_index=True)s_score_32 = df_score_32.groupby('team')['score'].sum()s_score_32.sort_values(ascending=False, inplace=True)s_score_32.sort_values(ascending=True, inplace=True)s_score_32.plot(kind='barh', figsize=(8,12), title='Top 32 in Total Scores of World Cup since year 1872')


分析结论3:

自1872年以来,32强之间的世界杯比赛,从赢球场数和进球数量来看,德国、巴西、阿根廷三支球队实力最强。


自1872年到现在,已经有100多年,时间跨度较大,有些国家已发生重大变化,后续分别分析自1978年(近10届)以及2002年(近4届)以来的比赛情况。

程序代码是类似的,这里只显示可视化的结果。

3.2 自1978年以来,32强数据情况

赢球场数情况

进球数据情况



分析结论4:

自1978年以来,32强之间的世界杯比赛,从赢球场数来看,阿根廷、德国、巴西三支球队实力最强。从进球数量来看,前3强也是这三支球队,但德国队的数据优势更明显。


3.3 自2002年以来,32强数据情况

赢球场数情况

进球数据情况


分析结论5:

自2002年以来,32强之间的世界杯比赛,从赢球场数和进球数量来看,德国、阿根廷、巴西三支球队实力最强。其中,德国队的数据优势更明显。


4、综合结论

2018年世界杯的32支队伍,根据以往的世界杯比赛数据来看,预测前三强为 德国、阿根廷和巴西,其中德国队应该是夺冠的最大热门。你怎么看?


最后附上一份《伪球迷的自我修养》,不懂世界杯的你、包你看完后,分分钟变“懂球帝”,真球迷,那就一起揭穿他(她)。



扫盲篇

  • 世界杯每四年一次,一次一个月

  • 这次的举办地是俄罗斯

  • 世界杯只有足球一项比赛

  • 比赛都是北京时间的晚上和凌晨进行

  • 世界杯一共32个队参赛,分成8各小组,每组4支球队

  • 世界杯是国家队之间的比赛,没有皇马、巴萨、拜仁(这些都是俱乐部)

  • 也没有科比、詹姆斯

  • 更没有姚明、马龙、张继科

  • 叕没有中国队

小白篇

首先你要pick一支球队作为主队。德国、法国、巴西、西班牙、阿根廷、葡萄牙这些人气高、实力强的夺冠热门都是很好的选择(另外谨记这届世界杯实力很强的意大利和荷兰都没能晋级,千万别说这俩队)。

不过这样的选择很有可能会受到一些自以为是的球迷鄙视,认为你是跟风喜欢,无脑支持。

所以如果你pick的是一支有实力,但名声又没那么响的球队,比如克罗地亚、墨西哥、瑞士、比利时。不仅能彰显你独特的品味,还能让别人觉得你是个真球迷。

要是这几支球队最后能杀进8强甚至4强成为黑马,啧啧,那你可就是别人眼中的资深球迷了。

好了,pick完主队后,你至少得知道自己的主队都有哪些球员吧,而且光知道球员的名字是不够的,最好能记住一些球员的绰号。

比如,“水爷”听着就要比“拉莫斯”霸气


“煤老板”听着就比“梅西”接地气


“二娃”听着就比“穆勒”喜气

进阶篇

在了解完自己主队的现况后,还要去了解自己主队的过去。这样跟别人聊起来时,你就可以说,我记得我还上小学的时候,XX队里有个老谁家的小谁贼厉害,blabla......

其次,如果别人邀请你一起看球,一定要了解他是哪个队的球迷。如果是阿根廷球迷,那一定是梅西的支持者没跑了。

所以,当出现以下情形时,你要做出正确的应对。举几个例子

  • 梅西射门进球:漂亮!这球也就梅西能进!

  • 梅西射门不进:卧*,对面的门将开挂了吧?

  • 梅西助攻:这传球太隐蔽,太有想象力了。

  • 梅西全场隐身(指没有什么表现):老板太无私了,吸引了这么多人防守。

  • 梅西倒地裁判没有吹罚犯规:这球不犯规吗,黑哨,裁判买球了吧?

  • 阿根廷赢了:老板Carry全场。

  • 阿根廷输了:队友太次,带不动。

同理,当你的朋友是别的队球迷时,你只需要冷静观察,分析出当家球星是谁(听解说老念叨谁,看镜头老给谁特写),然后用他的名字替换掉梅西即可。

但如果是一帮人一起看球,由于里面混杂着多国球迷,这时你最好选择沉默,好好吃你的瓜。

要是有人问起你对比赛的预测,然而你对这俩队完全不了解时,为了不暴露自己伪球迷的本质,你可以这么说:

“足球是圆的!”

这句话约等于一切皆有可能!

高阶篇

高阶篇的要求就有些难了,你需要会运用足坛的一些梗。比如:传统美德本特克:用于某位球员错失单刀或者空门。

注:此梗源自某场英超联赛中,当时身为利物浦球员的本特克错失了空门的机会,导致某国内解说怒爆粗口“传统美德(CTMD)本特克”。

都怪本泽马:用于某队输球或者被淘汰。

注:有关此梗来源的说法甚多,最早的一种说法是,每当C罗在皇马表现不好时,一些C罗的粉丝就会把锅甩给本泽马。以至于后来衍生出一系列关于“都怪本泽马”的段子,即便大部分的事都与本泽马无关。


掌握这些后,即可打开电视享受比赛了。最后希望大家一定要文!明!看!球!

End.

来源:Python数据之道(作者:Lemonbit)/蝌蚪五线谱


PS:昨日【转行数据分析指南→定位篇】预告链接失效,想会看的小伙伴点击阅读原文即可回看;建议感兴趣的小伙伴下载CCtalk,搜群号83213219,进群后可随时回看系列课程(已更新城市篇、定位篇),该系列课之后的直播也在群里发布。




今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/UZYYE6ZiIV
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13683