Gráfico para la relación entre dos variables ordinales

46

¿Cuál es un gráfico apropiado para ilustrar la relación entre dos variables ordinales?

Algunas opciones que se me ocurren:

  1. Diagrama de dispersión con jitter aleatorio agregado para detener los puntos que se esconden entre sí. Aparentemente un gráfico estándar: Minitab llama a esto un "gráfico de valores individuales". En mi opinión, puede ser engañoso, ya que visualmente fomenta una especie de interpolación lineal entre niveles ordinales, como si los datos fueran de una escala de intervalos.
  2. Diagrama de dispersión adaptado para que el tamaño (área) del punto represente la frecuencia de esa combinación de niveles, en lugar de dibujar un punto para cada unidad de muestreo. De vez en cuando he visto tales tramas en la práctica. Pueden ser difíciles de leer, pero los puntos se encuentran en un enrejado regularmente espaciado que de alguna manera supera las críticas al diagrama de dispersión nervioso que visualmente "interviene" los datos.
  3. Particularmente si una de las variables se trata como dependiente, una gráfica de caja agrupada por los niveles de la variable independiente. Es probable que se vea terrible si el número de niveles de la variable dependiente no es lo suficientemente alto (muy "plano" con bigotes faltantes o incluso cuartiles colapsados ​​que hacen imposible la identificación visual de la mediana), pero al menos llama la atención sobre la mediana y los cuartiles que son estadísticas descriptivas relevantes para una variable ordinal.
  4. Tabla de valores o cuadrícula de celdas en blanco con mapa de calor para indicar la frecuencia. Visualmente diferente pero conceptualmente similar al diagrama de dispersión con área de puntos que muestra la frecuencia.

¿Hay otras ideas o pensamientos sobre qué parcelas son preferibles? ¿Existe algún campo de investigación en el que ciertas parcelas ordinales vs ordinales se consideren estándar? (Parece recordar que el mapa de calor de frecuencia está muy extendido en la genómica, pero sospecho que es más frecuente para nominal-vs-nominal.) Las sugerencias para una buena referencia estándar también serían muy bienvenidas, supongo que algo de Agresti.

Si alguien quiere ilustrar con un gráfico, sigue el código R para datos de muestra falsos.

"¿Qué tan importante es el ejercicio para ti?" 1 = nada importante, 2 = algo sin importancia, 3 = ni importante ni sin importancia, 4 = algo importante, 5 = muy importante.

"¿Con qué frecuencia toma una carrera de 10 minutos o más?" 1 = nunca, 2 = menos de una vez por quincena, 3 = una vez cada una o dos semanas, 4 = dos o tres veces por semana, 5 = cuatro o más veces por semana.

Si fuera natural tratar "a menudo" como una variable dependiente y "importancia" como una variable independiente, si una gráfica distingue entre las dos.

importance <- rep(1:5, times = c(30, 42, 75, 93, 60))
often <- c(rep(1:5, times = c(15, 07, 04, 03, 01)), #n=30, importance 1
           rep(1:5, times = c(10, 14, 12, 03, 03)), #n=42, importance 2
           rep(1:5, times = c(12, 23, 20, 13, 07)), #n=75, importance 3
           rep(1:5, times = c(16, 14, 20, 30, 13)), #n=93, importance 4
           rep(1:5, times = c(12, 06, 11, 17, 14))) #n=60, importance 5
running.df <- data.frame(importance, often)
cor.test(often, importance, method = "kendall") #positive concordance
plot(running.df) #currently useless

Una pregunta relacionada para variables continuas que encontré útil, tal vez un punto de partida útil: ¿Cuáles son las alternativas a los diagramas de dispersión cuando se estudia la relación entre dos variables numéricas?

Silverfish
fuente
1
¿Qué pasa con una trama espinal?
Dimitriy V. Masterov
Una pregunta relacionada para mostrar datos ordinales univariados en varios grupos también puede ser relevante: Mostrar datos ordinales - Medias, medianas y rangos medios
Silverfish

Respuestas:

15

Un diagrama de espina dorsal (diagrama de mosaico) funciona bien para los datos de ejemplo aquí, pero puede ser difícil de leer o interpretar si algunas combinaciones de categorías son raras o no existen. Naturalmente, es razonable, y esperado, que una baja frecuencia esté representada por un pequeño mosaico, y cero por ningún mosaico, pero la dificultad psicológica puede permanecer. También es natural que las personas aficionadas a las tramas espinales elijan ejemplos que funcionen bien para sus trabajos o presentaciones, pero a menudo he producido ejemplos que eran demasiado desordenados para usar en público. Por el contrario, una gráfica de columna utiliza bien el espacio disponible.

