用Python預測NBA常規賽結果

提起「大數據」,你會想到什麼?

在很多人腦中,大數據都只是一個模糊的概念;也有人會說,大數據可以用來「預測股市」、「預測地震」、「預測消費者行為」。但其實,大數據與我們的關係可能比想像中得更緊密。

從夜觀天象到氣象預報,從童話里的水晶球到今日的科技預言家,人類一直希望能夠更早突破局限看穿未來,人類的生活也正在被大數據預測深刻改變。

相信你一定知道世界盃中,「章魚保羅」的傳說,但你可能不知道的是,它早已被大數據預測所取代:

世界盃期間,谷歌、百度、微軟和高盛等公司都推出了比賽結果預測平台。百度預測結果最為亮眼,預測全程 64 場比賽,準確率為 67%,進入淘汰賽後準確率為 94%。

從經驗來看,只要有體育賽事歷史數據,並且與指數公司進行合作,便可以進行其他賽事的預測,譬如歐冠、NBA 等賽事。

本次項目,我們就基於 2015-2016 年的 NBA 常規賽及季後賽的比賽統計數據,預測當下正在進行的 2016-2017 常規賽每場賽事的結果。因數據量有限,核心是向大家介紹分析方法,歡迎大家學習本課程後通過更多數據設計分析模型。

本教程由zyj061發布在實驗樓,完整教程、代碼及在線練習地址:NBA常規賽結果預測——利用Python進行比賽數據分析(更多課程請查看全部課程)

( 當然 NBA 比賽的影響因素有很多,轉會、換教練、換球場甚至換保安,都有可能對比賽結果造成影響,所以本課程只提供方法,更多的信息挖掘和分析思路留給你來拓展。)

一、課程介紹

1. 內容簡介

不知道你是否朋友圈被刷屏過 NBA 的某場比賽進度或者結果?或者你就是一個 NBA 狂熱粉,比賽中的每個進球,搶斷或是逆轉壓哨球都能讓你熱血沸騰。除去觀賞精彩的比賽過程,我們也同樣好奇比賽的結果會是如何。因此本節課程,將給同學們展示如何使用 NBA 比賽的以往統計數據,判斷每個球隊的戰鬥力,及預測某場比賽中的結果。

2. 課程知識點

  • NBA 球隊的 Elo score 計算
  • 特徵向量
  • 邏輯回歸

3. 實驗流程

  1. 獲取比賽統計數據
  2. 比賽數據分析,得到代表每場比賽每支隊伍狀態的特徵表達
  3. 利用機器學習方法學習每場比賽與勝利隊伍的關係,並對2016-2017的比賽進行預測

4. 效果截圖

二、獲取 NBA比賽統計數據

2.1 比賽數據介紹

在本次實驗中,我們將採用Basketball Reference.com中的統計數據。在這個網站中,你可以看到不同球員、隊伍、賽季和聯盟比賽的基本統計數據,如得分,犯規次數等情況,勝負次數等情況。而我們在這裡將會使用2015-16 NBA Season Summary中數據。

在這個2015-16總結的所有表格中,我們將使用的是以下三個數據表格:

  • Team Per Game Stats:每支隊伍平均每場比賽的表現統計。

  • Opponent Per Game Stats:所遇到的對手平均每場比賽的統計信息,所包含的統計數據與Team Per Game Stats中的一致,只是代表的該球隊對應的對手的。

  • Miscellaneous Stats:綜合統計數據。

我們將用這三個表格來評估球隊過去的戰鬥力,另外還需2015-16 NBA Schedule and Results中的2015~2016年的nba常規賽及季後賽的每場比賽的比賽數據,用以評估Elo score(在之後的實驗小節中解釋)。在Basketball Reference.com中按照從常規賽至季後賽的時間。列出了2015年10月份至2016年6月份的每場比賽的比賽情況。

可在上圖中,看到2015年10月份的部分比賽數據。在每個Schedule表格中所包含的數據為:

在預測時,我們同樣也需要在2016-17 NBA Schedule and Results中2016~2017年的NBA的常規賽比賽安排數據。

2.2 獲取比賽數據

我們將以獲取Team Per Game Stats表格數據為例,展示如何獲取這三項統計數據。

  1. 進入到basketball-refernce.com中,在導航欄中選擇Season並選擇2015~2016賽季中的Summary:

  2. 進入到2015~2016年的Summary界面後,滑動窗口找到Team Per Game Stats表格,並選擇左上方的Share & more,在其下拉菜單中選擇Get table as CSV (for Excel):

  3. 複製在界面中生的的csv格式數據,並複製粘貼至一個文本編輯器保存為csv文件即可。

為了方便同學們進行實驗,我們已經將數據全部都保存成 csv 文件上傳至實驗樓的雲環境中。在後續的代碼實現小節里,我們將給出獲取這些文件的地址。

三、數據分析

