第128天:Seaborn-可视化数据集的分布

简介: 第128天:Seaborn-可视化数据集的分布

上一篇我们介绍了介绍 seaborn 中分类数据的可视化图形表示。在处理数据过程中,我们通常想做的第一件事就是了解数据集中变量的分布情况,本篇将介绍 seaborn 中数据集分布情况的可视化图形表示。


1 前言

在这里我们将简要介绍 seaborn 中用于检查单变量和双变量分布的一些函数。

以下各个小节示例演示前均首先进行以下声明:


import seaborn as snsimport matplotlib.pyplot as pltfrom scipy import statssns.set(color_codes=True)


2 绘制单变量分布


在 seaborn 中想要快速查看单变量分布的最方便的方法是使用 distplot() 函数,可以灵活绘制单变量观测值分布图。


2.1 示例1


默认情况下,distplot() 函数会绘制直方图并拟合内核密度估计(kernel density estimate,简称 KDE)。


x = np.random.normal(size=100)sns.distplot(x)


image.png


2.2 示例2

直方图的绘制首先确定数据区间,然后观察数据落入这些区间中的数量来绘制柱形图以此来表征数据的分布情况。我们可以通过 kde=False 删除密度曲线,然后添加一个 rug=True,它会在横轴上为每一个观测值绘制垂直竖线。


x = np.random.normal(size=100)sns.distplot(x, kde=False, rug=True)


image.png


2.3 示例3

核密度估计(KDE)是绘制分布形状的有力工具,它是在概率论中用来估计未知的密度函数。可以通过 hist=False 来禁用直方图的绘制,然后只绘制核密度估计。


image.png


下面介绍一下如何绘制核密度估计曲线,这比直方图绘制更复杂。首先每个观测值被一个以该值为中心的正态(高斯)曲线所取代。


x = np.random.normal(0, 1, size=30)  # 初始化一组服从正态分布的随机数
bandwidth = 1.06 * x.std() * x.size ** (-1 / 5.)  # 根据经验公式计算 KDE 的带宽
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)


image.png


接下来,对这些曲线进行求和,计算支持网格(support grid)中每个点的密度值。然后对得到的曲线进行归一化,使曲线下的面积等于1。


from scipy.integrate import trapzdensity = np.sum(kernels, axis=0)density /= trapz(density, support)plt.plot(support, density)


image.png


我们可以看到,如果在 seaborn 中使用 kdeplot() 函数, 我们可以得到相同的曲线。这个函数也被 distplot() 所使用, 但是当我们只想要核密度估计时,它提供了一个更直接的接口,可以更容易地访问其他选项。


sns.kdeplot(x, shade=True)


image.png


KDE 的带宽参数控制估计与数据的拟合程度,就像直方图中的 bin 大小一样。它对应于我们在上面绘制的内核的宽度。默认行为尝试使用常用参考规则猜测一个好的值,但尝试更大或更小的值可能会有所帮助。


image.png


正如我们在上面所看到的,高斯 KDE 过程的本质意味着估计超出了数据集中最大和最小的值,有可能控制超过极值多远的曲线是由 cut 参数控制的,然而这只影响曲线的绘制方式,而不影响曲线的拟合方式。


image.png


2.4 示例4

可以使用 distplot() 函数将参数分布拟合到数据集上,并直观地评估其与观测数据的对应程度,这就是拟合参数分布。




image.png


3 绘制二元分布


对于可视化两个变量的二元分布也很有用。在 seaborn 中,最简单的方法就是使用jointplot()函数,它创建了一个多面板图形,显示了两个变量之间的二元(或联合)关系,以及每个变量在单独轴上的一元(或边际)分布。

接下来以下面的数据集为例展示例子:


mean, cov = [0, 1], [(1, .5), (.5, 1)]data = np.random.multivariate_normal(mean, cov, 200)df = pd.DataFrame(data, columns=["x", "y"])


3.1 示例1-散点图


可视化二元分布最常见的方法是散点图,其中每个观察点都以 x 和 y 值表示。这类似于二维 rugplot。您可以使用 matplotlib 的plt.scatter 函数绘制散点图, 它也是 jointplot() 函数显示的默认类型的图。


sns.jointplot(x="x", y="y", data=df)


image.png


3.2 示例2-六边形“桶”(Hexbin)图


类似于单变量的直方图,用于描绘二元变量关系的图称为 “hexbin” 图,因为它显示了落入六边形“桶”内的观察计数。此图对于相对较大的数据集最有效。它可以通过调用 matplotlib 中的 plt.hexbin 函数获得并且在 jointplot() 作为一种样式。当使用白色作为背景色时效果最佳。


x, y = np.random.multivariate_normal(mean, cov, 1000).Twith sns.axes_style("white"):    sns.jointplot(x=x, y=y, kind="hex", color="k")


image.png


3.3 示例3-核密度估计

也可以使用上面描述的核密度估计过程来可视化二元分布。在 seaborn 中,这种图用等高线图表示, 在 jointplot() 中被当作一种样式。


image.png


还可以使用 kdeplot() 函数绘制二维核密度图。这允许您在一个特定的(可能已经存在的) matplotlib 轴上绘制这种图,而 jointplot() 函数能够管理它自己的图。


image.png


image.png


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$")


image.png


4 可视化数据集中的成对关系