Algunas implementaciones presuponen gráficos interactivos, de modo que el usuario pueda interrogar cada mosaico para obtener más información al respecto.

Una alternativa que también puede funcionar bastante bien es un gráfico de barras bidireccional (existen muchos otros nombres).

Ver por ejemplo tabploten http://www.surveydesign.com.au/tipsusergraphs.html

Para estos datos, una posible trama (producida usando tabplotStata, pero debería ser fácil en cualquier software decente) es

ingrese la descripción de la imagen aquí

El formato significa que es fácil relacionar barras individuales con identificadores de fila y columna y que puede anotar con frecuencias, proporciones o porcentajes (no lo haga si cree que el resultado está demasiado ocupado, naturalmente).

Algunas posibilidades:

  1. Si se puede pensar que una variable es una respuesta a otra como predictor, entonces vale la pena pensar en trazarla en el eje vertical como de costumbre. Aquí pienso en la "importancia" como la medición de una actitud, la pregunta es si afecta el comportamiento ("a menudo"). El problema causal es a menudo más complicado incluso para estos datos imaginarios, pero el punto sigue siendo.

  2. La sugerencia n. ° 1 siempre debe ser inventada si lo contrario funciona mejor, es decir, es más fácil pensar e interpretar.

  3. El desglose porcentual o de probabilidad a menudo tiene sentido. Una trama de frecuencias sin procesar también puede ser útil. (Naturalmente, este argumento carece de la virtud de los mosaicos de mostrar ambos tipos de información a la vez).

  4. Por supuesto, puede probar las alternativas (mucho más comunes) de gráficos de barras agrupadas o gráficos de barras apiladas (o los gráficos de puntos agrupados bastante poco comunes en el sentido de WS Cleveland). En este caso, no creo que funcionen tan bien, pero a veces funcionan mejor.

  5. Algunos pueden querer colorear diferentes categorías de respuesta de manera diferente. No tengo objeciones, y si lo desea, no tomaría las objeciones en serio de ninguna manera.

La estrategia de hibridar el gráfico y la tabla puede ser útil de manera más general o, de hecho, no es lo que desea en absoluto. Un argumento repetido a menudo es que la separación de Figuras y Tablas fue solo un efecto secundario de la invención de la imprenta y la división del trabajo que produjo; es una vez más innecesario, como lo fue para los escritores de manuscritos que ponen ilustraciones exactamente cómo y dónde les gustó.

Nick Cox
fuente
Gracias por agregar el gráfico. Esto plantea el problema de cómo se combinan los gráficos y los datos textuales: sé que a algunas personas no les gusta poner números en la parte superior de las barras (porque hace que las barras parezcan más altas de lo que realmente son; no tengo una cita a mano para esto pero creo que es una opinión bien conocida).
Silverfish
Por otro lado, arreglar la posición de los números parece crear uno de dos problemas: o los números pueden terminar superpuestos en las barras, lo que los oscurece, o arreglar los números sobre las barras puede "desconectarlos" de las barras inferiores. en particular. ¿Hay una buena discusión sobre estos temas en alguna parte?
Silverfish
No creo que necesites una referencia; Es una actitud común. Veo otras variantes: (1) sugerencias específicas de la pantalla de que la pantalla está demasiado ocupada, desordenada, etc. (2) una apelación a la noción de que el texto numérico es redundante porque la misma información es implícita (o de acuerdo con alguna información explícita ) en el gráfico de cualquier manera (3) una actitud de "los niños visten de azul y las niñas visten de rosa" de que las Figuras son figuras y las Tablas son tablas, y nunca los dos se encontrarán. (3) me parece un prejuicio puro; (2) es correcto en principio, pero sin embargo los números pueden ayudar; (1) tiene que ser pensado a través de ejemplo por ejemplo.
Nick Cox
No conozco discusiones sobre las compensaciones específicas. Dejar barras sin colorear para que se puedan poner números dentro de ellas suele ser una buena idea. A veces las barras pueden ser demasiado pequeñas para que esto se haga siempre.
Nick Cox
30

Aquí hay un intento rápido de un mapa de calor , he usado bordes de celdas negras para dividir las celdas, pero tal vez las fichas deberían separarse más como en la respuesta de Glen_b.

Mapa de calor

