世界杯数据集分析

1.数据采集

采集目标:世界杯成绩信息表:WorldCupsSummary

包含了所有21届世界杯赛事(1930-2018)的比赛主办国、前四名队伍、总参赛队伍、总进球数、现场观众人数等汇总信息,包括如下字段:Year: 举办年份,HostCountry: 举办国家,Winner: 冠军队伍,Second: 亚军队伍,Third: 季军队伍,Fourth: 第四名队伍,GoalsScored: 总进球数,QualifiedTeams: 总参赛队伍数,MatchesPlayed: 总比赛场数,Attendance: 现场观众总人数,HostContinent: 举办国所在洲,WinnerContinent: 冠军国家队所在洲等,采集后如下图数据采集目标字段截图所示。

采集流程:

第一步,导入所需要的库,如requests库、json库、pandas库等,代码展示如图所示:

import requests

import json

import time

import pandas as pd

import random

第二步,确定翻页方法,确定url和请求参数,发起请求与响应,代码展示如图所示:

df = []

i = 0

# API

url = 'https://api.bilibili.com/x/space/arc/search?'# 请求头参数

headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67','refer': 'https://www.bilibili.com/',

}

第三步,发起请求,确定网站返回值正常,网站可以正常爬取,代码展示如图所示:

response = requests.get(url, headers=headers, params=params)

第四步,定义一个列表,利用requests库发送请求,由于我们要收集不同网页的数据,再利用每一页网址存在一定差异的特点进行分页爬取,定位列表爬取的内容,代码展示如下图所示:

for value in info_list:try:RoundID = value['RoundID']except:RoundID = ""try:MatchID = value['MatchID']except:MatchID = ''try:Team_Initials = value['Team_Initials']except:Team_Initials = ''try:Coach_Name = value["Coach_Name"]except:Coach_Name = ''try:Line_up = value['Line_up']except:Line_up = ''try:Shirt_Number = value['Shirt_Number']except:Shirt_Number = ''try:Player_Name = value['Player_Name']except:Player_Name = 0try:Position= value['Position']except:Position = '无'try:Event = value['Event']except:Event = 0df.append([RoundID,MatchID,Team_Initials,Coach_Name,Line_up,Shirt_Number,Player_Name,Position,Event])

第五步,加入时间函数,设置代码运行速度,使翻页速度下降,模拟成人工翻页,防止爬取速度过快,代码展示如图所示:

# 防止爬取速度过快time.sleep(random.randint(1, 2))

第六步,在确定网站可以正常爬取的前提下,通过for循环获取信息,再将爬取的文件写入并保存至csv文件,代码展示如图所示:

if __name__=='__main__':start = time.time()# 设置需要爬取的页数num = 3list = [1935882,351498044,390461123,99157282,60384544,9008159,8960728,71851529]for value in list:pau = get_info(url,headers,num,value)end = time.time()# 数据存储df = pd.DataFrame(df,columns=["RoundID", "MatchID", "Team Initials","Coach Name","Line-up","Shirt Number","Player Name","Position","Event"])df.to_csv('WorldCupsSummary', encoding='gb18030', index=False)

这样,运行完整代码,就可以在csv文件中找到我们获取到的主页信息,并对它们进行有效分析,采集的部分数据截图如图所示:

2.数据预处理

2.1 数据预处理的目标:

(1)数据清洗

(2)缺失值处理

(3)数据格式清洗

(4)重复值清洗

(5)异常值清洗。

(6)去掉重复记录

(7)年份列,数据添加关键字”年”,2014年

2.2 空值、重复值的处理:

wcPlayers. duplicated()

处理重复值:

wcPlayers.drop_duplicates(inplace=True)

wcMatches.drop_duplicates(inplace=True)

用isnull()查看缺失值,,返回True表示此处为缺失值,本数据集有缺失值,需要处理

删除Position列为Nan的数据,填充 Attendance 为空的 cell

# 删除Position列为Nan的数据

wcPlayers.dropna(how='any', subset=['Position'], inplace=True)

# 填充 Attendance 为空的 cell

#使用每列缺失值后面的值进行填充(按相应列填充,按照相应index前后填充)

wcMatches.Attendance.fillna(method='bfill', inplace=True)

异常值的处理:

1.Position包括C和GK

ind = wcPlayers[(wcPlayers.Position != 'C')&(wcPlayers.Position != 'GK')].index

wcPlayers.drop(axis=0, index=ind, inplace=True)

2 Home Team Name 和 Away Team Name以rn">开头的国家

ind = wcMatches['Home Team Name'].str.startswith('rn">')

wcMatches.loc[ind,['Home Team Name']] = wcMatches.loc[ind,['Home Team Name']]['Home Team Name'].str.slice(4)

