众所周知,箱线图是用于连续型数据可视化的一个基本图形,使用它可以比较一些统计量(比如中位数),但看不出数据的分布详情;同样,直方图或密度图可显示分布情况,却从图上不易看出需要的统计量。因此,在实际应用中,无论是在传统的六西格玛项目中,还是在数字化时代设计dashboard,又或者是在大数据分析项目中,经常需要将箱线图与直方图或密度图一起配合使用。
有没有一种图形可以同时满足这两个图所具备的功能呢,答应是肯定的,它就是小提琴图。听名字很优雅,视觉效果确实也挺好的一个图。
由于小提琴图同时显示统计量以及变量的密度图,在进行大数据可视化时我倾向于使用它,也因为它的这个优点,在去年我也多次向同事们推荐使用它,优势是显然的——在仪表盘空间有限的情况下,一个不算复杂的图能实现两个图的功能当然更可取。唯一的缺点是还需要几句话普及如何看图。
小提琴图目前还比较冷门,相信它会越来越受到大数据分析的重视。
一、什么是小提琴图?
小提琴图用于可视化连续型数据的分布,事实上它是箱形图和核密度图的混合体,如下图所示,也可以说是箱形图和直方图的组合。
从下边我根据一个视频特意制作的gif,可以较直观地了解。
可以看到,它的制作过程可简单理解成在箱线图的每一侧都添加旋转的核密度图,因此典型的小提琴图通常包括箱线图中的所有数据。
如果将一个小提琴图和对应的箱线图放一起作个比较,可以进一步了解上图中:
小提琴图显示了数据的完整分布,当数据分布是多模(多于一个峰值)时,小提琴图显示不同峰值的存在、它们的位置和相对振幅,在这种情况下更能体现出这个图的价值。
二、制作小提琴图的工具
Python、R等软件都可以制作小提琴图,Java也可以实现。对于Python,可以使用扩展库Seaborn、matplotlib、Plotly等库实现;这几个库都不错,在本文中我分别介绍。
三、准备数据集
使用的数据为Seaborn自带的tips数据集,通过load_dataset('tips')就可以获取。可看到该数据集有244行,7个维度,分别是total_bill, tip, sex, smoker, day, time, size。
这是一个经典的数据集,通过上表可以看到其中既有连续型数据,也有离散(类别)型数据。
四、基于Seaborn制作小提琴图
先了解sns.violinplot()的语法
sns.violinplot(
*,
x=None,
y=None,
hue=None,
data=None,
order=None,
hue_order=None,
bw='scott',
cut=2,
scale='area',
scale_hue=True,
gridsize=100,
width=0.8,
inner='box',
split=False,
dodge=True,
orient=None,
linewidth=None,
color=None,
palette=None,
saturation=0.75,
ax=None,
**kwargs,
)
Docstring:
Draw a combination of boxplot and kernel density estimate.
与箱线图一样,小提琴图用于表示连续型数据在一个(或多个)类别变量的几个级别上的分布,从而可以比较这些分布。因此,sns.violineplot()函数始终将x, y中的一个变量视为类别变量,并在对应的轴上按类别绘图,即使数据具有数字或日期类型。
sns.violinplot()的输入数据可以以多种格式传递,包括:
使用Pandas对象比使用numpy或Python对象更好,因为相关的名称将用于轴的标注。
下边进行实例演示,总共有11个示例,弄懂这些示例,应该可以满足绝大多数情况下的应用需求。
1、最基础的图。只指定x,y或者data这三个参数中的一个(当然它必须是连续型数据)。若指定x则生成水平的小提琴图,指定y和data都生成垂直的小提琴图。
2、同时指定x和y,小提琴图是横或竖取决于将类别变量设为y或者x。
3、指定x,y和hue,hue为第二个类别变量,且hue可以包括多类别。
4、构造类别数据进行分类。对现有其它类型数据(连续或者多类别变量)进行适当的转换变成类别数据【当使用split参数时(例5)hue参数只能接受二元类别变量,因此更常用此功能】。
在这个例子中使用了dodge参数并赋值为False,它的默认值为True。它的功能是指示当使用嵌套分类变量时是否将两个类别的小提琴图重叠显示。
5、用split参数将小提琴图中的密度图左右分开分别表示第二个类别变量(hue变量),此时hue变量必须是二元的,否则便不能画出图来。
6、用order参数来控制小提琴图中需要显示的类别以及各个类别的显示顺序。在以下案例中只选择了'Sun', 'Sat','Fri'三个类别,且按此顺序显示。
7、通过scale参数可以控制小提琴图的宽度。有三个选项,设为'area'会使每个小提琴图拥有相同的面积,'count'会使每个小提琴图的宽度代表它所在bin的观察值的数量(bin的原理与直方图相同),如果设为'width'则会使所有小提琴都具有相同的宽度。
8、用inner参数表示小提琴内部数据点的方式,默认为'box',如果为'quartile'则显示分布的四分位数;如果为'point'或者'stick'则显示每一个数据点,它俩的区别在于前者用中线上的点而后者用小提琴内的线的呈现;如果为None则只画小提琴图。
9、用scale_hue参数决定当使用hue变量时,由count参数所决定的尺寸缩放是(当scale_hue = True时)应用在每一个主要的类别内部还是(当scale_hue = False时)在整个小提琴图中的所有类别之间。
10、用bw参数给定名字('scott'或者'silverman')或者指定一个尺度因子用来计算kernel宽度。实际的kernel size = 指定的尺度因子 x 每个bin内的数据的标准差。
11、使用cut参数确定密度图超过极值点(最大和最小数据点)的距离,单位是bandwidth的大小。设置为0可限制小提琴图的范围局限在的观测值的范围内。
以上这些就是使用Seborn制作小提琴图的主要示例,应该能满足通常的应用需求了。小提琴图是一种同时显示多个数据分布的有效且有吸引力的方法,但需记住同其它的统计工具一样,它的应用效果显然也会受样本大小的影响,相对较小样本的小提琴图可能会导致误解。
五、基于Matplotlib绘制小提琴图
使用plt.violinplot()函数,它的参数有(dataset, positions=None, vert=True, widths=0.5, showmeans=False, showextrema=True, showmedians=False, quantiles=None, points=100, bw_method=None, *, data=None)
可看到与Seaborn相比,确实Matplotlib的图表要逊色一些,这正如Seaborn的介绍一样:Seaborn是一个基于matplotlib的Python数据可视化库。它提供了一个高级界面,用于绘制具有吸引力和信息量的统计图形。
六、基于plotly绘制小提琴图
Plotly是一个开源库,可以轻松可视化和理解数据。Plotly提供了多种常见的统计图表,之前发过一篇文章专门介绍如何使用plotly库,感兴趣的朋友参考《》,还有一篇文章是介绍plotly库制作箱线图,参考《》
以下是使用plotly制作的一个最基本的小提琴图形。
plotly还有一些非常不错的亮点,这也是我推荐的使用它的原因,这些亮点包括:
关于小提琴图,就介绍这么多吧。附《数字化六西格玛:赋能数字化转型的系统方法》链接给有需要的朋友。
工作、读书和旅行
是在不同的点位
触摸人生的莫比乌斯环
一路走走停停、且行且学
也边走边写、边写边忘
环路没有终点
如果不再出发,就是终点
往期文章㈠:工作
智能制造▶
数字化六西格玛▶
数据分析与编程▶
往期文章㈡:旅行
登山徒步▶
(上)
旅行杂记▶
往期文章㈢:读书
最近文章▶
发表评论