【问题标题】:Side-by-side bar chart with columns proportional by group (relative frequency bar chart)按组成比例的列并排条形图(相对频率条形图)
【发布时间】:2018-07-04 04:22:04
【问题描述】:

数据集

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()

我的任务是构建一个图表,以便轻松找出两种性别中的哪一种更有可能说'Yes'

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

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

甚至

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

为了减轻偏差,我需要将每个计数分别除以男性或女性的总数,以便 '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')

这描绘了一幅完全不同的画面。

问题

  1. 有没有办法只使用dplyrggplot2 来简化前一段代码?
  2. 还有其他库可以做得更好吗?
  3. 上述类型的图表有常规名称吗?

谢谢。

【问题讨论】:

    标签: r ggplot2 dplyr bar-chart


    【解决方案1】:

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

    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')
    

    【讨论】:

      【解决方案2】:

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

      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% 置信区间内,因此我们无法拒绝两组均值相等的原假设。

      【讨论】:

      • 感谢您的回答,尽管这个问题纯粹是关于图表的。对不起,误导性的表述。改了。
      • @ageorge - 我知道你的问题是关于图表的,但是,关于“哪个性别更有可能说是”的评论需要一个统计答案,因为没有它,图表会产生误导。也就是说,当 t 检验表明差异在统计上不显着时,图表表明男性更有可能说yes
      【解决方案3】:

      问题一:

      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:

      相对频率条形图。

      【讨论】:

        猜你喜欢
        • 2022-01-19
        • 2021-09-25
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 2019-02-01
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多