Graphique pour la relation entre deux variables ordinales


46

Qu'est-ce qu'un graphique approprié pour illustrer la relation entre deux variables ordinales?

Quelques options auxquelles je peux penser:

  1. Nuage de points avec ajout de jitter aléatoire pour empêcher les points de se cacher. Apparemment, un graphique standard - Minitab appelle cela un "tracé de valeurs individuelles". À mon avis, cela peut être trompeur car cela encourage visuellement une sorte d'interpolation linéaire entre les niveaux ordinaux, comme si les données provenaient d'une échelle d'intervalles.
  2. Le diagramme de dispersion est adapté pour que la taille (surface) du point représente la fréquence de cette combinaison de niveaux, plutôt que de dessiner un point pour chaque unité d'échantillonnage. J'ai parfois vu de tels complots dans la pratique. Ils peuvent être difficiles à lire, mais les points se trouvent sur un réseau régulièrement espacé, ce qui permet de surmonter quelque peu les critiques adressées au nuage de points agité selon lequel il «visuellement intermittent» les données.
  3. En particulier si l’une des variables est considérée comme dépendante, un diagramme à moustaches groupé par niveaux de la variable indépendante. Cela risque de paraître terrible si le nombre de niveaux de la variable dépendante n’est pas suffisamment élevé (très "plat" avec des moustaches manquantes ou même pire des quartiles effondrés rendant l’identification visuelle de la médiane impossible), mais attire au moins l’attention sur les médianes et les quartiles qui statistiques descriptives pertinentes pour une variable ordinale.
  4. Tableau de valeurs ou grille vierge de cellules avec carte thermique pour indiquer la fréquence. Visuellement différent mais conceptuellement similaire au nuage de points avec une zone de points indiquant la fréquence.

Existe-t-il d'autres idées ou réflexions sur lesquelles les parcelles sont préférables? Existe-t-il des domaines de recherche dans lesquels certaines parcelles ordinales / ordinales sont considérées comme standard? (Je pense me souvenir que la heatmap de fréquence est très répandue dans la génomique, mais je pense que c'est plus souvent entre nominal et nominal.) Des suggestions pour une bonne référence standard seraient également les bienvenues, je suppose quelque chose d'Agresti.

Si quelqu'un veut illustrer avec un tracé, le code R pour les données de l'échantillon fictif suit.

"Quelle est l'importance de l'exercice pour vous?" 1 = pas du tout important, 2 = un peu sans importance, 3 = ni important ni sans importance, 4 = plutôt important, 5 = très important.

"À quelle fréquence prenez-vous régulièrement 10 minutes ou plus?" 1 = jamais, 2 = moins d'une fois par quinzaine, 3 = une fois toutes les deux semaines, 4 = deux ou trois fois par semaine, 5 = quatre fois ou plus par semaine.

S'il serait naturel de traiter "souvent" en tant que variable dépendante et "importance" en tant que variable indépendante, si un graphique fait la distinction entre les deux.

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

Une question connexe sur les variables continues que j’ai trouvée utile, peut-être un bon point de départ: Quelles sont les alternatives aux diagrammes de dispersion lorsqu’on étudie la relation entre deux variables numériques?


1
Qu'en est-il une intrigue?
Dimitriy V. Masterov

Une question connexe d'affichage des données ordinales univariées sur plusieurs groupes peut également être pertinente: Affichage des
Silverfish

Réponses:


15

Un tracé vertébral (tracé en mosaïque) fonctionne bien pour les exemples de données ici, mais peut être difficile à lire ou à interpréter si certaines combinaisons de catégories sont rares ou n'existent pas. Naturellement, il est raisonnable et prévisible qu'une faible fréquence soit représentée par une petite tuile et nulle par aucune tuile, mais la difficulté psychologique peut rester. Il est également naturel que les personnes qui aiment les graphiques à la colonne vertébrale choisissent des exemples qui conviennent à leurs papiers ou à leurs présentations, mais j'ai souvent produit des exemples trop désordonnés pour être utilisés en public. Inversement, une représentation graphique utilise bien l’espace disponible.

Certaines implémentations supposent des graphiques interactifs, de sorte que l'utilisateur puisse interroger chaque mosaïque pour en savoir plus.

Une alternative qui peut aussi très bien fonctionner est un graphique à barres à double sens (de nombreux autres noms existent).

Voir par exemple tabplotdans http://www.surveydesign.com.au/tipsusergraphs.html

Pour ces données, un graphique possible (produit à l’aide tabplotde Stata, mais devrait être facile à utiliser dans tout logiciel approprié)

