今天2022年11月29日的凌晨,葡萄牙队2比0获击败乌拉圭队!葡萄牙队提前晋级16强,你熬夜看这场比赛了吗? 今天晚上11点荷兰将对战卡塔尔,NED(荷兰)有望取胜!

现在让我们通过Python数据分析以及机器学习等方式来预测一下谁能获得最后的冠军,当然最后预测出来的结果也仅仅只是作为一种参考,并不代表最后真实的结果。

目录

1.数据集的准备

2.模块和数据集的导入

2.1 导入数据集

2.2 校验数据

3.探索性数据分析和特征工程

4.俄罗斯世界杯的参赛队伍

5.逻辑回归算法

6.预测结果

7.2022年卡塔尔世界杯小组赛的预测


文中使用数据库的下载地址

1.数据集的准备

在这里我们用到的数据集是来自kaggle的公开数据集,其中的一份数据集是2018年俄罗斯世界杯每小组各成员交手的记录,最后小编的预测基于该份数据集的基础之上,另外一份数据集则是从1870年开始到2022年截止,所有参赛球队的历史交手成绩汇总。那么我们首先导入要用到的模块以及导入数据集。

2.模块和数据集的导入

数据分析和可视化要用到的模块分别是pandasmatplotlib以及seaborn,而机器学习预测要用到的模块是sklearn,代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.ticker as ticker
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

2.1 导入数据集

接着让我们导入数据集,代码如下:

world_cup = pd.read_csv("World_Cup_2018_Dataset.csv")results = pd.read_csv("results.csv")

2.2 校验数据

我们可以通过head()方法来查看导入数据及的前几行,校验一下数据的导入是否成功,代码如下 :

world_cup.head()

output

3.探索性数据分析和特征工程

接下来我们要做的便是探索性数据分析和特征工程了,来对数据集有一个大致的了解,同时生成一些针对最后的预测大有帮助的特征出来,例如我们针对比赛当中的比分来判断比赛是谁胜谁负,或者是平局,代码如下:

winner = []
for i in range(len(results["home_team"])):if results["home_score"][i] > results["away_score"][i]:winner.append(results["home_team"][i])elif results["home_score"][i] < results["away_score"][i]:winner.append(results["away_team"][i])else:winner.append("Draw")results["winning_team"] = winner
results["goal_difference"] = np.absolute(results["home_score"] - results["away_score"])
results.head()

output

紧接着我们针对某个单独的国家,统计历史过往中所有比赛的胜负率情况,例如阿根廷队,就筛选出阿根廷队的历史战绩,代码如下 :

df = results[(results["home_team"] == "Argentina") | (results["away_team"] == "Argentina")]
argen = df.iloc[:]
argen.head()

output

那么同时我们也知道第一届世界杯举办的时间是1930年在乌拉圭举办的,那么筛选出在1930年之后的所有比赛的成绩,代码如下:

year = []
for row in argen['date']:year.append(int(row[:4]))
argen["match_year"] = year
argen_1930 = argen[argen.match_year >= 1930]
argen_1930.head()

output

我们将比赛的结果的统计可视化,我们就能清晰地看到阿根廷球队的胜负率的情况,代码如下:

x = ["Argentina","Loss","Draw"]y = [474, 220, 173]
sns.barplot(x, y)plt.title("win games vs loss games")
plt.xlabel("win vs loss")plt.ylabel("count")plt.show()

output

4.俄罗斯世界杯的参赛队伍

我们先将目标锁定在2018年俄罗斯世界杯的参赛队伍上,总共是以下这几支球队:

world_cup_russia = ["Australia", "Iran", "Japan", "Korea Republic", "Saudi Arabia", "Egypt", "Morocco",                   "Nigeria", "Senegal", "Tunisia", "Costa Rica", "Mexico", "Panama", "Argentina", "Brazil",                     "Colombia", "Peru", "Uruguay", "Belgium", "Croatia", "Denmark", "England", "France",                     "Germany", "Iceland", "Poland", "Portugal", "Russia", "Serbia", "Spain", "Sweden", "Switzerland"]

然后我们筛选出来这32支球队的过往的比赛成绩,代码如下:

df_team_home = results[results['home_team'].isin(world_cup_russia)]
df_team_away = results[results['away_team'].isin(world_cup_russia)]
df_teams = pd.concat((df_team_home, df_team_away))
df_teams.drop_duplicates(inplace=True)df_teams.tail()

output

我们着重看的是1930年之后的比赛记录,那么我们再进行一次筛选,代码如下 :

year = []
for row in df_teams["date"]:year.append(int(row[:4]))
df_teams["match_year"] = year
df_teams_1930 = df_teams[df_teams.match_year >= 1930]
df_teams_1930.head()

output

当然我们在最后进行预测的时候,会有一些无关紧要的特征掺杂其中,我们需要将其去掉,代码如下 :

