Comment pouvez-vous visualiser la relation entre 3 variables catégorielles?

21

J'ai un ensemble de données avec trois variables catégorielles et je veux visualiser la relation entre les trois dans un graphique. Des idées?

Actuellement, j'utilise les trois graphiques suivants: entrez la description de l'image ici

Chaque graphique correspond à un niveau de dépression de base (léger, modéré, sévère). Ensuite, dans chaque graphique, j'examine la relation entre le traitement (0,1) et l'amélioration de la dépression (aucune, modérée, substantielle).

Ces 3 graphiques fonctionnent pour voir la relation à 3 voies, mais existe-t-il un moyen connu de le faire avec un graphique?

Alejandro Ochoa
la source
4
La publication des données permettrait aux gens de jouer.
Nick Cox
1
Vous avez 3 catégories de base, 2 catégories de traitement et 3 résultats de dépression. Étant donné le dernier. les proportions de chaque type de dépression pourraient être affichées par 6 points sur un tracé triangulaire (trilinéaire, ternaire).
Nick Cox
4
Quel est le problème avec ces graphiques?
Aksakal
Pouvez-vous fournir les données, comme le demande @NickCox? Je suppose que ce ne sont que 18 chiffres.
gung - Rétablir Monica

Réponses:

12

Il s'agit d'un ensemble de données intéressant à essayer de représenter graphiquement, en partie parce qu'il n'est pas vraiment catégorique. Les deux facteurs 3 niveaux sont ordinales et il y a interaction possible entre eux (probablement, il est plus difficile pour mild baselined'avoir substantial improvement- ou peut - être substantial improvementsignifie quelque chose de différent pour chacun baseline).

Avec plusieurs variables, il n'y a généralement pas une seule vue qui montre toutes les fonctionnalités qui pourraient vous intéresser. Certains facteurs seront plus faciles à comparer que d'autres. Je pense que votre vue d'origine est bonne et serait meilleure avec les suggestions de Nick Cox: supprimer les légendes en double et utiliser une échelle de couleurs ordinale.

Si vous êtes le plus intéressé à voir la différence entre les traitements, vous pouvez souligner le changement en utilisant un tracé de zone empilé au lieu de barres empilées.

entrez la description de l'image ici

Je me méfie généralement de l'empilement en général, car il est plus difficile de lire les valeurs moyennes, mais cela renforce la nature à somme fixe de ces données. Et cela facilite la lecture de la somme moderate+ substantialsi cela est pertinent. J'ai inversé l'ordre des improvementniveaux pour que plus c'est mieux pour la fréquence.

Sans empilement, l'équivalent est un graphique de pente.

entrez la description de l'image ici

Il est plus facile de lire chaque niveau, mais plus difficile à comprendre l'interaction. Vous devez garder à l'esprit que la troisième ligne dépend directement des deux autres.

Étant donné la nature ordinale des données, il peut être utile de convertir la improvementvaleur en un score numérique, comme cela se fait souvent avec les données de Likert . Par exemple, none=0, moderate=1, substantial=2. Ensuite, vous pouvez représenter graphiquement cette variable sur une échelle continue. L'inconvénient est que vous devez trouver un score raisonnable (par exemple, 0, 1 et 5 seraient une représentation plus vraie).

entrez la description de l'image ici

Colophon : Ces tracés ont été réalisés avec la fonction Graph Builder du progiciel JMP (que j'aide à développer). Bien qu'il soit créé de manière interactive, un script, par exemple, pour le tracé de la zone, sans les personnalisations de coloration, est:

Graph Builder(
    Graph Spacing( 15 ),
    Variables( X( :treatment ), Y( :frequency ),
        Group X( :baseline ), Overlay( :improvement )
    ),
    Elements( Area( X, Y ) )
);
xan
la source
2
+1. Quelques excellentes idées ici. Bien que je sois inquiet à propos de l'empilement, je pense que le premier graphique fonctionne mieux. Cela fait ressortir l'interaction intéressante: le traitement 1 produit toujours plus d'exemples d'amélioration substantielle et plus aucun!
Nick Cox
Super article. Existe-t-il de toute façon que l'on pourrait construire le premier graphique que vous affichez dans R? Je n'ai pas utilisé JMP depuis un moment.
Alejandro Ochoa
1
@AlejandroOchoa ggplot a une zone geom. Voir Création d'un tracé de zone empilée à l'aide de ggplot2 .
Xan
10

Tout d'abord, voici ma lecture du graphique fourni des données pour ceux qui souhaitent jouer (expérimenter, si vous voulez). NB: des erreurs ponctuelles sont certainement possibles, tout comme des erreurs grossières.

    improvement  treatment   baseline   frequency  
           none          0       mild          5  
       moderate          0       mild         41  
    substantial          0       mild          4  
           none          1       mild         19  
       moderate          1       mild         19  
    substantial          1       mild         12  
           none          0   moderate         19  
       moderate          0   moderate         24  
    substantial          0   moderate          7  
           none          1   moderate         20  
       moderate          1   moderate         14  
    substantial          1   moderate         16  
           none          0     severe          7  
       moderate          0     severe         21  
    substantial          0     severe         22  
           none          1     severe         12  
       moderate          1     severe         15  
    substantial          1     severe         23  

Voici une refonte du design original. Un détail des données originales simplifie les choses: le nombre de personnes dans chacune des combinaisons de prédicteurs est le même, donc les fréquences de traçage et les pourcentages de traçage sont les mêmes. Ici, au lieu d'un graphique à barres empilées (subdivisées, segmentées), nous séparons les barres dans un graphique à barres bidirectionnel ou une conception de tracé de tableau.

La plupart des détails graphiques ne sont que des détails. Plusieurs petites faiblesses dans un graphique peuvent nuire à son efficacité et plusieurs petites améliorations peuvent également aider.

entrez la description de l'image ici

Pour le préciser:

  1. Trois panneaux ne sont pas nécessaires ici, avec leur répétition d'axes, de légende et de texte.

  2. Une légende est toujours une malédiction autant qu'une bénédiction, obligeant le lecteur à faire des va-et-vient mentalement (ou à mémoriser la légende, pas quelque chose qui fait appel, aussi facile soit-il). Le texte informatif juste à côté des barres est plus facile à suivre.

  3. Le code couleur de la salade de fruits est dispensable. Cela semble aussi arbitraire: une amélioration "substantielle" est un gros problème, mais je trouve même le jaune fort une couleur tamisée. Mais nous n'avons pas besoin de couleur lorsque nous avons du texte à expliquer.

  4. Bien que certains crient avec horreur de violer la distinction entre la figure et le tableau, nous pouvons aussi montrer les fréquences. Il est utile de pouvoir penser "4 personnes dans cette catégorie".

  5. Il y a ici hommage au tracé traditionnel de la réponse sur l'axe vertical, tout comme dans l'original.

Cela dit, il est difficile de voir beaucoup de structure dans ces données. Dans ce cas, il est également difficile de partager le blâme entre (a) des données sans trop de structure et (b) les faiblesses d'une conception graphique pour identifier non seulement les effets des prédicteurs mais aussi les interactions possibles. Le traitement semble moins important que l'état de base. Mais alors, si la ligne de base était "légère", dans quelle mesure y avait-il une amélioration "substantielle"? Je m'arrêterai là pour arrêter de me ridiculiser quand l'étude des données de santé mentale n'est certainement pas une spécialité, surtout si les données s'avèrent être fausses. Mais s'ils sont réels, nous pourrions le faire avec un échantillon beaucoup plus grand. (Nous disons généralement cela, mais voilà.)

MODIFIER Le graphique peut naturellement être compliqué par un schéma de couleurs ordinales si vous le souhaitez:

entrez la description de l'image ici

Pour mémoire: les graphiques utilisaient le code Stata, y compris mon propre programme tabplottéléchargeable à l'aide ssc inst tabplot.

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*4)) bfcolor(emerald*0.2)

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*2)) ///
sep(improvement2) bar3(bfcolor(emerald*0.2)) bar2(bfcolor(emerald*0.6)) ///
bar1(bfcolor(emerald)) barall(blcolor(green)) 
Nick Cox
la source
Existe-t-il de toute façon que vous pouvez télécharger votre graphique avec un jeu de couleurs qui reflète la nature ordinale des données? Quel logiciel avez-vous également utilisé pour créer le visuel?
Alejandro Ochoa
Ce sont de très beaux complots
shadowtalker
4

