Grafico per la relazione tra due variabili ordinali


46

Qual è un grafico appropriato per illustrare la relazione tra due variabili ordinali?

Alcune opzioni che mi vengono in mente:

  1. Grafico a dispersione con jitter casuale aggiunto per fermare i punti che si nascondono l'un l'altro. Apparentemente un grafico standard - Minitab lo definisce un "diagramma di valori individuali". Secondo me può essere fuorviante in quanto incoraggia visivamente una sorta di interpolazione lineare tra livelli ordinali, come se i dati provenissero da una scala di intervallo.
  2. Grafico a dispersione adattato in modo tale che la dimensione (area) del punto rappresenti la frequenza di quella combinazione di livelli, piuttosto che disegnare un punto per ogni unità di campionamento. Di tanto in tanto ho visto trame simili in pratica. Possono essere difficili da leggere, ma i punti si trovano su un reticolo a spaziatura regolare che supera in qualche modo le critiche del diagramma a dispersione agitato che "intervista" visivamente i dati.
  3. In particolare se una delle variabili viene trattata come dipendente, un diagramma a riquadri raggruppato per i livelli della variabile indipendente. Probabilmente sembrerà terribile se il numero di livelli della variabile dipendente non è sufficientemente alto (molto "piatto" con baffi mancanti o ancora peggiori quartili crollati che rendono impossibile l'identificazione visiva della mediana), ma almeno attira l'attenzione su mediana e quartili che sono statistiche descrittive pertinenti per una variabile ordinale.
  4. Tabella dei valori o griglia vuota delle celle con mappa del calore per indicare la frequenza. Visivamente diverso ma concettualmente simile al grafico a dispersione con area del punto che mostra la frequenza.

Ci sono altre idee o pensieri su quali trame sono preferibili? Esistono campi di ricerca in cui alcuni grafici ordinali contro ordinali sono considerati standard? (Mi sembra di ricordare che la mappa di calore in frequenza sia diffusa nella genomica, ma sospetto che sia più spesso per nominale-vs-nominale.) Anche i suggerimenti per un buon riferimento standard sarebbero ben accetti, immagino che qualcosa da Agresti.

Se qualcuno vuole illustrare con un grafico, segue il codice R per i dati di esempio fasulli.

"Quanto è importante l'esercizio per te?" 1 = per niente importante, 2 = alquanto irrilevante, 3 = né importante né irrilevante, 4 = alquanto importante, 5 = molto importante.

"Con quale frequenza fai una corsa di 10 minuti o più?" 1 = mai, 2 = meno di una volta ogni due settimane, 3 = una volta ogni una o due settimane, 4 = due o tre volte alla settimana, 5 = quattro o più volte alla settimana.

Se sarebbe naturale trattare "spesso" come una variabile dipendente e "importanza" come una variabile indipendente, se un diagramma distingue tra i due.

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 domanda correlata per variabili continue che ho trovato utile, forse un utile punto di partenza: quali sono le alternative ai grafici a dispersione quando si studia la relazione tra due variabili numeriche?


1
Che ne dite di un diagramma di spina?
Dimitriy V. Masterov,

Una domanda correlata per la visualizzazione di dati ordinali univariati tra più gruppi può anche essere rilevante: Visualizzazione di dati ordinali - Mezzi, mediane e ranghi medi
Pesce d'argento

Risposte:


15

Un diagramma a colonna (diagramma a mosaico) funziona bene per i dati di esempio qui, ma può essere difficile da leggere o interpretare se alcune combinazioni di categorie sono rare o non esistono. Naturalmente è ragionevole, e prevedibile, che una bassa frequenza sia rappresentata da una piccola tessera e zero da nessuna tessera, ma la difficoltà psicologica può rimanere. È anche naturale che le persone appassionate di grafici a colonna scelgano esempi che funzionano bene per i loro documenti o presentazioni, ma ho spesso prodotto esempi che erano troppo disordinati per essere usati in pubblico. Al contrario, un diagramma a colonna utilizza bene lo spazio disponibile.

Alcune implementazioni presuppongono una grafica interattiva, in modo che l'utente possa interrogare ogni riquadro per saperne di più.

Un'alternativa che può anche funzionare abbastanza bene è un grafico a barre a due vie (esistono molti altri nomi).

Vedere ad esempio tabplotin http://www.surveydesign.com.au/tipsusergraphs.html

Per questi dati, una possibile trama (prodotta utilizzando tabplotin Stata, ma dovrebbe essere facile in qualsiasi software decente) è

inserisci qui la descrizione dell'immagine

Il formato significa che è facile mettere in relazione singole barre con identificatori di riga e colonna e che puoi annotare con frequenze, proporzioni o percentuali (non farlo se pensi che il risultato sia troppo occupato, naturalmente).

Alcune possibilità:

  1. Se una variabile può essere considerata una risposta ad un'altra come predittore, allora vale la pena pensare di tracciarla sull'asse verticale come al solito. Qui penso a "importanza" come a misurare un atteggiamento, la domanda quindi è se influisce sul comportamento ("spesso"). Il problema causale è spesso più complicato anche per questi dati immaginari, ma il punto rimane.

  2. Il suggerimento n. 1 deve essere sempre superato se il contrario funziona meglio, il che significa che è più facile pensare e interpretare.

  3. Le suddivisioni in percentuale o probabilità hanno spesso senso. Un grafico di frequenze grezze può anche essere utile. (Naturalmente, questa trama non ha la virtù delle trame a mosaico di mostrare entrambi i tipi di informazioni contemporaneamente.)

  4. Ovviamente puoi provare le alternative (molto più comuni) di grafici a barre raggruppati o grafici a barre in pila (o i grafici a punti raggruppati ancora abbastanza rari nel senso di WS Cleveland). In questo caso, non penso che funzionino altrettanto bene, ma a volte funzionano meglio.

  5. Alcuni potrebbero voler colorare in modo diverso categorie di risposta diverse. Non ho obiezioni, e se vuoi che non prenderai le obiezioni sul serio in alcun modo.

La strategia di ibridazione di grafici e tabelle può essere utile in generale, o addirittura non è ciò che si desidera affatto. Un argomento spesso ripetuto è che la separazione di figure e tabelle era solo un effetto collaterale dell'invenzione della stampa e della divisione del lavoro che produceva; è ancora una volta inutile, così come lo è stato per gli scrittori di manoscritti che mettono le illustrazioni esattamente come e dove gli piacevano.


Grazie per aver aggiunto la grafica. Ciò solleva il problema di come si combinano la grafica e i dati testuali: so che ad alcune persone non piace mettere i numeri in cima alle barre (perché fa apparire le barre più alte di quanto non siano in realtà; non ho una citazione a portata di mano questo, ma penso che sia un'opinione ben nota).
Silverfish,

D'altra parte, fissare la posizione dei numeri sembra creare uno dei due problemi: o i numeri possono finire sovrapposti alle barre, il che li oscura, oppure fissare i numeri sopra le barre può "disconnetterli" dalle barre inferiori in particolare. C'è una buona discussione di questi problemi da qualche parte?
Silverfish,

Non penso che tu abbia bisogno di un riferimento; è un atteggiamento comune. Vedo altre varianti: (1) suggerimenti specifici per il display che il display è troppo occupato, disordinato, ecc. (2) un appello all'idea che il testo numerico sia ridondante perché la stessa informazione è implicita (o secondo alcuni espliciti ) nel grafico in ogni caso (3) un atteggiamento da "ragazzi indossano il blu e le ragazze indossano il rosa" secondo cui le figure sono figure e i tavoli sono tavoli e mai i due si incontreranno. (3) mi sembra puro pregiudizio; (2) è corretto in linea di principio, ma tuttavia i numeri possono essere d'aiuto; (1) deve essere considerato come un esempio.
Nick Cox,

Non conosco discussioni sugli specifici compromessi. Lasciare le barre incolore in modo che i numeri possano essere inseriti al loro interno è spesso una buona idea. A volte le barre possono essere troppo piccole per farlo sempre.
Nick Cox,

30

Ecco un rapido tentativo di una mappa di calore , ho usato i bordi delle celle nere per rompere le celle, ma forse le tessere dovrebbero essere separate più come nella risposta di Glen_b.

Mappa di calore

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

Ecco un diagramma di fluttuazione basato su un precedente commento di Andy W. Mentre li descrive "sono fondamentalmente solo diagrammi a dispersione per dati categoriali e la dimensione di un punto è mappata al numero di osservazioni che ricadono in quel cestino". Per un riferimento vedere

Wickham, Hadley e Heike Hofmann. 2011. Trame del prodotto . Transazioni IEEE su visualizzazione e computer grafica (Proc. Infovis `11) . PDF prestampato

diagramma di fluttuazione

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
" forse le tessere dovrebbero essere separate più come nella risposta di Glen_b " - Non sono sicuro che sia necessario in questo caso, c'è molta meno tentazione di vedere le categorie come continue qui.
Glen_b,

18

Ecco un esempio di come sarebbe un diagramma a colonna dei dati. Ho fatto questo in Stata abbastanza rapidamente, ma c'è un'implementazione R . Penso che in R dovrebbe essere solo:

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

La colonna vertebrale sembra effettivamente essere l'impostazione predefinita se si danno variabili R categoriche:

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

La suddivisione frazionaria delle categorie di spesso viene mostrata per ogni categoria di importanza. Le barre impilate sono disegnate con una dimensione verticale che mostra la frazione di spesso data la categoria di importanza. La dimensione orizzontale mostra la frazione in ciascuna categoria di importanza. Pertanto, le aree delle tessere formate rappresentano le frequenze, o più in generale i totali, per ogni combinazione incrociata di importanza e spesso.

inserisci qui la descrizione dell'immagine


1
L'ho cambiato in giro.
Dimitriy V. Masterov

1
Citando Nick Cox (l'autore del diagramma della colonna vertebrale di Stata): la restrizione a due variabili è più evidente che reale. Le variabili composite possono essere create dalla combinazione incrociata di due o più variabili categoriali .... Una variabile di risposta viene generalmente mostrata meglio sull'asse y. Se una variabile è binaria, spesso è meglio tracciarla sull'asse y. Naturalmente, ci possono essere tensioni tra questi suggerimenti.
Dimitriy V. Masterov

3
Sono d'accordo con quanto sopra. Ma lo schema di colore predefinito di Stata è piuttosto scadente per le variabili ordinali. Diverse buone alternative sono diverse tonalità di rosso e / o blu, oppure solo gr {a | e} scelte di scala.
Nick Cox,

3
@Dimitriy Trovo molto strano usare un mix arbitrario di colori nella stessa situazione! Non intendo né deduco nulla dai o dai colori esatti, per quanto quantificati. Ma il punto è solo che una scala graduata è ben abbinata a una sequenza graduata di colori. Vi è una certa arbitrarietà anche nella colorazione delle mappe di calore, e in effetti in molti tipi di cartografia tematica.
Nick Cox,

2
Non vedo il problema con una combinazione di colori graduata purché i colori siano distinti. Perché qualcuno dovrebbe essere tentato di interpolare? Non riesco a vedere una logica con colori arbitrari. Le sequenze arcobaleno hanno senso in fisica, ma non in termini di come le persone percepiscono i colori (ad es. Giallo e rosso sono troppo diversi). Ho le prove in termini di parlare di molti studenti attraverso le scelte, e direi che l'80% dice sinceramente "È molto meglio" quando vedono una sequenza sottile e graduale rispetto agli arcobaleni o alla macedonia. Il blu attraverso il blu pallido attraverso il rosso pallido al rosso funziona bene. Assicurati di provarlo su donne e uomini.
Nick Cox,

13

Il modo in cui l'ho fatto è un po 'confuso, ma potrebbe essere risolto abbastanza facilmente.

Questa è una versione modificata dell'approccio jittering.

La rimozione degli assi riduce la tentazione di interpretare la scala come continua; disegnare caselle attorno alle combinazioni jitter sottolinea che c'è qualcosa come una "interruzione di scala" - che gli intervalli non sono necessariamente uguali

Idealmente, le etichette 1..5 dovrebbero essere sostituite con i nomi delle categorie, ma per ora lo lascerò per l'immaginazione; Penso che trasmetta il senso di esso.

 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 ordinale-ordinaria agitata


Possibili perfezionamenti:

i) ridurre le interruzioni (preferisco interruzioni più grandi di questa, personalmente), e

ii) tentare di usare una sequenza quasirandom per ridurre l'incidenza di pattern apparenti all'interno delle caselle. Mentre il mio tentativo mi ha aiutato un po ', puoi vedere che nelle celle con un numero inferiore di punti ci sono ancora sottosequenze con un aspetto più o meno correlato (ad esempio il riquadro nella riga superiore, seconda colonna). Per evitarlo, potrebbe essere necessario inizializzare la sequenza quasi casuale per ciascuna casella secondaria. (Un'alternativa potrebbe essere il campionamento latino Hypercube.) Una volta che è stato risolto, questo potrebbe essere inserito in una funzione che funziona esattamente come il jitter.

jitter quasi casuale e scatole più grandi

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
Mi piace questo, per me la separazione enfatizza davvero la natura ordinale dei dati! Sfortunatamente l'occhio umano è attratto naturalmente da schemi apparenti nel jittering, ad esempio le "tendenze al rialzo" nei pannelli (4,5) e (5,3). Tra i lati positivi, "contare i punti" mi sembra molto più naturale che giudicare la frequenza in base alla dimensione dei punti. Esistono varianti in cui i punti sono distribuiti uniformemente o raggruppati in schemi regolari nei centri, per evitare "tendenze jitter" che distraggono?
Pesce d'argento,

1
@Silverfish, un concetto simile in geografia sono mappe a densità di punti. I geografi hanno trovato alcune prove che schemi regolari o schemi che riempiono una certa quantità di spazio bianco (quindi sono distanziati più lontano quindi casuali) tendono a produrre percezioni più accurate tra gli osservatori.
Andy W,

IMO questa è una buona idea, ma la spaziatura tra i pannelli è così grande in questo esempio che rende molto difficile la visualizzazione di qualsiasi tendenza. La cura è peggiore della malattia (ma dovrebbe essere abbastanza facile avvicinare molto i pannelli).
Andy W,

1
Il jittering quasi casuale di @silverfish sarebbe una possibile soluzione a questo. La tua preoccupazione è quella che ho avuto me stesso.
Glen_b,

1
Molto bella! IMO questa è un'opzione migliore rispetto al diagramma della colonna vertebrale in questo caso (i diagrammi della colonna vertebrale o del mosaico sono migliori per valutare le distribuzioni condizionali per qualsiasi coppia di categorie - questo diagramma a punti agitato è più facile da valutare le tendenze - sfruttando la natura ordinale dei dati e assumendo alcuni tipo di relazione monotonica).
Andy W

7

Utilizzando il pacchetto 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)

inserisci qui la descrizione dell'immagine


1
(+1) Mi piace l'idea di usare coordinate parallele per questo! Penso che sarebbe più facile tracciare i percorsi attraverso il diagramma e vedere come vengono decomposte le risposte "spesso", se i colori scorressero da sinistra a destra (uno schema che visualizzerebbe effettivamente "spesso" come variabile dipendente e " importanza "come variabile esplicativa). Su alcune implementazioni interattive di tali grafici puoi fare clic su un asse per colorare con quella variabile, il che è utile.
Pesce rosso

1
Per fare un confronto, la visualizzazione di "set paralleli" di Robert Kosara , progettata per dati categorici, ha i colori che scorrono attraverso il diagramma.
Pesce rosso

6

Un'idea diversa a cui non pensavo originariamente era una trama setacciata .

inserisci qui la descrizione dell'immagine

Le dimensioni di ciascuna piastrella sono proporzionali alla frequenza prevista; i quadratini all'interno dei rettangoli rappresentano le frequenze effettive. Quindi una maggiore densità dei quadrati indica una frequenza superiore al previsto (ed è blu sfumato); una densità inferiore dei quadrati (rosso) è per una frequenza inferiore al previsto.

Penso che lo preferirei se il colore rappresentasse la dimensione, non solo il segno, del residuo. Ciò è particolarmente vero per i casi limite in cui le frequenze previste e osservate sono simili e il residuo è vicino allo zero; uno schema dicotomico rosso / blu sembra dare troppa enfasi a piccole deviazioni.

Implementazione in R:

library(vcd)
runningcounts.df <- as.data.frame(table(importance, often))
sieve(Freq ~ often + importance, data=runningcounts.df, shade= TRUE)

1
Per quanto riguarda la preferenza che il colore rappresenta sia la dimensione che il segno, una possibilità è quella di rendere i colori più grigi quando la differenza rispetto al previsto è relativamente piccola.
Glen_b,

6

Un grafico a barre sfaccettato in R. Mostra molto chiaramente la distribuzione di "spesso" ad ogni livello di "importanza". Ma non avrebbe funzionato così bene se il conteggio massimo fosse variato di più tra i livelli di "importanza"; è abbastanza facile impostarlo scales="free_y"in ggplot ( vedi qui ) per evitare un sacco di spazio vuoto, ma la forma della distribuzione sarebbe difficile da discernere a livelli di "importanza" a bassa frequenza poiché le barre sarebbero così piccole. Forse in quelle situazioni è meglio usare invece la frequenza relativa (probabilità condizionata) sull'asse verticale.

grafico a barre sfaccettato

Non è così "pulito" come il grafico a schede in Stata a cui Nick Cox si è collegato, ma trasmette informazioni simili.

Codice 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())
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.