数据分析综合案例讲解,一文搞懂Numpy,pandas,matplotlib,seaborn技巧方法

简介: 数据分析综合案例讲解,一文搞懂Numpy,pandas,matplotlib,seaborn技巧方法

NBA综合案例

1 基本数据介绍

每个球迷心中都有一个属于自己的迈克尔·乔丹、科比·布莱恩特、勒布朗·詹姆斯。 本案例将用jupyter notebook完成NBA菜鸟数据分析初探。


案例中使用的数据是2017年NBA球员基本数据,数据字段见下表:

首先先导包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

获取数据
data = pd.read_csv("nba_2017_nba_players_with_salary.csv")
data


数据解释

看下数据形状

data.shape


看下数据描述

data.describe()

输出结果部分展示:


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

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

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

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

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


数据分析

2.数据相关性

在众多数据中,有一项名为"RPM",标识球员的效率值,该数据反应球员在场时对球队比赛获胜的贡献大小,最能反应球员的综合实力

我们来看一下它与其他数据的相关性

data_cor = data.loc[:, [‘RPM’, ‘AGE’, ‘SALARY_MILLIONS’, ‘ORB’, ‘DRB’, ‘TRB’,

‘AST’, ‘STL’, ‘BLK’, ‘TOV’, ‘PF’, ‘POINTS’, ‘GP’, ‘MPG’, ‘ORPM’, ‘DRPM’]]data_cor.head()

相关性函数

corr = data_cor.corr()

#获取两列数据之间的相关性

corr.head()

plt.figure(figsize=(20, 8), dpi=100)

sns.heatmap(corr, square=True, linewidths=0.1, annot=True)
annot—是否在热力图中显示数据
square=True 正方形显示

seaborn中的heatmap函数,是将多维度数值变量按数值大小进行交叉热图展示


颜色越浅,相关性越高

颜色越深,相关性越低

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

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

3.球员数据分析

(1)基本分析

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


(2)薪资最高的10名运动员

data.loc[:, [‘PLAYER’, ‘SALARY_MILLIONS’, ‘RPM’, ‘AGE’, ‘MPG’]

].sort_values(by=‘SALARY_MILLIONS’, ascending=False).head(10)


勒布朗詹姆斯为该赛季薪水最高的球员,麦克康利拿到了大合同,但是在群星璀璨的薪金榜单上略显黯淡。同样出现在榜单的还有威少、哈登、杜兰特等球星,库里由于之前的合同太小,并没有出现在前10名里。


(3)效率值最高的10名运动员

data.loc[:, [‘PLAYER’, ‘RPM’, ‘SALARY_MILLIONS’, ‘AGE’, ‘MPG’]

].sort_values(by=‘RPM’, ascending=False).head(10)


詹皇拿着联盟最高的薪水,打球也毫不含糊,效率值排名第一。

保罗和库里紧随其后,在前10的榜单里,宇宙勇占据3席。

值得一提的是,掘金队的约基奇和爵士队的戈贝尔,拿着较为微薄的工资却打出了联盟前10的效率,这也为他们接下来的大合同奠定了基础。


(4)出场时间最高的10名运动员

data.loc[:, [‘PLAYER’, ‘RPM’, ‘SALARY_MILLIONS’, ‘AGE’, ‘MPG’]

].sort_values(by=‘MPG’, ascending=False).head(10)


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

1.单变量

我们先利用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))  # 把0--40之间,分成9个间隔(包含0和40)
plt.ylabel('Salary', size=10)

plt.subplot(3, 1, 2)
sns.distplot(data['RPM'])
plt.xticks(np.linspace(-10, 10, 9))
plt.ylabel('RPM', size=10) 

plt.subplot(3, 1, 3)
sns.distplot(data['AGE'])
plt.xticks(np.linspace(20, 40, 11))
plt.ylabel('AGE', size=10)


可见年龄和效率值更符合正态分布,而球员薪水更像一个偏态分布,拿高薪的球员占据较小的比例。这些与我们的主管感受基本一致,

那么这些变量之间是否有什么隐藏的关系呢?这里可以用seaborn中的pairplot绘图展示多个变量之间的关系:

2.双变量

#使用jointplot查看年龄和薪水之间的关系

