NBA球员数据的格式如下
本文的目的主要是对NBA球员的数据进行分析,通过分析数值数据判断球员的表现,进而可以研究球员在赛场上是属于哪一类球员,下面是对结果进行雷达图的绘制
对球员情况分析,并画出雷达图,代码和结果如下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler nba_data = pd.read_excel('./nba_data.xlsx') #把空数据转换成nan nba_data.replace(to_replace=' ',value=np.nan,inplace=True) #使用众数来填充数据 nba_data.loc[:,'时间'].fillna(value=nba_data.loc[:,'时间'].mode()[0],inplace=True) #处理数据格式,不然无法进行运算 nba_data.loc[:,'时间'] = pd.Series(nba_data.loc[:,'时间'],dtype=np.float16) nba_data.loc[:,'每分钟得分'] = nba_data.loc[:,'得分']/nba_data.loc[:,'时间'] nba_data.loc[:,'每分钟助攻'] = nba_data.loc[:,'助攻']/nba_data.loc[:,'时间'] def show_res_km(data,y_predict,center): ''' 进行结果展示 :param data:原始数据 :param y_predict:预测标签 :param center:最终的聚类中心 :return: ''' plt.figure() #获取原始数据的行数 index_num = data.shape[0] # colors = ['r','g','b','y','purple'] for i in range(index_num): plt.scatter(data[i,0],data[i,1],c=colors[int(y_predict[i])]) #散点图的绘制,一个一个绘制 #聚类中心的位置 #b的话是描点划线,bx的话是画点但是不描线 plt.plot(center[:,0],center[:,1],'bx',marker='x',markersize=12) plt.show() def radarmap(center,k): plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False plt.figure() #创建子图,1行1列第一个图,polar开启极坐标 plt.subplot(111,polar=True) #绘图 #设计角度 datalength = 5 #起始值,结束值,将圆分成几份,endpoint=False不然的会最后一个和第一个会重合 angle = np.linspace(0,2*np.pi,num=datalength,endpoint=False) #0到2pi分成5份 #闭合角度 angle = np.concatenate((angle,[angle[0]]),axis=0) print(angle) #循环闭合数据,并进行绘图 for i in range(k): #循环闭合数据 data = np.concatenate((center[i,:],[center[i,0]])) #没闭合一次数据就会进行一次绘制 plt.plot(angle,data) #设置刻度 labels = ['超级巨星','巨星','超星','球星','角色球员'] plt.xticks(angle,labels) plt.legend(['群体1','群体2','群体3','群体4','群体5']) plt.title('NBA球员聚类分析') plt.show() #画雷达图 def radar_plt(): data = nba_data.iloc[:, [2, 4, 6, 7, -1]] stand = StandardScaler() # 创建标准差示例 x = stand.fit_transform(data) # 进行标准化,返回标准化之后的数据 k = 5 km = KMeans(n_clusters=k) # 传入聚类类别 km.fit(x) # 训练数据 y_predict = km.predict(x) # 预测标签值 center = km.cluster_centers_ # 聚类中心值# show_res_km(data.values,y_predict,center) print(center) radarmap(center,k) radar_plt()
雷达图如下:
对数据分析结果进行散点图绘制的方法有下面两种,代码和结果如下
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler nba_data = pd.read_excel('./nba_data.xlsx') #把空数据转换成nan nba_data.replace(to_replace=' ',value=np.nan,inplace=True) #使用众数来填充数据 nba_data.loc[:,'时间'].fillna(value=nba_data.loc[:,'时间'].mode()[0],inplace=True) nba_data.loc[:,'时间'] = pd.Series(nba_data.loc[:,'时间'],dtype=np.float16) nba_data.loc[:,'每分钟得分'] = nba_data.loc[:,'得分']/nba_data.loc[:,'时间'] nba_data.loc[:,'每分钟助攻'] = nba_data.loc[:,'助攻']/nba_data.loc[:,'时间'] def show_res_km(data,y_predict,center): ''' 进行结果展示 :param data:原始数据 :param y_predict:预测标签 :param center:最终的聚类中心 :return: ''' plt.figure() #获取原始数据的行数 index_num = data.shape[0] # colors = ['r','g','b','y','purple'] for i in range(index_num): plt.scatter(data[i,0],data[i,1],c=colors[int(y_predict[i])]) #散点图的绘制,一个一个绘制 #聚类中心的位置 #b的话是描点划线,bx的话是画点但是不描线 plt.plot(center[:,0],center[:,1],'bx',marker='x',markersize=12) plt.show() #画散点图 def sca_plt(): data = nba_data.iloc[:,-2:] k = 3 km = KMeans(n_clusters=k) # 传入聚类类别 km.fit(data) # 训练数据 y_predict = km.predict(data) # 预测标签值 center = km.cluster_centers_ # 聚类中心值# show_res_km(data.values,y_predict,center) show_res_km(data.values,y_predict,center) sca_plt()
另一种分析方法与上面有些许区别,但大体上一致,可以参考两种方法
import pandas as pd import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt data = pd.read_excel('./nba_data.xlsx') #筛选出有用特征 data = data.loc[:,['时间','助攻','得分']] #特征类型检测 # print(data.dtypes) #缺失值检测 # print(data.isnull().sum()) #将缺失值转化为np.nan类型 data.replace(' ',np.nan,inplace=True) #删除缺失值 data.dropna(axis=0,how='any',inplace=True) #将时间数据转化为数值类型 data.loc[:,'时间'] = data.loc[:,'时间'].astype('float') #构建需要的特征 data.loc[:,'助攻/分钟'] = data.loc[:,'助攻']/data.loc[:,'时间'] data.loc[:,'得分/分钟'] = data.loc[:,'得分']/data.loc[:,'时间'] #拿到构建好特征的数据 data = data.iloc[:,-2:] #获取到特征之后的数据 print(data) #要进行去除异常值,没有异常值,跳过 #标准化,没有量纲影响,跳过 k = 3 km = KMeans(n_clusters=k) km.fit(data) y_predict = km.predict(data) center = km.cluster_centers_ #结果展示 def show_res_km(data,y_predict,center): ''' 进行结果展示 :param data:原始数据 :param y_predict:预测标签 :param center:最终的聚类中心 :return: ''' plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False plt.figure() #获取原始数据的行数 index_num = data.shape[0] # colors = ['r','g','b','y'] for i in range(index_num): plt.scatter(data[i,0],data[i,1],c=colors[int(y_predict[i])]) #散点图的绘制,一个一个绘制 #聚类中心的位置 #b的话是描点划线,bx的话是画点但是不描线 plt.plot(center[:,0],center[:,1],'bx',marker='x',markersize=12) plt.xlabel('助攻/分钟') plt.ylabel('得分/分钟') plt.title('NBA球员聚类结果') plt.show() show_res_km(data.values,y_predict,center)