700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > KMeans对NBA球员聚类案例分析

KMeans对NBA球员聚类案例分析

时间:2021-12-06 13:39:23

相关推荐

KMeans对NBA球员聚类案例分析

NBA球员数据的格式如下

本文的目的主要是对NBA球员的数据进行分析,通过分析数值数据判断球员的表现,进而可以研究球员在赛场上是属于哪一类球员,下面是对结果进行雷达图的绘制

对球员情况分析,并画出雷达图,代码和结果如下:

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeansfrom sklearn.preprocessing import StandardScalernba_data = pd.read_excel('./nba_data.xlsx')#把空数据转换成nannba_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'] = Falseplt.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 = 5km = 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 pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeansfrom sklearn.preprocessing import StandardScalernba_data = pd.read_excel('./nba_data.xlsx')#把空数据转换成nannba_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 = 3km = 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 pdimport numpy as npfrom sklearn.cluster import KMeansimport matplotlib.pyplot as pltdata = 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 = 3km = 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'] = Falseplt.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)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。