J'aime utiliser un axe x à 2 niveaux pour des données comme celle-ci. Ainsi, vos catégories d'axe des x pour un seul graphique peuvent être:

  • Traitement = 0, ligne de base = doux
  • Traitement = 0, ligne de base = modéré
  • Traitement = 0, ligne de base = sévère
  • Traitement = 1, ligne de base = doux
  • Traitement = 1, ligne de base = modéré
  • Traitement = 1, ligne de base = sévère

... avec les mêmes dénombrements par catégories [aucune / modérée / substantielle] barres d'histogramme.

Maximum d'énergie
la source
+1. Je suis d'accord avec l'idée principale ici, telle que mise en œuvre dans ma réponse. Je ne peux pas dire à quel point la conception de mon graphique à barres est proche de ce que vous imaginiez.
Nick Cox
Merci, votre graphique est superbe. Avez-vous essayé de le regarder avec Traitement 0/1 comme catégorie externe et Ligne de base = Léger / Modéré / Grave comme catégorie plus proche de l'axe des x? Je pense que si vous le présentiez de cette façon, vous verriez un schéma plus clair de - car dans le traitement = 0, les barres d'amélioration "substantielles" augmentent régulièrement à mesure que la ligne de base passe de légère / modérée / sévère. Et que vous verriez le même schéma (dans une moindre mesure) dans le traitement = 1. En général, je mets la variable avec moins de catégories (par exemple le traitement ici) à l'extérieur. Mais peut-être que vous l'avez déjà vu de cette façon.
Max Power
Je n'ai pas essayé dans l'autre sens, mais je pensais que le chercheur voudrait peut-être le plus comparer les effets des traitements avec une base de référence, ce qui devrait être plus facile à faire.
Nick Cox
Cela me semble logique.
Max Power
4

