列联表的最佳可视化是哪一个?


22

从统计的角度来看,哪张是最好的图来显示列联表,通常通过卡方检验来分析列联表?它是躲避的条形图,堆叠的条形图,热图,轮廓图,抖动的散点图,多条线图还是其他东西?应该显示绝对值还是百分比?

编辑:或如@forecaster在评论中建议的那样,数字表本身就是一个简单的图,应该足够了。


4
有时,数据表是最好的可视化方法。列联表就是一个典型的例子。
预报者

1
重要的一点,尽管我不同意它始终是最佳选择。
rnso 2015年

1
这就是为什么我说“有时”。我建议斯蒂芬·菲(Stephen Few)的“给我看数字”,其中有一个专门用于表格的部分。
预报者

1
好吧,最好的方法取决于您要显示的内容,表格有多大,而没有太多细节。
kjetil b halvorsen 2015年

3
大部分stats.stackexchange.com/questions/56322/…似乎与此处有关。
尼克·考克斯

Answers:


9

这里不会有一种千篇一律的解决方案。如果您有一个非常简单的表(例如),则最好仅显示该表。如果您想要一个实际的图形,那么马赛克图(如@xan所示)可能是一个不错的起点。还有其他一些与镶嵌图类似的选项,包括筛图,关联图和动态压力图(请参阅此处的问题:列联表的筛子/镶嵌图的替代品);Michael Friendly的书《可视化分类数据》将是该主题的一个很好的(基于SAS的)资源,而vcd包是一个在R中实现这些想法的很好的资源。 2×2

我认为,由于表具有更多的行和列,因此变得越来越难以使用。另一种可视化选项是执行/绘制对应关系分析。对应分析类似于在列联表的行和列上进行主成分分析。然后将两者与双图一起绘制。这是一个使用@xan答案的数据的基于R的示例:

library(ca)
tab = as.table(rbind(c(28, 4,  0, 56),
                     c(38, 5,  9, 10),
                     c( 6, 6, 14, 13) ))
names(dimnames(tab)) = c("activity", "period")
rownames(tab)        = c("feed", "social", "travel")
colnames(tab)        = c("morning", "noon", "afternoon", "evening")
tab
#         period
# activity morning noon afternoon evening
#   feed        28    4         0      56
#   social      38    5         9      10
#   travel       6    6        14      13
plot(ca(tab))

在此处输入图片说明

为了解释该图,相同类型的两个点越近,这两个行/列轮廓越相似。而且,不同类型的两个点越近,表示相交的像元中的概率质量就越大。

在R中有ca包;此小插图(pdf)也可能会有所帮助。


很有用。显然,它以较小的值会失败,例如:tt = with(mtcars,table(factor(gear),factor(vs))); 情节(ca(tt)); x [,dim]中的错误:下标超出范围
rnso 2015年

这是因为一个因素(即factor(vs))只有两个层次;您至少需要三个。尝试ttt = with(mtcars, table(factor(gear), factor(cyl))); plot(ca(ttt))
gung-恢复莫妮卡

很好地显示了不同因素之间的关系。
rnso 2015年

或者,您可以按照对应分析得分的顺序对行和列重新排序后显示表格。
kjetil b halvorsen

有趣的主意,@ kjetilbhalvorsen。我不确定如何从ca对象中获取代码,因此我从头开始对其进行了编码。除非我弄错了,否则您将对行c(1,3,2)和列进行重新排序c(4,1,3,2)。完成此操作后,我不确定应该在这里看到什么。你有什么考虑?
gung-恢复莫妮卡

11

不同的视觉效果会更好地突出显示不同的功能,但是马赛克图对于一般视图来说效果很好(检查是否突出)。也许这就是您所躲避的条形图的意思。像大多数选项一样,它们不是对称的,因为它们在一个维度上表示相对频率要好于另一个维度。一个不错的功能是边际频率也被表示出来。

在此处输入图片说明

在此处输入图片说明


很好 数字和比例都被表示。数字也可以放在情节上。如果按顺序排列x轴项目,则外观会更好。“闪避”是指类别并排的通用条形图,而不是相互叠加(请参阅本页上的position ='dodge':r-bloggers.com/using-r-barplot-with-ggplot2)。
rnso 2015年

1
+1 对于相对简单的数据,这种设计通常确实表现很好 ; 相反,我发现对于更复杂的数据,它也迅速变得难以思考,尽管在文献中重点强调了它对任意维列联表的可扩展性。尽管如此,在这种情况下,任何设计都无法很好地运作。此示例的一个小问题是您似乎已经接受了程序提供的默认字母顺序“下午” ...“中午”,而保留时间顺序似乎是一个更自然的选择。
Nick Cox

8

我同意“最佳”情节并不独立于数据集,读者群和目的而存在。对于两个测得的变量,散点图可以说是一种设计,除了特定目的外,其他所有特征都没有改变,但是对于分类数据而言,没有这样的市场领导者是显而易见的。

