KMeans对NBA球员聚类案例分析

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)

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值