entrez la description de l'image ici

Le format signifie qu'il est facile de relier des barres individuelles à des identificateurs de ligne et de colonne et que vous pouvez annoter des fréquences, des proportions ou des pourcentages (ne le faites pas si vous pensez que le résultat est trop chargé, naturellement).

Quelques possibilités:

  1. Si une variable peut être considérée comme une variable prédictive d'une réponse à une autre, il convient alors de la représenter comme d'habitude sur son axe vertical. Ici, je pense à "l’importance" comme à la mesure d’une attitude, la question étant alors de savoir si elle affecte le comportement ("souvent"). La question de la causalité est souvent plus compliquée même pour ces données imaginaires, mais le point demeure.

  2. La suggestion n ° 1 doit toujours être trompée si l'inverse fonctionne mieux, ce qui signifie qu'il est plus facile de penser et d'interpréter.

  3. Les pourcentages ou les probabilités sont souvent pertinents. Un graphique des fréquences brutes peut aussi être utile. (Naturellement, cette parcelle n'a pas le mérite des parcelles en mosaïque de montrer les deux types d'informations à la fois.)

  4. Vous pouvez bien sûr essayer les alternatives (beaucoup plus courantes) de diagrammes à barres groupées ou empilées (ou les diagrammes à points groupés encore assez rares au sens de WS Cleveland). Dans ce cas, je ne pense pas qu'ils fonctionnent aussi bien, mais parfois ils fonctionnent mieux.

  5. Certains voudront peut-être colorier différemment les différentes catégories de réponses. Je n'ai pas d'objection et si vous voulez, vous ne prendrez pas les objections au sérieux.

La stratégie consistant à hybrider un graphique et un tableau peut être utile de manière plus générale, voire ne pas correspondre à ce que vous souhaitez. Un argument souvent répété est que la séparation des figures et des tableaux n’était qu’un effet secondaire de l’invention de l’imprimerie et de la division du travail qu’elle produisait; c'est une fois de plus inutile, tout comme c'était le cas pour les auteurs de manuscrits mettant des illustrations exactement comme et où ils le souhaitaient.


Merci d'avoir ajouté le graphique. Cela soulève la question de la façon dont les graphiques et les données textuelles sont combinés - je sais que certaines personnes n’aiment pas placer de chiffres au-dessus des barres (parce que les barres semblent plus hautes qu’elles ne le sont réellement; je n’ai pas de référence à citer mais je pense que c’est une opinion bien connue).
Silverfish

En revanche, fixer la position des chiffres semble poser deux problèmes: soit les chiffres peuvent se superposer aux barres, ce qui les masque, soit fixer les chiffres au-dessus des barres peut les "déconnecter" des barres inférieures. en particulier. Existe-t-il une bonne discussion sur ces questions quelque part?
Silverfish

Je ne pense pas que vous ayez besoin d'une référence. c'est une attitude commune. Je vois d’autres variantes: (1) des suggestions spécifiques à l’affichage, à savoir que l’affichage est trop occupé, trop désordonné, etc. (2) font appel à la notion selon laquelle le texte numérique est redondant car les mêmes informations sont implicites (ou selon certaines indications explicites). ) dans le graphique, de quelque manière que ce soit (3) une attitude "les garçons portent le bleu et les filles le rose" en indiquant que les chiffres sont des figures et les tableaux sont des tableaux, et que le twain ne se rencontrera jamais. (3) me semble être un pur préjugé; (2) est correct en principe, mais néanmoins les chiffres peuvent aider; (1) doit être pensé exemple par exemple.
Nick Cox

Je ne connais pas les discussions sur les compromis spécifiques. Laisser les barres incolores pour pouvoir y insérer des chiffres est souvent une bonne idée. Parfois, les barres peuvent être trop petites pour que cela soit toujours fait.
Nick Cox

30

Voici une rapide tentative de carte thermique . J'ai utilisé des frontières de cellules noires pour briser les cellules, mais peut-être que les carreaux devraient être séparés davantage, comme dans la réponse de Glen_b.

Carte de chaleur

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

Voici un graphique de fluctuation basé sur un commentaire précédent de Andy W. Comme il les décrit, "ils ne sont en fait que des diagrammes de dispersion regroupés pour des données catégoriques, et la taille d'un point est mappée au nombre d'observations qui se trouvent dans cette catégorie". Pour une référence voir

