0.说在前面
1.单变量分布
2.双变量分布
3.作者的话
昨天看了一下机器学习的东西,发现在做特征工程时,需要用到seaborn的可视化方法。
特别是涉及变量置键的关系强度,对于模型的选择非常重要,那么今天一起来学习一下,有关可视化的两个分布,分别是单变量分布及双变量分布!
同时介绍一下Jupter的几个快捷键,哈哈~~,之前用的pycharm,没想到我也改用Jupter了。
改用这个主要原因为:绘制图形方便显示,而在pycharm中弹出多张图来就有点受不了了,在Jupter中为浏览器交互式操作,直接显示,非常方便。
这里介绍几个Jupter的快捷键:
Ctrl+Enter 运行当前行代码
Alt+Enter 运行当前行代码并跳转下一行
Tab 补全代码
下面开始使用Jupter开始程序美图之路!
distplot绘制单变量分布
【导包】
# 此行代码只能在Jupter中使用,并且可以保证不plt.show()直接显示图片
%matplotlib inline
# 导入相关包
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from scipy import stats, integrate【固定种子】
利用np.random.seed()函数设置相同的seed,每次生成的随机数相同。
如果不设置seed,则每次会生成不同的随机数
np.random.seed(sum(map(ord,"distributions")))【绘制默认图】
distplot,seaborn的displot()函数集合了matplotlib的hist()与核函数估计kdeplot的功能;
增加了rugplot分布观测条显示与利用scipy库fit拟合参数分布的新颖用途。
绘制单变量分布,单变量分布distplot()函数,默认使用柱状图hisogram来绘制,并提供一个适配的核密度估计(KDE)
# 产生制定分布的数集(默认是标准正态分布)
data = np.random.normal(size=100)
print(data)
sns.distplot(data)data结果输出
[ 0.42852369 1.19133255 -0.45820746 -1.85860798 1.02445299 0.69330216
0.78849804 0.38978006 0.28186484 2.87595634 -0.47628215 1.68025623
..................]
【分桶参数】
bins是分桶数
hist控制是否显示分桶柱子
kde 控制是否显示核密度估计图
rug 控制是否显示观测实例竖线
sns.distplot(data,kde=False,bins=5)
【柱子参数】
sns.distplot(data,kde=False,hist=True)
【核密度参数】
sns.distplot(data,kde=True,hist=False)
【观测实例竖线参数】
rug参数开启后会在最下面产生由下至上的竖线
sns.distplot(data,rug=True)
【核密度估计】
kdeplot,核密度估计的步骤:
每一个观测附近用一个正态分布曲线近似;
叠加所有观测的正态分布曲线;
归一化,以使得曲线下面包围的面积是1
KDE的带宽参数(bw)控制着密度估计曲线的宽窄形状。
sns.kdeplot(data,label="bw: default")
sns.kdeplot(data, bw=.2, label="bw: 0.2")
# 这个设置shade=True表示显示曲线包围面积,且包围面积为1
sns.kdeplot(data, bw=2, label="bw: 2", shade=True)
plt.legend()
为了更好得表达bw参数有点类似hist图形种的bins参数,对应这上面绘制的KDE宽度。
看到上图感觉对数值范围发生了变化,这里使用cut参数,与上面的几张图的范围对比,会发西安并没有变化,只是当bw为2时,使得范围扩大了,这样所产是的结果是:默认图看似区间范围变了,实际没变!
sns.kdeplot(data,label="bw: default")
sns.kdeplot(data, bw=.2, label="bw: 0.2")
# 通过cut参数来控制绘制曲线的极值值的距离
sns.kdeplot(data, bw=2, label="bw: 2", shade=True, cut=0)
plt.legend()
【拟合参数分布】
拟合参数分布,distplot的fit参数,控制拟合的参数分布图形
distplot可以绘制很多分布,函数内部涵盖了大量的分布函数,
可以用来近似拟合数据.这对于熟悉统计的人来说十分有用.
伽玛分布(Gamma Distribution)是统计学的一种连续概率函数。
这里采用distplot使用fit参数去拟合绘制伽玛分布。
核密度估计图
np.random.seed(sum(map(ord,"distributions")))
x = np.random.gamma(6, size=200)
print(x)
sns.distplot(x,kde=True)
伽玛图
注意将kde关闭,否则两个图绘制到一张图中,不容易区分!
sns.distplot(x,kde=False,fit=stats.gamma)
【jointplot】
jointplot绘制双变量分布
提供多面板图形展示两个变量之间的联合关系
以及每个轴单变量的分布情况
【散点图(Scatterplots)】
Pearsonr相关系数衡量x于y的相关程度
相关系数的绝对值越大,相关性越强;
相关系数越接近于1或-1,相关度越强;
相关系数越接近0,相关度越弱;
# 固定随机种子
np.random.seed(sum(map(ord,"distributions")))
# 均值,协方差矩阵
mean,cov = (1, 2),[[1, 0], [0.5, 1]]
'''
mean:mean是多维分布的均值维度为1;
cov:协方差矩阵且协方差矩阵必须是对称的且需为半正定矩阵;
size:指定生成的正态分布矩阵的维度。
'''
# 生成一个多元正态分布矩阵
# data=shape(200,2)
data = np.random.multivariate_normal(mean, cov, 200)
data
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(x="x",y="y",data=df)
【Hexbin plots图】
hexbin图Hexbin plot,称为直方图histogram的双变量类似图
展示了落在六角形箱内的观测量。适合数据量大的!白色背景视觉效果最好
import warnings
# 忽略一些警告
warnings.filterwarnings('ignore')
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")
【核密度估计(Kernel density estimation)】
等高线图展示核密度估计过程来可视化双变量分布
sns.jointplot(x="x", y="y", data=df, kind="kde")
【二维核密度图】
# 也可以用 kdeplot 函数来绘制一个二维的核密度图形
# matlibplot与seaborn结合!
f, ax = plt.subplots(figsize=(7, 7))
sns.kdeplot(df.x, df.y)
sns.rugplot(df.x, color="g", ax=ax)
# vertical设置x与y轴的垂直线
sns.rugplot(df.y, vertical=True, ax=ax);
【JointGrid】
'''
jointplot()函数使用JointGrid来管理图形。
为了获得更多的灵活性,可以直接使用JointGrid绘制图形
'''
g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")
g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$X$", "$Y$");
参考资料:数据可视化Seaborn从零开始学习教程(三) 数据分布可视化篇
最后,您如果觉得本公众号对您有帮助,欢迎您多多支持,转发,谢谢! 更多内容,请关注本公众号机器学习系列!