机器学习入门 01 —— 机器学习概述
机器学习入门 02 —— 环境搭建(Jupyter Notebook 及扩展库的安装与使用)
机器学习入门 03 —— Matplotlib使用
机器学习入门 04 —— Numpy使用
机器学习入门 05 —— Pandas使用
机器学习入门 06 —— Seaborn使用
Seaborn也是用于绘制图形的,Matplotlib虽然已经是比较优秀的绘图库了,但它的API使用比较复杂,而Seaborn是基于Matplotlib核心库进行了更高级的API封装,可以轻松绘制更漂亮的图形,其配色更加舒适、图形样式更加细腻。
如果没有安装,可以通过命令
pip3 install seaborn
安装。我是使用了Anaconda进行包管理,所以基本上库都安装过了。可以看我另一篇博客,使用Anaconda管理Python包要方便很多。
Seaborn的使用非常简单,它不会像Matplotlib那样给你提供很多函数,通常我们根据变量的数目来决定使用哪个函数,单变量distplot()
、双变量jointplot()
。
设置主题 sns.set_style("whitegrid")
1.darkgrid(灰色网格)
2.whitegrid(白色网格)
3.dark(黑色)
4.white(白色)
5.ticks(十字叉)
white和ticks两种主题都会包含没有必要的上边框和右边框。我们可以用despine()函数去除。
# 去掉多余的线
sns.despine()
单变量顾名思义,就是只有一个变量,因此数据也是Series类型的。Seaborn的函数distplot()
默认绘制的是带有核密度估计曲线的直方图。(核密度估计曲线不懂没关系,后面看例子就明白了)
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, color=None)
下面通过例子来简单看看。
import numpy as np
import seaborn as sns
np.random.seed(0) # 确定随机种子,使得每次随机的数字相同以便观察
array = np.random.randn(100) # 生成100个随机数的数组
# 绘制直方图
sns.distplot(array, bins=10, hist=True, kde=True, rug=True)
双变量也很简单,只需使用jointplot()
就可以绘制,默认是绘制双变量散点图。
seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=None, color=None, ratio=5, space=0.2, dropna=True)
scatter
,其他还有直方图hex
、核密度估计曲线kde
、import numpy as np
import pandas as pd
import seaborn as sns
sns.set() # 导入seaborn的默认设置
data = pd.DataFrame({'x':np.random.randn(500), 'y':np.random.randn(500)}) # 生成随机DataFrame
sns.jointplot(x="x", y="y", data=data)
sns.jointplot(x="x", y="y", data=data, kind='hex')
sns.jointplot(x="x", y="y", data=data, kind='kde')
要想在数据集中绘制多个成对的双变量分布,则可以使用pairplot()函数实现,该函数会创建一个坐标轴矩阵,并且显示Datafram对象中每对变量的关系。另外,pairplot()函数也可以绘制每个变量在对角轴上的单变量分布。
如果下面代码中加载数据集失败可以看我另一篇博客:解决sns.load_dataset()加载失败问题
# 这里使用seaborn自带的数据来显示
dataset = sns.load_dataset('iris') # 加载鸢尾花数据集
dataset.head()
# 绘制多个成对的双变量分布
sns.pairplot(dataset)
数据集中的数据类型有很多种,除了连续的特征变量之外,最常见的就是类别型的数据了,比如人的性别、学历、爱好等,这些数据类型都不能用连续的变量来表示,而是用分类的数据来表示。
Seaborn针对分类数据提供了专门的可视化函数,这些函数大致可以分为如下三种:
包括striplot()和swarmplot(),它们的区别是,swarmplot()不会让数据重叠。
seaborn.stripplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, jitter=True, dodge=False)
下面用代码演示下:
# 获取tips数据
tips = sns.load_dataset('tips')
tips.head(3)
默认的样式
# 展示不同时间点time的总账单数目
sns.stripplot(x='time', y='total_bill', data=tips)
参数修改样式
# 展示不同时间点time的总账单数目
# hue='day',根据day进行细分。
# jitter=False,去除一些重合的数据。
# dodge=True,把不同day分开。(如果设为False,那么lunch的蓝色和黄色会重叠,dinner的三个也会重叠)
sns.stripplot(x='time', y='total_bill', hue='day', data=tips, jitter=False, dodge=True)
以树状的形式展现,这样就不会重叠,其他用法和striplot差不多。
sns.swarmplot(x="day", y="total_bill", data=tips)
seaborn.boxplot(x=None, y=None, hue=None, data=None, orient=None, color=None, saturation=0.75, width=0.8)
sns.boxplot(x="day", y="total_bill", data=tips)
seaborn.violinplot(x=None, y=None, hue=None, data=None)
sns.violinplot(x="day", y="total_bill", data=tips)
要想查看每个分类的集中趋势,则可以使用条形图和点图进行展示。
最常用的查看集中趋势的图形就是条形图。默认情况下, barplot函数会在整个数据集上使用均值进行估计。若每个类别中有多个类别时**(使用了hue参数),则条形图可以使用引导来计算估计的置信区间(是指由样本统计量所构造的总体参数的估计区间)**,并使用误差条来表示置信区间(就是下面黑色的那条线)。
sns.barplot(x="day", y="total_bill", data=tips)
另外一种用于估计的图形是点图,可以调用 pointplot()函数进行绘制,该函数会用高度低计值对数据进行描述,而不是显示完整的条形,它只会绘制点估计和置信区间。
sns.pointplot(x="day", y="total_bill", data=tips)
每个球迷心中都有一个属于自己的迈克尔·乔丹、科比·布莱恩特、勒布朗·詹姆斯。 本案例将用jupyter notebook完成NBA菜鸟数据分析初探。
数据集下载:https://download.csdn.net/download/qq_39763246/20936311
案例中使用的数据是2017年NBA球员基本数据,数据字段见下表:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_csv("2017年NBA球员相关信息.csv")
data.head(3)
data.describe() # 查看每列的基本信息 统计、平均值、标准差、最值等
数据相关性用了热力图来体现,每个格子中的值表示x轴与y轴的相关性。值越大,说明越相关。例如,第一列中ORPM与RPM最相关,根据字段表可以看出,是进攻正负值和正负值。
# 这里只取了部分列,为了让图像更清晰
data_cor = data.loc[:, ['RPM', 'AGE', 'SALARY_MILLIONS', 'ORB', 'DRB', 'TRB',
'AST', 'STL', 'BLK', 'TOV', 'PF', 'POINTS', 'GP', 'MPG', 'ORPM', 'DRPM']]
# 获取两列数据之间的相关性
corr = data_cor.corr()
# 创建画布 以便用sns画图时好设置图像大小
plt.figure(figsize=(20, 8), dpi=100) # 因为seaborn是基于matplotlib的,设置plt就可以设置sns。
# corr是数据,square让图像是正方形(默认是长方形),linewidths设置每个格子间隙,annot显示每个格子具体值
sns.heatmap(corr, square=True, linewidths=0.1, annot=True)
# 按照球员薪资降序排名
data.loc[:, ["PLAYER", "SALARY_MILLIONS"]].sort_values(by="SALARY_MILLIONS", ascending=False).head()
# 利用seaborn中的distplot绘图来分别看一下球员薪水、年龄的分布情况
sns.set_style("darkgrid")
plt.figure(figsize=(14, 5)) # 创建画布(以便设置seaborn的图形大小)
plt.subplot(1, 2, 1) # 表明 这次有1行2列个图,这是第1个图。
sns.distplot(data["SALARY_MILLIONS"])
plt.ylabel("salary")
plt.subplot(1, 2, 2) # 表明 这次有1行2列个图,这是第2个图。
sns.distplot(data["AGE"])
plt.ylabel("AGE")
、