Wickham, Hadley et Heike Hofmann. 2011. Parcelles de produits . Transactions IEEE sur la visualisation et l’infographie (Proc. Infovis `11) . PDF pré-imprimé

parcelle de fluctuation

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
" Peut-être que les carreaux devraient être séparés davantage, comme dans la réponse de Glen_b " - Je ne suis pas sûr que ce soit nécessaire dans ce cas, il y a beaucoup moins de tentation de voir les catégories comme continues ici.
Glen_b

18

Voici un exemple de ce à quoi ressemblerait une représentation graphique des données. Je l' ai fait dans Stata assez rapidement, mais il y a une mise en œuvre de R . Je pense qu'en R cela devrait être juste:

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

Le tracé de la colonne semble être la valeur par défaut si vous donnez des variables catégorielles R:

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

La ventilation fractionnée des catégories de souvent est indiquée pour chaque catégorie d'importance. Les barres empilées sont dessinées avec une dimension verticale indiquant une fraction de souvent, compte tenu de la catégorie d'importance. La dimension horizontale montre la fraction dans chaque catégorie d'importance. Ainsi, les surfaces de tuiles formées représentent les fréquences, ou plus généralement les totaux, pour chaque combinaison croisée d’importance et de fréquence.

entrez la description de l'image ici


1
Je l'ai changé autour
Dimitriy V. Masterov

1
Citant Nick Cox (l'auteur du diagramme de la colonne vertébrale de Stata): La restriction à deux variables est plus apparente que réelle. Les variables composites peuvent être créées par une combinaison croisée de deux ou plusieurs variables qualitatives ... Une variable de réponse est généralement mieux représentée sur l'axe des ordonnées. Si une variable est binaire, il est souvent préférable de le tracer sur l'axe des y. Naturellement, il peut y avoir une certaine tension entre ces suggestions.
Dimitriy V. Masterov

3
Je suis d'accord avec ce qui précède. Mais le schéma de couleurs par défaut de Stata est assez moche pour les variables ordinales. Plusieurs bonnes alternatives sont les différentes nuances de rouge et / ou de bleu, ou simplement des choix plus vastes.
Nick Cox

3
@ Dimitriy Je trouve très étrange d'utiliser un mélange arbitraire de couleurs dans la même situation! Je n'implique ni ne déduis quoi que ce soit par ou à partir des couleurs exactes, quelle que soit leur quantification. Mais le fait est seulement qu'une échelle graduée est bien assortie à une séquence graduée de couleurs. La coloration des cartes thermiques est également quelque peu arbitraire, de même que dans de nombreux types de cartographie thématique.
Nick Cox

2
Je ne vois pas le problème avec une palette de couleurs graduée tant que les couleurs sont distinctes. Pourquoi quelqu'un serait-il tenté d'interpoler? Je ne peux pas voir une logique aux couleurs arbitraires. Les séquences arc-en-ciel ont un sens en physique, mais pas en termes de perception des couleurs (par exemple, le jaune et le rouge sont trop différents). J'ai la preuve que beaucoup d'élèves parlent de choix, et je dirais que 80% des gens disent sincèrement «C'est beaucoup mieux» lorsqu'ils voient une séquence nuancée subtile au-dessus d'un arc-en-ciel ou d'une salade de fruits. Le bleu allant du bleu pâle au rouge pâle au rouge fonctionne bien. Assurez-vous de l'essayer aussi bien chez les femmes que chez les hommes.
Nick Cox

13

La façon dont je l'ai fait est un peu un fudge, mais cela pourrait être corrigé assez facilement.

Ceci est une version modifiée de l'approche par tremblement.

Le retrait des axes réduit la tentation d'interpréter la balance comme étant continue; Le fait de dessiner des boîtes autour des combinaisons instables souligne qu'il y a quelque chose comme un "changement d'échelle" - que les intervalles ne sont pas nécessairement égaux

Idéalement, les étiquettes 1..5 devraient être remplacées par les noms de catégories, mais je vais laisser cela pour l’imagination pour le moment; Je pense que cela en donne le sens.

 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)

parcelle ordinale-ordinale agitée


Raffinements possibles:

i) rendre les pauses plus petites (personnellement, je préfère les pauses plus grandes), et

ii) essayer d'utiliser une séquence quasi-aléatoire pour réduire l'incidence de motifs apparents dans les cases. Bien que ma tentative ait quelque peu aidé, vous pouvez voir que dans les cellules avec un nombre de points plus petit, il y a toujours des sous-séquences avec un aspect plus ou moins corrélé (par exemple, la zone dans la rangée du haut, 2e colonne). Pour éviter cela, vous devrez peut-être initialiser la séquence quasi-aléatoire pour chaque sous-zone. (Une alternative pourrait être l'échantillonnage Latin Hypercube.) Une fois que cela a été trié, cela pourrait être inséré dans une fonction qui fonctionne exactement comme la gigue.

gigue quasi-aléatoire et boîtes plus 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)

1
J'aime ça, pour moi la séparation souligne vraiment le caractère ordinal des données! Malheureusement, l’œil humain est naturellement attiré par les motifs apparents du tremblement, par exemple les "tendances à la hausse" des panneaux (4,5) et (5,3). Du côté des points positifs, "compter les points" me semble beaucoup plus naturel que de juger de la fréquence en fonction de la taille du point. Existe-t-il des variantes dans lesquelles les points sont régulièrement espacés ou agglomérés de manière régulière au centre pour éviter de "distraire les" tendances de la gigue "?
Silverfish

1
Silverfish, un concept similaire en géographie sont des cartes de densité de points. Les géographes ont trouvé des preuves que les schémas réguliers ou les schémas qui remplissent une certaine quantité d'espaces blancs (sont donc plus éloignés les uns des autres qu'un aléatoire) tendent à produire des perceptions plus précises parmi les observateurs.
Andy W

OMI, c’est une bonne idée, mais l’espacement entre les panneaux est si grand dans cet exemple qu’il est très difficile de visualiser toute tendance. Le remède est pire que le mal (mais il devrait être assez facile de rapprocher les panneaux les uns des autres).
Andy W

1
@silverfish Une gigue quasi aléatoire serait une solution possible à cela. Votre préoccupation est celle que j'ai moi-même.
Glen_b

1
Très agréable! L’OMI, c’est une meilleure option que le diagramme vertébral dans ce cas (les diagrammes rachidiens ou en mosaïque sont préférables pour évaluer les distributions conditionnelles pour n’importe quelle paire de catégories - ce diagramme en points tremblotant est plus facile à évaluer les tendances - en exploitant la nature ordinale des données type de relation monotone).
Andy W

7

Utilisation de la parcelle de rivière package 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)

entrez la description de l'image ici


1
(+1) J'aime l'idée d'utiliser des coordonnées parallèles pour cela! Je pense qu'il serait plus facile de tracer les chemins à travers le diagramme et de voir comment les réponses "souvent" sont décomposées, si les couleurs coulaient de gauche à droite (un schéma qui afficherait effectivement "souvent" comme variable dépendante et " "importance" comme variable explicative). Sur certaines implémentations interactives de tels tracés, vous pouvez cliquer sur un axe pour colorer par cette variable, ce qui est utile.
Silverfish

1
À titre de comparaison, la visualisation "Jeux en parallèle" de Robert Kosara , conçue pour les données catégoriques, présente les couleurs qui défilent dans le diagramme.
Silverfish

6

Une idée différente à laquelle je n'avais pas pensé à l'origine était un complot tamisé .

entrez la description de l'image ici

La taille de chaque carreau est proportionnelle à la fréquence attendue. les petits carrés à l'intérieur des rectangles représentent les fréquences réelles. Par conséquent, une plus grande densité de carrés indique une fréquence supérieure à celle attendue (et est ombrée en bleu); densité de carrés inférieure (rouge) correspond à une fréquence inférieure à celle attendue.

Je pense que je préférerais cela si la couleur représentait la taille, pas seulement le signe, du résidu. Cela est particulièrement vrai pour les cas extrêmes où les fréquences attendues et observées sont similaires et où le résidu est proche de zéro; un schéma dichotomique rouge / bleu semble trop insister sur les petites déviations.

Mise en œuvre dans R:

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

1
En ce qui concerne votre préférence pour que la couleur représente à la fois la taille et le signe, une possibilité est de rendre les couleurs plus grises lorsque la différence par rapport aux attentes est relativement petite.
Glen_b

6

Diagramme à barres à facettes dans R. Il montre très clairement la répartition de "souvent" à chaque niveau "d'importance". Mais cela n'aurait pas si bien fonctionné si le nombre maximum avait varié davantage entre les niveaux d '"importance"; il est assez facile de placer scales="free_y"ggplot ( voir ici ) pour éviter beaucoup d’espace vide, mais il serait difficile de discerner la forme de la distribution à des niveaux «d’importance» basse fréquence, car les barres seraient si petites. Dans ces situations, il est peut-être préférable d’utiliser plutôt la fréquence relative (probabilité conditionnelle) sur l’axe vertical.

diagramme à barres à facettes

Ce n'est pas aussi "propre" que la tabplot dans Stata auquel Nick Cox s'est lié, mais transmet des informations similaires.

Code 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())
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.