成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我用Python提前“算”出了2018世界杯奪冠球隊(第二彈......)

開發 后端
2018 年世界杯小組賽已經在如火如荼的進行中。在上篇文章我用Python分析了4W場比賽,2018世界杯冠軍竟然是……的基礎上,我們繼續分析世界杯 32 強的實力情況,以便能夠更進一步分析本次世界杯的奪冠熱門球隊。

2018 年世界杯小組賽已經在如火如荼的進行中。在上篇文章我用Python分析了4W場比賽,2018世界杯冠軍竟然是……的基礎上,我們繼續分析世界杯 32 強的實力情況,以便能夠更進一步分析本次世界杯的奪冠熱門球隊。

三十年河東三十年河西,對于世界杯而言,這個時間可能 4 年就足夠。前幾場爆冷,使得天臺上已經擁擠不堪,跳水的股市更是讓天臺一度混亂。

在文章開始之前,提醒大家:賭球有風險,看球須盡興。本文的重點是通過分析 32 強之間的比賽,透過歷史數據來預測奪冠熱門球隊。

本次分析的數據來源于 Kaggle, 包含從 1872 年到今年的數據,包括世界杯比賽、世界杯預選賽、亞洲杯、歐洲杯、國家之間的友誼賽等比賽,一共大約 40000 場比賽的情況。

本次的環境為:

  • Window 7 系統
  • Python 3.6
  • Jupyter Notebook
  • pandas version 0.22.0