Le tracé Mosaic n'est-il pas spécialement conçu à cet effet?

En R ce serait comme

library(vcd)
d = read.table("data.dat", header=TRUE)
tab = xtabs(frequency ~ treatment+baseline+improvement, data=d)
mosaic(data=tab,~ treatment+baseline+improvement, shade=TRUE, cex=2.5)

Chaque variable catégorielle va à un bord du carré, qui est subdivisé par ses étiquettes. (Ainsi, si vous subdivisez chaque bord à un seul niveau, au plus 4 variables catégorielles peuvent être représentées. À mon humble avis, au-delà de 3, il devient compliqué et plus difficile à interpréter). La taille des rectangles est proportionnelle à la fréquence. C'est l'idée principale derrière l'intrigue mosaïque et c'est la même chose dans cette réponse et la réponse de Paweł Kleka.

Les différences sont dans les dispositions de ces rectangles et «subtilités» fournies par un R-package spécifique utilisé pour ce type de tracé. Comme vous le voyez dans la réponse de Paweł Kleka, le graphicspackage subdivise le bord supérieur à 2 niveaux au lieu d'utiliser le bord droit. J'ai utilisé un vcdpackage avec des options par défaut, de sorte que la couleur indique le degré d'association entre les variables. Le gris signifie que les données sont cohérentes avec (vous ne pouvez pas rejeter l'hypothèse de) l'indépendance des variables. Le bleu signifie qu'il existe une association positive entre une ligne de base "sévère" et une amélioration "substantielle" pour le traitement "0" et "1". (Surprise, surprise! Je le traduis comme suit: si vous souffrez d'une dépression sévère, vous vous améliorerez probablement sensiblement, que vous receviez ou non un traitement.

On peut ajuster l'intrigue en fonction de ses besoins, voir par exemple ici . Le paquet a également plusieurs vignettes, google "exemple de mosaïque vcd" (comme je viens de le faire). L'article de Wikipédia cité au tout début explique également comment construire ce type d'intrigue et d'intuition derrière.

entrez la description de l'image ici

Lorsque vous comparez ma photo avec la photo de la réponse de Paweł Kleka, peu importe, ce «traitement» se trouve sur le bord gauche de chaque photo. Vous pouvez facilement changer l'emplacement du bord en changeant la dernière ligne de mon code et ajuster la mise en page en fonction de vos besoins. La pratique courante est que vers la gauche va la variable la plus importante ou la variable avec le moins d'étiquettes. Vous pouvez également modifier l'ordre des étiquettes (par exemple, de sorte que sur le bord droit, l'ordre soit "non modérément substantiel") en rendant la variable de facteur correspondante dans R ordonnée et en ajustant ses niveaux.

