35

我用Python分析了4W场比赛,2018世界杯冠军竟然是……

 6 years ago
source link: http://developer.51cto.com/art/201806/576257.htm?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

2018 年俄罗斯世界杯将在北京时间 6 月 14 日 23 时于莫斯科的卢日尼基球场正式打响揭幕战。

NFFVjyu.jpg!web

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

jURRBvQ.gif

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

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

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

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

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

本次的环境为:

  • Window 7 系统
  • Python 3.6
  • Jupyter Notebook
  • pandas version 0.22.0

先来看看数据的情况:

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

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

  • 日期
  • 主队名称
  • 客队名称
  • 主队进球数 (不含点球)
  • 客队进球数 (不含点球)
  • 比赛的类型
  • 比赛所在城市
  • 比赛所在国家
  • 是否中立

结果如下:

nAZbQnB.jpg!web

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

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() 

结果如下:

Mfi6Fj7.jpg!web

对数据做一个初步整理,代码如下:

df_FIFA.loc[:,'date'] = pd.to_datetime(df_FIFA.loc[:,'date']) 
df_FIFA['year'] = df_FIFA['date'].dt.year 
df_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 winners 
df_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 winners 
def 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 winners 
df_FIFA['winner'] = find_win_team(df_FIFA) 
df_FIFA.head() 

结果如下:

eiy2Mrv.jpg!web

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

获取世界杯所有比赛获胜场数最多的前 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') 

UNr2Ify.jpg!web

柱状图

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

beY3Qr2.jpg!web

水平柱状图

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

ZFviqeB.jpg!web

饼图

分析结论 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’。

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

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

分析各个国家队进球总数量情况,代码如下:

df_score_home = df_FIFA[['home_team', 'home_score']] 
column_update = ['team', 'score'] 
df_score_home.columns = column_update 
df_score_away = df_FIFA[['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=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') 

n26vMbi.jpg!web

分析结论 2

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

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

2018 年世界杯 32 强分析

7j22yif.jpg!web

微信截图_20180604172650.png

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: 
Iceland 
Panama 

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

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

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

下面是自 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') 

32EvUzE.jpg!web

进球数据情况

df_score_home_32 = df_top32[['home_team', 'home_score']] 
column_update = ['team', 'score'] 
df_score_home_32.columns = column_update 
df_score_away_32 = df_top32[['away_team', 'away_score']] 
df_score_away_32.columns = column_update 
df_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') 

uyuyA3y.jpg!web

分析结论 3

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

自 1872 年到现在,已经有 100 多年,时间跨度较大,有些国家已发生重大变化,后续分别分析自 1978 年(近 10 届)以及 2002 年(近 4 届)以来的比赛情况。程序代码是类似的,这里只显示可视化的结果。

下面是自 1978 年以来,32 强数据情况分析:

赢球场数情况

rQNjUjF.jpg!web

进球数据情况

Zbmem2b.jpg!web

分析结论 4

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

下面是自 2002 年以来,32 强数据情况分析:

赢球场数情况

zEjIZji.jpg!web

进球数据情况

JNJJ7vu.jpg!web

分析结论 5

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

综合结论

2018 年世界杯的 32 支队伍,根据以往的世界杯比赛数据来看,预测前三强为德国、阿根廷和巴西,其中德国队应该是夺冠的最大热门。本文是一次比较综合的项目实战,希望可以给大家带来一些启发。

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

留 言 有 礼 活 动

根据各大数据机构给出的本届世界杯夺冠赔率榜,本次的八大夺冠热门球队为:巴西、德国、西班牙、法国、阿根廷、比利时、英格兰、葡萄牙。你觉得哪支球队能赢得冠军奖杯呢?扫描下方二维码,关注51CTO技术栈公众号。欢迎在技术栈微信公众号留言探讨。小编将精选出最有价值的三条评论,分别获得 50、30、20 元 的 红 包 奖 励,活动截止时间 6 月 21 号 12 时整。

ayUnYrM.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK