58 votos

Gráfico de relación entre dos variables ordinales

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

Se me ocurren algunas opciones:

  1. Gráfico de dispersión con una fluctuación aleatoria añadida para evitar que los puntos se oculten entre sí. Aparentemente es un gráfico estándar - Minitab lo llama "gráfico de valores individuales". En mi opinión, puede ser engañoso, ya que fomenta visualmente una especie de interpolación lineal entre los niveles ordinales, como si los datos fueran de una escala de intervalo.
  2. Gráfico 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. A veces he visto este tipo de gráficos en la práctica. Pueden ser difíciles de leer, pero los puntos se sitúan en un entramado de espacios regulares, lo que supera en cierto modo la crítica al gráfico de dispersión con saltos, ya que visualmente "intervaliza" los datos.
  3. En particular, si una de las variables se trata como dependiente, un gráfico de caja agrupado por los niveles de la variable independiente. Es probable que tenga un aspecto terrible si el número de niveles de la variable dependiente no es lo suficientemente alto (muy "plano" con los bigotes ausentes o, peor aún, 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 gráfico de dispersión con área de puntos que muestra la frecuencia.

¿Existen otras ideas o pensamientos sobre qué gráficos son preferibles? ¿Hay algún campo de investigación en el que ciertos gráficos ordinales-vs-ordinales se consideren estándar? (Me parece recordar que los mapas de calor de frecuencias están muy extendidos en la genómica, pero sospecho que se trata más bien de nominal-vs-nominal). También serían muy bienvenidas las sugerencias de una buena referencia estándar, supongo que algo de Agresti.

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

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

"¿Con qué regularidad hace 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 sería natural tratar "a menudo" como una variable dependiente y "importancia" como una variable independiente, si una trama 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 con las variables continuas que encontré útil, tal vez un punto de partida útil: ¿Cuáles son las alternativas a los gráficos de dispersión cuando se estudia la relación entre dos variables numéricas?

1 votos

¿Y qué hay de un spineplot?

0 votos

Una pregunta relacionada para mostrar univariante Los datos ordinales entre varios grupos también pueden ser relevantes: Visualización de datos ordinales: medias, medianas y rangos de medias

35voto

Silverfish Puntos 6909

He aquí un rápido intento de mapa de calor He utilizado los bordes negros de las celdas para separarlas, pero tal vez habría que separar más las baldosas como en la respuesta de Glen_b.

Heatmap

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 una gráfico de fluctuación basado en un comentario anterior de Andy W. Tal y como los describe "Básicamente, son gráficos de dispersión de datos categóricos, y el tamaño de un punto se asigna al número de observaciones que caen dentro de esa bandeja". Para una referencia, véase

Wickham, Hadley y Heike Hofmann. 2011. Producto parcelas . Transacciones del IEEE sobre Visualización y gráficos por ordenador (Proc. Infovis `11) . Pre-impresión PDF

fluctuation plot

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

1 votos

" tal vez las baldosas deberían estar más separadas 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í.

0 votos

> ggplot(runningcounts.df, aes(importancia, frecuencia)) + + 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() Mensaje de advertencia: Ignorando estética desconocida: stat, position

0 votos

¿Está disponible en Stata?

20voto

Neal Puntos 316

Este es un ejemplo de lo que sería un gráfico de espinas de los datos. Hice esto en Stata bastante rápido, pero hay un Aplicación de la R . Creo que en R debería ser justo:

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

El spineplot parece ser, de hecho, el predeterminado si le das a R variables categóricas:

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

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

enter image description here

0 votos

Esto es algo que debería haber pensado, pero no lo hice. Obviamente, en un diagrama de espinazo, el sentido de las variables marca la diferencia. El IV es importance y DV es often por lo que me parece natural considerar: "en los niveles más altos de importance ¿observo mayores proporciones de unidades de muestreo en los niveles más altos de often ?" Tal vez no estoy entendiendo bien esta trama, pero ¿no sería más fácil de observar si las variables fueran al revés aquí, con importance en el eje horizontal?

1 votos

Lo he cambiado.

0 votos

Me resulta mucho más fácil de leer, gracias. ¿Estoy en lo cierto al pensar que, si hay un VD/IV identificable, entonces el VD normalmente iría en el eje horizontal? (Y si no hay un VD/IV obvio, ¿cómo se determinaría cuál va donde? Los gráficos tienen un aspecto bastante diferente y, de hecho, transmiten información sutilmente diferente, equivalente a la elección, cuando se cruzan los recuentos, de incluir el % por fila o el % por columna).

19voto

Nick Cox Puntos 22819

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

Algunas implementaciones presuponen gráficos interactivos, para que el usuario pueda interrogar a cada baldosa para saber más sobre ella.

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

Véase, por ejemplo tabplot en http://www.surveydesign.com.au/tipsusergraphs.html

Para estos datos, un posible gráfico (elaborado con tabplot en Stata, pero debería ser fácil en cualquier software decente) es

enter image description here

El formato significa que es fácil relacionar las barras individuales con los identificadores de filas y columnas y que se puede anotar con frecuencias, proporciones o porcentajes (no lo haga si cree que el resultado está demasiado cargado, naturalmente).

Algunas posibilidades:

  1. Si una variable puede pensarse como respuesta a otra como predictor, entonces vale la pena pensar en trazarla en el eje vertical como es habitual. En este caso, considero que la "importancia" mide una actitud, y la cuestión es si afecta al comportamiento ("a menudo"). La cuestión causal suele ser más complicada incluso para estos datos imaginarios, pero la cuestión sigue siendo la misma.

  2. La sugerencia nº 1 siempre debe ser superada si la inversa funciona mejor, es decir, es más fácil de pensar e interpretar.

  3. Los desgloses porcentuales o probabilísticos suelen tener sentido. También puede ser útil un gráfico de frecuencias brutas. (Naturalmente, este gráfico carece de la virtud de los gráficos de mosaico de mostrar ambos tipos de información a la vez).

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

  5. Algunos podrían querer colorear las diferentes categorías de respuesta de manera diferente. Yo no tengo ninguna objeción, y si quieren que no se tomen en serio las objeciones de cualquier manera.

La estrategia de hibridar gráfico y tabla puede ser útil de forma más general, o incluso no es lo que se quiere. Un argumento que se repite a menudo es que la separación de Figuras y Tablas fue sólo un efecto secundario de la invención de la imprenta y la división del trabajo que produjo; es una vez más innecesaria, al igual que lo fue para los escritores de manuscritos poner las ilustraciones exactamente cómo y dónde querían.

0 votos

Gracias por añadir el gráfico. 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).

0 votos

Por otro lado, fijar la posición de los números parece crear uno de estos dos problemas: o bien los números pueden acabar superpuestos a las barras, lo que las oscurece, o bien fijar los números por encima de las barras puede "desconectarlos" de las barras inferiores en particular. ¿Existe una buena discusión sobre estos temas en algún lugar?

0 votos

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 está implícita (o según algunos explícita) en el gráfico de cualquier manera (3) una actitud de "los niños van de azul y las niñas de rosa" de que las figuras son figuras y las tablas son tablas, y nunca se encontrarán. (3) me parece un puro prejuicio; (2) es correcto en principio, pero sin embargo los números pueden ayudar; (1) hay que pensarlo ejemplo a ejemplo.

17voto

AdamSane Puntos 1825

La forma en la que lo he hecho es un poco chapucera, pero podría arreglarse fácilmente.

Se trata de una versión modificada del enfoque del jittering.

Eliminar los ejes reduce la tentación de interpretar la escala como continua; dibujar recuadros alrededor de las combinaciones salpicadas enfatiza que hay algo así como una "ruptura de escala", que los intervalos no son necesariamente iguales

Lo ideal sería sustituir las etiquetas 1..5 por los nombres de las categorías, pero por ahora lo dejaré a la imaginación; creo que transmite el sentido.

 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)

jittered ordinal-ordinal plot


Posibles mejoras:

i) hacer las pausas más pequeñas (personalmente, prefiero las pausas más grandes), y

ii) intentar utilizar una secuencia cuasi aleatoria para reducir la incidencia del patrón aparente dentro de las cajas. Aunque mi intento ayudó un poco, se puede ver que en las casillas con menor número de puntos sigue habiendo subsecuencias con un aspecto más o menos correlacionado (por ejemplo, la casilla de la fila superior, 2ª columna). Para evitar eso, la secuencia cuasi-aleatoria podría tener que ser inicializada para cada subcuadro. (Una alternativa podría ser el muestreo de hipercubos latinos.) Una vez solucionado esto, se podría insertar en una función que funcione exactamente igual que el jitter.

quasi-random jitter and larger boxes

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)

1 votos

Me gusta esto, para mí la separación realmente enfatiza la naturaleza ordinal de los datos. Desgraciadamente, el ojo humano se siente atraído de forma natural por los patrones aparentes en las fluctuaciones, por ejemplo, las "tendencias ascendentes" en los paneles (4,5) y (5,3). Por otro lado, "contar los puntos" me parece mucho más natural que juzgar la frecuencia por el tamaño de los puntos. ¿Existen variantes en las que los puntos estén espaciados uniformemente, o agrupados en patrones regulares en los centros, para evitar la distracción de las "tendencias de fluctuación"?

1 votos

@Silverfish, un concepto similar en geografía son los mapas de densidad de puntos. Los geógrafos han encontrado algunas pruebas de que los patrones regulares o los patrones que llenan una cierta cantidad de espacio en blanco (por lo que están espaciados más lejos que al azar) tienden a producir percepciones más precisas entre los observadores.

0 votos

En mi opinión es una buena idea, pero el espacio entre los paneles es tan grande en este ejemplo que hace muy difícil visualizar cualquier tendencia. El remedio es peor que la enfermedad (pero debería ser bastante fácil hacer los paneles mucho más juntos).

8voto

Silverfish Puntos 6909

Un gráfico de barras facetado en R. Muestra la distribución de "a menudo" en cada nivel de "importancia" con mucha claridad. Pero no habría funcionado tan bien si el recuento máximo hubiera variado más entre los niveles de "importancia"; es bastante fácil establecer 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 en los niveles de baja frecuencia de "importancia", ya que las barras serían muy pequeñas. Quizá en esas situaciones sea mejor utilizar la frecuencia relativa (probabilidad condicional) en el eje vertical.

faceted bar chart

No es tan "limpio" como el tabulador en Stata que Nick Cox enlazó, 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())

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X