lanenok
la source
Il y a au moment d'écrire deux réponses sur des parcelles en mosaïque. Il serait utile que chacun de vous développe ce que montre votre intrigue et pourquoi elle est utile, notamment parce que les intrigues sont assez différentes.
Nick Cox
@NickCox celui-ci est certainement différent des autres. Ils sont à peine le même affichage
shadowtalker
Ils ont tous deux un traitement sur l'axe y. Ce qui serait de l'or de leurs partisans est un commentaire sur les avantages et les limites de chaque affichage.
Nick Cox
Merci d'avoir élargi votre réponse. Je pense que l'intérêt ici est susceptible de comparer les réponses en fonction du traitement et de la ligne de base. Je suis naturellement d'accord que vous pouvez bricoler avec quelle variable va où, mais avez-vous essayé les autres possibilités et laquelle fonctionne le mieux? En examinant la réponse ici, le lecteur doit comparer deux rangées de blocs simultanément.
Nick Cox
@Nick Cox Merci pour vos commentaires. C'est la seule chose qui m'a motivé à me développer. Je n'ai pas essayé d'autres possibilités. En fait, je pense que si l'auteur de la question trouve ce type d'intrigue utile, il devrait tout essayer, puis poster et expliquer les résultats pour la communauté. Soit dit en passant, je ne dis pas que ce type de complot est meilleur que d'autres. Le fait est qu'il a été spécialement conçu pour les variables catégorielles et pour visualiser l'indépendance et / ou la violation de l'indépendance.
lanenok
3

Je suggère d'utiliser un tracé en mosaïque

mosaicplot(table(moz), sort = c(3,1,2), color = T)

mosaïque ()

Paweł Kleka
la source
Il y a au moment d'écrire deux réponses sur des parcelles en mosaïque. Il serait utile que chacun de vous développe ce que montre votre intrigue et pourquoi elle est utile, notamment parce que les intrigues sont assez différentes.
Nick Cox
2

Une option que je considérerais est d'utiliser des ensembles parallèles. Certaines comparaisons seront plus faciles que d'autres, mais vous pouvez toujours voir les relations entre trois variables catégorielles.

Voici un exemple avec des données Titanic Survival:

Voici un exemple avec des données de survie Titanic.

Dans R (compte tenu de vos balises), j'ai utilisé ggparallel pour l'implémenter. Certaines personnes ont discuté ici sur CV comment l'implémenter d'autres manières.

nazareno
la source
J'ai du mal à imaginer ça. Y a-t-il une chance que vous puissiez simuler un exemple?
shadowtalker
Une ligne dans le tracé a sa largeur proportionnelle à la fréquence des cooccurrences de deux catégories. Pour les données utilisées dans les graphiques de la question d'origine, il y aurait trois axes horizontaux: dépression de base, traitement et amélioration de la dépression. Dans chacun, il existe des zones distinctes pour chaque niveau de cette catégorie. Les cooccurrences sont liées, avec une largeur représentant leur fréquence.
nazareno
2

Les informations peuvent également être transmises à l'aide d'un graphique linéaire simple:

entrez la description de l'image ici

L'amélioration est indiquée par différents types de lignes tandis que le groupe de lignes de base est affiché en couleurs. Ceux-ci et le paramètre de l'axe des x (traitement ici) peuvent également être échangés si vous le souhaitez.

rnso
la source
1

Semblable aux ensembles parallèles, comme indiqué par nazareno ci-dessus, vous pouvez utiliser des tracés alluviaux qui sont disponibles à partir du package alluvial R. http://www.r-bloggers.com/alluvial-diagrams/

Ankur Chakravarthy
la source