单位标准统一化:在有年份的列,加入单位年,进行标准化,方便后续的处理

wcMatches.Year = wcMatches.Year.astype(str) + '年'

wcMatches.Year

数值标准化:

1. Matches 的 Year 列转为整数

2. 主队进球数 转为整数

3. 客队进球数转为整数

4. Datetime 转为时间列

wcMatches.Year = wcMatches.Year.astype(int)

#将year转换为整形

wcMatches['Home Team Goals'] = wcMatches['Home Team Goals'].astype(int)

wcMatches['Away Team Goals'] = wcMatches['Away Team Goals'].astype(int)

wcMatches.Datetime = pd.to_datetime(wcMatches.Datetime)

wcMatches

3.数据可视化

导入数据可视化需要的第三方库:

import pandas as pd

import numpy as np

from pyecharts import options as opts

from pyecharts.charts import Bar

from pyecharts.charts import Line

from pyecharts.charts import Map

根据世界杯历史数据,可以分析每个比赛场次吸引的观众人数:

attendance = wcMatches.groupby(by='Year',group_keys=False).agg({'Attendance':'mean'}).reset_index()

plt.bar(x=range(attendance.shape[0]),height=attendance.Attendance)

plt.xticks(ticks=range(attendance.shape[0]),labels=attendance.Year,rotation=90)

plt.xlabel('年份')

plt.ylabel('平均每场人数')

plt.title('各年世界杯人数')

plt.show()

people=[round(i,2) for i in df.loc[:,'Attendance']/10000]

c = (Line(init_opts=opts.InitOpts(width='1150px')).add_xaxis(df.index.tolist()).add_yaxis("现场观众总人数", people, is_smooth=True,markpoint_opts=opts.MarkPointOpts(data=[opts.MarkLineItem(type_='max',symbol_size = [80,50],name='max'),opts.MarkLineItem(type_='min',symbol_size = [80,50],name='min')])).set_global_opts(tooltip_opts=opts.TooltipOpts(is_show=True, trigger="axis", axis_pointer_type="cross"),xaxis_opts=opts.AxisOpts(name='Time',type_="category",axispointer_opts=opts.AxisPointerOpts(is_show=False, type_="shadow"),),yaxis_opts=opts.AxisOpts(name='numbers(10000)')).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).render("此场观众总人数.html")

)

从图中可以看出,世界杯观众人数整体总体是上升的,从最初只有30万人到2018年有300多万人现场观看,上涨了近5倍,其中在1934年现场人数最少,只有36万人左右,观众总数最多的一届是1994年的美国世界杯。其次,世界杯现场观众人数的总量已经从1930年的约590,000人增长到了2018年的超过3300万人。这反映了足球运动在全球越来越受欢迎和普及的趋势。然而,需要注意的是,该数字并不包括通过电视和互联网观看比赛的人数,因此实际上世界杯足球比赛所吸引的观众远远超过现场观众的数量。在世界杯历史的早期,现场观众人数相对较少,这主要是因为早期的比赛更为局部化和地区化。直到20世纪90年代,随着电视和互联网的普及,现场观众人数才开始显著增长。

接下来,我们绘制了1930-2018年世界杯总进球、参赛队伍、比赛场数折线图。

year_list=df['Year'].values.tolist()

plt.plot(year_list,df['GoalsScored'],label='总进球数')

plt.plot(year_list,df['QualifiedTeams'],label='总参赛队伍数')

plt.plot(year_list,df['MatchesPlayed'],label='总比赛场数')

plt.legend()

plt.title('1930-2018年世界杯总进球、参赛队伍、比赛场数')

plt.show()

从图中可看出,参赛队伍的增加,导致了总进球数和比赛场次的增加,中间有几届出现较大的波动,但1954年和1958年像是个意外,队伍不多,进的球还不少。且1930年至2018年的世界杯参赛队伍数量不断增加,从最初的13个增长到现在的32个,1998年世界杯以后,参赛队伍数量稳定在32个,其中既有足球强国,也有新兴足球劲旅。1930年至2018年的世界杯比赛场数逐年增加,从最初的18场增长到现在的64场。世界杯足球比赛已经成为全球足球迷普遍关注的焦点,进球数、参赛队伍和比赛场数也随着时间不断增长。世界杯足球比赛也一直在不断创造新的历史记录。

我们想要预测下一届的世界杯冠军,就得分析世界杯各个国家球队身价。

从世界杯各个国家球队身价条形图可知,排在前五的是英格兰队、巴西队、法国队和葡萄牙队,分别是在十亿欧元左右。然而,需要注意的是球员身价是动态变化的,受到众多因素的影响,不过这也能帮助我们预测下一届的冠军,大概率会从前几名之中产生。

