(十七)Seaborn知识学习4-python数据分析与机器学习
文章原创,最近更新:2018-05-11
1.分布数据集的可视化的介绍
2.单变量分布
3.双变量分布
课程来源: python数据分析与机器学习实战-唐宇迪
学习参考链接:
1、Seaborn(sns)官方文档学习笔记(第三章 分布数据集的可视化)
2、Seaborn官方0.8.1版本
引言:这部分主要学习的是分布数据集的可视化
1.分布数据集的可视化的介绍
在处理一组数据时,通常首先要做的是了解变量是如何分布的。这一章将简要介绍seborn中用于检查单变量和双变量分布的一些工具。
2.单变量分布
拿到一份数据之后,对数据进行展开分析,首先要观察数据内部的情况.比如说数据是由数据一个个特征组成的,每个特征的分布情况是什么样的?通常就会做单变量,单特征的变量分析.
做单特征分析的一种很简单的情况就是将该特征的分布情况拿出来,看一下当前特征的分布状况分布是什么样的?
最方便的方式是快速查看单变量分布无疑是使用distplot()函数。默认情况下,这将绘制一个直方图,并拟合出核密度估计(KDE)。
2.1直方图
直方图应当是非常熟悉的函数了,在matplotlib中就存在hist函数。直方图通过在数据的范围内切成数据片段,然后绘制每个数据片段中的观察次数,来表示整体数据的分布。
为了说明这一点,我们删除密度曲线并添加了地毯图,每个观察点绘制一个小的垂直刻度。您可以使用rugplot()函数来制作地毯图,但它也可以在distplot()中使用:
案例代码如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
x=np.random.normal(size=100)
sns.distplot(x,kde=False)
输出结果如下:
将数据分为20组,显示的结果又是怎么样的呢?
distplot()的参数bins设置为20,就可以将数据分为20组.
案例代码如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
x=np.random.normal(size=100)
sns.distplot(x,bins=20,kde=False)
输出结果如下:
这里涉及到的知识点:
1)set(color_codes=True)
在一个步骤中设置美学参数。
seaborn.set(context ='notebook',style ='darkgrid',palette ='deep',font ='sans-serif',font_scale = 1,color_codes = False,rc = None )
- color_codes :布尔
如果True并且palette是一个seaborn调色板,请将简写颜色代码(例如“b”,“g”,“r”等)重新映射到此调色板的颜色。
2)random.seed(sum(map(ord, "distributions")))
random.seed(123456789) # 种子不同,产生的随机数序列也不同,随机数种子都是全局种子.
要每次产生随机数相同就要设置种子,相同种子数的Random对象,相同次数生成的随机数字是完全相同的.
np.random.seed()的作用是当每次运行代码时,可以设置相同的seed时,每次生成的随机数也相同,如果不设置seed,则每次生成的随机数都会不一样
例如:
当不使用seed的情况下,每次随机数都不一样.
from numpy.random import rand
a=rand(5)#不使用seed
print("rand(5)第一次打印:",a)
rand(5)第一次打印: [ 0.01786796 0.95757811 0.70141209 0.92666375 0.66817397]
a=rand(5)#不使用seed
print("rand(5)第二次打印:",a)
rand(5)第二次打印: [ 0.80940914 0.36203074 0.76397746 0.27343798 0.4564159 ]
当使用seed的情况下,每次随机数都一样.
from numpy.random import rand
import numpy as np
np.random.seed(3)#使用seed
b=rand(5)
print("rand(5)第一次打印:",b)
rand(5)第一次打印: [ 0.5507979 0.70814782 0.29090474 0.51082761 0.89294695]
np.random.seed(3)#使用seed
b=rand(5)
print("rand(5)第二次打印:",b)
rand(5)第二次打印: [ 0.5507979 0.70814782 0.29090474 0.51082761 0.89294695]
3)random.normal(size=100)
numpy.random.normal(loc=0.0, scale=1.0, size=None)
参数的意义为:
- loc:float,此概率分布的均值(对应着整个分布的中心centre)
- scale:float,此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
-
size:int or tuple of ints,输出的shape,默认为None,只输出一个值
我们更经常会用到的np.random.randn(size)所谓标准正态分布(μ=0,σ=1μ=0,σ=1),对应于np.random.normal(loc=0, scale=1, size)。
4)distplot(x,bins=20,kde=False)
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
- a:series或一维数组或列表类型的数据
- bins:设置矩形条的数量
- kde:bool,可选.是否绘制高斯核密度估计,默认绘制.
2.2拟合参数分布
还可以使用distplot()将参数分布拟合到数据集,并可视化地评估其与观察数据的对应关系:
统计的时候,要把数据一个整体的轮廓表现出来,就是看一下数据的分布状况,什么样的?
需要将distplot()中的参数fit写进来,比如fit=stats.gamma,fit是统计的一个指标,可以看清楚当前的数据是在某一个统计指标下它的一个分步状态.
案例代码如下:
import seaborn as sns
import numpy as np
from scipy import stats,integrate
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
x=np.random.gamma(6,size=200)
sns.distplot(x, kde=False, fit=stats.gamma)
输出结果如下:
这里涉及到知识点
- np.random.gamma()
numpy.random.gamma(shape, scale=1.0, size=None)
从Gamma分布中绘制样本。-
shape:float或float_like,伽玛分布的形状。应该大于零。
-
scale:float或float_like,可选,伽玛分布的范围。应该大于零。默认值等于1。
-
size:int或int的元组,可选
返回:ndarray或标量,从参数化伽马分布中绘制样本。 -
输出形状。如果给定的形状是,例如,然后 抽取样本。如果大小是(默认),则返回单个值,如果和都是标量。否则,绘制样本。
-
-
sns.distplot()中的参数x, kde=False, fit=stats.gamma
3)distplot(x,bins=20,kde=False)
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)- x:series或一维数组或列表类型的数据
- kde:bool,可选.是否绘制高斯核密度估计,默认绘制.
- fit:控制拟合的参数分布图形
-
from scipy import stats,integrate
- stats :Python有一个很好的统计推断包。那就是scipy里面的stats。Scipy的stats模块包含了多种概率分布的随机变量,随机变量分为连续的和离散的两种
- integrate: scipy.integration提供多种积分的工具,主要分为以下两类,一是对给出的函数公式积分,二是对于采样数值进行积分.
mean是均值,cov是协方差,想根据均值以及协方差通过numpy这个库,生成一组二维数据.
案例代码如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
print(df)
输出结果如下:
x y
0 -0.966779 1.224554
1 1.326123 0.467515
2 -1.233853 0.459449
3 -0.877749 0.512031
4 -1.682080 2.193876
5 -0.427656 2.252601
.. ... ...
195 0.415857 0.815041
196 -0.141024 0.214063
197 -1.879956 0.599829
198 -1.056075 -0.086185
199 -0.786835 2.789600
[200 rows x 2 columns]
之前分析的数据是单变量,只需要分析一维,对数据分析而说,通查要看数据特征以及数据特征之间的关系.对二维数据来说,比如x,y数据之间的特征关系是什么样的?要分析特征以及特征之间的一个内部的联系,最好使用的方法是散点图.单特征最好使用直方图描述.
这里涉及到知识点:
-
mean, cov = [0, 1], [(1, .5), (.5, 1)]
-
np.random.multivariate_normal(mean, cov, 200)
np.random.multivariate_normal方法用于根据实际情况生成一个多元正太分布矩阵(正太分布基本概念戳这里),其在Python3中的定义如下:-
mean:mean是多维分布的均值维度为1;
-
cov:协方差矩阵(协方差基本概念戳这里),注意:协方差矩阵必须是对称的且需为半正定矩阵;
-
size:指定生成的正太分布矩阵的维度(例:若size=(1, 1, 2),则输出的矩阵的shape即形状为 1X1X2XN(N为mean的长度))。
-
参考链接:np.random.multivariate_normal方法浅析
3.双变量分布
观测两个变量之间的分布关系最好用散点图.
双变量分布的最熟悉的可视化方式无疑是散点图,其中每个观察结果以x和y值表示。这是两个方面的地毯图。可以使用matplotlib中的plt.scatter函数绘制散点图,它也是jointplot()函数显示的默认方式。
3.1绘制双变量分布
在绘制两个变量的双变量分布也是有用的。在seaborn中这样做的最简单的方法就是在jointplot()函数中创建一个多面板数字,显示两个变量之间的双变量(或联合)关系以及每个变量的单变量(或边际)分布和轴。
这里的x="x", y="y", 分别表示x维度,y维度,然后data=df,df表示的是传进来的数据.
案例代码如下:
import seaborn as sns
import numpy as np
import pandas as pd
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x", y="y", data=df)
输出结果如下:
从输出的结果可以看出,x与y之间的关系,jointplot()函数不仅可以将x,y之间的关系画出来,也将x,y分别自身的状况也画出来,此外相关系数也计算出来.jointplot()函数用于分析特征与特征之间的关系非常方便.当然也可以自定义颜色.
这里涉及到的知识点:
1)jointplot()函数
seaborn.jointplot(x,y,data = None,kind ='scatter',stat_func = <function pearsonr>,color = None,size = 6,ratio = 5,space = 0.2,dropna = True,xlim = None,ylim = None,joint_kws =无,marginal_kws =无,annot_kws =无,** kwargs )
用双变量和单变量图绘制两个变量的图。
- x,y:字符串或向量,数据或变量名称data。
- data : 当x,y是变量名,DataFrame, 可选.
3.2HexBin图
直方图的双变量类似物被称为“hexbin”图,因为它显示了落在六边形仓内的观测数。该图适用于较大的数据集。通过matplotlib plt.hexbin函数和jointplot()中的样式可以实现。 它最好使用白色背景,可以更好的看出数据分布的一个规则.
散点图可以查看什么样的区域分布的点比较多?如果数据非常多的时候,点会非常密集,看不出来哪个点比较多?哪个点比较少?
数据量比较大的时候,最好设置jointplot()函数中的参数kind,设置为"hex",改变散点图的查看方式.
案例代码如下:
import seaborn as sns
import numpy as np
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
mean, cov = [0, 1], [(1, .5), (.5, 1)]
x,y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
sns.jointplot(x=x, y=y,kind="hex", color="k")
输出结果如下:
从输出的结果可以看出,上侧和右侧均没有变化,都有直方图.数据量比较大的时候,这里通过颜色的差异,以此确定那一部分区域的散点图更多一些.而普通的散点图通过点的分布是很难查看出来.而用"hex"查看方式,能够很清晰的看到.颜色越深,出现的值越多,颜色越浅,出现的值越少.可以更好的看出两个变量直接的相互关系是怎么样的.
这里涉及到的知识点:
- sns.jointplot(x=x, y=y, kind="hex", color="k")
seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=<function pearsonr>, color=None, size=6, ratio=5, space=0.2, dropna=True, xlim=None, ylim=None, joint_kws=None, marginal_kws=None, annot_kws=None, **kwargs)- x,y:字符串或向量
- kind:{“scatter”| “reg”| “resid”| “kde”| “hex”},可选,绘制的情节
- color:matplotlib颜色,可选,用于绘图元素的颜色
3.3呈现数据集中成对的关系
要在数据集中绘制多个成对双变量分布,可以使用pairplot()函数。这将创建一个轴的矩阵,并显示DataFrame中每对列的关系。默认情况下,它也绘制每个变量在对角轴上的单变量:
比如这里有一份数据集,有4个特征,包含花瓣与花萼之间的关系.有花瓣的长度和花瓣的宽度,花萼的长度和花萼的宽度.反正当成有4个特征就可以了.在这四个特征中,想查看两两之间的关系,pairplot()提供了非常便利的方法.
首先seaborn这个库已经内置了"iris"这个数据集,我们可以直接使用这个数据集.如果不用这个数据集,也可以用pandas读进数据集也可以.这里用sns.pairplot()会将数据的特征两两之间的关系都画出来.
案例代码如下:
import seaborn as sns
iris = sns.load_dataset("iris")
sns.pairplot(iris)
输出结果如下:
从输出结果可以看出,对角线是直方图,其他位置是散点图.对角线是直方图的原因是两个数据的特征均是同一个数据特征,对于单变量而言,就是一个直方图.而不是对角线的图,因为是不同的两个特征,所以用散点图.
总结,pairplot()对角线画出的是直方图,是同一个数据特征.而非对角线是散点图,是两个特征之间的相互关系的图形.
这里涉及到的知识点:
1)load_dataset("iris")与pairplot(iris)
这里的iris不是某个文件,而是seaborn自带的展示用数据集,与
iris = sns.load_dataset("iris")与sns.pairplot(iris)这两段代码搭配使用.