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从零开始学习教程(三) 数据分布可视化篇
最后,您如果觉得本公众号对您有帮助,欢迎您多多支持,转发,谢谢! 更多内容,请关注本公众号机器学习系列!