先來看看數據的情況:

  1. import pandas as pd 
  2. import matplotlib.pyplot as plt 
  3. %matplotlib inline 
  4. plt.style.use('ggplot'
  5. # 解決matplotlib顯示中文問題 
  6. plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默認字體 
  7. plt.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負號'-'顯示為方塊的問題 
  8. df = pd.read_csv('results.csv'
  9. df.head() 

該數據集包含的數據列的信息如下:

  • 日期
  • 主隊名稱
  • 客隊名稱
  • 主隊進球數 (不含點球)
  • 客隊進球數 (不含點球)
  • 比賽的類型
  • 比賽所在城市
  • 比賽所在國家
  • 是否中立

結果如下:

獲取所有世界杯比賽的數據(含預選賽)

創建一個新的列數據,包含獲勝隊伍的信息,以及獲取所有世界杯比賽的數據,包含預選賽。

  1. mask = df['home_score'] - df['away_score'
  2. df.loc[mask > 0, 'win_team'] = df.loc[mask > 0, 'home_team'
  3. df.loc[mask < 0, 'win_team'] = df.loc[mask < 0, 'away_team'
  4. df.loc[mask == 0, 'win_team'] = 'Draw' 
  5. df_FIFA_all = df[df['tournament'].str.contains('FIFA', regex=True)] 

結果如下:

世界杯戰績分析 (含預選賽)

從前文來看, 在世界杯歷史上,實力最強的 5 支球隊是德國、阿根廷、巴西、法國、西班牙。

接下來,我們將比賽的范圍擴大至包含世界杯預選賽,通過 5 支球隊之間的比賽情況來進行分析。

  1. team_top5 = ['Germany''Argentina''Brazil''France''Spain'
  2. df_FIFA_top5 = df_FIFA_all[(df_FIFA_all['home_team'].isin(team_top5))& 
  3.                                         (df_FIFA_all['away_team'].isin(team_top5))] 
  4. df_FIFA_top5.shape 
  5. out
  6. (43, 10) 

在世界杯歷史上,5 支球隊在共有 43 場比賽相遇。

通過這 43 場比賽分析后,5 支球隊的勝負場數排名如下:

  1. s_FIFA_top5 = df_FIFA_top5.groupby('win_team')['win_team'].count() 
  2. s_FIFA_top5.drop('Draw', inplace=True
  3. s_FIFA_top5.sort_values(ascending=False, inplace=True
  4. s_FIFA_top5.plot(kind='bar', figsize=(10,6), title='Top Five in World Cup'

結果如下:

下面,著重來分析下這 5 支球隊,在世界杯上,兩兩對陣時的勝負情況。

首先自定義兩個函數,分別獲得兩支球隊獲勝場數情況以及自定義繪圖函數,代碼如下:

  1. # 自定義函數,返回兩支球隊獲勝場數情況 
  2. def team_vs(df,team_A,team_B): 
  3.     df_team_A_B = df[(df['home_team'].isin([team_A,team_B]))& 
  4.                                         (df['away_team'].isin([team_A,team_B]))] 
  5.     s_win_team = df_team_A_B.groupby('win_team')['win_team'].count() 
  6.     return s_win_team 
  7. # 如需獲取本文源代碼,請關注公眾號“Python數據之道”, 
  8. # 在公眾號后臺回復 “code” ,謝謝大家支持。 
  9. # 自定義函數,兩支球隊在世界杯的對陣勝負情況制圖 
  10. def team_vs_plot(df,team_A,team_B,ax): 
  11.     s_win_FIFA = team_vs(df,team_A,team_B) 
  12.     title = team_A + ' vs ' +team_B 
  13.     s_win_FIFA.plot(kind='bar', ax =ax) 
  14.     ax.set_xlabel(''
  15.     ax.set_title(title,fontdict={'fontsize':10}) 
  16.     ax.set_xticklabels(s_win_FIFA.index, rotation=20) 

基于上述函數,分析世界杯戰績的結果如下:

巴西 vs 其他 4 支球隊

  1. f, axes = plt.subplots(figsize=(10,10), ncols=2, nrows=2) 
  2. ax1, ax2,ax3,ax4 = axes.ravel() 
  3. team_vs_plot(df_FIFA_all,'Brazil','Germany',ax=ax1) 
  4. team_vs_plot(df_FIFA_all,'Brazil','Argentina',ax=ax2) 
  5. team_vs_plot(df_FIFA_all,'Brazil','France',ax=ax3) 
  6. team_vs_plot(df_FIFA_all,'Brazil','Spain',ax=ax4) 
  7. # 如需獲取本文源代碼,請關注公眾號“Python數據之道”, 
  8. # 在公眾號后臺回復 “code” ,謝謝大家支持。 
  9. set main title of the figure 
  10. plt.suptitle('Brazil vs other Top 4 teams in World Cup', fontsize=14, fontweight='bold', x=0.5, y=0.94) 
  11. plt.show() 

結果如下:

統計現象 1: 

在世界杯上的戰績,統計獲勝場數如下(不含平局):

巴西 1:1 德國,巴西 6:3 阿根廷,巴西 1:2 法國,巴西 3:1 西班牙

巴西隊,輸贏不好判斷……

德國 vs 其他 3 支球隊

代碼跟 2.1 部分是類似的,結果如下:

統計現象 2:

在世界杯上的戰績,統計獲勝場數如下(不含平局):

德國 4:1 阿根廷,德國 2:1 法國,德國 2:1 西班牙

德國在這 5 支球隊里,獲勝的優勢相對比較明顯。

阿根廷 vs 其他 2 支球隊

代碼跟 2.1 部分是類似的,結果如下:

統計現象3:

在世界杯上的戰績,統計獲勝場數如下(不含平局):

阿根廷 2:0 法國,阿根廷 1:0 西班牙

但阿根廷不敵巴西和德國

西班牙 vs 法國

綜合小結論:從歷屆世界杯上的表現情況來看,分析 5 強之間兩兩對陣后,發現德國隊的表現是最好的,其次巴西和阿根廷的表現也不錯。

考慮到,歷屆世界杯的數據,時間跨度很大,很多球隊已經發生了很大變化。

球隊真實的情況,可能選擇近幾年的比賽,以及包含不同級別的比賽,可能分析效果要更好些。

下面,重點來分析 2014 年以來包含所有比賽的情況。

2014 年以來,所有比賽的戰績對比

首先,時間選擇 2014 年之后(含 2014 年),距離現在的時間比較近,相對來說,球隊人員的組成變化小一些。

當然,這里的時間選擇,對于結果是有影響的。 大家可以探討下這個因素帶來的影響。

2014 年以來所有球隊所有比賽勝負情況概覽:

  1. df['date'] = pd.to_datetime(df['date']) 
  2. df['year'] = df['date'].dt.year 
  3. df_since_2014 = df[df['year']>=2014] 
  4. df_since_2014.shape 

2014 年以來,共有 3600 多場比賽。針對 3600 多場比賽分析后,勝負場數情況如下:

  1. s_all = df_since_2014.groupby('win_team')['win_team'].count() 
  2. s_all.drop('Draw', inplace=True
  3. s_all.sort_values(ascending=True, inplace=True
  4. s_all.tail(50).plot(kind='barh', figsize=(8,16), tick_label='',title='Top 50 in all tournament since 2014'

從上圖來看,2014 年以來,墨西哥,法國,德國、葡萄牙、巴西、比利時、韓國和西班牙表現相對較好。

結果是不是跟想象中的有些差異?6 月 17 日的小組賽,德國不敵墨西哥,看來也不是全無理由的。

但是,本次我們主要還是要考慮 32 強之間的對陣,這樣更能反映現實情況。

2014 年以來 32 強相互之間在所有比賽中的概覽情況:

  1. team_list = ['Russia''Germany''Brazil''Portugal''Argentina''Belgium''Poland''France'
  2.              'Spain''Peru''Switzerland''England''Colombia''Mexico''Uruguay''Croatia'
  3.             'Denmark''Iceland''Costa Rica''Sweden''Tunisia''Egypt''Senegal''Iran'
  4.             'Serbia''Nigeria''Australia''Japan''Morocco''Panama''Korea Republic''Saudi Arabia'
  5. df_top32 = df_since_2014[(df_since_2014['home_team'].isin(team_list))&(df_since_2014['away_team'].isin(team_list))] 
  6. s_top32 = df_top32.groupby('win_team')['win_team'].count() 
  7. s_top32.drop('Draw', inplace=True
  8. s_top32.sort_values(ascending=True, inplace=True
  9. s_top32.plot(kind='barh', figsize=(8,12), tick_label='',title='Top 32 in all tournament since 2014'
  10. # plt.ylabel(''

 

從上圖來看,自 2014 年以來,巴西、法國、葡萄牙、阿根廷、墨西哥、比利時、德國、西班牙、英國為前 9 強。

下面我們來分析 Top 9 之間的勝負情況:

  1. team_top9 = [ 'Brazil''France''Portugal'
  2.              'Argentina','Mexico','Belgium'
  3.              'Germany','Spain','England'
  4. df_top9 = df_since_2014[(df_since_2014['home_team'].isin(team_top9))& 
  5.                         (df_since_2014['away_team'].isin(team_top9))] 
  6. df_top9.shape 

2014 年以來,Top 9 之間一共踢了 44 場比賽(包括友誼賽)。

總體來說,比賽的場數不是太多,基于這些數據來分析,可能對結果會有較大的影響。

九強排名如下:

  1. s_top9 = df_top9.groupby('win_team')['win_team'].count() 
  2. s_top9.drop('Draw', inplace=True
  3. s_top9.sort_values(ascending=False, inplace=True
  4. s_top9.plot(kind='bar', figsize=(10,6), title='Top 9 in all tournament since 2014'

來查看下都統計了哪些類型的比賽:

  1. s_tournament = df_top9.groupby('tournament')['tournament'].count() 
  2. s_tournament_percentage = s_tournament/s_tournament.sum() 
  3. # s_tournament_percentage.sort_values(ascending=False, inplace=True
  4. s_tournament_percentage.tail(20).plot(kind='pie', figsize=(10,10), autopct='%.1f%%'
  5.                            startangle=150, title='percentage of tournament', label=''
  6.                                      labeldistance=1.25, pctdistance=1.08) 

從上面來看,友誼賽占的比例較大??紤]到友誼賽在有些情況下可能不能比較準確的反映出球隊的真實水平,且友誼賽占的場數比例較大,我們剔除友誼賽再來看看結果情況。

2014 年以來 32 強剔除友誼賽后的勝負情況概覽:

  1. df_top9_no_friendly = df_top9[df_top9['tournament']!= 'Friendly'
  2. df_top9_no_friendly.groupby('tournament')['tournament'].count() 
  3. out
  4. tournament 
  5. Confederations Cup              3 
  6. FIFA World Cup                  6 
  7. FIFA World Cup qualification    2 
  8. UEFA Euro                       2 
  9. Name: tournament, dtype: int64 

剔除友誼賽后,比賽類型分布如下:

剔除友誼賽后,Top 9 的情況如下:

在概覽中可以看出,是否剔除友誼賽(Friendly),對排名還是有影響的。

另外,剔除友誼賽后,總的比賽場數更少了(只有 13 場),9 強之間有些隊伍沒有比賽,或者沒有贏過,這個數據用來分析的作用更有限。

當然,在分析中 是否要剔除友誼賽,應該是值得商榷的。

九強兩兩對陣的勝負情況概覽

這里,我們后續分析采用包含友誼賽的數據,來分別分析9強之間兩兩對陣的情況,看看哪支球隊的勝率更高些。

首先自定義幾個函數,方便進行分析。自定義獲取球隊某年至今獲勝比例函數:

  1. # 自定義獲取球隊某年至今獲勝比例函數 
  2. def probability(df,year,team_A,team_B): 
  3.     prob = [] 
  4.     df_year = df[df['year']>= year
  5.     s = team_vs(df_year,team_A,team_B) 
  6.     s_team_A = 0 if s.get(team_A) is None else s.get(team_A) 
  7.     s_A_win = s_team_A/s.sum() 
  8.     s_team_B = 0 if s.get(team_B) is None else s.get(team_B) 
  9.     s_B_win = s_team_B/s.sum() 
  10.     s_draw = 1 - s_A_win - s_B_win 
  11.     prob.append(year
  12.     prob.append(s_A_win) 
  13.     prob.append(s_B_win) 
  14.     prob.append(s_draw) 
  15.     return prob   

自定義獲取兩支球隊歷史獲勝情況對比函數:

  1. # 自定義獲取兩支球隊歷史獲勝情況對比函數 
  2. def his_team_data(df,year_start,year_end,team_A,team_B): 
  3.     row_team = [] 
  4. #     df_team = pd.DataFrame(columns=('year''team_A_win''team_B_win''draw')) 
  5.     for yr in list(range(year_start,year_end+1)): 
  6.         team_A_vs_team_B = probability(df,yr,team_A,team_B) 
  7.         row_team.append(team_A_vs_team_B) 
  8.     team_A_win = team_A + '_win_percentage' 
  9.     team_B_win = team_B + '_win_percentage' 
  10.     df_team = pd.DataFrame(row_team, columns=('year', team_A_win, team_B_win, 'draw_percentage')) 
  11.     return df_team 

自定義兩支球隊歷史獲勝情況制圖函數:

  1. # 自定義兩支球隊歷史獲勝情況制圖函數 
  2. def team_plot(df,year_start,year_end,team_A,team_B,ax): 
  3.     team_A_vs_team_B = team_A + '_vs_' + team_B 
  4.     team_A_vs_team_B = his_team_data(df,year_start,year_end,team_A,team_B) 
  5.     title = team_A + ' vs ' + team_B 
  6.     columns = [team_A+'_win_percentage',team_B+'_win_percentage','draw_percentage'
  7.     team_A_vs_team_B.set_index('year')[columns].plot(kind='line',figsize=(10,6), title=title,ax=ax) 

這些函數有什么用呢,首先我們來分析下巴西 vs 德國的情況,如下:

  1. team_A = 'Brazil' 
  2. team_B = 'Germany' 
  3. f, axes = plt.subplots(figsize=(6,12), ncols=1, nrows=2) 
  4. ax1, ax2 = axes.ravel() 
  5. team_plot(df,1930,2016,team_A,team_B,ax1) 
  6. ax1.set_xlabel(''
  7. team_plot(df,2000,2016,team_A,team_B,ax2) 
  8. ax2.set_title(''
  9. plt.show() 

上述圖中,x 軸代表的含義是從某年至今(數據集含有部分 2018 年的比賽數據),兩支球隊的勝負情況。 

例如 2012 對應的是德國跟巴西從 2012 年至今,兩支球隊的勝負情況。所以,時間越早,兩支球隊的比賽數量越多,數據曲線的波動可能要小些。

但由于球隊的成員組成在不斷的變化,會導致越早的數據,其分析價值越弱。 因此,選擇合適的年份進行分析就顯得很重要。

有童鞋說,如果我要同時分析德國對陣另外 8  支球隊呢?

這里,用上面的函數,也是很迅速的,代碼如下:

  1. team_A = 'Germany' 
  2. for team in ['France','Portugal''Argentina','Mexico','Belgium','Brazil','Spain','England']: 
  3.     team_B = team 
  4.     f, axes = plt.subplots(figsize=(6,12), ncols=1, nrows=2) 
  5.     ax1, ax2 = axes.ravel() 
  6.     team_plot(df,1930,2016,team_A,team_B,ax1) 
  7.     ax1.set_xlabel(''
  8.     team_plot(df,2000,2016,team_A,team_B,ax2) 
  9.     ax2.set_title(''
  10.     plt.show() 

運行上述代碼后,將會繪制 8 張圖,下面只放上其中幾張圖。

同理,如果你喜歡巴西隊或者別的球隊,也可以用上述代碼進行分析。 

 

用上述函數可以快速的分析兩支球隊的歷史勝負情況,當然,有些球隊之間,相遇很少,或者近些年沒有遭遇過,那分析結果可能就不好用了。

[[234068]]

當然,數據分析的只是歷史情況,足球是圓的,場上瞬息萬變。比如,阿根廷現在岌岌可危,梅西內心慌得一比……

預測

本屆世界杯真的是爆冷太多:

  • 意大利,荷蘭,連小組賽都沒進
  • 阿根廷,可以說現在已涼了半截
  • 德國隊,若不是最后的絕殺,也差不多可以送首涼涼了,不過現在看已回血大半

最后,來放上我的神預測。黑馬年年有,今年特別多,預測不準,坐等 pia pia 打臉。

當然,其實我內心深處希望是下面這樣的。怎么樣,為強大的內心點贊吧~~

特別說明: 以上數據分析,純屬個人學習用,預測結果與實際情況可能偏差很大,不能用于其他用途。

責任編輯:武曉燕 來源: Python數據之道
相關推薦

2013-12-19 10:23:03

2018-06-15 11:22:52

Python分析世界杯

2018-06-26 15:27:42

2018-06-19 09:46:01

世界杯機器學習人工智能

2018-06-14 14:23:38

Python比賽冠軍

2018-07-24 14:51:11

柔性屏

2018-06-20 11:26:41

世界杯梅西數據分析

2013-12-18 11:46:49

大數據微軟

2014-03-28 17:39:34

世界杯

2018-06-13 14:59:11

大數據世界杯冠軍

2014-06-18 17:17:24

360世界杯

2014-06-12 11:32:16

世界杯大數據

2018-05-31 06:52:03

2022-12-25 14:14:27

2018-06-14 16:41:40

2018-07-17 16:25:44

數據

2022-07-08 14:52:00

人工智能世界杯半自動化

2018-07-26 14:21:22

騰訊云

2014-03-26 16:08:24

樂視網樂視體育

2018-06-18 14:50:03

世界杯AI瑞士銀行
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久婷婷二区次 | 超碰av免费 | 国产视频久久久 | 日韩欧美综合 | 麻豆精品一区二区三区在线观看 | 欧美精品欧美精品系列 | 久久的色 | 韩日一区二区 | 一级片免费网站 | 日本三级日产三级国产三级 | 精品日韩一区二区 | 日韩久久精品 | 国产第一亚洲 | 国产目拍亚洲精品99久久精品 | 国产不卡在线观看 | 日韩欧美一二三区 | 天天干天天爱天天操 | 欧美另类视频在线 | 日日干日日操 | 久久国产高清视频 | 91偷拍精品一区二区三区 | 欧美中文字幕一区二区 | 久久精品国产99国产 | 久久久精品网 | 欧美区在线 | 国产区在线视频 | 久久青草av | 午夜a级理论片915影院 | 天天搞天天操 | 亚洲高清视频一区二区 | 欧美另类视频 | 国产1区| 色资源在线| 国产精品a一区二区三区网址 | 在线看亚洲 | 国产精品一区二区三区四区 | 久久91av | 国产精品视频一区二区三区四蜜臂 | 久久久久久久一区二区三区 | 狠狠操狠狠色 | 中文字幕精品一区 |