Apa teknik visualisasi data yang baik untuk membandingkan distribusi?

25

Saya menulis tesis PhD saya dan saya menyadari bahwa saya sangat mengandalkan plot kotak untuk membandingkan distribusi. Alternatif lain apa yang Anda sukai untuk mencapai tugas ini?

Saya juga ingin bertanya apakah Anda tahu sumber daya lain sebagai galeri R di mana saya dapat menginspirasi diri saya dengan berbagai ide tentang visualisasi data.

pedrosaurio
sumber
6
Saya pikir pilihannya juga tergantung pada fitur yang ingin Anda bandingkan. Anda mungkin mempertimbangkan histogram, hist; kepadatan merapikan, density; QQ-plot qqplot; plot batang dan daun (agak kuno) stem. Selain itu, tes Kolmogorov-Smirnov mungkin merupakan pelengkap yang baik ks.test.
1
Bagaimana dengan histogram, perkiraan kepadatan kernal, atau plot biola?
Alexander
Plot batang dan daun seperti histogram tetapi dengan fitur tambahan yang memungkinkan Anda untuk menentukan nilai yang tepat dari setiap pengamatan. Ini berisi lebih banyak informasi tentang data daripada yang Anda dapatkan dari boxplot atau q histogram.
Michael R. Chernick
2
@Prastrastator, yang memiliki kemampuan untuk menghasilkan jawaban yang baik, jika Anda ingin sedikit menjelaskannya, Anda dapat mengubahnya menjadi jawaban. Pedro, Anda mungkin juga tertarik dengan ini , yang mencakup eksplorasi data grafis awal. Bukan itu yang Anda minta, tapi mungkin menarik bagi Anda.
gung - Reinstate Monica
1
Terima kasih teman-teman, saya mengetahui opsi-opsi itu dan sudah menggunakan beberapa dari mereka. Saya tentu belum menjelajahi plot daun. Saya akan melihat lebih dalam pada tautan yang Anda berikan dan pada jawaban @Procastinator
@Procastinator pedrosaurio

Jawaban:

24

Saya akan menguraikan komentar saya, seperti yang disarankan oleh @gung. Saya juga akan memasukkan plot biola yang disarankan oleh @Alexander, untuk kelengkapannya. Beberapa alat ini dapat digunakan untuk membandingkan lebih dari dua sampel.

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

Saya harap ini membantu.

pengguna10525
sumber
14

Setelah menjelajahi sedikit lebih banyak pada saran Anda, saya menemukan plot semacam ini untuk melengkapi jawaban @Procastinator. Ini disebut 'bee swarm' dan merupakan campuran plot kotak dengan plot biola dengan tingkat detail yang sama dengan plot pencar.

paket beeswarm R.

contoh plot lebah

pedrosaurio
sumber
2
Saya juga sudah termasuk beanplot.
7

Sebuah catatan:

Anda ingin menjawab pertanyaan tentang data Anda, dan tidak membuat pertanyaan tentang metode visualisasi itu sendiri. Seringkali, membosankan lebih baik. Itu membuat perbandingan perbandingan lebih mudah untuk dipahami juga.

Sebuah jawaban:

Kebutuhan format sederhana di luar paket dasar R mungkin menjelaskan popularitas paket ggplot Hadley di 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"))

Akhirnya, saya menemukan bahwa menambahkan latar belakang sederhana membantu. Itulah sebabnya saya menulis "bgfun" yang dapat dipanggil oleh 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)
geneorama
sumber
(+1) Jawaban yang bagus. Saya akan menambahkan alpha=0.5plot pertama (ke geom_density()) sehingga bagian yang tumpang tindih tidak disembunyikan.
smillig
Saya setuju dengan alpha = .5 Saya tidak dapat mengingat sintaksnya!
geneorama
7

Ini a tutorial yang bagus dari blog Nathan Yau Flowing Data menggunakan data kejahatan tingkat negara bagian R dan AS. Itu menunjukkan:

  • Box-and-Whisker Plots (yang sudah Anda gunakan)
  • Histogram
  • Plot Kepadatan Kernel
  • Plot karpet
  • Petak Biola
  • Bean Plots (kombo aneh plot kotak, plot kepadatan, dengan karpet di tengah).

Akhir-akhir ini, saya mendapati diri saya merencanakan CDF lebih dari sekadar histogram.

Dimitriy V. Masterov
sumber
1
+1 untuk plot kepadatan kernel. Mereka jauh lebih 'sibuk' daripada histogram untuk merencanakan beberapa populasi.
Doresoom
3

Ada konsep khusus untuk membandingkan distribusi, yang seharusnya lebih dikenal: distribusi relatif.

Y0,YF0,FF0 sebagai referensi.

R=F0(Y)
RYY0F0(Y0)

Mari kita lihat sebuah contoh. Situs web http://www.math.hope.edu/swanson/data/cellphone.txt memberikan data tentang panjang panggilan telepon terakhir siswa pria dan wanita. Mari kita nyatakan distribusi panjang panggilan telepon untuk siswa pria, dengan siswa wanita sebagai referensi.

Distribusi relatif panjang panggilan telepon, pria dibandingkan dengan wanita

xT (apa pun itu, nilainya tidak ditampilkan) sehingga 20% panggilan wanita lebih pendek (atau sama) untuk itu, kepadatan relatif untuk pria dalam interval itu bervariasi antara sekitar 1,3 dan 1,4. Jika kita memperkirakan (secara mental dari grafik) kerapatan relatif rata-rata dalam interval itu sebesar 1,35, kita melihat bahwa proporsi pria dalam interval itu sekitar 35% lebih tinggi daripada proporsi wanita. Itu sesuai dengan 27% pria dalam interval itu.

Kami juga dapat membuat plot yang sama dengan interval kepercayaan titik-titik di sekitar kurva kepadatan relatif:

plot distribusi relatif dengan interval kepercayaan pointwise

Pita kepercayaan yang luas dalam hal ini mencerminkan ukuran sampel yang kecil.

Ada buku tentang metode ini: Handcock

Kode R untuk plot ada di sini:

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

Untuk perubahan plot terakhir menjadi:

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

Perhatikan bahwa plot diproduksi dengan menggunakan estimasi kerapatan kernel, dengan tingkat kelancaran dipilih melalui gcv (validasi lintas umum).

Q0F0rRyr

g(r)=f(Q0(r))f0(Q0(r))
g(r)=f(yr)f0(yr)r(0,1)
kjetil b halvorsen
sumber
1

Saya suka memperkirakan kepadatan dan plot mereka,

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)

masukkan deskripsi gambar di sini

TrynnaDoStat
sumber
Mengapa Anda mewarnai bagian dalam pdf (di bawah kurva)?
serigala
Saya pikir itu terlihat lebih cantik.
TrynnaDoStat
Mungkin - tetapi ini dapat menyampaikan kesan yang salah - tentang menyampaikan massa atau area, yang mungkin secara visual tidak sesuai.
serigala
1
Ini menyampaikan massa probabilitas empiris.
Lepidopterist