df_teams_1930 = df_teams.drop(['date', 'home_score', 'away_score', 'tournament', 'city', 'country', 'goal_difference', 'match_year'], axis=1)df_teams_1930.tail()

output

紧接着,我们需要对这些离散类型的变量进行独热编码,用到的是pandas模块当中的get_dummies()方法,代码如下:

# convert home team and away team from categorical variables to continous inputs
# Get dummy variables
final = pd.get_dummies(df_teams_1930, prefix=['home_team', 'away_team'], columns=['home_team', 'away_team'])
final.head()

output

划分出训练集和测试集,调用的是train_test_split()方法,代码如下:

# Separate X and y sets
X = final.drop(['winning_team'], axis=1)
y = final["winning_team"]
y = y.astype('int')# Separate train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42)

5.逻辑回归算法

这里调用的是非常简单的逻辑回归的算法,读者朋友后续也可以尝试其他的分类算法进一步的完善一下整个预测的流程与结果,代码如下:

logreg = LogisticRegression()
logreg.fit(X_train, y_train)
score = logreg.score(X_train, y_train)
score2 = logreg.score(X_test, y_test)print("Training set accuracy: ", '%.3f'%(score))
print("Test set accuracy: ", '%.3f'%(score2))

6.预测结果

那么最后便是将我们训练出来的模型去做一个预测了,我们先前的数据集当中有主队和客队之分,但是在世界杯的赛场上没有,这里我们就依据世界排名的先后顺序来划分一下,因此需要导入世界排名的数据集 :

# 导入新的数据集,各球队的世界排名
ranking = pd.read_csv('datasets/fifa_rankings.csv')
# 2018年俄罗斯世界杯的对阵情况
fixtures = pd.read_csv('datasets/fixtures.csv')pred_set = []

在数据集当中插入主队和客队排名的字段,代码如下:

# 插入两个新的字段,主队和客队排名的字段
fixtures.insert(1, 'first_position', fixtures['Home Team'].map(ranking.set_index('Team')['Position']))
fixtures.insert(2, 'second_position', fixtures['Away Team'].map(ranking.set_index('Team')['Position']))# 我们筛选出来在小组赛中的对阵情况
fixtures = fixtures.iloc[:48, :]
fixtures.head()

output

根据排名的高低来重新修正参赛球队是作为主队还是客队,代码如下 :

# Loop to add teams to new prediction dataset based on the ranking position of each team
for index, row in fixtures.iterrows():if row['first_position'] < row['second_position']:pred_set.append({'home_team': row['Home Team'], 'away_team': row['Away Team'], 'winning_team': None})else:pred_set.append({'home_team': row['Away Team'], 'away_team': row['Home Team'], 'winning_team': None})pred_set = pd.DataFrame(pred_set)
backup_pred_set = pred_setpred_set.head()

output

还是与之前一样,我们要对这些离散类型的变量进行编码,这里就不重复演示了,我们调用训练好的模型并且进行比赛结果的预测,代码如下:

# 小组赛对决的预测
predictions = logreg.predict(pred_set)
for i in range(fixtures.shape[0]):print(backup_pred_set.iloc[i, 1] + " and " + backup_pred_set.iloc[i, 0])if predictions[i] == 2:print("Winner: " + backup_pred_set.iloc[i, 1])elif predictions[i] == 1:print("Draw")elif predictions[i] == 0:print("Winner: " + backup_pred_set.iloc[i, 0])print('Probability of ' + backup_pred_set.iloc[i, 1] + ' winning: ', '%.3f'%(logreg.predict_proba(pred_set)[i][2]))print('Probability of Draw: ', '%.3f'%(logreg.predict_proba(pred_set)[i][1]))print('Probability of ' + backup_pred_set.iloc[i, 0] + ' winning: ', '%.3f'%(logreg.predict_proba(pred_set)[i][0]))print("")

output

7.2022年卡塔尔世界杯小组赛的预测

上述预测的结果针对的是2018年俄罗斯世界杯小组赛的对阵情况,那么2022年卡塔尔世界杯小组赛的预测,我们只需要将fixture数据集更新一下即可:

fixtures = pd.read_csv("datasets/fifa-world-cup-2022.csv")fixtures.head()

output

最后预测出来的结果如下所示


感谢您的阅读,如觉得有用请您点赞,您的鼓励是对我的最大动力!

END

2022/11/28

联系我:pengyu717@yeah.net

