(十七)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)

输出结果如下:


这里涉及到知识点

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

这里涉及到知识点:

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

这里涉及到的知识点:

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容