Gráfico para relacionamento entre duas variáveis ​​ordinais

46

O que é um gráfico apropriado para ilustrar a relação entre duas variáveis ​​ordinais?

Algumas opções que posso pensar:

  1. Gráfico de dispersão com tremulação aleatória adicionada para impedir que os pontos se ocultem. Aparentemente, um gráfico padrão - o Minitab chama isso de "gráfico de valores individuais". Na minha opinião, pode ser enganoso, pois encoraja visualmente um tipo de interpolação linear entre os níveis ordinais, como se os dados fossem de uma escala de intervalo.
  2. Gráfico de dispersão adaptado para que o tamanho (área) do ponto represente a frequência dessa combinação de níveis, em vez de desenhar um ponto para cada unidade de amostragem. Ocasionalmente, vi tais conspirações na prática. Eles podem ser difíceis de ler, mas os pontos estão em uma rede com espaçamento regular que supera de certa forma as críticas ao gráfico de dispersão nervoso que "visualiza" os dados.
  3. Especialmente se uma das variáveis ​​for tratada como dependente, um gráfico de caixa agrupado pelos níveis da variável independente. É provável que pareça terrível se o número de níveis da variável dependente não for suficientemente alto (muito "plano" com falta de bigodes ou quartis ainda piores, o que impossibilita a identificação visual da mediana), mas pelo menos chama a atenção para mediana e quartis que são estatística descritiva relevante para uma variável ordinal.
  4. Tabela de valores ou grade em branco de células com mapa de calor para indicar frequência. Visualmente diferente, mas conceitualmente semelhante ao gráfico de dispersão, com a área do ponto mostrando a frequência.

Existem outras idéias ou pensamentos sobre quais parcelas são preferíveis? Existem campos de pesquisa em que certas parcelas ordinais versus ordinais são consideradas padrão? (Parece que me lembro do mapa de calor de frequência sendo generalizado na genômica, mas suspeito que isso seja mais frequente para nominal versus nominal.) Sugestões para uma boa referência padrão também seriam muito bem-vindas, estou supondo algo da Agresti.

Se alguém quiser ilustrar com um gráfico, segue o código R para dados de amostra falsos.

"Qual a importância do exercício para você?" 1 = nada importante, 2 = um tanto sem importância, 3 = nem importante nem sem importância, 4 = um pouco importante, 5 = muito importante.

"Com que regularidade você leva 10 minutos ou mais?" 1 = nunca, 2 = menos de uma vez por quinzena, 3 = uma vez a cada uma ou duas semanas, 4 = duas ou três vezes por semana, 5 = quatro ou mais vezes por semana.

Se seria natural tratar "frequentemente" como uma variável dependente e "importância" como uma variável independente, se um gráfico distingue entre os dois.

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

Uma questão relacionada a variáveis ​​contínuas achei útil, talvez um ponto de partida útil: quais são as alternativas aos gráficos de dispersão ao estudar a relação entre duas variáveis ​​numéricas?

Silverfish
fonte
1
Que tal um spineplot?
precisa saber é o seguinte
Uma questão relacionada para a exibição de univariadas dados ordinais em vários grupos também podem ser relevantes: Resultados ordinal de dados - Meios, medianas, e graus médios
Silverfish

Respostas:

15

Um spineplot (mosaico) funciona bem para os dados de exemplo aqui, mas pode ser difícil de ler ou interpretar se algumas combinações de categorias forem raras ou não existirem. Naturalmente, é razoável, e esperado, que uma frequência baixa seja representada por um bloco pequeno e zero por nenhum bloco, mas a dificuldade psicológica pode permanecer. Também é natural que as pessoas que gostam de tramas espinhais escolham exemplos que funcionam bem para seus trabalhos ou apresentações, mas eu sempre produzi exemplos que eram muito bagunçados para serem usados ​​em público. Por outro lado, um gráfico de espinha usa bem o espaço disponível.

Algumas implementações pressupõem gráficos interativos, para que o usuário possa interrogar cada bloco para saber mais sobre ele.

Uma alternativa que também pode funcionar muito bem é um gráfico de barras bidirecional (existem muitos outros nomes).

Veja, por exemplo, tabplotem http://www.surveydesign.com.au/tipsusergraphs.html

Para esses dados, um gráfico possível (produzido usando o tabplotStata, mas deve ser fácil em qualquer software decente) é

