Visualisation des données la plus sous-utilisée [fermé]

178

Les histogrammes et les nuages ​​de points sont d'excellentes méthodes de visualisation des données et de la relation entre les variables, mais récemment, je me suis demandé quelles techniques de visualisation me manquaient. Selon vous, quel est le type d'intrigue le plus sous-utilisé?

Les réponses doivent:

  1. Ne pas être très couramment utilisé dans la pratique.
  2. Soyez compréhensible sans beaucoup de discussion de fond.
  3. Être applicable dans de nombreuses situations courantes.
  4. Incluez du code reproductible pour créer un exemple (de préférence en R). Une image liée serait bien.
Boursiers Ian
la source
13
Je pense que c'est une discussion très utile, et je suis triste qu'elle soit fermée.
Alex Brown
2
@AlexBrown: alors pourquoi ne pas voter pour la réouverture? Je peux voir pourquoi le libellé de cette question peut sembler «non constructif», mais cette question a abouti à certaines des réponses les plus réfléchies et les plus perspicaces sur ce sujet sur le Web. J'aimerais voir ces réponses mises à jour et étendues.
max
2
Cela devrait probablement être déplacé vers stats.stackoverflow.com. C'est beaucoup plus adapté à ce site.
naught101
4
Dommage que personne n'ait mentionné les parcelles QQ ici avant que cela ne soit fermé. Ils sont tellement utiles!
naught101
Cela devrait être rouvert.
Peter Flom

Réponses:

89

Je suis vraiment d'accord avec les autres affiches: les livres de Tufte sont fantastiques et valent la peine d'être lus.

Tout d'abord, je voudrais vous signaler un très bon tutoriel sur ggplot2 et ggobi de "Looking at Data" plus tôt cette année. Au-delà de cela, je soulignerais simplement une visualisation de R et deux packages graphiques (qui ne sont pas aussi largement utilisés que les graphiques de base, le treillis ou ggplot):

Cartes thermiques

J'aime beaucoup les visualisations qui peuvent gérer des données multivariées, en particulier des données de séries chronologiques. Les cartes thermiques peuvent être utiles pour cela. Un très joli a été présenté par David Smith sur le blog Revolutions . Voici le code ggplot gracieuseté de Hadley:

stock <- "MSFT"
start.date <- "2006-01-12"
end.date <- Sys.Date()
quote <- paste("http://ichart.finance.yahoo.com/table.csv?s=",
                stock, "&a=", substr(start.date,6,7),
                "&b=", substr(start.date, 9, 10),
                "&c=", substr(start.date, 1,4), 
                "&d=", substr(end.date,6,7),
                "&e=", substr(end.date, 9, 10),
                "&f=", substr(end.date, 1,4),
                "&g=d&ignore=.csv", sep="")    
stock.data <- read.csv(quote, as.is=TRUE)
stock.data <- transform(stock.data,
  week = as.POSIXlt(Date)$yday %/% 7 + 1,
  wday = as.POSIXlt(Date)$wday,
  year = as.POSIXlt(Date)$year + 1900)

library(ggplot2)
ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + 
  geom_tile(colour = "white") + 
  scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + 
  facet_wrap(~ year, ncol = 1)

Ce qui finit par ressembler un peu à ceci:

texte alternatif

RGL: graphiques 3D interactifs

RGL , qui offre facilement la possibilité de créer des graphiques 3D interactifs, en vaut la peine . Il existe de nombreux exemples en ligne pour cela (y compris dans la documentation de rgl).

Le R-Wiki a un bel exemple de la façon de tracer des nuages ​​de points 3D en utilisant rgl.

GGobi

Un autre paquet qui vaut la peine d'être connu est rggobi . Il y a un livre Springer sur le sujet , et beaucoup de bons documents / exemples en ligne, y compris le cours "Looking at Data" .

Shane
la source
agréable. Merci d'avoir inclus le code / l'image.
Ian Fellows
qu'indique la position verticale du «Z» ou du pli dans chaque ligne verticale noire pleine?
doug le
Ce sont des limites de mois (les mois ne se terminent pas le même jour).
Shane
3
C'est beau. Comment avez-vous établi les limites du mois?
Alex Brown
58

J'aime beaucoup les dotplots et je trouve que lorsque je les recommande à d'autres pour des problèmes de données appropriés, ils sont invariablement surpris et ravis. Ils ne semblent pas être très utilisés et je ne comprends pas pourquoi.

Voici un exemple de Quick-R: dotplot sur les données de la voiture

