用Python強勢分析倫納德和詹姆斯的差距


「DATA CHAT」是科賽網打造的品牌活動。擁有最強大腦、最獨特視角的數據分析狂熱者,將針對體育、影視、音樂、財經四大領域內最生活的話題,開展有趣又燒腦的數據分析探索之旅。bash

首期咱們從NBA話題切入,在官網發佈了超全的NBA數據集(全部球員&球隊的常規賽、季後賽,教練執教、球員各賽季薪金的數據),N位網友在線根據本身的興趣,發佈了數據分析項目,切入點不少樣,也頗有意思。如,王者榮耀 — NBA數據分析 [增長梅西評分模型]喬科詹庫之全方位分析……app

這裏PO其中一份原創做品@大野人007 ,感興趣的朋友也可直接登陸kesci.com,Fork過來在K-Lab上開展我的分析。附:原貼連接
函數


說明:關於K-Lab。ui

K-Lab是科賽網重點打造的在線數據分析協做平臺。它涵蓋了Python、R等主流語言,完成了90%以上數據分析&挖掘相關庫的部署(如題主所提到的pandas, numpy, matplotlib),免去了本地搭建環境的煩惱,實現了即刻線上動手作分析項目。spa

倫納德和詹姆斯兩人的差距體如今哪?

1)數據維度3d

  • 球員基本信息(姓名/所屬球隊/球員年齡)
  • 比賽信息(參賽球隊/場地/比賽分差)
  • 球員表現(比賽時間/得分效率/得分類型)

2)數據處理code

!ls ../input/NBAdata/
複製代碼
  1. # 導入必要的包.
# 導入必要的包.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import numpy as np
import pylab

%matplotlib inline
warnings.filterwarnings('ignore')
複製代碼

讀取球員場均數據cdn

player_avg = pd.read_csv('avg.csv')  player_avg.head()
複製代碼

展現要分析的數據blog

pd.set_option('display.max_columns',30)
player_avg[(player_avg['姓名'] == 'Kawhi Leonard') & (player_avg['賽季'] == '16--17')]
複製代碼

pd.set_option('display.max_columns',50)
L_1617_avg = player_avg[(player_avg['姓名'] == 'LeBron James') & (player_avg['賽季'] == '16--17')]
L_1617_avg
複製代碼

對比分析及數據可視化three

class Radar(object):
    n = 1
    angles =None
    def __init__(self, fig, titles, labels, rect=None):
        if rect is None:
            rect = [0.05, 0.05, 0.95, 0.95]

        self.n = len(titles)
        self.angles = np.arange(90, 90+360, 360.0/self.n)
        self.axes = [fig.add_axes(rect, projection="polar", label="axes%d" % i) 
                         for i in range(self.n)]

        self.ax = self.axes[0]
        self.ax.set_thetagrids(self.angles, labels=titles, fontsize=14)

        for ax in self.axes[1:]:
            ax.patch.set_visible(False)
            ax.grid("off")
            ax.xaxis.set_visible(False)

        for ax, angle, label in zip(self.axes, self.angles, labels):
            ax.set_rgrids(range(1, 6), angle=angle, labels=label)
            ax.spines["polar"].set_visible(False)
            ax.set_ylim(0, 5)

    def angle(self, values, *args, **kw):
        return np.deg2rad(np.r_[self.angles]),np.r_[values],values

    def plot(self, values, *args, **kw):
        angle = np.deg2rad(np.r_[self.angles, self.angles[0]])
        values = np.r_[values, values[0]]
        self.ax.plot(angle, values, *args, **kw)
titles_ = ['score','shoot','rebound','assist','three','penalty','steal','block']
titles = ['得分','投籃','籃板','助攻','三分','罰球','搶斷','蓋帽']
# titles = list("ABCDE")複製代碼

咱們發現:

  • 詹姆斯突破得分能力更強。兩人出手次數差很少,詹命中率高了5個百分點左右
  • 詹姆斯的組織能力更強。詹助攻數場均多5.2個
  • 詹姆斯的籃板能力稍勝一籌。相同出場次數,詹均多2.8個籃板球

  • 倫納德的投籃能力更好。罰球能力同樣,但詹命中率差了20個百分點
  • 倫納德搶斷能力更加出色。倫的場均搶斷數要高0.5個


以上分析較宏觀,不能反映事物的本質。下面從微觀角度(每場比賽的數據)進行分析。


角度1:基於籃板球

# data_statistics函數主要是方便categoricl型的數據的統計顯示,方便後續繪圖使用
def data_statistics(Kawhi_season1617, Lebron_season1617, name):
    Kawhi_season1617_ = pd.DataFrame(Kawhi_season1617.groupby(name)['球員'].count())
    Kawhi_season1617_.columns = ['K_次數']
    Kawhi_season1617_.reset_index(inplace=True) 

    Lebron_season1617_ = pd.DataFrame(Lebron_season1617.groupby(name)['球員'].count())
    Lebron_season1617_.columns = ['L_次數']
    Lebron_season1617_.reset_index(inplace=True)

    data = pd.merge(Lebron_season1617_,Kawhi_season1617_,on = name , how ='outer')
    data = data.fillna(0)
    data = data.sort_values(name) 
    return data