#Python #2022卡塔尔世界杯 #FIFA World Cup Qatar 2022 # 机器学习 #数据分析 用Python预测世界杯决赛相关推荐

  1. #世界杯征文活动 #Python #2022卡塔尔世界杯 #FIFA World Cup Qatar 2022 # 机器学习 #数据分析 用Python预测世界杯决赛

    今天2022年11月29日的凌晨,葡萄牙队2比0获击败乌拉圭队!葡萄牙队提前晋级16强,你熬夜看这场比赛了吗? 今天晚上11点荷兰将对战卡塔尔,NED(荷兰)有望取胜! 现在让我们通过Python数据 ...

  2. python numpy安装教程_手把手教你搭建机器学习开发环境—Python与NumPy的超简安装教程...

    手把手教你搭建机器学习开发环境Python语言是机器学习的基础,所以,想要入门机器学习,配置好Python的开发环境是第一步.本文就手把手的教你配置好基于Python的机器学习开发环境.超简单!第一步 ...

  3. python智慧树判断题_智慧树知到大数据分析的python基础判断题答案

    通过不同部门之间数据的互通共享,可以有效改善多头管理的问题,使企业和个人避免信息的重复填写和到处跑路提供证明的繁琐. 在指令长度相同的情况下,所有指令的取指操作都是相同的. 虞山派:嘉庆万历年间出现的 ...

  4. python超市售货统计程序_零售超市项目销售数据分析(Python)

    一.项目背景:现有一家零售超市2017-2020年的订单信息,2020年各销售指标持续上升,但是利润总额年增长率下滑,净利润率下滑,分析该超市的历年销售业绩表现和利润构成,探究利润总额增长速度下滑的原 ...

  5. Python生成2022卡塔尔世界杯赛程日历订阅源代码,生成ics文件,带日历提醒

    Python生成2022卡塔尔世界杯赛程日历订阅源代码,不错过每一场比赛,直接运行main.py即可,首先从百度体育抓取最新2022卡塔尔世界杯赛程日历,已完赛部分爬取比分,然后生成两个ics文件,w ...

  6. 世界杯小组赛频繁爆冷?这或许是强队的谋略 一分钟带你了解2022卡塔尔世界杯赛制

    今年的世界杯你赚到钱了吗? 我们这里所说的世界杯是指世界杯决赛圈,也被叫做世界杯正赛.参赛队伍是已经通过世界杯预选赛选拔出的的32支队伍(除了东道主卡塔尔自动晋级). 世界杯中没有皇马.巴萨.曼联,这 ...

  7. 基于机器学习的2022卡塔尔世界杯冠军预测-个人期末项目总结

    声明:文中内容基于山东某高校数据挖掘课程的学习成果,本系列文章为课程期末项目的个人总结. #--------------- [2022年6月补充:非常不好意思大家,当时是笔记用,我没想到这么久还有人看 ...

  8. 2022 FIFA World Cup Final

    我希望梅西能够捧杯,因为我怕再看见那个眼神!写在总决赛开始前 12/18/2022 22:04 在一个周日的晚上收到了邹总发的活动信,我记得还在CSDN问答区在回答问题,突然看见私信的红点,其实看到活 ...

  9. 最后一场2022卡塔尔世界杯预选赛,巴西队与阿根廷队不踢了

    2022卡塔尔世界杯的所有预选赛全数都已告一段落,但唯独南美洲赛区有一场比赛因故未能如期完成,对战组合是南美两大足球强权巴西队与阿根廷队.原本国际足联(FIFA)与南美足联(CONMEBOL)排定这场 ...

最新文章

  1. hdu2089 不要62 数位dp
  2. 小红帽linux操作教程_【免费】Linux从入门到精通教程!
  3. Cnblogs美化总结
  4. stylus导入时 报错These relative modules were not found
  5. [20180816]校内模拟赛
  6. 开机未发现nvidia控制面板_Windows10或者其他操作系统开机提示“未发现NVIDIA控制面板,从Microsoft Store中安装NVIDIA控制面板”的解决办法...
  7. nodejs进入mysql数据库_nodejs简单访问及操作mysql数据库的方法示例
  8. 那些年,我们解析过的前端异常
  9. Python —— CPU vs. GPU
  10. Python 的OOP 面向对象编程基础
  11. 利用Keydown事件阻止用户输入
  12. Struts框架的工作原理
  13. H5游戏开发框架排名
  14. C++ UPD广播异步发包工具
  15. 如何做好一场技术分享(技巧篇)
  16. C#时间戳与日期时间DateTime格式互转
  17. Visual Studio Ultimate 2013(VS2013旗舰版 下载地址及哈希校验)
  18. 非组蛋白带什么电荷_非组蛋白是构成真核生物染色体的基本结构蛋白,富含带正电荷的精氨酸(Arg)和赖氨酸(Lys)等碱性...
  19. fastadmin更改访问入口文件路径
  20. 官能团醛化改性修饰药物的制备

热门文章

  1. [NLP] 实例讲解 N-gram语言模型 中 Good-Turning 平滑技术
  2. 多模式MaaS仅仅适用于大城市吗?
  3. 老调重弹,Squirrel,FASTCGI
  4. 提高商品曝光率增加销量,从这几点做起
  5. SASS的概念和使用
  6. solidworks教程:如何在SW中创建边界框
  7. java 多态的应用——多态数组和多态参数详解
  8. 哪个PHP文本编辑器最好?
  9. bbp代码python_如何正确计算加密债券价格的BBP(Bollinger波段百分比)?
  10. springboot引入rabbit mq