在獲取到數據之後,我們將利用每支隊伍過去的比賽情況和Elo 等級分來判斷每支比賽隊伍的可勝概率。在評價到每支隊伍過去的比賽情況時,我們將使用到Team Per Game Stats,Opponent Per Game Stats和Miscellaneous Stats(之後簡稱為T、O和M表)這三個表格的數據,作為代表比賽中某支隊伍的比賽特徵。我們最終將實現針對每場比賽,預測比賽中哪支隊伍最終將會獲勝,但並不是給出絕對的勝敗情況,而是預判勝利的隊伍有多大的獲勝概率。因此我們將建立一個代表比賽的特徵向量。由兩支隊伍的以往比賽情況統計情況(T、O和M表),和兩個隊伍各自的Elo等級分構成。

關於Elo score等級分,不知道同學們是否看過《社交網路》這部電影,在這部電影中,Mark(主人公原型就是扎克伯格,FaceBook創始人)在電影起初開發的一個美女排名系統就是利用其好友Eduardo在窗戶上寫下的排名公式,對不同的女生進行等級制度對比,最後PK出勝利的一方。

這條對比公式就是Elo Score 等級分制度。Elo 的最初為了提供國際象棋中,更好地對不同的選手進行等級劃分。在現在很多的競技運動或者遊戲中都會採取 Elo 等級分制度對選手或玩家進行等級劃分,如足球、籃球、棒球比賽或 LOL、DOTA 等遊戲。

在這裡我們將基於國際象棋比賽,大致地介紹下Elo等級劃分制度。在上圖中Eduardo在窗戶上寫下的公式就是根據Logistic Distribution計算PK雙方(A和B)對各自的勝率期望值計算公式。假設A和B的當前等級分為R_ARA何R_BRB,則A對B的勝率期望值為:

B對A的勝率期望值為

如果棋手A在比賽中的真實得分S_ASA(勝1分,和0.5分,負0分)和他的勝率期望值E_AEA不同,則他的等級分要根據以下公式進行調整:

在國際象棋中,根據等級分的不同K值也會做相應的調整:

  • ge2400≥2400,K=16
  • 2100~2400分,K=24
  • le2100≤2100,K=32

因此我們將會用以表示某場比賽數據的特徵向量為(加入A與B隊比賽):[A隊Elo score, A隊的T,O和M表統計數據,B隊Elo score, B隊的T,O和M表統計數據]

四、基於數據進行模型訓練和預測

4.1 實驗前期準備

在本次實驗環境中,我們將會使用到python的pandas,numpy,scipy和sklearn庫,不過實驗樓中已經安裝了numpy,所以在實驗前,我們需要先利用pip命令安裝另外三個Python庫。

$ sudo pip install pandas$ sudo pip install scipy$ sudo pip install sklearn

在安裝完所需的實驗庫之後,進入到實驗環境的Code目錄下,創建cs_782文件夾,並且通過以下地址獲取我們為大家處理好的csv文件壓縮包data.zip:

$ cd Code$ mkdir cs_782 && cd cs_782# 獲取數據文件$ wget http://labfile.oss.aliyuncs.com/courses/782/data.zip# 解壓data壓縮包並且刪除該壓縮包$ unzip data.zip $ rm -r data.zip

在data文件夾中,包含了2015~2016年的NBA數據T,O和M表,及經處理後的常規賽和挑戰賽的比賽數據2015~16result.csv,這個數據文件是我們通過在basketball-reference.com的2015-16 Schedule and result的幾個月份比賽數據中提取得到的,其中包括三個欄位:

  • WTeam: 比賽勝利隊伍
  • LTeam: 失敗隊伍
  • WLoc: 勝利隊伍一方所在的為主場或是客場 另外一個文件就是16-17Schedule.csv,也是經過我們加工處理得到的NBA在2016~2017年的常規賽的比賽安排,其中包括兩個欄位:
  • Vteam: 訪問/客場作戰隊伍
  • Hteam: 主場作戰隊伍

4.2 效果展示

在Codecs_782目錄下,創建prediciton.py開始實驗。全部代碼可以在實驗樓查看及下載。

最後運行prediction.py:

生成預測結果文件16-17Result.csv文件:

五、總結

在本項目中,我們利用Basketball-reference.com的部分統計數據,計算每支nba比賽隊伍的Elo socre,和利用這些基本統計數據評價每支隊伍過去的比賽情況,並且根據國際等級劃分方法Elo Score對隊伍現在的戰鬥等級進行評分,最終結合這些不同隊伍的特徵判斷在一場比賽中,哪支隊伍能夠佔到優勢。但在我們的預測結果中,與以往不同,我們沒有給出絕對的正負之分,而是給出勝算較大一方的隊伍能夠贏另外一方的概率。當然在這裡,我們所採用評價一支隊伍性能的數據量還太少(只採用了15~16年一年的數據),如果想要更加準確、系統的判斷,有興趣的你當然可以從各種統計數據網站中獲取到更多年份,更加全面的數據。結合不同的回歸、決策機器學習模型,搭建一個更加全面,預測準確率更高的模型。在kaggle中有相關的籃球預測比賽項目,有興趣的同學可嘗試一下。

更多經典的編程練手項目:全部課程


推薦閱讀:

利用XGboost簡單粗暴zillow競賽25%
《R語言實戰》第7章 筆記
胡說八道互聯網,他讓馬雲又愛又恨
數據可視化(三)那些好用的在線工具
《機器學習》從零開始學(1) 數據分析之「岩石與水雷」

TAG:Python | 数据分析 | NBA |