zoukankan      html  css  js  c++  java
  • NBA数据分析初探(上)

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    #%matplotlib inline    ##魔法命令了解一下, 内嵌画图  是IPython的内置magic函数,那么在Pycharm中是不会支持的。
    
    #载入数据:
    data=pd.read_csv('D:/pycharm_ngs_programs/data_analysis/nba_2017_nba_players_with_salary.csv')
    print(data.head(5))
    
    ## 描述统计
    print(data.shape)
    print(data.describe())

    输出结果如下:

    Unnamed: 0  Rk             PLAYER POSITION  AGE    MP    FG   FGA    FG%  
    0           0   1  Russell Westbrook       PG   28  34.6  10.2  24.0  0.425   
    1           1   2       James Harden       PG   27  36.4   8.3  18.9  0.440   
    2           2   3      Isaiah Thomas       PG   27  33.8   9.0  19.4  0.463   
    3           3   4      Anthony Davis        C   23  36.1  10.3  20.3  0.505   
    4           4   6   DeMarcus Cousins        C   26  34.2   9.0  19.9  0.452   
    
        3P       ...         GP   MPG  ORPM  DRPM   RPM  WINS_RPM   PIE    PACE  
    0  2.5       ...         81  34.6  6.74 -0.47  6.27     17.34  23.0  102.31   
    1  3.2       ...         81  36.4  6.38 -1.57  4.81     15.54  19.0  102.98   
    2  3.2       ...         76  33.8  5.72 -3.89  1.83      8.19  16.1   99.84   
    3  0.5       ...         75  36.1  0.45  3.90  4.35     12.81  19.2  100.19   
    4  1.8       ...         72  34.2  3.56  0.64  4.20     11.26  17.8   97.11   
    
        W  SALARY_MILLIONS  
    0  46            26.50  
    1  54            26.50  
    2  51             6.59  
    3  31            22.12  
    4  30            16.96  
    
    [5 rows x 39 columns]
           Unnamed: 0          Rk         AGE          MP          FG         FGA  
    count  342.000000  342.000000  342.000000  342.000000  342.000000  342.000000   
    mean   170.500000  217.269006   26.444444   21.572515    3.483626    7.725439   
    std     98.871128  136.403138    4.295686    8.804018    2.200872    4.646933   
    min      0.000000    1.000000   19.000000    2.200000    0.000000    0.800000   
    25%     85.250000  100.250000   23.000000   15.025000    1.800000    4.225000   
    50%    170.500000  205.500000   26.000000   21.650000    3.000000    6.700000   
    75%    255.750000  327.750000   29.000000   29.075000    4.700000   10.400000   
    max    341.000000  482.000000   40.000000   37.800000   10.300000   24.000000   
    
                  FG%          3P         3PA         3P%       ...         
    count  342.000000  342.000000  342.000000  320.000000       ...          
    mean     0.446096    0.865789    2.440058    0.307016       ...          
    std      0.078992    0.780010    2.021716    0.134691       ...          
    min      0.000000    0.000000    0.000000    0.000000       ...          
    25%      0.402250    0.200000    0.800000    0.280250       ...          
    50%      0.442000    0.700000    2.200000    0.340500       ...          
    75%      0.481000    1.400000    3.600000    0.373500       ...          
    max      0.750000    4.100000   10.000000    1.000000       ...          
    
                   GP         MPG        ORPM        DRPM         RPM    WINS_RPM  
    count  342.000000  342.000000  342.000000  342.000000  342.000000  342.000000   
    mean    58.198830   21.572807   -0.676023   -0.005789   -0.681813    2.861725   
    std     22.282015    8.804121    2.063237    1.614293    2.522014    3.880914   
    min      2.000000    2.200000   -4.430000   -3.920000   -6.600000   -2.320000   
    25%     43.500000   15.025000   -2.147500   -1.222500   -2.422500    0.102500   
    50%     66.000000   21.650000   -0.990000   -0.130000   -1.170000    1.410000   
    75%     76.000000   29.075000    0.257500    1.067500    0.865000    4.487500   
    max     82.000000   37.800000    7.270000    6.020000    8.420000   20.430000   
    
                  PIE        PACE           W  SALARY_MILLIONS  
    count  342.000000  342.000000  342.000000       342.000000  
    mean     9.186842   98.341053   28.950292         7.294006  
    std      3.585475    2.870091   14.603876         6.516326  
    min     -1.600000   87.460000    0.000000         0.030000  
    25%      7.100000   96.850000   19.000000         2.185000  
    50%      8.700000   98.205000   29.000000         4.920000  
    75%     10.900000  100.060000   39.000000        11.110000  
    max     23.000000  109.870000   66.000000        30.960000  
    
    [8 rows x 36 columns]

    从数据中看几项比较重要的信息:

    • 球员平均年龄为26.4岁,年龄段在19-38岁;

    • 球员平均年薪为730万美金,当时最大的合同为年薪3000万美金;

    • 球员平均出场时间为21.5分钟,某球员场均出场37.8分钟领跑联盟,当然也有只出场2.2分钟的角色球员,机会来之不易。

    • 类似的信息我们还能总结很多。

    效率值相关性分析

    在众多的数据中,有一项名为“RPM”,标识球员的效率值,该数据反映球员在场时对球队比赛获胜的贡献大小,最能反映球员的综合实力。
    我们来看一下它与其他数据的相关性:

    dat_cor=data.loc[:,['RPM','AGE','SALARY_MILLIONS','ORB','DRB','TRB','AST','STL','BLK','TOV','PF','POINTS','GP','MPG','ORPM','DRPM']]
    coor=dat_cor.corr()
    sns.heatmap(coor,square=True, linewidths=0.02, annot=False) 
    #seaborn中的heatmap函数,是将多维度数值变量按数值大小进行交叉热图展示。

    由相关性分析的heatmap图可以看出,RPM值与年龄的相关性最弱,与“进攻效率值”、“场均得分”、“场均抢断数”等比赛技术数据的相关性最强。

    我在接下来的分析中将把RPM作为评价一个球员能力及状态的直观反应因素之一。

    球员数据分析部分

    此处练习了一下pandas基本的数据框相关操作,包括提取部分列、head()展示、排序等,简单通过几个维度的展示,笼统地看一下16-17赛季那些球员冲在联盟的最前头。

    data.loc[:,['PLAYER','SALARY_MILLIONS','RPM','AGE','MPG']].sort_values(by='SALARY_MILLIONS',ascending=False).head(10)
    #效率值最高的10名运动员
    data.loc[:,['PLAYER','RPM','SALARY_MILLIONS','AGE','MPG']].sort_values(by='RPM',ascending=False).head(10)
    #出场时间最高的10名运动员
    data.loc[:,['PLAYER','RPM','SALARY_MILLIONS','AGE','MPG']].sort_values(by='MPG',ascending=False).head(10)

    结果如下:

    Seaborn常用的三个数据可视化方法

    单变量:

    distplot方法可以绘制直方图和连续密度估计,通过distplot方法seaborn使直方图和密度图的绘制更为简单, 

    我们先利用seaborn中的distplot绘图来分别看一下球员薪水、效率值、年龄这三个信息的分布情况,代码如下:

    #单变量:
    #我们先利用seaborn中的distplot绘图来分别看一下球员薪水、效率值、年龄这三个信息的分布情况,上代码:
    #分布及核密度展示
    sns.set_style('darkgrid') #设置seaborn的面板风格
    plt.figure(figsize=(12,12))
    plt.subplot(3,1,1)  #拆分页面,多图展示
    sns.distplot(data['SALARY_MILLIONS'])
    plt.xticks(np.linspace(0,40,9))
    plt.ylabel(u'$Salary$',size=10)
    
    plt.subplot(3,1,2)
    sns.distplot(data['RPM'])
    plt.xticks(np.linspace(-10,10,9))
    plt.ylabel(u'$RPM$',size=10)
    
    plt.subplot(3,1,3)
    sns.distplot(data['AGE'])
    plt.xticks(np.linspace(20,40,11))
    plt.ylabel(u'$AGE$',size=10)

     结果如下:



    双变量:
    dat1=data.loc[:,['RPM','SALARY_MILLIONS','AGE','POINTS']]
    sns.jointplot(dat1.SALARY_MILLIONS,dat1.AGE,kind='kde',size=8) 


    上图展示的是球员薪水与年龄的关系,采用不同的kind方式(等高线图/hex/散点等),我们可以整体感受一下年龄和薪水的集中特点,
    大部分球员集中在22-25岁拿到5million以下的薪水,当然也有“年少成名”和“越老越妖”的情况。



    多变量:
    dat1=data.loc[:,['RPM','SALARY_MILLIONS','AGE','POINTS']]
    sns.pairplot(dat1) #相关性展示,斜对角为分布展示,可以直观地看变量是否具有现行关系

    图展示的是球员薪水、效率值、年龄及场均得分四个变量间的两两相关关系,对角线展示的是本身的分布图,由散点的趋势我们可以看出不同特征的相关程度。
    整体看各维度的相关性都不是很强,正负值与薪水和场均得分呈较弱的正相关性,
    而年龄这一属性和其他的变量相关性较弱


    参考资料  pyhton 爱好者社区#https://mp.weixin.qq.com/s/gl_8Wxl_Oq7xvGUdsHR3Bg

  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/yellow-hgy/p/10232695.html
Copyright © 2011-2022 走看看