dat1 = data.loc[:, ['RPM', 'SALARY_MILLIONS', 'AGE', 'POINTS']]
sns.jointplot(x =dat1.SALARY_MILLIONS, y =dat1.AGE, kind='kde', height=8)
plt.show()

上图展示的是球员薪水与年龄的关系,采用不同的kind方式(等高线图/hex/散点等),

我们可以整体感受一下年龄和薪水的集中特点,大部分球员集中在22-25岁拿到5million以下的薪水,当然也有“年少成名”和“越老越妖”的情况。


3.多变量

#用seaborn中的pairplot绘图展示多个变量之间的关系

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

上图展示的是球员薪水、效率值、年龄及场均得分四个变量间的两两相关关系,对角线展示的是本身的分布图,由散点的趋势我们可以看出不同特征的相关程度。


整体看各维度的相关性都不是很强,正负值与薪水和场均得分呈较弱的正相关性,而年龄这一属性和其他的变量相关性较弱,究竟是家有一老如有一宝还是廉颇老矣,接下来我们从年龄维度入手进一步分析.

5.衍生变量的一些可视化实践-以年龄为例

在已有的数据集里想要生成新的变量,例如:把球员按年龄分为老中青三代,可以借助定义一个函数,再利用apply的方式,生成新的变量。


#思路tips: 根据已有变量生成新的变量

data['avg_point'] = data['POINTS']/data['MP']  # 每分钟得分

# 分割年龄
def age_cut(df):
    if df.AGE <= 24:
        return 'young'
    elif df.AGE >= 30:
        return 'old'
    else:
        return 'best'


data['age_cut'] = data.apply(lambda x: age_cut(x), axis=1)  # 球员是否处于黄金年龄
data['cnt'] = 1  # 计数用

既然得到了老中青三代的标签,我们来看一下不同年龄段球员的RPM(正负值)与薪水之前的关系如何:

#球员薪水与效率值 按年龄段来看

sns.set_style('darkgrid')  # 设置seaborn的面板风格
plt.figure(figsize=(8, 8), dpi=100)
plt.title('RPM and SALARY', size=15)

X1 = data.loc[data.age_cut == 'old'].SALARY_MILLIONS
Y1 = data.loc[data.age_cut == 'old'].RPM
plt.plot(X1, Y1, '.')

X2 = data.loc[data.age_cut == 'best'].SALARY_MILLIONS
Y2 = data.loc[data.age_cut == 'best'].RPM
plt.plot(X2, Y2, '^')

X3 = data.loc[data.age_cut == 'young'].SALARY_MILLIONS
Y3 = data.loc[data.age_cut == 'young'].RPM
plt.plot(X3, Y3, '.')

plt.xlim(0, 30)
plt.ylim(-8, 8)
plt.xlabel('Salary')
plt.ylabel('RPM')
plt.xticks(np.arange(0, 30, 3))
plt.legend(['old', 'best', 'young'])


点图横坐标为球员薪水,纵坐标为效率值。可以观测到:

绝大部分的年轻球员拿着较低的薪水,数据非常集中。有两个离群点,是上文提到的戈贝尔和约基奇,两个小兄弟前途无量啊。

黄金年龄的球员和老球员的数据相对发散,黄金年龄球员薪水与效率值正相关性更强。第一集团有几个全明星排头兵。

老球员过了呼风唤雨的年纪,运动状态有所下滑,“高薪低效”的球员也稍微多一些。

用上篇的方法看一下老中青三代各技术统计的分布情况:


dat2=data.loc[:,[‘RPM’,‘POINTS’,‘TRB’,‘AST’,‘STL’,‘BLK’,‘age_cut’]]

sns.pairplot(dat2,hue=‘age_cut’)


6.球队数据分析

(1)球队薪资排行

将数据按球队分组,平均薪水降序排列,看一下联盟十大土豪球队:

# 分组操作 按球队

dat_grp = data.groupby(by=['TEAM'], as_index=False).agg(
    {'SALARY_MILLIONS': np.mean, 'RPM': np.mean, 'PLAYER': np.size})

dat_grp.sort_values(by='SALARY_MILLIONS', ascending=False).head(10)

