python数据分析与机器学习实战我爱编程

(十七)Seaborn知识学习4-python数据分析与机器学习

2018-05-11  本文已影响116人  努力奋斗的durian

文章原创,最近更新: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 )

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)
参数的意义为:

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)

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)

输出结果如下:


这里涉及到知识点

  1. 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或标量,从参数化伽马分布中绘制样本。

    • 输出形状。如果给定的形状是,例如,然后 抽取样本。如果大小是(默认),则返回单个值,如果和都是标量。否则,绘制样本。


参考链接:numpy.random.gamma官网网站

  1. 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:控制拟合的参数分布图形
  2. 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数据之间的特征关系是什么样的?要分析特征以及特征之间的一个内部的联系,最好使用的方法是散点图.单特征最好使用直方图描述.

这里涉及到知识点:

参考链接: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 )
用双变量和单变量图绘制两个变量的图。

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"查看方式,能够很清晰的看到.颜色越深,出现的值越多,颜色越浅,出现的值越少.可以更好的看出两个变量直接的相互关系是怎么样的.

这里涉及到的知识点:

  1. 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)这两段代码搭配使用.

上一篇 下一篇

猜你喜欢

热点阅读