當前位置:
首頁 > 最新 > R代碼模擬世界盃1000次,足球小白速成世界盃預言姐

R代碼模擬世界盃1000次,足球小白速成世界盃預言姐

本文翻譯自Mango Solution 的博客:

https://www.mango-solutions.com/blog/another-prediction-of-fifa-world-cup-2018

作者楊環,就職於Mango Solutions,擔任數據科學諮詢顧問。本文已獲得原作者授權。

幾周前的皇家馬德里VS利物浦的歐冠總決賽是我差不多十年來唯一嚴肅認真看完的一場比賽,但我居然會挺胸抬頭地預測捧起2018年大力神杯的會是巴西隊?如果(真假偽)各界球迷朋友發現本文口感略柴,可能是因為我的足球類自然語言處理能力欠佳。不要緊,你可以關注下面更有趣的模型訓練、預測模擬與代碼實現的討論。

本文主要基於 Claus Thorn Ekstr??m. 在 eRum2018 上關於 2018 年世界盃的預測。第一手資料請點擊:

PPT:

http://www.biostatistics.dk/talks/eRum2018/#1,

視頻:

https://www.youtube.com/watch?v=urJ1obHPsV8,

代碼:https://github.com/MangoTheCat/blog_worldcup2018/blob/master/github.com/ekstroem/socceR2018,

如果你沒有梯子,視頻鏈接在這裡:https://pan.baidu.com/s/1r1NuJppNGkNeeybEVgs3SA

本文的想法是,每次模擬比賽都會產生冠軍、亞軍、季軍等。在N次(比如10000次)模擬後, 我們就能綜合計算出每一個球隊的勝率。

除了預測誰是冠軍外,本文還試圖預測哪個球隊的得分會最高以及最高得分是多少。在 Claus』s rmarkdown 分析文件的基礎上,我收集了新數據,把函數集成到 R 包中並且嘗試了一個新的模型。模型本身十分簡單,所以準確率難免有點低,但是模型能預估一個大概的趨勢。你可以以這個模型為基礎做出改進。

初始化