骑士队和勇士队已超高的薪水排在这份榜单的前两名,群星璀璨的他们最终在季后赛中一路厮杀,双双闯入分区决赛。

排在第三的开拓者有10名球员上榜,可谓后补活力充沛。球队薪金结构的健康与否对球队的发展至关重要。


(2)球队年龄结构

先胖不算胖,后胖压倒炕,优质的年轻球员储备是保持球队竞争性的密匙。

我按照分球队分年龄段,上榜球员降序排列,如上榜球员数相同,则按效率值降序排列。

# 分组操作 按场上位置

dat_grp2 = data.groupby(by=['TEAM', 'age_cut'], as_index=False).agg(
    {'SALARY_MILLIONS': np.mean, 'RPM': np.mean, 'PLAYER': np.size})

dat_grp2.sort_values(by=['PLAYER', 'RPM'], ascending=False).head(15)

在这份榜单里,排在榜首的公牛队(CHA)有年轻球员8人,但效率值偏低,小伙子们还需努力啊。

绿凯(BOS)不得了,黄金年龄球员和年轻球员共14人,效率值较高,未来一片光明。


年轻的森林狼(MIN)有6名黄金年龄球员,老马刺(SA)有5为年长球员,一老一小效率值还都不错。

最牛的还属宇宙勇(GS),5名黄金年龄球员效率值为恐怖的4.7,明星在手天下我有!

(3)球队综合实力分析

最后我们来看看球队综合实力:


按照效率值降序排列前10名球队的相关信息如下:

# 数据可视化 按球队

dat_grp3 = data.groupby(by=['TEAM'], as_index=False).agg({'SALARY_MILLIONS': "mean",
                                                          'RPM': "mean",
                                                          'PLAYER': "size",
                                                          'POINTS': "mean",
                                                          'eFG%': "mean",
                                                          'MPG': "mean",
                                                          'AGE': "mean"})
dat_grp3 = dat_grp3.loc[dat_grp3.PLAYER > 5]
dat_grp3.sort_values(by=['RPM'], ascending=False).head(10)


勇士(GS)和骑士(CLE)占据前两名的位置,效率值反映球队实力的事实情况。

老马刺(SA)排名第三,平均年龄达29.5岁排名第一,更新血液迫在眉睫。


雷霆(OKC)由于大威少的存在能排在第5位,各项数据中规中矩。

利用箱线图和小提琴图看着10支球队的相关数据

7.利用箱线图和小提琴图看着10支球队的相关数据

(1)箱线图



sns.set_style('whitegrid')  # 设置seaborn的面板风格
plt.figure(figsize=(12, 8))
dat_grp4 = data[data['TEAM'].isin(['GS', 'CLE', 'SA', 'LAC', 'OKC', 'UTAH', 'CHA', 'TOR', 'NO', 'BOS']
     )]

plt.subplot(3, 1, 1)
sns.boxplot(x='TEAM', y='AGE', data=dat_grp4)
plt.subplot(3, 1, 2)
sns.boxplot(x='TEAM', y='SALARY_MILLIONS', data=dat_grp4)
plt.subplot(3, 1, 3)
sns.boxplot(x='TEAM', y='MPG', data=dat_grp4)

(2)小提琴图

plt.figure(figsize=(12, 8))
plt.subplot(3, 1, 1)
sns.violinplot(x='TEAM', y='POINTS', data=dat_grp4)
plt.subplot(3, 1, 2)
sns.violinplot(x='TEAM', y='eFG%', data=dat_grp4)
plt.subplot(3, 1, 3)
sns.violinplot(x='TEAM', y='RPM', data=dat_grp4)

从年龄结构看,老马刺年龄跨度最大,年龄中位数最高

猛龙队最年轻且年龄跨度最小,后劲十足。

从球队薪金看,勇士和骑士最高,俄村雷霆在失去杜兰特后栽了大跟头,薪金健康情况堪忧。

从出场时间看,骑士队最高且跨度低,小团体战斗能力出众。

从得分来看,骑士和勇士整体出众。雷霆的威少、绿军的小托马斯、醍醐的浓眉哥以及马刺的伦纳德均是各队的离群点,双拳难敌四手。

从命中率看,命中率各队非常集中,绿凯的小托马刺作为地表最强175远远高于其他人。