为了做出更准确的预测,世界杯各个国家进球数分析是必不可少的。

homeTeam = wcMatches[['Home Team Name', 'Home Team Goals']]

homeTeam.columns = ['Team Name','Team Goals']

awayTeam = wcMatches[['Away Team Name', 'Away Team Goals']]

awayTeam.columns = ['Team Name','Team Goals']

team = pd.concat([homeTeam, awayTeam])

results = team.groupby(by='Team Name',group_keys=False).agg({'Team Goals':'sum'}).reset_index()

results.sort_values(by='Team Goals',ascending=False,inplace=True)plt.figure(figsize=(24,6))

plt.bar(range(results.shape[0]), results['Team Goals'])

plt.xticks(range(results.shape[0]),results['Team Name'],rotation=90)

plt.xlabel('国家')

plt.ylabel('历届总进球数')

plt.title('国家进球数')

plt.show()

从图中可以看出,巴西是历届总进球数最多的国家,远远超过其他各国,无愧足球王国的称号,其次是德国和阿根廷等。而矩形颜色越深,说明这个国家进球的次数越多,实力比较强。

同时我们也分析了夺冠国家的进失球率。

# 合并数据表

data7=data3.merge(data6,on="球队",how="outer")

data7=data7[['球队','总场次_x','总进球数','进球率','总失球数','失球率']]

data7.rename(columns={'总场次_x': '总场次'}, inplace=True)

# 画图

import numpy as np

col=["Brazil","Italy","Germany FR","Argentina","France","Uruguay","England","Germany","Spain"]

result=[]

for i in col:result.append(data7[data7["球队"]==i])

result=np.array(result)

result=result.reshape(9,6)

result=pd.DataFrame(result,index=col,columns=data7.columns)

result=result.iloc[:,1:].astype('float') import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams['font.family']='sans-serif'

mpl.rcParams['font.sans-serif']=[u'SimHei']

mpl.rcParams['axes.unicode_minus'] = Falseminx = min(result["失球率"])

maxx = max(result["失球率"])

miny = min(result["进球率"])

maxy = max(result["进球率"])plt.figure(figsize=(8,8),dpi=100)

for i in range(result.shape[0]): plt.scatter(x=result["失球率"][i],y=result["进球率"][i],s=result["总场次"][i]*20,alpha=0.65,cmap='viridis')

plt.xlim(xmin= maxx+0.1,xmax=minx-0.1) # 将失球率从大到小设定X轴

plt.vlines(x=result['失球率'].mean(), ymin=miny-0.1, ymax=maxy+0.1,colors='black', linewidth=1)

plt.hlines(y=result['进球率'].mean(), xmin=minx-0.1, xmax=maxx+0.1,colors='black', linewidth=1)

for x,y,z in zip(result["失球率"],result["进球率"],col):plt.text(x, y, z, ha='center',fontsize=10)

plt.xlabel("高<—————— 失球率(%) ——————>低",fontsize=15)

plt.ylabel("低<—————— 进球率(%) ——————>高",fontsize=15)

plt.title("夺冠国家进失球率-波士顿矩阵图", fontsize=20)

plt.show()

从图可以看出进球率高而失球率低的国家更容易夺冠。例如,巴西、德国和意大利等国家,它们在夺冠的同时,进球率和失球率都比较出色,这说明它们在攻守两端都相当出色,具有很强的实力和稳定性。 其次,一些夺冠次数较少的国家,如乌拉圭和英格兰,它们的进球率和失球率波动范围比较大,这表明它们的实力相对较弱,夺冠时的运气和机会起到了很大的作用。最后,还可以看出一些国家在进攻或防守方面表现非常突出。

世界杯上主客场优劣势问题一直备受关注,下面是世界杯主客场胜率的一些分析,研究冠军国家是否与举办国家是否存在关系。

data = wcSummary[['HostCountry','Winner']]

eq = data[data.HostCountry == data.Winner].shape[0]

neq = data.shape[0] - eqplt.pie(labels=['举办国家获冠军','非举办国家获冠军'],x=[eq,neq],autopct='%.2f%%')

plt.title('举办国家和冠军国家的比例')

plt.show()

#主场队胜

win=int(df[df.loc[:,'Home Team Goals']>df.loc[:,'Away Team Goals']].count()[0])

#平

draw=int(df[df.loc[:,'Home Team Goals']==df.loc[:,'Away Team Goals']].count()[0])

#主场队输