我在这里的目的只是提及一种简单的方法,通常会对其进行重新发现或重新发明,但是即使在涉及统计图形的专着或教科书中,也经常会忽略它们。

首先是示例,涵盖与xan发布的数据相同的数据:

在此处输入图片说明

如果想要一个名称(通常如此),则这是一个双向条形图(在这种情况下)。我不会在这里列出其他术语,只是多重条形图是一种具有类似味道的常见替代方法。(我对“多个条形图”的反对是,“多个”并不排除非常常见的堆叠条形图或并排条形图,而对我而言,“双向”则更清楚地表示行和列的布局,尽管反过来,可能会举例说明。)

这种情节的利弊也很简单,但我会讲清楚。当我喜欢这种设计(至少可以追溯到1930年代)时,其他人可能想提出更尖锐的批评。

+1。即使是非技术人员很容易理解这个想法。在此示例中,条高或条长编码频率。在其他示例中,他们可以对以任意方式计算的百分比,残差等进行编码。

+2。行和列的结构与表的结构匹配。您也可以添加数值。非常少量甚至隐含的零都是显而易见的,而其他设计(例如堆叠条形图,镶嵌图)并不总是如此。行和列标签通常比添加键或图例更有效,并带有所需的“来回”提示。因此,这种设计混合了图形和表格的想法,这似乎使某些读者感到困扰。相反,我认为数字与表格之间的强烈区别只是历史遗留,现在已经过时了,因为研究人员可以准备自己的文档,而不必依靠设计师,合成人和印刷商。

+3。原则上,三向及更高设计的扩展很容易。将两个或多个变量作为复合变量放在任一轴或两个轴上,或给出此类图的数组。自然,设计越复杂,解释就越复杂。

+4。该设计显然允许在任一轴上使用序数变量。可以通过适当的阴影以及该轴上类别的顺序来表示顺序(例如)。轴上的类别顺序可以根据其含义确定,也可以根据频率更好地确定;根据文本标签的字母顺序可能是默认设置,但绝不应视为唯一的选择。

-1。通过一般性的设计,绘图在显示某些类型的关系时可能效率较低。特别是,马赛克图可以使对独立性的偏离非常清楚。相反,当分类变量之间的关系复杂或不清楚时,通常没有一个图形比该弱事实更能显示更多。

-2。在某些方面,该设计会为每个交叉组合留出空间,而无论其是否发生或频繁发生,都无法充分利用空间。这是被视为美德的同一原则的恶习。上面的特定设计在空间类别上均等,而与频率无关;牺牲常常牺牲可读的边际标签,我非常重视。在此示例中,文本标签都非常短,但这远非典型。

注意:xan的数据似乎只是被发明出来的,因此,我不会比其他答案尝试更多的解释了。但是,这里有一些家常便饭的智慧,这句话才是硬道理:对您而言,最好的设计是可以最好地传达给您和您的读者的,您所关心的一些真实数据的结构。

其他例子包括

您如何可视化3个类别变量之间的关系?

两个序数变量之间的关系图


1
+1是另一个可行的选择,并进行了一些精彩的讨论。让我问一个关于2向条形图的问题/指出另一个可能的缺点:有一个未标记但明显可感知的“盒子”,可以在其中绘制条形图。当条形接近框的顶部时,达到100%。该值如何确定?(注意,列联表在某种意义上始终是多项式,带有已知的总数。)在框的顶部,行总和或列总和将促进不同的感知推断。(似乎未使用表格总和,因为许多条形图太小而无法区分。)
gung-恢复莫妮卡

1
@gung谢谢。我可以对自己的Stata程序(在此处以及在CV中其他地方的示例中使用)进行评论。该程序 tabplot来自SSC。钢筋的高度必定是最高或最长钢筋的高度的一部分。可用空间取决于显示多少行。用户可以覆盖默认的间隙大小,但是会冒着相互接触或遮挡的风险。如果柱形既可以是负数也可以是正数,那么事情就变得不那么容易了。我想其他任何程序都会受到相同的约束。简而言之,不触摸的条表示空白!
尼克·考克斯

8

为了补充@gung和@xan的答案,下面是vcd在R中使用的镶嵌图和关联图的示例。

> tab
        period
activity morning noon afternoon evening
  feed        28    4         0      56
  social      38    5         9      10
  travel       6    6        14      13

要获取地块:

require(vcd)
mosaic(tab, shade=T, legend=T)
assoc(tab, shade=T, legend=T)

在此处输入图片说明

在此处输入图片说明

两者都直观地显示出与预期频率的偏离...默认值是相互独立的模型,但是可以通过参数将其更改(例如,如果有明确的响应变量,则可以更改为联合独立expected

也可以看看:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.