¿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?
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ónfacet_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.