insira a descrição da imagem aqui

O formato significa que é fácil relacionar barras individuais aos identificadores de linha e coluna e que você pode anotar com frequências, proporções ou porcentagens (não faça isso se achar que o resultado é muito ocupado, naturalmente).

Algumas possibilidades:

  1. Se uma variável pode ser considerada uma resposta a outra como preditor, vale a pena pensar em plotá-la no eixo vertical, como de costume. Aqui penso na "importância" como medida de uma atitude, a questão então é se afeta o comportamento ("frequentemente"). A questão causal é frequentemente mais complicada, mesmo para esses dados imaginários, mas o ponto permanece.

  2. A sugestão 1 sempre deve ser superada se o inverso funcionar melhor, ou seja, for mais fácil pensar e interpretar.

  3. Porcentagens ou probabilidades de discriminação geralmente fazem sentido. Um gráfico de frequências brutas também pode ser útil. (Naturalmente, esse enredo carece da virtude de enredos em mosaico de mostrar os dois tipos de informações de uma só vez.)

  4. É claro que você pode tentar as alternativas (muito mais comuns) de gráficos de barras agrupados ou gráficos de barras empilhadas (ou os gráficos de pontos agrupados ainda bastante incomuns no sentido de WS Cleveland). Nesse caso, acho que não funcionam tão bem, mas às vezes funcionam melhor.

  5. Alguns podem querer colorir diferentes categorias de resposta de maneira diferente. Não tenho objeções e, se você quiser, não levaria as objeções a sério.

A estratégia de hibridar gráfico e tabela pode ser útil de maneira mais geral, ou mesmo não o que você deseja. Um argumento frequentemente repetido é que a separação de figuras e tabelas era apenas um efeito colateral da invenção da impressão e da divisão do trabalho que produzia; é mais uma vez desnecessário, assim como foi para escritores de manuscritos que colocavam ilustrações exatamente como e onde eles gostavam.

Nick Cox
fonte
Obrigado por adicionar o gráfico. Isso levanta a questão de como os gráficos e os dados textuais se combinam - eu sei que algumas pessoas não gostam de colocar números no topo das barras (porque isso faz com que as barras pareçam mais altas do que realmente são; não tenho uma citação à mão para isso, mas acho que é uma opinião bem conhecida).
Silverfish
Por outro lado, fixar a posição dos números parece criar um de dois problemas: os números podem acabar sobrepostos nas barras, o que os obscurece, ou a fixação dos números acima das barras pode "desconectá-los" das barras inferiores em particular. Existe uma boa discussão sobre esses problemas em algum lugar?
Silverfish
Eu não acho que você precise de uma referência; é uma atitude comum. Vejo outras variantes: (1) sugestões específicas da tela de que a tela está muito ocupada, desarrumada etc. (2) um apelo à noção de que o texto numérico é redundante porque as mesmas informações estão implícitas (ou de acordo com algumas explícitas). ) no gráfico de qualquer maneira (3) uma atitude de "meninos vestem azul e meninas vestem rosa" de que Figuras são figuras e Tabelas são tabelas, e nunca os dois se encontrarão. (3) me parece puro preconceito; (2) é correto em princípio, mas, no entanto, os números podem ajudar; (1) deve ser pensado através de exemplo por exemplo.
Nick Cox
Não conheço discussões sobre trocas específicas. Deixar as barras sem cor para que os números possam ser colocados dentro delas geralmente é uma boa idéia. Às vezes, as barras podem ser pequenas demais para que isso seja feito sempre.
Nick Cox
30

Aqui está uma tentativa rápida de um mapa de calor : usei bordas de células pretas para quebrar as células, mas talvez os ladrilhos devam ser separados mais como na resposta 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")

Aqui está um gráfico de flutuação baseado em um comentário anterior de Andy W. Como ele os descreve "eles são basicamente apenas gráficos de dispersão binados para dados categóricos, e o tamanho de um ponto é mapeado para o número de observações que caem dentro desse bin". Para uma referência, consulte

