根據四萬場比賽結果,我給今年世界盃每場比賽計算了勝率

Crossin先生發表於2018-07-12

四年一度的世界盃本週就要開賽啦!如果你和我一樣是一名偽球迷,請先了解以下注意事項:

  1. 本屆世界盃是在俄羅斯舉辦
  2. 一共32只球隊分8個小組,每組前2名進入淘汰賽
  3. 比賽持續一個月
  4. 共64場比賽在俄羅斯多個城市舉行
  5. 沒有中國隊,因為沒出線
  6. 沒有義大利隊、荷蘭隊,因為也沒出線
  7. 是國家隊間比賽,因此沒有巴薩、皇馬、曼聯、拜仁……
  8. 比賽常規時間,上下半場各45分鐘
  9. 淘汰賽階段常規時間打平,進入30分鐘加時賽,再打平才是點球大戰
  10. 梅西是阿根廷的,C羅是葡萄牙的,內馬爾是巴西的,他們都不是西班牙的
  11. 大羅、小羅、卡卡、貝克漢姆都不參加
  12. 世界盃是足球比賽,沒有哈登、庫裡、杜蘭特


每到世界盃,一項保留節目就是預測當年冠軍,各路大神啦、名嘴啦、章魚啦、貓貓狗狗啦都少不了。這次我也來預測一把。但我不懂球啊怎麼辦?沒關係,我可以用程式!(反正都是蒙唄)


資料來源

這份資料來自 Kaggle,是從1872年到2018年共38929場比賽的結果。我們這次就用這份資料作為預測的基礎。

根據四萬場比賽結果,我給今年世界盃每場比賽計算了勝率
根據四萬場比賽結果,我給今年世界盃每場比賽計算了勝率
https://www.kaggle.com/martj42/international-football-results-from-1872-to-2017/data

可從文末專案中獲取。

另外介紹下 Kaggle,它一個資料科學競賽平臺,強烈建議研究資料分析、機器學習這方面的同學多上去玩耍。


建立模型

有了這麼多歷史比賽資料,要怎麼來預測呢?我建立了如下幾條規則:

  1. 太久遠的資料對於當下球隊的參考價值有限,所以設定一個起始年限
  2. 查詢對陣雙方從起始年限至今的對戰資料,並計算
    勝利概率=(勝利場次+平局場次/2)/總場次
  3. 小組賽階段,勝利概率超過一定閾值(比如0.7)的球隊贏,否則為平局
  4. 淘汰賽階段,勝利概率大的球隊贏
  5. 如果兩隊從起始年限至今沒有進行過比賽,就往前再多選取N年的資料(一般出現在參加大賽較少的球隊)
  6. 如果仍然沒有交手過,則以各自對陣本屆盃賽其餘所有球隊的戰績為基礎,分別計算勝利概率。概率高的球隊勝。但如果是小組賽,概率差必須高過一定閾值(比如0.1),否則為平局


賽程模擬

基於以上的規則模型,我們匯入資料,通過 Python 程式模擬本屆世界盃32支球隊的64場比賽。

根據四萬場比賽結果,我給今年世界盃每場比賽計算了勝率

這樣就“預測”了比賽的結果。


預測結果

所以,究竟這份程式碼 run 出怎樣的結果?

因為不同的起始年限和平局閾值會得到不一樣的結果。我嘗試使用 2006~2016 11個不同年限,和4組N的取值,得到共44組比賽結果。最終奪冠的次數是:

巴西 23 次
西班牙 12 次
德國 6 次
英格蘭 3 次

看來,巴西隊還是毋庸置疑的奪冠熱門。難怪各大菠菜網站都給他們開出最低的賠率。

根據四萬場比賽結果,我給今年世界盃每場比賽計算了勝率

但是拋開巴西隊不談,在我的結果中,英格蘭隊的表現異常得好。這主要源於他們近幾年對戰巴西的良好戰績:1勝2平0負。而相比之下,阿根廷恐怕又要“沒戲”了。

另外,塞內加爾伊朗值得關注下,他們這幾年對戰其他球隊的戰績不錯,或許會成為黑馬:

2012年以來

塞內加爾 4勝3平1負
伊朗 5勝6平3負


歷史戰績查詢工具

當然,我這個模型是很粗糙的。不過本來嘛,足球是圓的,拿歷史資料預測比賽結果也就是娛樂一下,給看球增加點樂趣。如果你有自己的規則想實現,也可以在我程式碼的基礎上進行修改。程式碼和資料的獲取方法見文末說明。

另外,我把部分資料匯出,做了一個線上查詢的小工具,方便你直接查詢任意兩支球隊之間的對戰歷史。

點選進入:歷史戰績線上查詢工具


根據四萬場比賽結果,我給今年世界盃每場比賽計算了勝率

可以選擇不同的年限。同時我還自創了一套“賠率”計算,以供參考。

主隊綜合勝率=總場數/(主隊勝場+客隊負場)

因為這個賠率模型基於的更多是歷史戰績,而強隊的對手多是強隊,弱隊的對手多是弱隊,導致賠率上的差異並沒有市面上的那麼大,但總的來看也基本符合勝負關係。如果你發現有某場比賽計算出的結果和別人開出的結果差異很大,那或許這會是場會爆冷的比賽哦


預測結果僅供參考,如有雷同純屬巧合


最後,我突然想到,我們們國足對這32支球隊的戰績如何呢?如果在另一個平行宇宙中有幸參賽,大概會是個什麼結果?於是……

2014年以來:2勝, 5平, 8負
2002年以來:8勝, 19平, 35負
似乎只有和從未交過手的巴拿馬在戰績上可以一戰。


好吧,當我沒說。還是讓我們安心享受世界盃的歡樂吧!


本文中使用到的資料和程式碼,可在公眾號(Crossin的程式設計教室)裡獲取,回覆關鍵字 世界盃


════
其他文章及回答:

如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 區塊鏈 | 人工智慧 | 雙11 | 嘻哈 | 爬蟲 | 排序演算法 | 我用Python | 高考

歡迎搜尋及關注:Crossin的程式設計教室

相關文章