Je crois que Cleveland est le plus responsable du développement et de la promulgation de ceux-ci, et l'exemple de son livre (dans lequel des données défectueuses ont été facilement détectées avec un dotplot) est un argument puissant pour leur utilisation. Notez que l'exemple ci-dessus ne met qu'un point par ligne, alors que leur puissance réelle vient avec vous avez plusieurs points sur chaque ligne, avec une légende expliquant lequel est lequel. Par exemple, vous pouvez utiliser des symboles ou des couleurs différents pour trois moments différents, et ainsi facilement avoir une idée des modèles de temps dans différentes catégories.

Dans l'exemple suivant (fait dans Excel de toutes choses!), Vous pouvez clairement voir quelle catégorie a pu souffrir d'un échange d'étiquettes.

Dotplot avec 2 groupes

Ari B. Friedman
la source
1
En quoi un dotplot est-il différent d'un nuage de points avec un axe commuté dont l'un est catégorique?
DrSAR
4
@DrSAR En quoi un histogramme est-il différent d'un graphique à barres ou un graphique de densité différent d'un graphique linéaire? Vous pouvez décrire de nombreux types de graphiques standard en termes de géométries plus fondamentales (cf. Semiologie graphique de Bertin ), mais cela ne rend pas la compréhension de tracer quelque chose d'une manière particulière moins unique. Dans ce cas, vous tracez deux éléments d'information catégorielle (un verticalement, un par la forme du caractère de traçage) par rapport à un élément de données continues. Alors que dans la plupart des logiciels, vous pirateriez un nuage de points pour le créer, ce n'est surtout pas un nuage de points.
Ari B.Friedman
2
@ gsk3 Je ne voulais pas paraître sournois. En fait, je me rends compte maintenant (après en avoir lu plus sur la grammaire des graphiques et des travaux similaires) que cette distinction de niveau supérieur peut être très importante pour la présentation. Merci de l'avoir montré.
DrSAR
@DrSAR Et je ne voulais pas paraître sur la défensive. Nature des commentaires SO je suppose ;-)
Ari B. Friedman
56

Les graphiques utilisant des coordonnées polaires sont certainement sous-utilisés - certains diraient avec raison. Je pense que les situations qui justifient leur utilisation ne sont pas courantes; Je pense aussi que lorsque ces situations se présentent, les graphiques polaires peuvent révéler des modèles dans les données que les graphiques linéaires ne peuvent pas.

Je pense que c'est parce que parfois vos données sont intrinsèquement polaires plutôt que linéaires - par exemple, elles sont cycliques (coordonnées x représentant des heures pendant une journée de 24 heures sur plusieurs jours), ou les données ont déjà été mappées sur un espace polaire.

Voici un exemple. Ce graphique montre le volume de trafic moyen d'un site Web par heure. Remarquez les deux pointes à 22 h et à 1 h du matin. Pour les ingénieurs réseau du site, ceux-ci sont importants; il est également significatif qu'ils se produisent à proximité les uns des autres (à seulement deux heures d'intervalle). Mais si vous tracez les mêmes données sur un système de coordonnées traditionnel, ce modèle serait complètement masqué - tracé linéairement, ces deux pointes seraient espacées de 20 heures, ce qu'elles sont, bien qu'elles ne soient également qu'à deux heures d'intervalle sur des jours consécutifs. La carte polaire ci-dessus montre cela de manière parcimonieuse et intuitive (une légende n'est pas nécessaire).

Carte polaire montrant le trafic sur le site, avec des pics aux heures 1 et 22

