实战项目练习 ---- 【2018世界杯】用python分析夺冠球队

2018世界杯

前言

在网上找到了个用Python分析2018世界杯夺冠热门的项目,感觉很有意思准备拿来练练手。
因为目前还没有学到图形可视化部分,所以这部分内容会完全借鉴网上的教程。

分析目的

通过数据分析找出哪些队伍是这次世界杯的夺冠热门球队

开发环境

  • Python 3.7
  • SublimeText2

初步分析数据情况

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import DataFrame,Series


df = pd.read_csv('results.csv')
print(df.head())

由于sublimetext上打印数据显示不全,所以打印数据放在ipython中了

In [39]: df.head()
Out[39]:
         date home_team away_team  home_score  away_score tournament     city   country  neutral
0  1872-11-30  Scotland   England           0           0   Friendly  Glasgow  Scotland    False
1  1873-03-08   England  Scotland           4           2   Friendly   London   England    False
2  1874-03-07  Scotland   England           2           1   Friendly  Glasgow  Scotland    False
3  1875-03-06   England  Scotland           2           2   Friendly   London   England    False
4  1876-03-04  Scotland   England           3           0   Friendly  Glasgow  Scotland    False

目前包含有9种数据:日期、主队名、客队名、主队进球数、客队进球数、比赛类型、所在城市、所在国家、是否中立。
但是想要知道夺冠热门球队,光这些数据还不够。

分析思路

  • 因为我们这次分析的是世界杯的夺冠热门,首先需要排除掉像友谊赛,亚洲杯等比赛数据。
  • 这批数据是从1873年至2014年的比赛数据,所以一个国家队肯定换过好多批阵容了,早年强的队伍近期不一定强,需要以时间段对它们进行分析。
  • 想要分析黑马球队,需要一个球队的胜率以及进球数。目前数据中缺少胜利队伍的变量,需要我们加进去。

获取世界杯相关数据

# 通过在比赛类型中抓取包含'FIFA'字符来获取世界杯数据
df_FIFA_all = df[df['tournament'].str.contains('FIFA', regex=True)] 

# 其中世界杯类型的数据也蛮乱的,‘FIFA World Cup’以及‘FIFA World Cup qualification’都有,只提取‘FIFA World Cup’部分

df_FIFA = df_FIFA_all[df_FIFA_all['tournament']=='FIFA World Cup']
print(df_FIFA.head())

整理数据

  • 要分析球队的获胜场数,需要添加一个获胜队伍的字段。
  • 为了方便分割年份,添加一个‘届数’的字段。
  • 统一时间数据格式
# 在做数据修改以前,先做拷贝
df_FIFA_COPY = df.copy()

df_FIFA_COPY.loc[:,'date'] = pd.to_datetime(df_FIFA_COPY.loc[:,'date'])
df_FIFA_COPY['session'] = df_FIFA_COPY['date'].dt.year
# 添加分差值,方便后面确定获胜队伍
df_FIFA_COPY['diff_score'] = df_FIFA_COPY['home_score']-df_FIFA_COPY['away_score']

df_FIFA_COPY['win_team'] = ''
df_FIFA_COPY['diff_score'] = pd.to_numeric(df_FIFA_COPY['diff_score'])

上面部分添加了年份这个参数,添加了获胜队伍的参数还未填入数据,还确定了分差值。

确认获胜队伍,填入win_team参数中

df_FIFA_COPY.loc[df_FIFA_COPY['diff_score']> 0, 'win_team'] = df_FIFA_COPY.loc[df_FIFA_COPY['diff_score']> 0, 'home_team']
df_FIFA_COPY.loc[df_FIFA_COPY['diff_score']< 0, 'win_team'] = df_FIFA_COPY.loc[df_FIFA_COPY['diff_score']< 0, 'away_team']
df_FIFA_COPY.loc[df_FIFA_COPY['diff_score']== 0, 'win_team'] = 'Draw'

print(df_FIFA_COPY.head())

结果如下:

           date  home_team   away_team  ...  session  diff_score    win_team
1277 1930-07-13    Belgium         USA  ...     1930          -3         USA
1278 1930-07-13     France      Mexico  ...     1930           3      France
1279 1930-07-14     Brazil  Yugoslavia  ...     1930          -1  Yugoslavia
1280 1930-07-14       Peru     Romania  ...     1930          -2     Romania
1281 1930-07-15  Argentina      France  ...     1930           1   Argentina

现在已经获得了获胜队伍的数据,接下来通过对获胜队伍这个参数的统计来分析出前20强队伍:

获取获胜场数最多的前20强比赛队伍

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

显示柱形图


s.head(20).plot(kind='bar', figsize=(10,6), title='Top 20 Winner of World')
plt.show()
1.png

柱状图中已经明确显示了前20强的队伍,其中巴西、德国、意大利、阿根廷、西班牙、法国等最为突出,他们的胜场占比非常的高。

再来查看下饼图情况:

# 
s = df_FIFA_COPY.groupby('win_team')['win_team'].count()
s.drop(labels=['Draw'], inplace=True)

s.sort_values(ascending=True,inplace=True)


# 饼图

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='')

WechatIMG37.png

通过百分比更能清晰的看到强队在整个世界杯历史中胜场比数。初步分析下来,从赢球场数来看,巴西、德国、意大利、阿根廷四支球队实力最强。

接下来在分析下各队的进球数情况

# 进球数统计
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')
plt.show()
WechatIMG38.png

从进球数的分析结果来看,德国、巴西、阿根廷、意大利这四支球队最强,结合上面的胜场数分析同样也是这四支球队排名最靠前。

开篇准备的分析思路里第一条和第三条已经完成了。

分析1872年以来按胜场数排名的32强数据情况

df_top32 = df_FIFA_COPY.copy()

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')
WechatIMG40.png

再看看从1978年至今的胜场排名前32队伍数据

df_since1978 = df_FIFA_COPY.loc[df_FIFA_COPY['session'] >= 1978]

s_32 = df_since1978.groupby('win_team')['win_team'].count()
s_32.sort_values(ascending=False, inplace=True)
s_32 = s_32[:32]
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 1978')
plt.show()
WechatIMG41.png

然后是自1978年以来的进球数排名前32队伍相关数据:

df_score_home = df_since1978[['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=s_score[:32]
s_score.sort_values(ascending=True, inplace=True)
s_score.tail(32).plot(kind='barh', figsize=(10,6), title='Top 32 in Total Scores of World Cup since year 1978')
plt.show()

代码都差不多就不再重复解释了


WechatIMG42.png

在这两组数据中,巴西、阿根廷、德国、意大利排名稳坐前四。

再分析下从2002年以来的相关数据情况:

自2002以来胜场排名数据:


2002-winteam.png

自2002以来得分排名数据:


2002-score.png

个人分析总结:
从这两组数据中可以看到,德国队在胜场和得分数上有很大的优势。虽然个人不大懂如何分析球队,但是光看这个数据觉得德国队在2018世界杯的赢面还是蛮大的。而排名第二、三的巴西、阿根廷、意大利在数据上明显差了德国队一截。

最终结论:2018世界杯冠军应该在前四强德国、巴西、意大利、阿根廷中产出。此次数据分析当做练习来用,而且2018年世界杯老早已经过了。

技术总结

在这里主要涉及到了一些基础功能点:

  • 读取csv文件
  • 数据整理:去除了和世界杯无关的数据、添加新变量获胜队伍win_teamdiff_score分差值、
  • 按关键字对数据排序
  • matplotlib库的初步使用,生成柱形图和饼图
  • 数据分割与截取
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容