马赛克图:列联表的有效可视化方式

列联表是一种广泛应用的用于揭示两个名义变量之间相关性的方法,例如性别和是否爱吃零食之间的相关性,生源地和升学率之间的关系,等等。学过统计学的人大多都对此了如指掌,给出列联表之后卡方检验走一套。但是对于这种列联表数据,是否有高效的可视化方法,能够直观的看出两个名义变量之间是否具有一定的相关性呢?

列联表是针对名义变量的,其本质是“计数”。因此对于计数的数据,柱状图是一种比较优秀的可视化方法,然而柱状图对于揭示两个名义变量之间的相关性还是差一点火候的,如下图所示(所有的图均通过R语言实现):

A B
a 10 18
b 20 100
barplot(matrix(c(10,20,18,100),nrow=2),beside=T,names.arg = c('A','B')) 
image.png

通过表格,虽然可以看出,在类别A中,b是a的2倍,在类别B中,b是a的几乎5倍,有相关性的可能性很高,但是从柱形图上很难直观的看出这一结论,因为能看到的都是b的比例高于a不少。

写过统计学的人都知道,列联表卡方检验的本质是通过频数近似概率,之后与计算在相互独立这个零假设下的卡方统计量,因此如果以探索关联性为目的,我们可视化的对象不应该是频数,而应该是频率。于是,改进之后的柱状图可以变为:

barplot(apply(matrix(c(10,20,18,100),nrow=2),2,function(x) x/sum(x)),
         beside=T,names.arg = c('A','B'))          
image.png

将频数转化为频率之后,两个名义变量之间的关系变得更加清晰了,我们可以清晰的看出,在A组中,a是b的一半,但是在B组中,a却远小于b的一半。在此基础上,因为频率的和总为1,因此将柱状图变为堆叠类型,得到:

barplot(apply(matrix(c(10,20,18,100),nrow=2),2,
        function(x) x/sum(x)),names.arg = c('A','B'))          
image.png

当变为堆叠频率柱状图之后,我们可以清晰的观测到,A组中a的频率是B组中a的频率的2-3倍,因此可以几乎断定,两者之间很可能是相关的。但是,堆积频率柱状图无法反映出A组和B组两个组别在数量上的差异,因此将A组和B组数量上的差异映射到柱子的宽度上,得到马赛克图:

tab<-matrix(c(10,20,18,100),nrow=2)
colnames(tab)<-c('a','b')
rownames(tab)<-c('A','B')
mosaicplot(tab,main='')
image.png

可见,在可视化列联表数据时,普通的柱状图无法直观的看出频数比例上的差异,但是频率化之后又无法看出组别数量上的差异。因此我们引入马赛克图,相当于在横向和纵向两个方向上转化为频率,在一个平面上将2×2列联表的四个数值完全可视化。综上,马赛克图不失为一个高效的列联表可视化方法。

但是值得注意的是,当列联表的行数和列数过多的时候,马赛克图也会变得效率低下,对于那种极度复杂的列联表数据,卡方检验本身也会面临效率假阳性提高点问题。此时,我们的目的将不再局限于两个变量之间的相关性,而转向了两个因素中,哪些水平之间可能具有一定的相关性。这时候就需要用到对应分析,坐标映射的内容了。

可视化是贯穿数据分析始终重要的环节,无论是前期的探索还是后期的展示,都离不开高效的可视化方法。我会不定期的更新在实际项目中可视化的思路与案例,希望大家多多点赞收藏转发。

你可能感兴趣的:(马赛克图:列联表的有效可视化方式)