如何可视化数字属性括​​号内布尔属性为 TRUE 的比例?

How to visualise the proportion of a boolean attribute being TRUE under brackets of a numeric attribute?

在数据框中说,X是数字属性,Y是布尔属性。 我如何可视化这两个属性之间的关系,通过根据它的值将X分成k(比如10)个括号,并绘制条形图来显示Y在X的不同取值范围下的比例是多少,所以剧情是这样的?

 % of Y
    ^
  1 |
0.8 |             ---
0.6 |             | |
0.4 |       ---   | |
0.2 | ---   | |   | |
  0 +-|-|---|-|---|-|---> X
      1-10 11-20 21-30

另外,我只是不知道is/is这种可视化问题有什么具体的术语,但它一定是一种常用的可视化技术。我也没有想到,也没有找到更简洁的方式来表达上述需求。有人也可以帮我找到更好的方法来描述这个问题吗?

如果您有一个具有固定分箱(如出生国家/地区)的变量,您可以使用条形图。酒吧之间应该有空间。如果您有一个变量可以在一个范围内取许多可能的值,例如年龄,您需要一个直方图。直方图将 bin 紧挨着放置,以提供视觉线索,表明 bin 可以使用不同的范围来完成。

如果您刚刚开始学习统计和可视化,请查看 https://www.openintro.org/。他们为高中生和大学生提供了极好的材料(具有扎实的 R 和 SAS 指南)。

这个问题的不寻常之处在于,与典型的直方图不同,y 轴表示第二个二元变量值之一的比例。本质上,它是部分双向 table.

的百分比的图形表示

例如,我们可以使用 table 计算 V 型和直列发动机(vs 变量)的频率,如问题评论中所述。

mtcars$mpg_group <- cut(mtcars$mpg, c(10, 20, 30, 40))
table(mtcars$vs,mtcars$mpg_group)
> table(mtcars$vs,mtcars$mpg_group)
   
    (10,20] (20,30] (30,40]
  0      15       3       0
  1       3       7       4

为了将其转换为条形图,我们需要操纵数据来计算比例。有三种不同的比例计算方法,包括:

  1. 作为输入数据中观测值总数的一部分,
  2. V 型发动机汽车总数的一小部分,或
  3. 占 MPG 范围内汽车总数的一小部分。

首先我们将计算 V 引擎的比例,其中分母是数据框中的所有汽车。

df <- as.data.frame(table(mtcars$vs,mtcars$mpg_group))
names(df) <- c("vs","mpg_group","count") # V engines
df$proportion <- df$count / sum(df$count)
plot_df <- df[as.numeric(df$vs)==1,]

此时,plot_df 包含上面打印的 table 中对应于 V 引擎的行。我们现在可以使用 barplot() 打印图表,其中 y 轴表示具有 V 形引擎的 mpg_group 的比例。

barplot(proportion ~ mpg_group,data = plot_df,ylim=c(0,1),
        main="mtcars: Cars with V Engines by MPG range")

...以及输出:

要打印一个条形图,其中百分比的分母是配备 V 型发动机的汽车总数,我们调整代码如下。

df <- as.data.frame(table(mtcars$vs,mtcars$mpg_group))
names(df) <- c("vs","mpg_group","count") # V engines
plot_df <- df[as.numeric(df$vs)==1,]
plot_df$proportion <- plot_df$count / sum(plot_df$count)
barplot(proportion ~ mpg_group,data = plot_df,ylim=c(0,1),
        main="mtcars: Cars with V Engines by MPG range")

...以及输出:

最后,根据 MPG 范围内的汽车数量计算比例有点复杂,但可以结合使用 aggregate() 和 `merge()。

df <- as.data.frame(table(mtcars$vs,mtcars$mpg_group))
names(df) <- c("vs","mpg_group","count") # V engines
totals <- aggregate(count ~ mpg_group,data = df,FUN="sum")
names(totals)[2] <- "total"
plot_df <- merge(df,totals)
plot_df <- plot_df[as.numeric(df$vs)==1,]
plot_df$proportion <- plot_df$count / plot_df$total
barplot(proportion ~ mpg_group,data = plot_df,ylim=c(0,1),
        main="mtcars: V Engine cars within MPG range")

...以及输出:

解读情节

第一个图表可以解释如下:46% 的汽车的 MPG 在 10 到 20 之间,并且采用 V 型发动机。

第二张图表可以解释为:在18辆V型发动机的汽车中,83%的汽车MPG在10到20之间。

第三张图表可以解读为:MPG在10到20之间的18辆汽车中,83%的车是V型发动机。