Quelles sont les bonnes techniques de visualisation des données pour comparer les distributions?


25

J'écris ma thèse de doctorat et je me suis rendu compte que je m'appuie excessivement sur les boîtes à moustaches pour comparer les distributions. Quelles autres alternatives aimez-vous pour accomplir cette tâche?

J'aimerais également vous demander si vous connaissez une autre ressource comme la galerie R dans laquelle je peux m'inspirer de différentes idées sur la visualisation des données.


6
Je pense que le choix dépend aussi des fonctionnalités que vous souhaitez comparer. Vous pourriez envisager histogrammes, hist; densité lissées, density; Parcelles QQ qqplot; parcelles de tiges et de feuilles (un peu anciennes) stem. De plus, le test de Kolmogorov-Smirnov pourrait être un bon complément ks.test.

1
Que diriez-vous d'un histogramme, d'une estimation de densité kernale ou d'un complot de violon?
Alexander

Les tracés des tiges et des feuilles sont comme des histogrammes, mais avec la fonction supplémentaire qu'ils vous permettent de déterminer la valeur exacte de chaque observation. Il contient plus d'informations sur les données que ce que vous obtenez à partir d'un diagramme à boîte ou d'un histogramme.
Michael R. Chernick

2
@Procrastinator, qui a l'étoffe d'une bonne réponse, si vous vouliez la développer un peu, vous pourriez la convertir en réponse. Pedro, vous pourriez également être intéressé par ce qui couvre l' exploration de données graphiques initial. Ce n'est pas exactement ce que vous demandez, mais cela pourrait néanmoins vous intéresser.
gung - Rétablir Monica

1
Merci les gars, je connais ces options et j'en ai déjà utilisé certaines. Je n'ai certainement pas exploré l'intrigue des feuilles. J'examinerai plus en détail le lien que vous avez fourni et la réponse de
@Procastinator

Réponses:


24

Je vais développer mon commentaire, comme suggéré par @gung. Je vais également inclure l'intrigue de violon suggérée par @Alexander, par souci d'exhaustivité. Certains de ces outils peuvent être utilisés pour comparer plus de deux échantillons.

# Required packages

library(sn)
library(aplpack)
library(vioplot)
library(moments)
library(beanplot)

# Simulate from a normal and skew-normal distributions
x = rnorm(250,0,1)
y = rsn(250,0,1,5)

# Separated histograms
hist(x)
hist(y)

# Combined histograms
hist(x, xlim=c(-4,4),ylim=c(0,1), col="red",probability=T)
hist(y, add=T, col="blue",probability=T)

# Boxplots
boxplot(x,y)

# Separated smoothed densities
plot(density(x))
plot(density(y))

# Combined smoothed densities
plot(density(x),type="l",col="red",ylim=c(0,1),xlim=c(-4,4))
points(density(y),type="l",col="blue")

# Stem-and-leaf plots
stem(x)
stem(y)

# Back-to-back stem-and-leaf plots
stem.leaf.backback(x,y)

# Violin plot (suggested by Alexander)
vioplot(x,y)

# QQ-plot
qqplot(x,y,xlim=c(-4,4),ylim=c(-4,4))
qqline(x,y,col="red")

# Kolmogorov-Smirnov test
ks.test(x,y)

# six-numbers summary
summary(x)
summary(y)

# moment-based summary
c(mean(x),var(x),skewness(x),kurtosis(x))
c(mean(y),var(y),skewness(y),kurtosis(y))

# Empirical ROC curve
xx = c(-Inf, sort(unique(c(x,y))), Inf)
sens = sapply(xx, function(t){mean(x >= t)})
spec = sapply(xx, function(t){mean(y < t)})

plot(0, 0, xlim = c(0, 1), ylim = c(0, 1), type = 'l')
segments(0, 0, 1, 1, col = 1)
lines(1 - spec, sens, type = 'l', col = 2, lwd = 1)

# Beanplots
beanplot(x,y)

# Empirical CDF
plot(ecdf(x))
lines(ecdf(y))

J'espère que ça aide.


14

Après avoir exploré un peu plus vos suggestions, j'ai trouvé ce type de complot pour compléter la réponse de @Procastinator. Il est appelé «essaim d'abeilles» et est un mélange de boîte à moustaches et de violon avec le même niveau de détail que le nuage de points.

paquet R de beeswarm

exemple de terrain chaud


2
J'ai également inclus beanplot.

7

Une note:

Vous souhaitez répondre à des questions sur vos données et ne pas créer de questions sur la méthode de visualisation elle-même. Souvent, ennuyeux, c'est mieux. Cela rend aussi les comparaisons de comparaisons plus faciles à comprendre.

Une réponse:

La nécessité d'un formatage simple au-delà du package de base de R explique probablement la popularité du package ggplot de Hadley dans R.

library(sn)
library(ggplot2)

# Simulate from a normal and skew-normal distributions
x = rnorm(250,0,1)
y = rsn(250,0,1,5)


##============================================================================
## I put the data into a data frame for ease of use
##============================================================================

dat = data.frame(x,y=y[1:250]) ## y[1:250] is used to remove attributes of y
str(dat)
dat = stack(dat)
str(dat)