Il y a deux façons (dont je suis conscient) de créer des tracés comme celui-ci en utilisant R (j'ai créé le tracé ci-dessus w / R). La première consiste à coder votre propre fonction dans les systèmes graphiques de base ou de grille. L'autre façon, qui est plus simple, est d'utiliser le paquet circulaire . La fonction que vous utiliseriez est ' rose.diag ':

data = c(35, 78, 34, 25, 21, 17, 22, 19, 25, 18, 25, 21, 16, 20, 26, 
                 19, 24, 18, 23, 25, 24, 25, 71, 27)
three_palettes = c(brewer.pal(12, "Set3"), brewer.pal(8, "Accent"), 
                   brewer.pal(9, "Set1"))
rose.diag(data, bins=24, main="Daily Site Traffic by Hour", col=three_palettes)
doug
la source
4
En copiant votre code, j'obtiens un tracé très différent (c'est assez moche); une idée pourquoi? Je reçois cet avertissement: 1: Dans as.circular (xx [, 1]): un objet est contraint à la classe «circulaire» en utilisant la valeur par défaut pour les composants suivants: type: unités «angles»: modèle «radians»: none 'modulo:' asis 'zero: 0 rotation:' counter 'rose.diagdata24 Trafic quotidien du site par Hourthree_palettes
datayoda
J'ai le même problème.
crayola le
Vous pouvez également le faire avec un graphique linéaire. Cela peut être un peu plus difficile à lire, mais cela peut aussi être vraiment génial pour des données plus granulaires, ou des données qui subissent plus d'un cycle (par exemple, tracez dix cycles, puis tracez leur moyenne).
rien101
1
J'ai également eu du mal à reproduire l'intrigue. J'ai finalement décidé qu'il était plus facile d'utiliser ggplot2. J'ai laissé une courte démo sur Rpubs avec le code et les résultats: rpubs.com/mattbagg/circular
MattBagg
1
ggplot2 équivalent:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
naught101
54

Si votre nuage de points a tellement de points qu'il devient un désordre complet, essayez un nuage de points lissé. Voici un exemple:

library(mlbench) ## this package has a smiley function
n <- 1e5 ## number of points
p <- mlbench.smiley(n,sd1 = 0.4, sd2 = 0.4) ## make a smiley :-)
x <- p$x[,1]; y <- p$x[,2]
par(mfrow = c(1,2)) ## plot side by side
plot(x,y) ## left plot, regular scatter plot
smoothScatter(x,y) ## right plot, smoothed scatter plot

Le hexbinpaquet (suggéré par @Dirk Eddelbuettel) est utilisé dans le même but, mais smoothScatter()a l'avantage qu'il appartient au graphicspaquet, et fait donc partie de l'installation standard de R.

Smiley sous forme de nuage de points régulier ou lissé

nullglob
la source
6
Par souci d'exhaustivité, vous pouvez également obtenir cet effet dans ggplot en utilisant la transparence (alpha).), En combinaison avec geom point.
Paul Hiemstra
1
est-ce la même chose que l'estimation de la densité du noyau, ou est-ce juste similaire?
endolith
30

En ce qui concerne sparkline et autre idée Tufte, le package YaleToolkit sur CRAN fournit des fonctions sparklineetsparklines .

Un autre package utile pour les ensembles de données plus volumineux est hexbin, car il `` classe '' intelligemment les données dans des compartiments pour traiter des ensembles de données qui peuvent être trop volumineux pour des nuages ​​de points naïfs.

Dirk Eddelbuettel
la source
4
+1 aux graphiques sparkline. Je travaille actuellement sur un package qui se concentre sur la création de sparkline dans R - ils apportent d'excellents ajouts aux tableaux dans les rapports Sweave.
Sharpie
1
Cool! Je ne suis pas trop content de ce que Jay a dans YaleToolkit et j'aimerais avoir des sparklines dans les tableaux!
Dirk Eddelbuettel
Je viens de documenter un moyen de produire des graphiques sparkline en utilisant uniquement plotover dans une mise à jour de ma question , avec l'aide de ce message du forum Tufte
Ben
1
La Hmisc::latex()version de sortie de Hmisc::describeinclut un mini-histogramme qui est inclus dans le tableau.
IRTFM
28

Les parcelles de violon (qui combinent des boîtes à moustaches avec une densité de noyau) sont relativement exotiques et plutôt cool. Le vioplot package dans R vous permet de les créer assez facilement.

Voici un exemple (le lien wikipedia montre également un exemple):

entrez la description de l'image ici

Jason Sundram
la source
3
Les parcelles de violon sont également disponibles via le package lattice:bwplot(... panel = panel.violin)
David J.
3
version ggplot2 des parcelles de violon à venir. github.com/wch/ggplot2/wiki/geom_violin
Roman Luštrik
Je n'aime pas que les parcelles de violon soient si utiles, j'aime montrer tous les points avec une gigue à la place.
Nakx
25

Une autre belle visualisation de séries chronologiques que je viens de passer en revue est le "graphique en relief" (tel que présenté dans cet article sur le blog "Learning R" ). Ceci est très utile pour visualiser les changements de position dans le temps.

Vous pouvez lire comment le créer sur http://learnr.wordpress.com/ , mais voici à quoi il finit par ressembler:

texte alternatif