要在数据集中绘制多个成对的双变量分布,我们可以使用 pairplot() 函数。这将创建一个轴矩阵并显示 DataFrame 中每对列的关系,默认情况下,它还绘制对角轴上每个变量的单变量分布。



image.png

网络异常,图片无法展示
|

网络异常,图片无法展示
|
与 jointplot() 和 JointGrid 之间的关系非常类似, pairplot() 函数构建在 PairGrid 对象之上, 可以直接使用它来获得更大的灵活性。


g = sns.PairGrid(iris)g.map_diag(sns.kdeplot)g.map_offdiag(sns.kdeplot, n_levels=6)


image.png


总结

本节给大家介绍了 seaborn 中关于可视化数据集分布的一些方法,主要包含了三个方面的内容,分别是绘制绘制单变量分布、绘制二元分布以及可视化数据集中的成对关系。

网络异常,图片无法展示
|





目录
相关文章
|
2天前
|
资源调度 数据可视化 数据挖掘
Python用PyMC贝叶斯GLM广义线性模型、NUTS采样器拟合、后验分布可视化
Python用PyMC贝叶斯GLM广义线性模型、NUTS采样器拟合、后验分布可视化
|
3天前
|
数据可视化 API Python
Python绘图工具seaborn,教会你如何绘制更加精美的图形(二)
Python绘图工具seaborn,教会你如何绘制更加精美的图形(二)
|
3天前
|
数据可视化 Linux API
Python绘图工具seaborn,教会你如何绘制更加精美的图形(一)
Python绘图工具seaborn,教会你如何绘制更加精美的图形(一)
|
3天前
|
Python
使用Seaborn库创建图形的使用案例
【4月更文挑战第29天】该代码段首先导入seaborn和matplotlib库,然后加载名为"titanic"的数据集。接着,它创建一个画布并设定子图大小。通过seaborn的FacetGrid以"Attrition_Flag"为列进行分组,映射数据到网格上,用histplot展示"Customer_Age"的直方图分布。同样,也使用boxplot方法生成"Freq"的箱线图。最后展示所有图形。
8 2
|
13天前
|
数据可视化 数据挖掘 Python
Matplotlib与Seaborn在Python面试中的可视化题目
【4月更文挑战第16天】本文介绍了Python数据可视化在面试中的重点,聚焦于Matplotlib和Seaborn库。通过基础绘图、进阶图表、图形定制和交互式图表的实例展示了常见面试问题,并列出了一些易错点,如忽视图形清晰度、误用色彩等。建议理解两者功能并注意保持图形简洁,以提升面试表现和数据可视化能力。
23 3
|
13天前
|
数据可视化 数据挖掘 Linux
python数据分析工具Seaborn
【4月更文挑战第15天】Seaborn是Python的数据可视化库,基于matplotlib,提供统计图形绘制。它包含内置数据集,支持风格控制和多种图形类型如散点图、分布图,擅长处理分类数据并能可视化统计估计。Seaborn还能绘制热图、聚类图及交互式图形。要使用它,先用`pip install seaborn`安装,然后导入并应用到数据集上,如示例中展示的散点图绘制。
11 1
|
14天前
|
数据可视化 数据挖掘 API
Python数据分析工具Seaborn
【4月更文挑战第14天】Seaborn是Python的数据可视化库,基于matplotlib,为数据科学家提供高级接口创建统计图形。其特点包括简洁的API、丰富的图形类型(如散点图、直方图)、内置统计功能、数据集集成和与pandas的紧密配合。使用时需先安装Seaborn和matplotlib,然后通过Seaborn的函数(如`scatterplot()`、`histplot()`)绘制图形。它是数据分析和可视化的一个强大工具。
21 8
Python数据分析工具Seaborn
|
15天前
|
数据可视化 Python
PYTHON贝叶斯推断计算:用BETA先验分布推断概率和可视化案例
PYTHON贝叶斯推断计算:用BETA先验分布推断概率和可视化案例
33 7
|
15天前
|
数据可视化 数据挖掘
Seaborn中的分类图:直观展示分类数据的差异
【4月更文挑战第17天】Seaborn是数据分析中的利器,尤其在展示分类数据差异方面。本文介绍了5种主要图表类型:1) 使用`barplot`创建条形图,便于比较不同分类的数值差异;2) `boxplot`生成箱线图,展示数据分布和离散程度;3) `stripplot`和`swarmplot`显示单个观测值分布,理解分类内变异性和差异;4) `scatterplot`结合`hue`参数,呈现分类在连续变量关系中的差异;5) 自定义分类图,调整样式以满足特定需求。通过这些图表,可以更深入地分析和传达分类数据的特性。
|
15天前
|
数据可视化 Python
Seaborn中的时间序列图:展示数据随时间的变化趋势
【4月更文挑战第17天】使用Seaborn创建时间序列图可展现数据随时间变化的趋势。首先,确保数据集包含日期时间格式的时间戳字段。借助Pandas处理数据,然后使用Seaborn的`lineplot`创建基本图表。通过`line_kws`自定义线条样式,添加标题和轴标签以增强可视化。结合Pandas的`rolling`计算滚动平均值,`resample`进行数据重采样,或使用Statsmodels进行时间序列分析和预测,从而提升图表功能和分析深度。有效定制图表有助于更好地理解和传达数据趋势。