首先,載入包含 worldcup在內的 R 包,我把我的函數都集成到了worldcup(https://github.com/MangoTheCat/blog_worldcup2018/tree/master/worldcup)里。R 包是一個分享代碼、集成函數和加速迭代的便捷方式。dataMod.Rmd頭部的 YAML 部分中聲明了normalgoals(世界盃中一場比賽的平均進球數)和nsim(模擬次數)兩個變數。

接著我們載入了三個數據集,這三個數據集的原始數據來自開源數據集,我對原始數據做了一些改進。收集數據、調整隊伍名稱和清洗特徵花了我非常多的時間。

1. team_data 包含跟隊伍有關的特徵

2. groupmatchdata 是比賽時間表,來自公開數據

3. wcmatches_train 是一個處理過的數據,數據源自Kaggle 比賽(https://www.kaggle.com/abecklas/fifa-world-cup/data)。這個數據可以作為訓練集來估計 lambda 參數(每個球隊的場均進球數),訓練集採用了 1994-2014 年的數據。

遊戲開始

Claus 提出了三個計算單場比賽結果的模型。第一個模型基於兩個獨立的泊松分布,在這個模型中兩個球隊平等對待,所以無論他們實際技術和天賦如何,比賽的結果都是隨機的。第二個模型假設一場比賽的分數是兩個泊松事件,以及這兩個泊松事件的差服從 skellam 分布。由於參數是根據實際的投注估計的,所以這個模型的結果更加可靠。第三個模型基於 ELO 評分 ( World Football Elo Ratings,一個通用的球員評分規則(https://www.eloratings.net/about), 根據現在 ELO 評分,我們計算一場比賽中單個隊伍的成績,結果可以被看做二項分布中成功的概率。由於二項分布的性質(只有 0 和 1)這個模型忽略了平局的存在。

第四個模型是我的第一次嘗試,這裡簡單介紹下。在這個模型中我們假設了兩個獨立的泊松事件,它們的 lambda 參數是另一個已經訓練好的泊松分布模型的預測結果,預測的結果又由 rpois 模擬。

play_game函數包裝封裝好了上述四個模型,模型的選擇由參數play_fun實現。

在訓練中估計泊松均值

讓我們快速瀏覽下回歸函數glm中的核心部分,glm函數中的因變數是一個隊伍一場比賽中的進球數,自變數是 2014 年世界盃開始前的 FIFA 評分和 ELO 評分。FIFA 評分和 ELO 評分都是著名的評分系統,兩者之間的區別在於 FIFA 評分是官方的而 ELO 不是。ELO 評分是基於國際象棋排名方法更改的。

從模型的summary可以看出,在從統計學的角度,ELO評分比FIFA評分更重要顯著。更有趣的是FIFA評分的係數竟然是負數,1分FIFA評分平均能降低0.0002296進球數。總體而言,ELO評分的預測性要好於FIFA評分。由於模型中的自變數是2014年世界盃開始前的FIFA評分和ELO評分,所以這也可能是導致這樣結果的原因,更進一步,可能我們需要考慮更早的世界盃數據.畢竟有關於FIFA評分的預測效果不好已經不是什麼新聞(https://www.sbnation.com/soccer/2017/11/16/16666012/world-cup-2018-draw-elo-rankings-fifa)了。

訓練集wcmatches_train有一個is_home列,代表在這個比賽中隊伍是不是主場。然而,很難說明主客場因素在第三方國家進行的比賽和有職業聯賽之間有很大的不同。而且,對於本屆俄羅斯世界盃我也沒有找到明確劃分主客場的方法。我們可以新增一個相似特徵 - 主場優勢來表徵這個國家、這個洲是否是主場,這在未來的建模可以派上用場。主場優勢這個特徵暫時沒有出現在wcmatches_train數據集中。

小組賽和淘汰賽結果預測

下面展示的是在不同場景中預測獲勝隊伍的結果,包含小組賽、16 強、1/4 決賽、半決賽和總決賽。

模擬比賽

終於來到了最激動人心的部分!我們編寫了一個函數simulate_one()來模擬一次比賽,然後用replicate()函數重複模擬多次。如果想要模擬的次數很多(比如 10000 次),你可能需要開啟並行計算。為了簡單起見,我只模擬了 1000 次。

說了這麼多,我們最後把上述提到的關鍵功能都打包到了函數simulate_tournament()里,函數的返回結果是nsim次模擬比賽的排名和進球數,nsim就是simulate_tournament()函數的nsim參數。每次模擬結果都包含 32 支隊伍。set.seed()函數設置隨機數種子以保證結果可以復現。

冠軍名單

get_winner()函數返回一個獲勝概率的表單,從高到低依次往下排列。除了隨機泊松模型外,其餘三個模型都認為巴西會獲得冠軍,巴西和德國包攬了比賽的前兩名。至於第三名和第四名,當隨機數種子不同時隊伍(下圖中深藍色)很有可能會變化。方差可能是一個可以深挖的點。

哪個隊伍進球數最多呢?

四個模型中,skellum 模型似乎最可靠,我的雙泊松模型所給出的得分頻率要比實際的更低。這兩個模型的結果都認為巴西將獲得最多的進球數。

總結

模型的整體框架還是很清晰的,只需要通過game_fun_blah函數定義自己的單場比賽模型 ,然後把它作為參數傳遞給play_game函數。

歡迎優秀的大家在 Github 上給ekstroem/socceR2018(https://github.com/ekstroem/socceR2018)提交 PR。誰又能成為本屆世界盃最佳預言帝呢?

如果你喜歡這篇文章,歡迎給這篇文章的Github(https://github.com/MangoTheCat/blog_worldcup2018)點 Star,fork,提交 issue 或者扔香蕉,文章所提及的所有代碼都在 Github(https://github.com/MangoTheCat/blog_worldcup2018) 中。同時非常感謝 Rich, Doug, Adnan 以及所有分享過想法的人,沒有他們的幫助就沒有這篇文章,讓我們一起把知識傳遞給演算法。

補充

1. 數據收集。team_data數據集裡面並沒有最新的賠率和 ELO 評分。如果你想添加這些信息,它們可以從下面三個網站獲取。FIFA 評分獲取是最簡單的,能用常規的爬蟲獲得,而賠率和 ELO 評分似乎是由 JavaScript 代碼提供,我還沒想到一個很好的解決方案。至於一些投注和賠率信息,你可以從Betfair獲取。Betfair是一個在線投注交易網站,它提供了獲取信息的API,R包(https://github.com/phillc73/abettor)能直接爬取。投注信息對於不僅關心預測結果而且想要做策略的人來說更加重要。

https://www.betfair.com/sport/football

https://www.eloratings.net/2018_World_Cup

http://www.fifa.com/fifa-world-ranking/ranking-table/men/index.html

2. 模型改進。這可能是最關鍵的一點。舉例而言,已經有不少的研究證明雙變數的泊松分布對足球預測是有幫助的。

3. 特徵工程。GDP之類的經濟因素;球員總價、球員保險、球員受傷等市場因素可能也會幫助提升精度。

4. 模型評價。了解我們的模型是否具有良好的預測可信度的一種方法是在2018年7月15日之後根據實際結果評估預測結果。目前來自博彩公司的賠率也是一個參考因素。在歷史數據集上運行模型也不是也不能的,比如可以對2014世界盃運行模型,並對模型進行選擇。

5. 函數和R包還有改善的餘地,代碼也可以進一步整理。

你是哪個球隊的球迷?你覺得本屆世界盃誰將奪冠?來說說你的預測吧!

譯者簡介

夏豐盛,浙江大學在讀研究生,鍾情R語言,畫過電路,焊過板子,熱愛編程,勵志做個數據科學家。

翻譯:夏豐盛

審稿:郎大為

編輯:雷博文

版權公告

原創文章,版權所有。

敬告各位友媒,如需轉載,請與統計之都小編聯繫(直接留言或發至郵箱:editor@cos.name ),獲准轉載的請在顯著位置註明作者和出處(轉載自:統計之都),並在文章結尾處附上統計之都二維碼。

統計之都:專業、人本、正直的中國統計學門戶網站。

關注方式:掃描下圖二維碼。或查找公眾帳號,搜索 統計之都 或 CapStat 即可。

往期推送:進入統計之都會話窗口,點擊右上角小人圖標,查看歷史消息即可。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 統計之都 的精彩文章:

TAG:統計之都 |