Shane
la source
J'aime le graphique en relief pour ces données particulières, mais j'ai du mal à penser à des situations plus générales où il serait utile. Cela dit, je pense que nous pouvons tous convenir que le blog Learning R fait vibrer les chaussettes.
Ian Fellows
7
Un graphique en relief est un tracé de coordonnées parallèles de données classées.
hadley
1
cela me rappelle slopegraph qui est bon pour représenter les changements de classement au fil du temps ou les relations entre les classements: charliepark.org/slopegraphs
topchef
21

J'aime aussi les modifications des boîtes à moustaches de Tufte qui vous permettent de faire de petites comparaisons multiples beaucoup plus facilement car elles sont très "minces" horizontalement et n'encombrent pas l'intrigue avec de l'encre redondante. Cependant, cela fonctionne mieux avec un assez grand nombre de catégories; si vous n'en avez que quelques-uns sur une parcelle, les boîtes à moustaches régulières (Tukey) ont une meilleure apparence car elles ont un peu plus de poids.

library(lattice)
library(taRifx)
compareplot(~weight | Diet * Time * Chick, 
  data.frame=cw , 
  main = "Chick Weights",
  box.show.mean=FALSE,
  box.show.whiskers=FALSE,
  box.show.box=FALSE
  )

comparaison

D'autres façons de les faire (y compris l'autre type de boîte à moustaches Tufte) sont discutées dans cette question .

Ari B. Friedman
la source
@daroczig Merci. Un de ces jours, je vais le réécrire pour prendre différentes configurations de regroupements. J'ai beaucoup appris depuis que j'ai écrit cette fonction!
Ari
1
J'aime beaucoup mieux vos intrigues que celles de Tufte, qui sont ridiculement difficiles à lire. Je pense toujours que les boîtes à moustaches de style Tukey sont meilleures, bien qu'un bon compromis puisse être quelque chose comme ce que vous avez ici, mais avec des lignes de 3px de large pour la boîte, au lieu du décalage de 1px. Et je pense qu'une ligne horizontale large de 1px pour la médiane est probablement plus nette et plus exacte.
naught101
19

Nous ne devons pas oublier la parcelle de tiges et de feuilles mignonne et (historiquement) importante (que Tufte aime aussi!) Vous obtenez un aperçu directement numérique de la densité et de la forme de vos données (bien sûr, si votre ensemble de données n'est pas plus grand, environ 200 points). Dans R, la fonction stemproduit votre affichage tige et feuille (dans l'espace de travail). Je préfère utiliser la gstemfonction du package fmsb pour le dessiner directement dans un périphérique graphique. Vous trouverez ci-dessous une variance de la température corporelle du castor (les données doivent être dans votre ensemble de données par défaut) dans un affichage tige par feuille:

  require(fmsb)
  gstem(beaver1$temp)

entrez la description de l'image ici

Geek On Acid
la source
15

En plus de l'excellent travail de Tufte, je recommande les livres de William S. Cleveland: Visualizing Data and The Elements of Graphing Data . Non seulement ils sont excellents, mais ils ont tous été réalisés en R, et je crois que le code est accessible au public.

Peter Flom
la source
14

Boîtes à moustaches! Exemple de l'aide R:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")

À mon avis, c'est le moyen le plus pratique de jeter un coup d'œil rapide sur les données ou de comparer les distributions. Pour les distributions plus complexes, il existe une extension appelée vioplot.

mbq
la source
2
Beanplot pourrait mentionner ici aussi jstatsoft.org/v28/c01/paper et cran.r-project.org/web/packages/beanplot/index.html
radek
Les boxplots ne sont-ils pas sous-utilisés? Je veux dire, bien sûr, dans de nombreux articles, les graphiques à barres sont utilisés pour les données qui devraient être encadrées, mais ils sont encore assez courants.
rien101
11

Les parcelles en mosaïque me semblent répondre aux quatre critères mentionnés. Il y a des exemples dans r, sous mosaicplot.

Peter Flom
la source
3
Une meilleure implémentation des graphiques en mosaïque est dans la bibliothèque vcd (nom de la fonction «mosaïque»). Il a une signature de méthode beaucoup plus flexible et il est implémenté en grille (plutôt que dans le système graphique «de base»).
doug
10

Découvrez le travail d'Edward Tufte et en particulier ce livre

Vous pouvez également essayer de voir sa présentation itinérante . C'est assez bon et comprend un paquet de quatre de ses livres. (je jure que je ne possède pas le stock de son éditeur!)

Au fait, j'aime sa technique de visualisation de données sparkline. Surprise! Google l'a déjà écrit et l'a publié sur Google Code

Paul Sasik
la source