##============================================================================
## Density plots with ggplot2
##============================================================================
ggplot(dat, 
     aes(x=values, fill=ind, y=..scaled..)) +
        geom_density() +
        opts(title = "Some Example Densities") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

ggplot(dat, 
     aes(x=values, fill=ind, y=..scaled..)) +
        geom_density() +
        facet_grid(ind ~ .) +
        opts(title = "Some Example Densities \n Faceted") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_density() +
        facet_grid(ind ~ .) +
        opts(title = "Some Densities \n This time without \"scaled\" ") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

##----------------------------------------------------------------------------
## You can do histograms in ggplot2 as well...
## but I don't think that you can get all the good stats 
## in a table, as with hist
## e.g. stats = hist(x)
##----------------------------------------------------------------------------
ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_histogram(binwidth=.1) +
        facet_grid(ind ~ .) +
        opts(title = "Some Example Histograms \n Faceted") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

## Note, I put in code to mimic the default "30 bins" setting
ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_histogram(binwidth=diff(range(dat$values))/30) +
        opts(title = "Some Example Histograms") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

Enfin, j'ai trouvé que l'ajout d'un arrière-plan simple aide. C'est pourquoi j'ai écrit "bgfun" qui peut être appelé par panel.first

bgfun = function (color="honeydew2", linecolor="grey45", addgridlines=TRUE) {
    tmp = par("usr")
    rect(tmp[1], tmp[3], tmp[2], tmp[4], col = color)
    if (addgridlines) {
        ylimits = par()$usr[c(3, 4)]
        abline(h = pretty(ylimits, 10), lty = 2, col = linecolor)
    }
}
plot(rnorm(100), panel.first=bgfun())

## Plot with original example data
op = par(mfcol=c(2,1))
hist(x, panel.first=bgfun(), col='antiquewhite1', main='Bases belonging to us')
hist(y, panel.first=bgfun(color='darkolivegreen2'), 
    col='antiquewhite2', main='Bases not belonging to us')
mtext( 'all your base are belong to us', 1, 4)
par(op)

(+1) Belle réponse. J'ajouterais alpha=0.5au premier tracé pour geom_density()que les parties qui se chevauchent ne soient pas cachées.
smillig

Je suis d'accord sur l'alpha = .5 Je ne me souviens pas de la syntaxe!
geneorama

7

Voici un joli didacticiel du blog Flowing Data de Nathan Yau utilisant des données sur la criminalité au niveau de l'État R et américain. Ça montre:

  • Tracés en boîte et moustaches (que vous utilisez déjà)
  • Histogrammes
  • Tracés de densité du noyau
  • Parcelles de tapis
  • Parcelles de violon
  • Bean Plots (un combo étrange d'un plot box, plot de densité, avec un tapis au milieu).

Dernièrement, je me retrouve à tracer des CDF beaucoup plus que des histogrammes.


1
+1 pour les tracés de densité du noyau. Ils sont beaucoup moins «occupés» que les histogrammes pour tracer plusieurs populations.
Doresoom

3

Il existe un concept spécifique pour comparer les distributions, qui devrait être mieux connu: la distribution relative.

Oui0,OuiF0,FF0

R=F0(Oui)
ROuiOui0F0(Oui0)

Voyons un exemple. Le site Web http://www.math.hope.edu/swanson/data/cellphone.txt fournit des données sur la durée du dernier appel téléphonique des étudiants masculins et féminins. Exprimons la distribution de la durée des appels téléphoniques pour les étudiants masculins, avec les étudiantes comme référence.

Répartition relative de la durée des appels téléphoniques, hommes par rapport aux femmes

XT

Nous pouvons également faire le même tracé avec des intervalles de confiance ponctuels autour de la courbe de densité relative:

tracé de la distribution relative avec intervalle de confiance ponctuel

Les larges bandes de confiance dans ce cas reflètent la petite taille de l'échantillon.

Il existe un livre sur cette méthode: Handcock

Le code R pour l'intrigue est ici:

phone <-  read.table(file="phone.txt", header=TRUE)
library(reldist)
men  <-  phone[, 1]
women <-  phone[, 3]
reldist(men, women)
title("length of mens last phonecall with women as reference")

Pour le dernier tracé, changez en:

reldist(men, women, ci=TRUE)
title("length of mens last phonecall with women as reference\nwith pointwise confidence interval (95%)")

Notez que les graphiques sont produits en utilisant l'estimation de la densité du noyau, avec un degré de lissage choisi via gcv (validation croisée généralisée).

Q0F0rRyr

g(r)=F(Q0(r))F0(Q0(r))
g(r)=F(yr)F0(yr)r(0,1)

1

J'aime juste estimer les densités et les tracer,

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

library(ggplot2)
ggplot(data = iris) + geom_density(aes(x = Sepal.Length, color = Species, fill = Species), alpha = .2)

entrez la description de l'image ici


Pourquoi coloriez-vous l'intérieur du pdf (sous la courbe)?
wolfies

Je pense que ça a l'air plus joli.
TrynnaDoStat

Peut-être - mais cela peut donner l'impression incorrecte - de transmettre une masse ou une zone, ce qui peut être visuellement inapproprié.
wolfies

1
Il véhicule une masse de probabilité empirique.
Lépidoptériste
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.