Các kỹ thuật trực quan dữ liệu tốt để so sánh phân phối là gì?


25

Tôi đang viết luận án tiến sĩ và tôi nhận ra rằng tôi phụ thuộc quá nhiều vào các ô vuông để so sánh các bản phân phối. Những lựa chọn thay thế nào khác mà bạn thích để đạt được nhiệm vụ này?

Tôi cũng muốn hỏi liệu bạn có biết bất kỳ tài nguyên nào khác là thư viện R trong đó tôi có thể truyền cảm hứng cho mình với các ý tưởng khác nhau về trực quan hóa dữ liệu.


6
Tôi nghĩ rằng sự lựa chọn cũng phụ thuộc vào các tính năng bạn muốn so sánh. Bạn có thể xem xét biểu đồ , hist; mật độ mịn , density; Lô đất QQ qqplot; lô gốc và lá (một chút cổ xưa) stem. Ngoài ra, xét nghiệm Kolmogorov-Smirnov có thể là một bổ sung tốt ks.test.

1
Làm thế nào về một biểu đồ, ước tính mật độ hạt nhân, hoặc một âm mưu violin?
Alexander

Các ô gốc và lá giống như biểu đồ nhưng với tính năng được thêm vào, chúng cho phép bạn xác định giá trị chính xác của mỗi quan sát. Nó chứa nhiều thông tin về dữ liệu hơn bạn nhận được từ biểu đồ boxplot hoặc q.
Michael R. Chernick

2
@Procrastinator, có những câu trả lời hay, nếu bạn muốn giải thích một chút, bạn có thể chuyển nó thành câu trả lời. Pedro, bạn cũng có thể quan tâm đến điều này , bao gồm khám phá dữ liệu đồ họa ban đầu. Đó không phải là chính xác những gì bạn yêu cầu, nhưng dù sao cũng có thể khiến bạn quan tâm.
gung - Phục hồi Monica

1
Cảm ơn các bạn, tôi biết những lựa chọn đó và đã sử dụng một vài trong số chúng. Tôi chắc chắn chưa khám phá cốt truyện lá. Tôi sẽ có cái nhìn sâu hơn về liên kết bạn đã cung cấp và câu trả lời của
@Procastinator

Câu trả lời:


24

Tôi sẽ xây dựng nhận xét của mình, theo đề xuất của @gung. Tôi cũng sẽ bao gồm âm mưu violin được đề xuất bởi @Alexander, cho đầy đủ. Một số công cụ này có thể được sử dụng để so sánh nhiều hơn hai mẫu.

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

Tôi hi vọng cái này giúp được.


14

Sau khi khám phá thêm một chút về các đề xuất của bạn, tôi đã tìm thấy loại cốt truyện này để bổ sung cho câu trả lời của @Procastinator. Nó được gọi là 'ong swarm' và là một hỗn hợp của âm mưu hộp với âm mưu violin với mức độ chi tiết tương tự như âm mưu phân tán.

gói sáp ong R

ví dụ về cốt truyện sáp ong


2
Tôi cũng đã bao gồm beanplot.

7

Một lưu ý:

Bạn muốn trả lời các câu hỏi về dữ liệu của bạn và không tạo câu hỏi về chính phương thức trực quan hóa. Thông thường, nhàm chán là tốt hơn. Nó làm cho việc so sánh so sánh cũng dễ hiểu hơn.

Một câu trả lời:

Nhu cầu định dạng đơn giản ngoài gói cơ sở của R có thể giải thích sự phổ biến của gói ggplot của Hadley trong 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"))

Cuối cùng, tôi đã thấy rằng thêm một nền tảng đơn giản sẽ giúp. Đó là lý do tại sao tôi đã viết "bgfun" có thể được gọi bởi 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) Câu trả lời hay. Tôi đã thêm alpha=0.5vào cốt truyện đầu tiên (để geom_density()) để các phần chồng chéo không bị ẩn.
smillig

Tôi đồng ý về alpha = .5 Tôi không thể nhớ cú pháp!
genorama

7

Dưới đây là một hướng dẫn hay từ blog Dữ liệu Flowing của Nathan Yau sử dụng dữ liệu tội phạm cấp R và Hoa Kỳ. Nó cho thấy:

  • Lô hộp và râu ria (mà bạn đã sử dụng)
  • Biểu đồ
  • Lô mật độ hạt nhân
  • Thảm tấm
  • Âm mưu vĩ cầm
  • Bean Plots (một kết hợp kỳ lạ của một âm mưu hộp, âm mưu mật độ, với một tấm thảm ở giữa).

