做者:xiaoyuhtml
微信公众号:Python数据科学python
知乎:python数据分析师bash
seaborn
的学习内容主要包含如下几个部分:微信
数据集的分布可视化
本次将主要介绍数据集的分布可视化
的使用。app
当处理一个数据集的时候,咱们常常会想要先看看特征变量是如何分布的。这会让咱们对数据特征有个很好的初始认识,同时也会影响后续数据分析以及特征工程的方法。本篇将会介绍如何使用 seaborn 的一些工具来检测单变量和双变量分布状况。dom
首先仍是先导入须要的模块和数据集。python2.7
%matplotlib inline
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
复制代码
注意:这里的数据集是随机产生的分布数据,由 numpy 生成,数据类型是ndarray。固然,pandas 的 Series 数据类型也是可使用的,好比咱们常常须要从 DataFrame 表中提取某一特征(某一列)来查看分布状况。函数
在 seaborn 中,快速观察单变量分布的最方便的方法就是使用 distplot()
函数。默认会使用柱状图(histogram)来绘制,并提供一个适配的核密度估计(KDE)。工具
x = np.random.normal(size=100)
sns.distplot(x);
复制代码
直方图是比较常见的,而且在 matplotlib 中已经存在了 hist
函数。直方图在横坐标的数据值范围内均等分的造成必定数量的数据段(bins),并在每一个数据段内用矩形条(bars)显示y轴观察数量的方式,完成了对的数据分布的可视化展现。学习
为了说明这个,咱们能够移除 kde plot,而后添加 rug plot(在每一个观察点上的垂直小标签)。固然,你也可使用 rug plot 自带的 rugplot()
函数,可是也一样能够在 distplot
中实现:
sns.distplot(x, kde=False, rug=True);
复制代码
当绘制直方图时,你最须要肯定的参数是矩形条的数目以及如何放置它们。distplot()
使用了一个简单的规则推测出默认状况下最合适的数量,可是或多或少的对 bins 数量进行一些尝试也许能找出数据的其它特征:
sns.distplot(x, bins=20, kde=False, rug=True);
复制代码
核密度估计可能不被你们所熟悉,但它对于绘制分布的形状是一个很是有用的工具。就像直方图那样,KDE plots 会在一个轴上经过高度沿着其它轴将观察的密度编码。
sns.distplot(x, hist=False, rug=True);
复制代码
绘制 KDE 比绘制直方图须要更多的计算。它的计算过程是这样的,每一个观察点首先都被以这个点为中心的正态分布曲线所替代。
x = np.random.normal(0, 1, size=30)
bandwidth = 1.06 * x.std() * x.size ** (-1 / 5.)
support = np.linspace(-4, 4, 200)
kernels = []
for x_i in x:
kernel = stats.norm(x_i, bandwidth).pdf(support)
kernels.append(kernel)
plt.plot(support, kernel, color="r")
sns.rugplot(x, color=".2", linewidth=3);
复制代码
而后,这些替代的曲线进行加和,并计算出在每一个点的密度值。最终生成的曲线被归一化,以使得曲线下面包围的面积是1。
density = np.sum(kernels, axis=0)
density /= integrate.trapz(density, support)
plt.plot(support, density);
复制代码
咱们能够看到,若是咱们使用 kdeplot()
函数,咱们能够获得相同的曲线。这个函数实际上也被 distplot()
所使用,可是若是你就只想要密度估计,那么 kdeplot()
会提供一个直接的接口更简单的操做其它选项。
sns.kdeplot(x, shade=True);
复制代码
KDE 的带宽参数(bw)控制着密度估计曲线的宽窄形状,有点相似直方图中的 bins 参数的做用。它对应着咱们上面绘制的 KDE 的宽度。默认状况下,函数会按照一个通用的参考规则来估算出一个合适的值,可是尝试更大或者更小也可能会有帮助:
sns.kdeplot(x)
sns.kdeplot(x, bw=.2, label="bw: 0.2")
sns.kdeplot(x, bw=2, label="bw: 2")
plt.legend();
复制代码
如上所述,高斯KDE过程的意味着估计延续了数据集中最大和最小的值。 能够经过cut
参数来控制绘制曲线的极值值的距离; 然而,这只影响曲线的绘制方式,而不是曲线如何拟合:
sns.kdeplot(x, shade=True, cut=0)
sns.rugplot(x);
复制代码
你也可使用distplot()
将参数分布拟合到数据集,并可视化地评估其与观察数据的对应程度:
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma);
复制代码
对于双变量分布的可视化也是很是有用的。在 seaborn 中最简单的方法就是使用 joinplot()
函数,它可以建立一个多面板图形来展现两个变量之间的联合关系,以及每一个轴上单变量的分布状况。
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
复制代码
双变量分布最熟悉的可视化方法无疑是散点图了,在散点图中每一个观察结果以x轴和y轴值所对应的点展现。你能够用 matplotlib 的 plt.scatter
函数来绘制一个散点图,它也是jointplot()
函数显示的默认方式。
sns.jointplot(x="x", y="y", data=df)
复制代码
直方图 histogram
的双变量相似图被称为 “hexbin” 图,由于它展现了落在六角形箱内的观测量。这种绘图对于相对大的数据集效果最好。它能够经过 matplotlib 的 plt.hexbin
函数使用,也能够做为 jointplot
的一种类型参数使用。它使用白色背景的时候视觉效果最好。
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");
复制代码
还使用上面描述的核密度估计过程来可视化双变量分布。在 seaborn 中,这种绘图以等高线图展现,而且能够做为 jointplot()
的一种类型参数使用。
sns.jointplot(x="x", y="y", data=df, kind="kde");
复制代码
你也能够用 kdeplot
函数来绘制一个二维的核密度图形。这能够将这种绘图绘制到一个特定的(可能已经存在的)matplotlib轴上,而jointplot()
函数只能管理本身:
f, ax = plt.subplots(figsize=(6, 6))
sns.kdeplot(df.x, df.y, ax=ax)
sns.rugplot(df.x, color="g", ax=ax)
sns.rugplot(df.y, vertical=True, ax=ax);
复制代码
若是你但愿让双变量密度看起来更连续,您能够简单地增长 n_levels 参数增长轮廓级数:
f, ax = plt.subplots(figsize=(6, 6))
cmap = sns.cubehelix_palette(as_cmap=True, dark=0, light=1, reverse=True)
sns.kdeplot(df.x, df.y, cmap=cmap, n_levels=60, shade=True);
复制代码
jointplot()
函数使用JointGrid
来管理图形。为了得到更多的灵活性,您可能须要直接使用JointGrid
绘制图形。jointplot()
在绘制后返回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$");
复制代码
为了绘制数据集中多个成对的双变量,你可使用 pairplot()
函数。这建立了一个轴矩阵,并展现了在一个 DataFrame 中每对列的关系。默认状况下,它也绘制每一个变量在对角轴上的单变量。
iris = sns.load_dataset("iris")
sns.pairplot(iris);
复制代码
就像 joinplot()
和 JoinGrid
之间的关系,pairplot()
函数创建在 PairGrid
对象之上,直接使用能够更灵活。
g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6);
/Users/mwaskom/anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.
warnings.warn("No labelled objects found. "
复制代码
参考:http://seaborn.pydata.org/tutorial.html
关注微信公众号Python数据科学,获取 120G
人工智能 学习资料。