library(ggplot2)
runningcounts.df <- as.data.frame(table(importance, often))
ggplot(runningcounts.df, aes(importance, often)) +
   geom_tile(aes(fill = Freq), colour = "black") +
   scale_fill_gradient(low = "white", high = "steelblue")

Aquí hay un diagrama de fluctuación basado en un comentario anterior de Andy W. Como él los describe "son básicamente diagramas de dispersión agrupados para datos categóricos, y el tamaño de un punto se asigna al número de observaciones que caen dentro de ese contenedor". Para una referencia ver

Wickham, Hadley y Heike Hofmann. 2011. Parcelas de productos . Transacciones IEEE sobre visualización y gráficos por computadora (Proc. Infovis `11) . PDF preimpreso

diagrama de fluctuación

theme_nogrid <- function (base_size = 12, base_family = "") {
  theme_bw(base_size = base_size, base_family = base_family) %+replace% 
    theme(panel.grid = element_blank())   
}

ggplot(runningcounts.df, aes(importance, often)) +
  geom_point(aes(size = Freq, color = Freq, stat = "identity", position = "identity"), shape = 15) +
  scale_size_continuous(range = c(3,15)) + 
  scale_color_gradient(low = "white", high = "black") +
  theme_nogrid()
Silverfish
fuente
1
" quizás las fichas deberían separarse más como en la respuesta de Glen_b ". No estoy seguro de que sea necesario en este caso, hay mucha menos tentación de ver las categorías como continuas aquí.
Glen_b
18

Aquí hay un ejemplo de cómo se vería una gráfica de columna vertebral de los datos. Hice esto en Stata con bastante rapidez, pero no hay una aplicación R . Creo que en R debería ser solo:

spineplot(factor(often)~factor(importance))

El diagrama de espinas en realidad parece ser el predeterminado si le da a R variables categóricas:

plot(factor(often)~factor(importance))

El desglose fraccional de las categorías de a menudo se muestra para cada categoría de importancia. Las barras apiladas se dibujan con una dimensión vertical que muestra una fracción de la categoría de importancia dada a menudo. La dimensión horizontal muestra la fracción en cada categoría de importancia. Por lo tanto, las áreas de mosaicos formados representan las frecuencias, o más generalmente totales, para cada combinación cruzada de importancia y frecuencia.

ingrese la descripción de la imagen aquí

Dimitriy V. Masterov
fuente
1
Lo cambié todo.
Dimitriy V. Masterov
1
Citando a Nick Cox (el autor de la trama espinal de Stata): La restricción a dos variables es más aparente que real. Las variables compuestas se pueden crear mediante la combinación cruzada de dos o más variables categóricas ... Una variable de respuesta generalmente se muestra mejor en el eje y. Si una variable es binaria, a menudo es mejor trazarla en el eje y. Naturalmente, puede haber cierta tensión entre estas sugerencias.
Dimitriy V. Masterov
3
Estoy de acuerdo con lo anterior. Pero el esquema colo [u] r predeterminado de Stata es bastante pésimo para las variables ordinales. Varias buenas alternativas son diferentes tonos de rojo y / o azul, o simplemente opciones de escala gr {a | e}.
Nick Cox
3
@Dimitriy ¡Me resulta muy extraño usar una mezcla arbitraria de colores en la misma situación! No implico ni infiero nada por o de los colores exactos, por cuantificados que sean. Pero el punto es solo que una escala graduada coincide bien con una secuencia graduada de colores. También existe cierta arbitrariedad en la coloración de los mapas de calor, y de hecho en muchos tipos de cartografía temática.
Nick Cox
2
No veo el problema con un esquema de color graduado siempre que los colores sean distintos. ¿Por qué alguien estaría tentado a interpolar? No puedo ver una lógica de colores arbitrarios. Las secuencias del arco iris tienen sentido en física, pero no en términos de cómo las personas perciben los colores (por ejemplo, el amarillo y el rojo son demasiado diferentes). Tengo evidencia en términos de hablar a muchos estudiantes a través de elecciones, y diría que el 80% dice sinceramente "Eso es mucho mejor" cuando ven una secuencia sutil y gradual sobre arcoiris o ensalada de frutas. Azul a azul pálido a través de rojo pálido a rojo funciona bien. Asegúrate de probar esto tanto en mujeres como en hombres.
Nick Cox
13

La forma en que lo hice es un poco difícil, pero podría solucionarse con bastante facilidad.

Esta es una versión modificada del enfoque de fluctuación.

Quitar los ejes reduce la tentación de interpretar la escala como continua; dibujar cuadros alrededor de las combinaciones nerviosas enfatiza que hay algo así como un "salto de escala": que los intervalos no son necesariamente iguales

Idealmente, las etiquetas 1..5 deberían reemplazarse con los nombres de las categorías, pero lo dejaré para la imaginación por ahora; Creo que transmite el sentido de ello.

 plot(jitter(often)~jitter(importance),data=running.df,bty="n",
    ylim=c(0.5,5.5),xlim=c(0.5,5.5),cex=0.5,pty="s",xaxt="n",yaxt="n") 
 axis(1,tick=TRUE,col=0)
 axis(2,tick=TRUE,col=0)
 rect(rep(seq(0.75,4.75,1),5),rep(seq(0.75,4.75,1),each=5),
       rep(seq(1.25,5.25,1),5),rep(seq(1.25,5.25,1),each=5),
       border=8)

trama ordinal-ordinal nerviosa


Posibles mejoras:

i) hacer los descansos más pequeños (prefiero los descansos más grandes que esto, personalmente), y

ii) intentar utilizar una secuencia cuasialeatoria para reducir la incidencia del patrón aparente dentro de los cuadros. Si bien mi intento ayudó un poco, puede ver que en las celdas con un menor número de puntos todavía hay subsecuencias con un aspecto más o menos correlacionado (por ejemplo, el cuadro en la fila superior, segunda columna). Para evitar eso, la secuencia cuasialeatoria podría tener que inicializarse para cada subcuadro. (Una alternativa podría ser el muestreo de hipercubos latinos). Una vez que se solucionó, esto se pudo insertar en una función que funciona exactamente como la fluctuación de fase.

jitter cuasialeatorio y cajas más grandes

library("fOptions")

 hjit <- runif.halton(dim(running.df)[1],2) 
 xjit <- (hjit[,1]-.5)*0.8
 yjit <- (hjit[,2]-.5)*0.8  

 plot(I(often+yjit)~I(importance+xjit),data=running.df,bty="n",
    ylim=c(0.5,5.5),xlim=c(0.5,5.5),cex=0.5,pty="s",xaxt="n",yaxt="n") 
 axis(1,tick=TRUE,col=0)
 axis(2,tick=TRUE,col=0)
 rect(rep(seq(0.55,4.55,1),5),rep(seq(0.55,4.55,1),each=5),
       rep(seq(1.45,5.45,1),5),rep(seq(1.45,5.45,1),each=5),
       border=8)
Glen_b
fuente
1
¡Me gusta esto, para mí la separación realmente enfatiza la naturaleza ordinal de los datos! Desafortunadamente, el ojo humano se siente atraído naturalmente por los patrones aparentes en la fluctuación, por ejemplo, las "tendencias al alza" en los paneles (4,5) y (5,3). En el lado positivo, "contar los puntos" me parece mucho más natural que juzgar la frecuencia por el tamaño del punto. ¿Existen variantes en las que los puntos están espaciados de manera uniforme, o agrupados en patrones regulares en los centros, para evitar distraer las "tendencias de jitter"?
Silverfish
1
@Silverfish, un concepto similar en geografía son los mapas de densidad de puntos. Los geógrafos han encontrado alguna evidencia de que los patrones regulares o los patrones que llenan una cierta cantidad de espacio en blanco (por lo que están más separados que al azar) tienden a producir percepciones más precisas entre los observadores.
Andy W
OMI, esta es una buena idea, pero el espacio entre los paneles es tan grande en este ejemplo que hace que la visualización de cualquier tendencia sea muy difícil. La cura es peor que la enfermedad (pero debería ser bastante fácil hacer que los paneles estén mucho más juntos).
Andy W
1
La fluctuación cuasialeatoria de @silverfish sería una posible solución a eso. Tu preocupación es una que tuve yo mismo.
Glen_b
1
¡Muy agradable! En mi opinión, esta es una mejor opción que la trama de la columna vertebral en este caso (las gráficas de la columna vertebral o del mosaico son mejores para evaluar las distribuciones condicionales para cualquier par de categorías; esta gráfica de puntos con jitter es más fácil de evaluar las tendencias, aprovechando la naturaleza ordinal de los datos y asumiendo algunos tipo de relación monotónica).
Andy W
7

Usando el paquete R riverplot:

  data$importance <- factor(data$importance, 
                            labels = c("not at all important",
                                       "somewhat unimportant",
                                       "neither important nor unimportant",
                                       "somewhat important",
                                       "very important"))
  data$often <- factor(data$often, 
                       labels = c("never",
                                  "less than once per fortnight",
                                  "once every one or two weeks",
                                  "two or three times per week",
                                  "four or more times per week"))

  makeRivPlot <- function(data, var1, var2, ...) {

    require(plyr)
    require(riverplot)
    require(RColorBrewer)

    names1 <- levels(data[, var1])
    names2 <- levels(data[, var2])

    var1 <- as.numeric(data[, var1])
    var2 <- as.numeric(data[, var2])

    edges <- data.frame(var1, var2 + max(var1, na.rm = T))
    edges <- count(edges)

    colnames(edges) <- c("N1", "N2", "Value")

    nodes <- data.frame(ID     = c(1:(max(var1, na.rm = T) +
                                      max(var2, na.rm = T))),
                        x      = c(rep(1, times = max(var1, na.rm = T)),
                                   rep(2, times = max(var2, na.rm = T))),
                        labels = c(names1, names2) ,
                        col    = c(brewer.pal(max(var1, na.rm = T), "Set1"),
                                   brewer.pal(max(var2, na.rm = T), "Set1")),
                        stringsAsFactors = FALSE)

    nodes$col <- paste(nodes$col, 95, sep = "")

    return(makeRiver(nodes, edges))

  }

a <- makeRivPlot(data, "importance", "often")

riverplot(a, srt = 45)

ingrese la descripción de la imagen aquí

DL Dahly
fuente
1
(+1) ¡Me gusta la idea de usar coordenadas paralelas para esto! Creo que sería más fácil trazar las rutas a través del diagrama y ver cómo se descomponen las respuestas "a menudo", si los colores fluyen de izquierda a derecha (un esquema que efectivamente se mostraría "a menudo" como la variable dependiente y " importancia "como la variable explicativa). En algunas implementaciones interactivas de tales gráficos, puede hacer clic en un eje para colorear por esa variable, lo cual es útil.
Silverfish
1
A modo de comparación, la visualización de "conjuntos paralelos" de Robert Kosara , que está diseñada para datos categóricos, tiene los colores que fluyen a través del diagrama.
Silverfish
6

Una idea diferente que no pensé originalmente era una trama de tamiz .

ingrese la descripción de la imagen aquí

El tamaño de cada mosaico es proporcional a la frecuencia esperada; Los pequeños cuadrados dentro de los rectángulos representan frecuencias reales. Por lo tanto, una mayor densidad de los cuadrados indica una frecuencia superior a la esperada (y está sombreada en azul); La menor densidad de cuadrados (rojo) es para una frecuencia inferior a la esperada.

Creo que preferiría que el color representara el tamaño, no solo el signo, del residuo. Esto es particularmente cierto para los casos de borde donde las frecuencias esperadas y observadas son similares y el residual es cercano a cero; un esquema dicotómico rojo / azul parece enfatizar demasiado las pequeñas desviaciones.

Implementación en R:

library(vcd)
runningcounts.df <- as.data.frame(table(importance, often))
sieve(Freq ~ often + importance, data=runningcounts.df, shade= TRUE)
Lepisma
fuente
1
Con respecto a su preferencia de que el color represente el tamaño y el signo, una posibilidad es hacer que los colores sean más grises cuando la diferencia con la esperada es relativamente pequeña.
Glen_b
6

Un gráfico de barras facetadas en R. Muestra la distribución de "a menudo" en cada nivel de "importancia" muy claramente. Pero no hubiera funcionado tan bien si la cuenta máxima hubiera variado más entre niveles de "importancia"; es bastante fácil de configurar scales="free_y"en ggplot ( ver aquí ) para evitar mucho espacio vacío, pero la forma de la distribución sería difícil de discernir a niveles de "importancia" de baja frecuencia ya que las barras serían muy pequeñas. Quizás en esas situaciones es mejor usar la frecuencia relativa (probabilidad condicional) en el eje vertical.

gráfico de barras facetadas

No es tan "limpio" como el diagrama de tabulación en Stata al que Nick Cox se vinculó, pero transmite información similar.

Código R:

library(ggplot)
running2.df <- data.frame(often = factor(often, labels = c("never", "less than once per fortnight", "once every one or two weeks", "two or three times per week", "four or more times per week")), importance = factor(importance, labels = c("not at all important", "somewhat unimportant", "neither important nor unimportant", "somewhat important", "very important")))
ggplot(running2.df, aes(often)) + geom_bar() +
  facet_wrap(~ importance, ncol = 1) +
  theme(axis.text.x=element_text(angle = -45, hjust = 0)) +
  theme(axis.title.x = element_blank())
Lepisma
fuente