当前位置:   article > 正文

opta球员大数据预测胜负_NBA球员数据分析及薪酬预测

opta数据算法

31254ca55be3664d4668eb5c09c17b55.png

一、绪论

1.1 背景:

NBA是美国运动员薪酬最高的几大联赛之一,由于每支球队都有工资上限,作为球队管理人员如何更有效的确定球员薪水(避免溢价合同)是十分重要的。

美国国家篮球协会(NBA)的明星薪水很高。在2017-18赛季,斯蒂芬库里获得了超过3470万美元的奖金,勒布朗詹姆斯在球场上获得了超过3330万美元的奖金。但NBA正在发展。多年来,这支球队已经从很少投中3分球,成为他们进攻的焦点。最初在棒球比赛中受到金钱球现象关注的分析现在也在所有体育运动中。本文不仅包括先前研究中的重要变量,还包括三分球和霍林格球员效率等级(PER),以分析确定NBA球员薪水的重要性,从而解释了比赛的变化。研究人员发现,在支付NBA球员方面,得分,球员经验(联赛年数),助攻,篮板和犯规都是统计上显着的因素,但我们也发现3分球和PER值微不足道。此外,研究人员执行向后逐步回归,一次一个地消除无关紧要的自变量(每次最不重要),直到模型仅包含重要变量。同样,尽管逐步模型的统计数据优于原始模型,但相同的变量具有统计显着性。

1.2 考虑的因素:

球员的薪资的确定是一件非常复杂的事情很难考虑到所有因素,影响其因素主要包括:

  1. 球员因素
  • 球员的技术水平:得分、防守
  • 球员的场下因素:领导力,商业因素
  • 球员的潜力(年龄)
  • 球员进入NBA的时间长短(时间越长,薪资的上限越高)
  • 球员的伤病
  • 球员的种族,国籍

2.NBA联盟的因素:

  • 电视转播费的提高,其他商业因素变化
  • 球队工资帽的变化(这几年的球队工资帽在不断提高,新签球员的总体工资水平在不断提高)
  • NBA打法的变化(以前重视内线,现在注重三分)

3.其他不确定因素

1.3 思路:

本文主要考虑球员的技术统计对其薪资水平的影响,并基于工资帽的占比来预测球员的薪资(排除工资帽的变化的影响)

  1. 在Kaggle中获取相关数据集,利用Python对球员的薪酬分布进行分析;
  2. 分析影响薪酬的多方面因素和主要影响因素,为球队管理人员和球员本身提供参考;
  3. 采用多种机器学习算法对薪酬进行预测,选择出最佳方法,为建立薪酬体系提供参考;

1.4 数据来源

Kaggle上2017-2018年NBA球员数据,以及ESPN等网站上的数据集。需要的话可以加关注,私信我

二、数据预处理和清洗

  1. import numpy as np
  2. import pandas as pd
  3. import seaborn as sns
  4. import matplotlib.pyplot as plt
  5. import statsmodels.api as sm #statsmodels是一个Python模块,它提供对许多不同统计模型估计的类和函数,并且可以进行统计测试和统计数据的探索
  6. import statsmodels.formula.api as smf
  7. from sklearn.neighbors import KNeighborsRegressor
  8. from sklearn.model_selection import train_test_split
  9. from sklearn.neighbors import KNeighborsClassifier
  10. from sklearn.metrics import mean_squared_error
  11. sns.set_style("whitegrid")
  12. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  13. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  14. plt.rcParams.update({'font.size': 20})
  15. %matplotlib inline
  16. adv_stats = pd.read_csv('.../data/player-data-wrangled/player2017/Adv-2017wrangled.csv')
  17. adv_stats.drop(adv_stats.columns[[0, 1, 20, 25, 3, 4, 5, 6, 7, 30]], axis = 1, inplace = True)
  18. adv_stats.columns
  19. perGame = pd.read_csv('.../data/player-data-wrangled/player2017/PerGame-2017wrangled.csv')
  20. perGame.drop(perGame.columns[[0, 1, 20, 25]], axis = 1, inplace = True)
  21. perGame.columns
  22. perGameAdv = perGame.merge(adv_stats, on = 'Player', how = 'inner')
  23. perGameAdv.columns
  24. fa = pd.read_csv('.../data/salary-data/fixed-fa-signings/fixed-2017.csv')
  25. fa.drop(fa.columns[[0, 1, 2, 3, 4, 5, 6]], axis = 1, inplace = True)
  26. fa.columns

2.1主要球员数据如下:

