「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/
複製代碼
# 導入必要的包.
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")複製代碼
咱們發現:
贏
輸
以上分析較宏觀,不能反映事物的本質。下面從微觀角度(每場比賽的數據)進行分析。
角度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
紅色:詹姆斯,藍色:倫納德
橫軸:得分層次,縱軸:發生次數
能夠看出:
角度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)最終結論
詹姆斯贏倫納德:突破能力、組織能力、功能性的差距、穩定性的差距。
詹姆斯輸倫納德:遠投能力的差距。