Dağılımları karşılaştırmak için iyi veri görselleştirme teknikleri nelerdir?


25

Doktora tezimi yazıyorum ve dağıtımları karşılaştırmak için aşırı derecede kutulara dayandığımı anladım. Bu görevi başarmak için başka hangi alternatifleri seviyorsunuz?

Ayrıca, veri görselleştirmesi konusunda farklı fikirler ile kendime ilham verebileceğim R galeriden başka bir kaynak biliyor musunuz diye sormak istiyorum.


6
Bence seçim, karşılaştırmak istediğiniz özelliklere de bağlı. Histogramları düşünebilirsiniz hist; düzleştirilmiş yoğunluklar density; QQ grafikleri qqplot; kök ve yaprak arazileri (biraz eski) stem. Ayrıca, Kolmogorov Smirnov testi iyi bir tamamlayıcı olabilir ks.test.

1
Histogram, çekirdek yoğunluğu tahmini veya keman arsasına ne dersiniz?
Alexander,

Kök ve yaprak çizimleri histogramlara benzer, ancak her bir gözlemin tam değerini belirlemenizi sağlayan ek özelliği ile. Veriler hakkında, bir kutu veya q histogramından aldığınızdan daha fazla bilgi içerir.
Michael R. Chernick

2
@Procrastinator, bu iyi bir cevap kazanıyor, eğer biraz daha ayrıntılı olarak anlatmak isterseniz, bunu cevaba dönüştürebilirsiniz. Pedro, ayrıca ilginizi çekebilir bu ilk grafiksel veri keşif kapsayan,. Tam olarak istediğin bu değil, ama yine de ilgini çekebilir.
gung - Monica'yı yeniden yerleştir

1
Teşekkürler millet, bu seçeneklerin farkındayım ve bazılarını zaten kullandım. Yaprak grafiğini kesinlikle incelemedim. Sağladığınız bağlantıya ve @Procastinator'ın cevabı
pedrosaurio'ya

Yanıtlar:


24

@Gung tarafından önerildiği gibi yorumumu detaylandıracağım. Aynı zamanda @Alexander tarafından önerilen keman grafiğini de ekleyeceğim. Bu araçlardan bazıları ikiden fazla numuneyi karşılaştırmak için kullanılabilir.

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

Umarım bu yardımcı olur.


14

Önerilerinizi biraz daha inceledikten sonra, @Procastinator'ın cevabını tamamlamak için bu tür bir komplo buldum. 'Arı sürüsü' olarak adlandırılır ve scatter arsa ile aynı ayrıntı seviyesine sahip keman arsalı ile bir arsa karışımıdır.

arındırma R paketi

bal arısı arsa örneği


2
Ben de dahil ettim beanplot.

7

Bir not:

Verilerinizle ilgili soruları cevaplamak ve görselleştirme yönteminin kendisi hakkında soru oluşturmak istemiyorsunuz. Sık sık, sıkıcı iyidir. Karşılaştırmaların karşılaştırılmasını da kavramalarını kolaylaştırır.

Bir cevap:

R'nin temel paketinin ötesinde basit biçimlendirmeye duyulan ihtiyaç muhtemelen Hadley'in ggplot paketinin R'deki popülaritesini açıklıyor.

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

Sonunda, basit bir arka plan eklemenin yardımcı olduğunu buldum. Bu yüzden panel.first tarafından çağrılabilecek "bgfun" yazdım.

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) Güzel cevap. Ben eklemek istiyorum alpha=0.5(ilk planıyla geom_density()örtüşen kısımlar gizli kalmaz böylece).
smillig

Alpha = .5 ile aynı fikirdeyim. Sözdizimini hatırlayamıyorum!
geneorama

7

İşte R ve ABD eyaleti suç verilerini kullanan Nathan Yau'nun Akan Veri blogundan güzel bir ders . Gösteriyor:

  • Box-and-Whisker Plots (kullanımda olan)
  • histogramlar
  • Çekirdek Yoğunluğu Grafikleri
  • Halı Sahaları
  • Keman Arazileri
  • Fasulye Tarlaları (ortada bir halıya sahip bir kutu arsa, yoğunluk arsa, garip bir combo).

Son zamanlarda kendimi CDF'leri histogramlardan çok daha fazla çizerim.


1
Çekirdek yoğunluğu grafikleri için +1. Çoklu popülasyonları çizmek için histogramlarından çok daha az 'meşgul'.
Doresoom

3

Göreceli dağılım: Özellikle daha iyi bilinmesi gereken dağılımları karşılaştırmak için bir kavram var.

Y0,YF0,FF0

R,=F0(Y)
R,YY0F0(Y0)

Bir örneğe bakalım. Http://www.math.hope.edu/swanson/data/cellphone.txt web sitesi , erkek ve kız öğrencilerin son telefon görüşmesinin uzunluğu hakkında veri vermektedir. Erkek öğrenciler için telefon uzunluğu dağılımını, kadın öğrencilerle birlikte referans olarak verelim.

Telefon uzunluğunun nispi dağılımı, erkeklerle karşılaştırıldığında kadınlar

xT

Aynı arsayı bağıl yoğunluk eğrisi etrafındaki noktalara dayalı güven aralıklarıyla da yapabiliriz:

Noktasal güven aralığı ile bağıl dağılım grafiği

Bu durumda geniş güven bantları küçük örneklem büyüklüğünü yansıtmaktadır.

Bu yöntem hakkında bir kitap var: Handcock

Arsa için R kodu burada:

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

Son arsa değişikliği için:

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

Alanların, çekirdek yoğunluğu tahmini kullanılarak, gcv (genelleştirilmiş çapraz doğrulama) ile seçilen düzgünlük derecesi ile üretildiğine dikkat edin.

S0F0rR,yr

g(r)=f(S0(r))f0(S0(r))
g(r)=f(yr)f0(yr)r(0,1)

1

Sadece yoğunlukları tahmin etmeyi ve onları çizmeyi seviyorum.

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)

görüntü tanımını buraya girin


Neden pdf'in içini renklendiriyorsunuz (eğrinin altında)?
kurtlar

Bence daha güzel görünüyor.
TrynnaDoStat 18:16

Belki de - ama görsel olarak uygunsuz olabilecek, kütle veya alan taşıma yanlış izlenimini verebilir.
kurtlar

1
Ampirik olasılık kütlesini iletir.
Lepidopterist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.