loss=int(df[df.loc[:,'Home Team Goals']

从图中可以发现,主场优势是真实存在的,当作为主场方的,其胜率达到了76.19%,而客场的胜率只有23.81%,平局和客队胜概率都较小。需要明确的是,在世界杯比赛中,没有正式的主客场之分。在小组赛中,每个球队都有机会分别在中立场进行3次比赛;而在淘汰赛阶段,除了决赛以外,主客场的优劣势对这些比赛并没有明显的影响。

世界杯是世界范围内最重要、最受关注的足球比赛之一,那么世界杯举办国家都在哪些地方呢,哪些地方的人们踢足球更厉害呢?

HostCountry=df.groupby(df.loc[:,'HostCountry']).groups

for i in HostCountry:HostCountry[i]=len(HostCountry[i])

HostCountry['Korea']=1

HostCountry['Japan']=1

del HostCountry['Korea/Japan']

HostCountry['United States']=HostCountry['USA']

del HostCountry['USA']

HostCountry['United Kingdom']=HostCountry['England']

del HostCountry['England']

HostCountry=[[i,HostCountry[i]] for i in HostCountry]c=(Map(init_opts=opts.InitOpts(width='1150px')).add(series_name="举办国家",data_pair=HostCountry,maptype="world",)# 全局配置项.set_global_opts(# 设置标题title_opts=opts.TitleOpts(title="举办世界杯国家的世界地图"),# 设置标准显示visualmap_opts=opts.VisualMapOpts(max_=2, is_piecewise=False),)# 系列配置项.set_series_opts(# 标签名称显示,默认为Truelabel_opts=opts.LabelOpts(is_show=False, color="blue"),showLegendSymbol=False)# 生成本地html文件.render("举办过世界杯的国家.html"))

从图中可以看出,世界杯的主办方一般都在欧洲和美洲,很少会在亚洲和非洲举办,这可能跟经济实力或者国家足球实力有关,也取决于欧洲球队的综合实力以及参赛名额。从词云图可知,有的国家都举办二轮了,有的国家连一轮都没举办过,在亚洲举办的次数最少,在欧洲举办的次数是最多的,像墨西哥,巴西,法国等都举办了两次了。

世界杯的冠军队伍并不都来自同一个州或地区,这些获胜者分散在世界各地。以下是世界杯冠军队伍所在州的一些分析。

sns.countplot(df['WinnerContinent'])

plt.title('1930-2018年世界杯冠军队所在州统计')

plt.show()

预测下一届世界杯冠军是一项困难的任务,因为从目前的局面来看,尚不清楚哪支球队最有可能夺冠。每个队伍都有自己的优点和缺点,而世界杯比赛还可能会出现意外的情况,影响比赛进程和结果。

尽管如此,我们可以根据过去的战绩、球队阵容、教练以及球队的整体实力等因素来预测夺冠概率。根据目前的情况,以下是我们的预测:

巴西拥有百年足球历史和优秀的足球文化,在世界足坛上一直占有重要地位。他们有许多优秀的球员,如内马尔、库蒂尼奥和阿尔维斯等,并且巴西队一直以攻势足球而著名。如果他们能够保持稳定状态并且各个方面配合默契,他们极有可能赢得冠军。我们认为夺冠概率为14%。

阿根廷足球历史悠久,拥有众多可圈可点的成就和优秀的球员,是南美洲足球的重要代表之一,但是,尽管他们历史上曾多次获得过世界杯冠军,但在未来能否夺冠仍存在着许多的不确定性。总的来说,我认为阿根廷队在下一届世界杯夺冠概率是中等偏上的,约为13%左右。

法国在2018年世界杯上获得了冠军,他们是一支有实力的球队,拥有一流的教练和优秀球员,如姆巴佩、格列兹曼和坎特等。他们有足够的实力和经验,可以在下一届世界杯中再次获得冠军,夺冠概率约在16%。

德国早期足球运动很活跃,在足球历史上占有着重要的地位,也取得过世界杯冠军,且一直保持着强大的国际竞争实力。然而,根据过往的历史数据和目前的球队阵容,德国队仍然是有很大冠军争夺实力的球队之一。夺冠概率约在12%。

西班牙足球风格独特,注重技术和战术的融合并且拥有一流的球员和教练团队。他们在过去几年的比赛中表现出色,并有可能在下一届世界杯上获得冠军。夺冠概率约为11%。

其他国家也有可能赢得冠军,如英格兰、葡萄牙等。但他们的夺冠概率相对较低,因为他们可能面临更大的挑战和困难。夺冠概率:10%。

这仅是我们通过数据做出的预测,实际情况可能存在变化,并且各支球队的实力、状态以及比赛情况均可影响预测结果。

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

Copyright © 2022 篮球世界杯_世界杯亚洲区名额 - cdbnfc.com All Rights Reserved.