993fd90797537b7446de04391f91bc1c.png
表1.1
  1. final = perGameAdv.merge(fa, left_on = 'fix', right_on = 'name', how = 'inner')
  2. # drop 'fix' and 'name
  3. final.drop(final.columns[[27]], axis = 1, inplace = True)
  4. final.head()
  5. final.rename(columns={'PS.G':'POINTS'},inplace=True)
  6. final2 = final.copy(deep = True)
  7. sns.set(font_scale=1.5)
  8. sns.set_style("whitegrid")
  9. plt.figure(figsize=(10,6))
  10. final['average'].hist(bins = 20,
  11. histtype = 'bar',
  12. align = 'left',
  13. orientation = 'vertical',
  14. alpha=0.5,
  15. normed =True)
  16. final['average'].plot(kind='kde',style='k--')
  17. # plt.xticks(np.linspace(0,40,9))
  18. plt.xlabel('SALARY')
  19. # plt.axvline(20.87,color='r')
  • 可以得出球员薪水的分布密度图:

598dc54a2972d961c38e9d615d8ffd22.png
图1
  • 可以看出大部分的球员薪水是偏低的

2.2通过位置将球员分类,分析位置和球员薪水的关系:

  1. sns.set(font_scale=1.5)
  2. sns.set_style("whitegrid")
  3. plt.figure(figsize=(10,6))
  4. ax = sns.lmplot(x='Age', y='Salary', data=copy_data, hue='Pos', fit_reg=False, aspect=2,size=7, legend=False, scatter_kws={"s": 200})
  5. ax.set(xlabel='AGE', ylabel='RPM (Real Plus Minus)',title="Salary by Position: 2017-2018 Season")
  6. plt.legend(loc='upper left', title='Position')
  7. plt.figure(figsize=(10,6))
  8. ax = sns.barplot(x="Pos", y="Salary",data=copy_data,capsize=.2)
  9. plt.figure(figsize=(10,6))
  10. ax = sns.barplot(x="Pos", y="average",data=final_c,capsize=.2)

1fb82377b3cc4466c0781e8a72176d32.png

cf21c4f57de861886af9b49f60bf1bf4.png

可以图得出:

  • 在三千万薪水之上没有中锋和得分后卫,大前锋最多。这也符合联盟现状,得分后卫和中锋的相对凋零。
  • 大前锋和中锋的平均工资较高,但大前锋的拿顶薪数量更多,也就是优质的PF在球队地位更高

思路:各位置的平均工资和离散程度

2.3各参数与薪资相关性分析

  1. final.drop(final.columns[[0,1,3, 49]], axis = 1, inplace = True)
  2. final.columns

2857346f0043bfcfb0868e2fead1cbe6.png
  1. # Check correlation between features
  2. sns.set(font_scale=1)
  3. sns.set_style("whitegrid")
  4. colormap = plt.cm.magma
  5. plt.figure(figsize=(30,30))
  6. plt.title('Pearson Correlation of NBA Salary Features', y=1.05, size=50)
  7. corr = final.astype(float).corr().round(2)
  8. # corr = smalls.astype(float).corr().round(2)
  9. mask = np.zeros_like(corr, dtype=np.bool)
  10. # mask upper diagonal of heatmap
  11. mask[np.triu_indices_from(mask)] = True
  12. sns.heatmap(corr,
  13. mask = mask, linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True)

bae9cd99a2072b846dc9be11d2b8574e.png
  • 从中选择出 相关性较高的参数,并进行分析,作出了热图
final2.columns

b67710a010026f0646d3c41833bde4a5.png
  1. #Selecting candidates
  2. final2.drop(final2.columns[[0, 1, 2, 3, 4, 5, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 21,
  3. 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
  4. 41, 42, 49]], axis = 1, inplace = True)
  5. final2.columns

72e1b210e6fe85593f7c96150f9c375c.png
  1. # Check correlation between features
  2. sns.set(font_scale=2)
  3. colormap = plt.cm.magma
  4. plt.figure(figsize=(30,30))
  5. plt.title('Pearson Correlation of NBA Salary Features', y=1.05, size=50)
  6. corr = final2.astype(float).corr().round(2)
  7. mask = np.zeros_like(corr, dtype=np.bool)
  8. # mask upper diagonal of heatmap
  9. mask[np.triu_indices_from(mask)] = True
  10. sns.heatmap(corr,
  11. mask = mask,
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/910686
推荐阅读
相关标签
  

闽ICP备14008679号