Wickham, Hadley e Heike Hofmann. 2011. Gráficos de produtos . Transações IEEE em Visualização e Computação Gráfica (Proc. Infovis `11) . Pré-imprimir PDF

gráfico de flutuação

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
fonte
1
" talvez os blocos devam ser separados mais como na resposta de Glen_b " - não tenho certeza de que seja necessário neste caso, há muito menos tentação de ver as categorias como contínuas aqui.
Glen_b
18

Aqui está um exemplo de como seria um gráfico de espinha dos dados. Eu fiz isso em Stata muito rapidamente, mas há uma implementação R . Eu acho que em R deveria ser apenas:

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

O spineplot realmente parece ser o padrão se você der variáveis ​​categóricas para R:

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

A repartição fracionária das categorias de é frequentemente mostrada para cada categoria de importância. Barras empilhadas são desenhadas com dimensão vertical, mostrando a fração de vezes dada a categoria de importância. A dimensão horizontal mostra a fração em cada categoria de importância. Assim, as áreas dos ladrilhos formados representam as frequências, ou em geral totais, para cada combinação cruzada de importância e frequência.

insira a descrição da imagem aqui

Dimitriy V. Masterov
fonte
1
Eu mudei isso.
precisa saber é o seguinte
1
Citando Nick Cox (o autor do spineplot de Stata): A restrição a duas variáveis ​​é mais aparente do que real. Variáveis ​​compostas podem ser criadas pela combinação cruzada de duas ou mais variáveis ​​categóricas ... Uma variável de resposta geralmente é melhor mostrada no eixo y. Se uma variável é binária, geralmente é melhor plotá-la no eixo y. Naturalmente, pode haver alguma tensão entre essas sugestões.
precisa saber é o seguinte
3
Eu concordo com o acima. Mas o esquema de cores padrão do Stata é bastante ruim para variáveis ​​ordinais. Várias boas alternativas são diferentes tons de vermelho e / ou azul ou apenas opções de escala de escala.
Nick Cox
3
@ Dimitriy Acho muito estranho usar uma mistura arbitrária de cores na mesma situação! Não insiro nem deduzo nada por ou das cores exatas, por mais quantificadas que sejam. Mas o ponto é apenas que uma escala graduada é bem correspondida por uma sequência graduada de cores. Também existe alguma arbitrariedade na coloração dos mapas de calor e, de fato, em muitos tipos de cartografia temática.
Nick Cox
2
Não vejo o problema com um esquema de cores graduado, desde que as cores sejam distintas. Por que alguém seria tentado a interpolar? Não consigo ver uma lógica para cores arbitrárias. Seqüências de arco-íris fazem sentido na física, mas não em termos de como as pessoas percebem as cores (por exemplo, amarelo e vermelho são muito diferentes). Eu tenho evidências em termos de convencer muitos alunos a fazer escolhas, e eu diria que 80% sinceramente diz "Isso é muito melhor" quando eles veem uma sequência sutil de notas sobre arco-íris ou salada de frutas. Azul através de azul pálido através de vermelho pálido a vermelho funciona bem. Certifique-se de experimentar isso tanto em mulheres quanto em homens.
Nick Cox
13

A maneira como eu fiz isso é meio que uma farsa, mas pode ser corrigida com bastante facilidade.

Esta é uma versão modificada da abordagem de tremulação.

A remoção dos eixos reduz a tentação de interpretar a balança como contínua; desenhar caixas ao redor das combinações tremidas enfatiza que há algo como uma "quebra de escala" - que os intervalos não são necessariamente iguais

Idealmente, os rótulos 1..5 devem ser substituídos pelos nomes das categorias, mas deixarei isso para a imaginação por enquanto; Eu acho que transmite o sentido disso.

 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)

enredo ordinal-ordinal instável


Refinamentos possíveis:

i) diminuir os intervalos (eu prefiro intervalos maiores do que isso, pessoalmente), e

ii) tentar usar uma sequência quase aleatória para reduzir a incidência de padrão aparente dentro das caixas. Embora minha tentativa tenha ajudado um pouco, você pode ver que nas células com um número menor de pontos ainda existem subsequências com uma aparência mais ou menos correlacionada (por exemplo, a caixa na linha superior, segunda coluna). Para evitar isso, a sequência quase aleatória pode ter que ser inicializada para cada subcaixa. (Uma alternativa pode ser a amostragem Latin Hypercube.) Uma vez resolvida, ela poderia ser inserida em uma função que funciona exatamente como jitter.

jitter quase aleatório e caixas maiores

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
fonte
1
Eu gosto disso, para mim a separação realmente enfatiza a natureza ordinal dos dados! Infelizmente, o olho humano é atraído naturalmente para padrões aparentes no tremor, por exemplo, nas "tendências ascendentes" nos painéis (4,5) e (5,3). No lado positivo, "contar os pontos" me parece muito mais natural do que julgar a frequência pelo tamanho dos pontos. Existem variantes em que os pontos são espaçados uniformemente, ou agrupados em padrões regulares nos centros, para evitar perturbar as "tendências de instabilidade"?
quer
1
@ Silverfish, um conceito semelhante na geografia são mapas de densidade de pontos. Os geógrafos descobriram alguma evidência de que padrões regulares ou padrões que preenchem uma certa quantidade de espaço em branco (portanto, são mais espaçados do que aleatórios) tendem a produzir percepções mais precisas entre os observadores.
21813 Andy W
Para a IMO, é uma boa idéia, mas o espaçamento entre os painéis é tão grande neste exemplo que dificulta a visualização de qualquer tendência. A cura é pior que a doença (mas deve ser bem fácil aproximar os painéis).
21813 Andy W
1
@silverfish tremulação quase aleatória seria uma solução possível para isso. Sua preocupação é uma que eu mesmo.
Glen_b
1
Muito agradável! Na IMO, essa é uma opção melhor do que a coluna vertebral nesse caso (as plotagens da coluna ou do mosaico são melhores para avaliar distribuições condicionais para qualquer par de categorias - esse gráfico de pontos instáveis ​​é mais fácil de avaliar tendências - aproveitando a natureza ordinal dos dados e assumindo algumas tipo de relacionamento monotônico).
21713 Andy
7

Usando o riverplot do pacote R:

  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)

insira a descrição da imagem aqui

DL Dahly
fonte
1
(+1) Gosto da ideia de usar coordenadas paralelas para isso! Eu acho que seria mais fácil rastrear os caminhos através do diagrama e ver como as respostas "frequentemente" são decompostas, se as cores fluíssem da esquerda para a direita (um esquema que efetivamente exibia "frequentemente" como a variável dependente e " importância "como variável explicativa). Em algumas implementações interativas de tais plotagens, você pode clicar em um eixo para colorir por essa variável, o que é útil.
quer
1
Para comparação, a visualização de "conjuntos paralelos" de Robert Kosara , projetada para dados categóricos, tem as cores fluindo pelo diagrama.
quer
6

Uma idéia diferente da qual eu não pensava originalmente era uma trama de peneiras .

insira a descrição da imagem aqui

O tamanho de cada bloco é proporcional à frequência esperada; os pequenos quadrados dentro dos retângulos representam as freqüências reais. Portanto, uma densidade maior dos quadrados indica uma frequência maior que a esperada (e está sombreada em azul); menor densidade de quadrados (vermelho) é para uma frequência menor que o esperado.

Acho que preferiria que a cor representasse o tamanho, não apenas o sinal, do resíduo. Isto é particularmente verdadeiro para casos extremos onde as frequências esperadas e observadas são semelhantes e o resíduo é próximo de zero; um esquema dicotômico de vermelho / azul parece enfatizar excessivamente pequenos desvios.

Implementação em R:

library(vcd)
runningcounts.df <- as.data.frame(table(importance, often))
sieve(Freq ~ often + importance, data=runningcounts.df, shade= TRUE)
Silverfish
fonte
1
Com relação à sua preferência de que a cor represente tamanho e sinal, uma possibilidade é tornar as cores mais cinza quando a diferença do esperado é relativamente pequena.
Glen_b
6

Um gráfico de barras facetado em R. Ele mostra a distribuição de "frequentemente" em cada nível de "importância" muito claramente. Mas não teria funcionado tão bem se a contagem máxima tivesse variado mais entre os níveis de "importância"; é fácil configurar o scales="free_y"ggplot ( veja aqui ) para evitar muito espaço vazio, mas seria difícil discernir o formato da distribuição em níveis de "importância" de baixa frequência, pois as barras seriam muito pequenas. Talvez nessas situações seja melhor usar a frequência relativa (probabilidade condicional) no eixo vertical.

gráfico de barras facetado

Não é tão "limpo" como o tabplot no Stata ao qual Nick Cox se vinculou, mas transmite informações semelhantes.

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