从效率值看,骑士和勇士是大赢家。

8.结语

NBA每天都会如期而至!随着科技的进步我们可以更好的对篮球比赛的数据进行记录和分析,

这使得我们能更好地理解篮球,理解球员,结合我们的专业知识和兴趣爱好,更好地享受篮球比赛的无穷魅力。

相关文章
|
3月前
|
数据采集 数据可视化 数据挖掘
Pandas数据应用:天气数据分析
本文介绍如何使用 Pandas 进行天气数据分析。Pandas 是一个强大的 Python 数据处理库,适合处理表格型数据。文章涵盖加载天气数据、处理缺失值、转换数据类型、时间序列分析(如滚动平均和重采样)等内容,并解决常见报错如 SettingWithCopyWarning、KeyError 和 TypeError。通过这些方法,帮助用户更好地进行气候趋势预测和决策。
162 71
|
3月前
|
存储 数据采集 数据可视化
Pandas数据应用:电子商务数据分析
本文介绍如何使用 Pandas 进行电子商务数据分析,涵盖数据加载、清洗、预处理、分析与可视化。通过 `read_csv` 等函数加载数据,利用 `info()` 和 `describe()` 探索数据结构和统计信息。针对常见问题如缺失值、重复记录、异常值等,提供解决方案,如 `dropna()`、`drop_duplicates()` 和正则表达式处理。结合 Matplotlib 等库实现数据可视化,探讨内存不足和性能瓶颈的应对方法,并总结常见报错及解决策略,帮助提升电商企业的数据分析能力。
176 73
|
4月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
135 0
|
2月前
|
存储 数据采集 数据可视化
Pandas数据应用:医疗数据分析
Pandas是Python中强大的数据操作和分析库,广泛应用于医疗数据分析。本文介绍了使用Pandas进行医疗数据分析的常见问题及解决方案,涵盖数据导入、预处理、清洗、转换、可视化等方面。通过解决文件路径错误、编码不匹配、缺失值处理、异常值识别、分类变量编码等问题,结合Matplotlib等工具实现数据可视化,并提供了解决常见报错的方法。掌握这些技巧可以提高医疗数据分析的效率和准确性。
103 22
|
3月前
|
数据采集 数据可视化 索引
Pandas数据应用:股票数据分析
本文介绍了如何使用Pandas库进行股票数据分析。首先,通过pip安装并导入Pandas库。接着,从本地CSV文件读取股票数据,并解决常见的解析错误。然后,利用head()、info()等函数查看数据基本信息,进行数据清洗,处理缺失值和重复数据。再者,结合Matplotlib和Seaborn进行数据可视化,绘制收盘价折线图。最后,进行时间序列分析,设置日期索引、重采样和计算移动平均线。通过这些步骤,帮助读者掌握Pandas在股票数据分析中的应用。
116 5
|
3月前
|
数据可视化 数据挖掘 开发者
Pandas数据可视化:matplotlib集成(df)
Pandas 是 Python 中强大的数据分析库,Matplotlib 是常用的绘图工具。两者结合可方便地进行数据可视化,帮助理解数据特征和趋势。本文从基础介绍如何在 Pandas 中集成 Matplotlib 绘制图表,如折线图、柱状图等,并深入探讨常见问题及解决方案,包括图表显示不完整、乱码、比例不合适、多子图布局混乱、动态更新图表等问题,提供实用技巧和代码示例。掌握这些方法后,你将能更高效地处理数据可视化任务。
75 9
|
2月前
|
数据采集 SQL 数据挖掘
电商数据分析的方法
电商数据分析涵盖从业务需求理解到数据呈现的全流程。初学者应循序渐进,掌握数据清洗、转换等技能,Python是重要工具。社交媒体营销分析关注用户参与度和KOL影响。实战教程如《2019电商数据分析师实战项目》提供Excel、SQL及Tableau应用案例,帮助巩固理论知识。代码示例展示了如何使用Pandas和SQLAlchemy进行销售数据分析,计算转化率。 (注:联系方式和感谢语已省略以符合要求)
电商数据分析的方法
|
4月前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
315 1
|
4月前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
85 2
|
4月前
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
219 5

热门文章

最新文章