es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo representar gráficamente los porcentajes para preguntas de respuesta múltiple?

Estoy intentando analizar una encuesta en la que se permiten múltiples respuestas para el mismo encuestado. El objetivo es determinar el número de participantes dentro de cada clase que dieron cada una de las 3 posibles respuestas, para representarlo en un gráfico de barras.

Por ejemplo, si mi marco de datos df se ve así:

ID q1 q2 q3 class
001 gato perro NA A
002 gato NA pájaro A
003 NA perro pájaro A
004 NA perro NA B
005 gato perro NA B
006 NA perro pájaro B
007 gato perro pájaro C
008 NA perro NA C

Me gustaría determinar el porcentaje de encuestados en la clase A, B y C, respectivamente, que dieron cada respuesta. Mi respuesta esperada se ve así:

clase q perc
A gato 0.67
A perro 0.67
A pájaro 0.67
B gato 0.33
B perro 1.00
B pájaro 0.33
C gato 0.50
C perro 1.00
C pájaro 0.50

Me gustaría mantener mi respuesta como un marco de datos, ya que me gustaría usar el paquete ggplot2 para combinar mis frecuencias resultantes con otras variables que tengo (como la variable cls en el marco de datos anterior).

En este momento solo puedo determinar las frecuencias sin procesar, ya que siempre que intento representar los porcentajes, obtengo el porcentaje con respecto al número total de respuestas por categoría. Por ejemplo, para la categoría A, obtengo lo siguiente:

clase q perc
A gato 0.33
A perro 0.33
A pájaro 0.33

Esto es lo que he intentado:

library(tidyr)
library(ggplot2)

idno <- 1:8
q1 <- c('gato','gato',NA, NA, 'gato',NA,'gato',NA)
q2 <- c('perro',NA,'perro','perro','perro','perro','perro','perro')
q3 <- c(NA,'pájaro','pájaro',NA,NA,'pájaro','pájaro',NA)
cls <- c('A','A','A','B','B','B','C','C')

df <- data.frame(idno,q1,q2,q3,cls)

df1 <- gather(df,"animal","ans",2:4)
ggplot(df1[!is.na(df1$ans),], aes(x=ans, group=cls)) + geom_bar(aes(y=..prop..,fill=cls),position='dodge')

¿Hay alguna forma en la que pueda dividir la frecuencia para cada subcategoría no por el número de respuestas sino por el número de encuestados en esa categoría?

Gráfico actual

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes calcular el porcentaje de cada respuesta por clase dividiendo el conteo de cada respuesta por el conteo de los encuestados en cada clase. Así es como puedes hacerlo:

    “`{r}
    library(dplyr)
    library(tidyr)
    library(ggplot2)

    df %>%
    gather(key = “q”, value = “ans”, q1:q3) %>% # remodelar los datos
    group_by(class, q, ans) %>% # agrupar por clase, pregunta y respuesta
    summarize(n = n_distinct(ID)) %>% # contar el número de encuestados distintos por clase, pregunta y respuesta
    group_by(class, q) %>% # agrupar por clase y pregunta
    mutate(perc = n/sum(n)) %>% # calcular el porcentaje de encuestados para cada respuesta en esa clase
    ggplot(aes(x = ans, y = perc, fill = class)) + # graficar el gráfico
    geom_col(position = “dodge”) +
    facet_wrap(~q, ncol = 1, scales = “free_y”) # dividir el gráfico para mostrar cada pregunta por separado
    “`
    El gráfico resultante debería mostrar el porcentaje de encuestados en cada clase que seleccionaron cada respuesta para cada pregunta por separado.

    Ten en cuenta que agregué scales = "free_y" a la función facet_wrap() para permitir que el eje y se ajuste de manera independiente para cada pregunta, ya que la escala de porcentaje puede variar entre preguntas.

Comments are closed.