那么四年一度的世界杯即将要在卡塔尔开幕了,对于不少热爱足球运动的球迷来说,这可是十分难得的盛宴,而对于最后大力神杯的归属,相信很多人都满怀着期待,每个人心中都有不同的答案。

今天小编就通过Python数据分析以及机器学习等方式来预测一下谁能获得最后的冠军,当然最后预测出来的结果也仅仅只是作为一种参考,并不代表最后真实的结果。(文末附python数据资料)

数据集的准备

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

模块和数据集的导入

数据分析和可视化要用到的模块分别是pandas、matplotlib以及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

接着我们导入数据集

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

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

world_cup.head()
output

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

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

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

俄罗斯世界杯的参赛队伍

我们先将目标锁定在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


我们需要将winning_team这一列的标签做一次转换,将赢得比赛的标签改为2,输掉比赛的标签改为0,而平局的标签改为1,代码如下

df_teams_1930 = df_teams_1930.reset_index(drop=True)
df_teams_1930.loc[df_teams_1930.winning_team == df_teams_1930.home_team,'winning_team']=2
df_teams_1930.loc[df_teams_1930.winning_team == 'Draw', 'winning_team']=1
df_teams_1930.loc[df_teams_1930.winning_team == df_teams_1930.away_team, 'winning_team']=0
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)

逻辑回归算法

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

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

预测结果

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

# 导入新的数据集,各球队的世界排名
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


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

`css
# 小组赛对决的预测
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

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

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


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

最后我自己整理了一些学习资料,都是别人分享给我的,希望对你们有帮助。
朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

四、实战案例

五、面试资料



最后,千万别辜负自己当时开始的一腔热血,一起变强大变优秀。

神了!用Python预测世界杯决赛,发现准确率还挺高!相关推荐

  1. 神了,用 Python 预测世界杯决赛,发现准确率还挺高

    那么四年一度的世界杯即将要在卡塔尔开幕了,对于不少热爱足球运动的球迷来说,这可是十分难得的盛宴,而对于最后大力神杯的归属,相信很多人都满怀着期待,每个人心中都有不同的答案. 今天我就通过Python数 ...

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

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

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

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

  4. 用Python预测世界杯球赛结果,还别说准确度还是蛮高的

    前言 那么四年一度的世界杯即将要在卡塔尔开幕了,对于不少热爱足球运动的球迷来说,这可是十分难得的盛宴,而对于最后大力神杯的归属,相信很多人都满怀着期待,每个人心中都有不同的答案. 今天我就通过Pyth ...

  5. 章鱼保罗预测世界杯决赛,荷兰将会夺冠,有图为证

    有图为证!

  6. 人工智能既预测世界杯冠军,还帮你“讨债”?

    6月14日,2018年俄罗斯世界杯即将开幕.就在前不久,俄罗斯一名人士,利用人工智能预测了今年的世界杯将会是德国夺冠.说起人工智能,大家脑海里浮现出的都是机器人.高级计算.智能识别等高科技应用,然而人 ...

  7. 预测2018年世界杯决赛_2018年5个电子商务预测

    预测2018年世界杯决赛 2018 is with us already and it's important in the current competitive market that eComm ...

  8. python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...

    Mika 来源 | 头图 |CSDN自东方IC今天教大家用Python预测英雄联盟比赛胜负. Show me data,用数据说话 今天我们聊一聊 Python预测LOL胜负 目前,英雄联盟S10全球 ...

  9. 富而喜悦自称时空穿越者预测世界杯12天12对惊讶网友!

    上一届世界杯法国队在俄罗斯赢得大力神杯!4年后的11月28日,一名自称时空旅行者的富而喜悦微博博主称,法国队今年没戏!巴西队时隔20年将在卡塔尔再次夺冠! 一名自称时空旅行者的富而喜悦新浪微博博主坚称 ...

最新文章

  1. 20个经典要诀学好英语
  2. Mybait缓存机制
  3. PostgreSQL 批量权限 管理方法
  4. 鸿蒙推送升级包,华为鸿蒙系统已陆续推送!安卓可无缝升级,升级包容量高达6GB...
  5. Python实现线程池
  6. 非线性调频 matlab,非线性调频信号
  7. Linux如何在任务栏显示时间,在MFC[转载]在MFC状态栏显示时间 状态栏显示时间
  8. Gym - 101471D Money for Nothing(决策单调性+分治+贪心)
  9. 面试算法工程师时,我居然被化学专业转行的老哥血虐了
  10. laravel 队列学习
  11. Android7.1+查看audio policy使用.conf/.xml(二十七)
  12. Centos7安装完毕后无法联网的解决方法(转)
  13. IntelliJ IDEA创建和配置Maven项目并运行
  14. Android改机 安卓改机软件 免root/不刷机/拒绝Xposed 实现 技术分析
  15. 关于CAD选择集的一些用法
  16. -XX:NewRatio 命令
  17. 自动打印照片是如何实现的
  18. 批处理文件怎么写用c语言,批处理文件怎么写
  19. 微信H5分享 代码和详细配置步骤 js + Java 代码
  20. 云计算对于软件工程的影响

热门文章

  1. linux bin文件制作,linux 将脚本制作成二进制bin文件
  2. 我转行程序员的那一年(七)
  3. 创建一个Spring Boot项目
  4. 数据库配置口令复杂度策略和口令有效期策略
  5. 冷月手撕408之操作系统(3)-操作系统的发展及分类
  6. ORACLE 错误 1659,数据库导入dmp临时表空间内存不够
  7. 设计模式之门面设计模式
  8. 一篇好文,以在迷茫时品味…………
  9. Qmail+vpopmail+daemontools+ucspi邮件系统安装及其SMTP认证配置
  10. 《天穗之咲稻姬》游玩感想