Gần đây, tôi thấy mình âm mưu CDF nhiều hơn biểu đồ.


1
+1 cho các ô mật độ hạt nhân. Chúng ít "bận rộn" hơn nhiều so với biểu đồ cho việc vẽ nhiều quần thể.
Doresoom

3

Có một khái niệm đặc biệt để so sánh các bản phân phối, nên được biết đến nhiều hơn: phân phối tương đối.

Giả sử chúng ta có các biến ngẫu nhiên với các hàm phân phối tích lũy và chúng tôi muốn so sánh chúng, sử dụng làm tham chiếu.Y0,YF0,FF0

Xác định Phân phối biến ngẫu nhiên là phân phối tương đối của , với là tham chiếu. Lưu ý rằng chúng ta có luôn có phân phối đồng đều (với các biến ngẫu nhiên liên tục, nếu các biến ngẫu nhiên là rời rạc thì điều này sẽ gần đúng).

R=F0(Y)
RYY0F0(Y0)

Chúng ta hãy xem xét một ví dụ. Trang web http://www.math.hope.edu/swanson/data/cellphone.txt cung cấp dữ liệu về thời lượng cuộc gọi điện thoại cuối cùng của nam và nữ. Hãy để chúng tôi thể hiện sự phân phối độ dài cuộc gọi điện thoại cho sinh viên nam, với sinh viên nữ là tài liệu tham khảo.

Phân phối tương đối của thời lượng cuộc gọi điện thoại, nam giới so với phụ nữ

Chúng ta có thể thấy ngay rằng đàn ông (trong lớp đại học này ...) có xu hướng gọi điện thoại ngắn hơn phụ nữ ... và điều này được thể hiện trực tiếp, theo cách rất trực tiếp. Trên trục được hiển thị tỷ lệ trong phân phối của phụ nữ và chúng ta có thể đọc rằng, ví dụ, trong thời gian (dù đó là gì, giá trị của nó không được hiển thị) sao cho 20% các cuộc gọi của phụ nữ ngắn hơn (hoặc bằng) do đó, mật độ tương đối của nam giới trong khoảng đó thay đổi trong khoảng 1,3 đến 1,4. Nếu chúng ta ước tính (về mặt tinh thần từ biểu đồ) mật độ tương đối trung bình trong khoảng đó là 1,35, chúng ta thấy rằng tỷ lệ nam giới trong khoảng đó cao hơn khoảng 35% so với tỷ lệ nữ. Điều đó tương ứng với 27% nam giới trong khoảng thời gian đó.xT

Chúng ta cũng có thể tạo cùng một âm mưu với các khoảng tin cậy theo điểm xung quanh đường cong mật độ tương đối:

biểu đồ phân phối tương đối với khoảng tin cậy theo chiều

Các dải tin cậy rộng trong trường hợp này phản ánh kích thước mẫu nhỏ.

Có một cuốn sách về phương pháp này: Handcock

Mã R cho cốt truyện ở đây:

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

Đối với cốt truyện cuối cùng thay đổi thành:

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

Lưu ý rằng các ô được tạo ra bằng cách sử dụng ước tính mật độ hạt nhân, với mức độ mịn được chọn thông qua gcv (xác thực chéo tổng quát).

Một số chi tiết về mật độ tương đối. Đặt là hàm lượng tử tương ứng với . Đặt là một lượng tử của với giá trị tương ứng trên thang đo ban đầu. Sau đó, mật độ tương đối có thể được viết là hoặc trên thang đo ban đầu là . Điều này cho thấy mật độ tương đối có thể được hiểu là tỷ lệ mật độ. Nhưng, ở dạng đầu tiên, với đối số , nó cũng là một mật độ riêng, tích hợp thành một trong khoảng . Điều đó làm cho nó một điểm khởi đầu tốt cho suy luận.Q0F0rRyr

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

1

Tôi muốn chỉ ước tính mật độ và vẽ chúng,

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)

nhập mô tả hình ảnh ở đây


Tại sao bạn tô màu bên trong pdf (bên dưới đường cong)?
sói

Tôi nghĩ rằng nó trông đẹp hơn.
TrynnaDoStat

Có lẽ - nhưng nó có thể truyền đạt ấn tượng không chính xác - về việc truyền tải khối lượng hoặc diện tích, có thể không phù hợp về mặt thị giác.
sói

1
Nó truyền đạt khối lượng xác suất theo kinh nghiệm.
Lepidopterist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.