複製代碼

用seaborn作柱狀圖可視化

rebounds['K_次數'] =  rebounds['K_次數'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '籃板', y = 'L_次數', data = rebounds, color='red')
sns.barplot(x = '籃板',y = 'K_次數', data = rebounds, color ='blue')複製代碼
紅色:詹姆斯,藍色:倫納德
橫軸:籃板數,縱軸:發生次數

能夠看出:

  • 詹姆斯的籃板球能力遠超倫納德。
  • 詹姆斯在數據層面比倫納德高個檔次。

角度2:基於得分

score['K_次數'] =  score['K_次數'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '得分', y = 'L_次數', data = score, color='red')
sns.barplot(x = '得分',y = 'K_次數', data = score, color ='blue')複製代碼
紅色:詹姆斯,藍色:倫納德
橫軸:得分數,縱軸:發生次數

用seaborn作violin圖可視化

plt.figure(figsize= [12,5])
total = pd.concat([Kawhi_season1617,Lebron_season1617])
total['Is_Kawhi'] = 0
total.loc[total['球員'] == 'Kawhi Leonard','Is_Kawhi'] = 1
total['A'] = 0
sns.violinplot(x= 'A' , y = '得分', hue = 'Is_Kawhi', data = total, split=True)複製代碼

綠色:倫納德,藍色:詹姆斯

能夠看出:

  • 詹姆斯的得分較穩,倫納德的得分分佈更廣,但整體兩人差別不大。所以將分數劃爲幾檔,再來看:
0 - 15分 定爲檔1
15 - 19 定爲檔2
20 - 24 定爲檔3
25 - 29 定爲檔4
30 - 定爲檔5
紅色:詹姆斯,藍色:倫納德
橫軸:得分層次,縱軸:發生次數

能夠看出:

  • 詹姆斯的得分更穩定,基本在25分附近。
  • 倫納德的得分分佈範圍更廣,得分的爆發力更好。從檔5來看,倫納德更佔優點,不過這也從側面反映了一點外線投籃好的職業選手的優點。手感來了分分鐘爆表,而手感差的話也會出現不少檔1檔2的狀況。


角度3:基於投籃命中率

shoot = data_statistics(Kawhi_season1617, Lebron_season1617, '投籃')
shoot
# sns.distplot(Kawhi_season1617.groupby('得分')['球員'].count(),color='b')
# sns.distplot(Lebron_season1617.groupby('得分')['球員'].count(),color='r')

Kawhi_season1617.groupby('得分')['球員'].count().plot(figsize=(12,6),color='b',marker='*')
Lebron_season1617.groupby('得分')['球員'].count().plot(figsize=(12,6),color = 'r', marker='o')複製代碼
紅色:詹姆斯,藍色:倫納德
橫軸:分數,縱軸:發生次數

用柱狀圖進行對比分析

能夠看出:

  • 詹姆斯果真是老司機,穩!其高命中率的場次遠高於倫納德。

角度4:基於搶斷和蓋帽的分析

steal = data_statistics(Kawhi_season1617, Lebron_season1617, '搶斷')
steal
steal['K_次數'] =  steal['K_次數'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '搶斷', y = 'L_次數', data = steal, color='red')
sns.barplot(x = '搶斷',y = 'K_次數', data = steal, color ='blue')複製代碼
紅色是詹姆斯,藍色表示倫納德
橫軸表示搶斷,縱軸表示發生次數
block = data_statistics(Kawhi_season1617, Lebron_season1617, '蓋帽')
block

block['K_次數'] =  block['K_次數'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '蓋帽', y = 'L_次數', data = block, color='red')
sns.barplot(x = '蓋帽',y = 'K_次數', data = block, color ='blue')複製代碼
紅色是詹姆斯,藍色表示倫納德.
橫軸表示蓋帽次數,縱軸表示發生次數

能夠獲得:

  • 倫納德幾乎完爆了詹姆斯。
  • 蓋帽上,兩人在常規賽平方秋色。


角度5:基於失誤次數的分析

fault_num = data_statistics(Kawhi_season1617, Lebron_season1617, '失誤')
fault_num
fault_num['K_次數'] =  fault_num['K_次數'] * -1
plt.figure(figsize=[16,6])
sns.barplot(x = '失誤', y = 'L_次數', data = fault_num, color='red')
sns.barplot(x = '失誤',y = 'K_次數', data = fault_num, color ='blue')複製代碼
紅色是詹姆斯,藍色表示倫納德。
橫軸表示失誤次數,縱軸表示發生次數。

能夠獲得:

  • 詹姆斯的失誤偏高,這也不難理解,倫納德在波波老爺子手下,失誤兩個就被換下,詹姆斯沒有波波這種教練的限制,另外詹姆斯經常打控衛角色,因此從這一角度來看的話,詹姆斯失誤率高也能夠理解,不過僅從數據角度來看,無論是本身仍是教練的幫忙,倫納德勝出.


3)最終結論

詹姆斯贏倫納德:突破能力、組織能力、功能性的差距、穩定性的差距。

詹姆斯輸倫納德:遠投能力的差距。

相關文章
相關標籤/搜索