百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

数据可视化:解析小提琴图(Violin plots)

bigegpt 2024-08-14 14:51 2 浏览

小提琴图(Violin plots)是一种数据可视化类型,结合了箱线图( box plot )和核密度图( kernel density plot)的特点。它展示了数据在不同类别或分组中的分布情况。在小提琴图中,每个组的分布由一个核密度图表示,镜像和旋转以形成类似小提琴的对称形状。小提琴图在任何给定点的宽度对应于该值的数据密度。此外,通常在小提琴图上叠加一个箱线图,提供摘要统计信息,如中位数、四分位数和异常值。小提琴图可用于比较不同组之间的分布,并识别它们的形状和扩展之间的差异。

Python 中的实现

标准正态分布(Standard Normal distribution)

代码生成了一个展示标准正态分布数据样本的直方图、箱线图和小提琴图的图形。首先,从标准正态分布中生成了一组具有10^4个样本的数据。然后,使用matplotlib和seaborn库创建了一个包含3个子图的图形。第一个子图显示了数据样本的直方图和核密度估计图(KDE),第二个子图显示了数据样本的箱线图,第三个子图显示了数据样本的小提琴图。标题标注了每个子图中显示的图形类型以及整个图形的主标题是"标准正态分布"。

import matplotlib.pyplot as plt
import seaborn  as sns


N = 10 ** 4
np.random.seed(2024)


sample_gaussian = np.random.normal(size=N)


fig, ax = plt.subplots(3, 1, sharex=True)
sns.distplot(sample_gaussian, ax=ax[0])
ax[0].set_title('Histogram + KDE')
sns.boxplot(sample_gaussian, ax=ax[1])
ax[1].set_title('Boxplot')
sns.violinplot(sample_gaussian, ax=ax[2])
ax[2].set_title('Violin plot')
fig.suptitle('Standard Normal Distribution', fontsize=16)
plt.show()

可以得出一些观察结果:

  • 在直方图中,我们看到了分布的对称形状。
  • 在箱线图和小提琴图中,我们可以看到之前提到的指标(中位数、四分位距、图基的栅栏)。
  • 用于创建小提琴图的核密度图与添加在直方图上方的核密度图相同。小提琴图中较宽的部分代表观察值取特定值的概率较高,而较窄的部分对应着概率较低的情况。

将这三种图形放在一起展示可以很好地解释小提琴图的本质以及它包含的信息类型。

对数正态分布(Log-normal distribution)

接下来是对数正态分布的示例,这种分布明显比正态分布更倾斜。

import matplotlib.pyplot as plt
import seaborn  as sns


N = 10 ** 4
np.random.seed(2024)


sample_lognormal = np.random.lognormal(size=N)


fig, ax = plt.subplots(3, 1, sharex=True)
sns.distplot(sample_lognormal, ax=ax[0])
ax[0].set_title('Histogram + KDE')
sns.boxplot(sample_lognormal, ax=ax[1])
ax[1].set_title('Boxplot')
sns.violinplot(sample_lognormal, ax=ax[2])
ax[2].set_title('Violin plot')
fig.suptitle('Log-normal Distribution', fontsize=16)
plt.show()

混合高斯分布 — 双峰(Mixture of Gaussians — bimodal)

在前两个例子中,我们已经看到小提琴图比箱线图包含更多信息。当我们考虑多峰分布时,这一点变得更加明显。在这个例子中,我们创建一个双峰分布,作为两个高斯分布的混合。

import matplotlib.pyplot as plt
import seaborn  as sns


N = 10 ** 4
np.random.seed(2024)


sample_bimodal = np.concatenate([np.random.normal(loc=-2, scale=2, size=int(N/2)),
                                 np.random.normal(loc=3, scale=1, size=int(N/2))])


fig, ax = plt.subplots(3, 1, sharex=True)
sns.distplot(sample_bimodal, ax=ax[0])
ax[0].set_title('Histogram + KDE')
sns.boxplot(sample_bimodal, ax=ax[1])
ax[1].set_title('Boxplot')
sns.violinplot(sample_bimodal, ax=ax[2])
ax[2].set_title('Violin plot')
fig.suptitle('Mixture of Gaussians - bimodal', fontsize=16)
plt.show()

没有密度图,我们将无法发现数据中的两个峰值。

高级用法

小提琴图经常用于比较某个变量在不同类别间的分布。我们以下列出了一些可能性。为此,我们从seaborn加载了小费(tips)数据集。

import seaborn as sns
#tips = sns.load_dataset("tips",cache=False)
tips = pd.read_csv('tips.csv')
tips

下面的示例:按性别分组的小费分布。此外,我们改变了小提琴图的结构,仅显示四分位数。其他一些可能性包括点表示所有观测值,或者箱形图表示在小提琴图内绘制一个小箱形图。

ax = sns.violinplot(x="sex", y="tip", inner='quartile', data=tips)
ax.set_title('Distribution of tips', fontsize=16);

下面示例:每天的总账单金额分布。此外,我们按性别进行了分组。立即可以看到,性别之间分布形状的最大差异发生在星期五。

ax = sns.violinplot(x="day", y="total_bill", hue="sex", data=tips)
ax.set_title('Distribution of total bill amount per day', fontsize=16)

在最后一个示例中,我们调查了与前一个案例相同的内容,但是我们设置了split=True。这样做的话,我们不是得到了8个小提琴图,而是得到了四个 —— 每个小提琴图的一侧对应着不同的性别。

ax = sns.violinplot(x="day", y="total_bill", hue="sex", split=True, data=tips)
ax.set_title('Distribution of total bill amount per day', fontsize=16);

主要介绍了什么是小提琴图,如何解释它们以及它们相对于箱线图的优势。值得一提的是,只要四分位数保持不变,箱线图就不会适应变化。我们可以以一种方式修改数据,使四分位数保持不变,但分布的形状却发生了明显的变化。以下 GIF 动画说明了这一点。

source:Same Stats, Different Graphs(https://www.research.autodesk.com/publications/same-stats-different-graphs/)

相关推荐

为3D手游打造, Visual Studio Unity扩展下载

IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...

由ArcMap属性字段自增引出字段计算器使用Python的技巧

1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...

微软首次回答 HoloLens 相关问题,终于爆料了

fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...

C#指针的应用(c#指针类型)

C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...

C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)

C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...

欢迎回来:Fortran意外重回流行编程语言20强榜单

TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...

C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案

简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...

C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤

在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...

C# (一)状态机模式(状态机代码实现)

最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...

C# 中 Predicate 详解(c#中的replace)

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...

C#中$的用法?(c#中&&什么意思)

文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...

C#并行编程:Parallel类(c# 并行处理)

在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...

颠覆认知!用Span重构foreach循环竟让数据处理快如闪电

在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...

Unity3D手游开发实践《腾讯桌球》客户端开发经验总结

本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...

.NET 7 AOT 的使用以及 .NET 与 Go 互相调用

目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...