并排条形图与列按比例分组(相对频率条形图)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并排条形图与列按比例分组(相对频率条形图)相关的知识,希望对你有一定的参考价值。

数据集

gender <- c('Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Female', 'Female', 'Male', 'Female', 'Female', 'Male', 'Female', 'Female')
answer <- c('Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'No', 'No', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes')
df <- data.frame(gender, answer)

偏向于女性:

df %>% ggplot(aes(gender, fill = gender)) + geom_bar()

enter image description here

我的任务是建立一个图表,可以很容易地找出哪两个性别更有可能说'Yes'

但是,鉴于偏见,我不能这样做

df %>% ggplot(aes(x = answer, fill = gender)) + geom_bar(position = 'dodge')

enter image description here

甚至

df %>% ggplot(aes(x = answer, y = ..count../sum(..count..), fill = gender)) +
geom_bar(position = 'dodge')

enter image description here

为了减轻偏差,我需要将每个计数除以男性或女性的总数,以便'Female'条加起来1以及'Male'。像这样:

df.total <- df %>% count(gender)
male.total <- (df.total %>% filter(gender == 'Male'))$n
female.total <- (df.total %>% filter(gender == 'Female'))$n

df %>% count(answer, gender) %>% 
mutate(freq = n/if_else(gender == 'Male', male.total, female.total)) %>% 
ggplot(aes(x = answer, y = freq, fill = gender)) + 
geom_bar(stat="identity", position = 'dodge')

enter image description here

这画出了完全不同的画面。

问题:

  1. 有没有办法只使用dplyrggplot2简化前一段代码?
  2. 还有其他库可以更好地解决这个问题吗?
  3. 上述类型的图表是否具有传统名称?

谢谢。

答案

问题1:

df %>%  
  count(gender, answer) %>% 
  group_by(gender) %>% 
  mutate(freq = n/sum(n)) %>% 
  ggplot(aes(x = answer, y = freq, fill = gender)) + 
  geom_bar(stat="identity", position = 'dodge')

问题2:

您可以使用其他包以更少的行进行此操作。

问题3:

相对频率条形图。

另一答案

根据数据,确定男性或女性是否更有可能对所提问题回答“是”的最有效方法是将数据转换为二元变量并运行比例差异测试。

gender <- c('Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Female', 'Female', 'Male', 'Female', 'Female', 'Male', 'Female', 'Female')
answer <- c('Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'No', 'No', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes')
isYes <- ifelse(answer=="Yes",1,0)

t.test(isYes ~ gender)

......和输出:

> t.test(isYes ~ gender)

    Welch Two Sample t-test

data:  isYes by gender
t = -0.34659, df = 14.749, p-value = 0.7338
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.5965761  0.4299094
sample estimates:
mean in group Female   mean in group Male 
           0.4166667            0.5000000 

t.test()输出提供与加权频率图相同的yes百分比,但是来自检验统计量的p值表明我们应该接受零假设,即男性和女性在回答yes问题的可能性方面没有差异问。

解释t.test()输出的另一种方法是,由于0在均值差的95%置信区间内,我们不能拒绝两个群的均值相等的零假设。

另一答案

position = "fill"中的geom_bar可用于查看相对比例:

library(ggplot2)

df <- data.frame(gender = c("Male", "Male", "Male", "Female", "Female", "Female", "Male", "Male", "Male", "Female", "Female", "Female", "Female", "Female", "Male", "Female", "Female", "Male", "Female", "Female"), 
                 answer = c("Yes", "No", "Yes", "Yes", "No", "No", "No", "No", "No", "No", "No", "Yes", "No", "No", "Yes", "Yes", "Yes", "Yes", "No", "Yes"),
                 stringsAsFactors = FALSE)

ggplot(df, aes(gender, fill = answer)) + geom_bar(position = 'fill')

proportion plot

以上是关于并排条形图与列按比例分组(相对频率条形图)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 geom_text 在堆叠条形图的比例尺上添加频率或数字?

Pandas 并排堆积条形图

R语言ggplot2可视化因子分组并排条形图柱状图可视化添加误差条:barplot with several variables side by side grouped by a factor

折线图+不同频率的分组条形图[重复]

第二章 描述性统计

R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签