Boxplot setara dengan distribusi berekor berat?

13

Untuk data yang terdistribusi normal, plot kotak adalah cara yang bagus untuk memvisualisasikan median dan penyebaran data dengan cepat, serta keberadaan pencilan apa pun.

Namun untuk distribusi yang lebih berat, banyak poin yang ditampilkan sebagai outlier, karena outlier didefinisikan sebagai di luar faktor tetap dari IQR, dan ini terjadi tentu saja lebih sering dengan distribusi berekor berat.

Jadi apa yang digunakan orang untuk memvisualisasikan data semacam ini? Apakah ada sesuatu yang lebih disesuaikan? Saya menggunakan ggplot pada R, jika itu penting.

static_rtti
sumber
1
Sampel dari distribusi berekor berat cenderung memiliki kisaran yang sangat besar dibandingkan dengan 50% menengah. Apa yang ingin Anda lakukan?
Glen_b -Reinstate Monica
7
Beberapa utas yang relevan sudah mis. Stats.stackexchange.com/questions/13086/... Jawaban singkatnya mencakup transformasi terlebih dahulu! histogram; plot kuantil dari berbagai jenis; plot strip berbagai jenis.
Nick Cox
@ Glen_b: itulah masalah saya, itu membuat boxplots tidak dapat dibaca.
static_rtti
2
Masalahnya, ada lebih dari satu hal yang mungkin dilakukan ... jadi apa yang ingin Anda lakukan?
Glen_b -Reinstate Monica
2
Mungkin perlu dicatat bahwa sebagian besar dunia statistik mengetahui kotak-kotak dari penamaan mereka dan (kembali) oleh John Tukey pada 1970-an. (Mereka digunakan untuk beberapa dekade sebelumnya dalam klimatologi dan geografi.) Tetapi dalam bab-bab selanjutnya dari bukunya 1977 tentang analisis data Eksplorasi (Reading, MA: Addison-Wesley) ia memiliki ide yang sangat berbeda dalam menangani distribusi berekor berat. Tampaknya tidak ada yang tertangkap sama sekali. Tapi plot-plot kuantil memiliki semangat yang sama.
Nick Cox

Jawaban:

8

Masalah utama yang dimiliki OP adalah bahwa mereka memiliki data berekor yang sangat berat - dan saya kira sebagian besar jawaban yang ada saat ini tidak berurusan dengan masalah itu sama sekali , jadi saya mempromosikan komentar saya sebelumnya ke sebuah jawaban.

Jika Anda ingin tetap menggunakan plot box, beberapa opsi tercantum di bawah ini. Saya telah membuat beberapa data dalam R yang menunjukkan masalah mendasar:

 set.seed(seed=7513870)
 x <- rcauchy(80)
 boxplot(x,horizontal=TRUE,boxwex=.7)

boxplot tidak memuaskan

Setengah bagian tengah data direduksi menjadi strip kecil selebar beberapa mm. Masalah yang sama menimpa sebagian besar saran lainnya - termasuk plot QQ, strip chart, plot sarang lebah / lebah, dan plot biola.

Sekarang beberapa solusi potensial:

1) transformasi ,

Jika log, atau invers menghasilkan plot box yang dapat dibaca, mereka mungkin ide yang sangat bagus, dan skala aslinya masih dapat ditampilkan pada sumbu.

Masalah besarnya adalah terkadang tidak ada transformasi 'intuitif'. Ada masalah yang lebih kecil bahwa sementara kuantil sendiri menerjemahkan dengan transformasi monoton dengan cukup baik, pagar tidak; jika Anda hanya memplot data yang ditransformasikan (seperti yang saya lakukan di sini), kumisnya akan berada pada nilai x yang berbeda dari pada plot aslinya.

boxplot dari nilai yang diubah

Di sini saya menggunakan inverse-hyperbolic-sin (asinh); itu semacam log-seperti di ekor dan mirip dengan linear mendekati nol, tetapi orang-orang umumnya tidak menganggapnya sebagai transformasi intuitif, jadi secara umum saya tidak akan merekomendasikan opsi ini kecuali transformasi yang cukup intuitif seperti log jelas. Kode untuk itu:

xlab <- c(-60,-20,-10,-5,-2,-1,0,1,2,5,10,20,40)
boxplot(asinh(x),horizontal=TRUE,boxwex=.7,axes=FALSE,frame.plot=TRUE)
axis(1,at=asinh(xlab),labels=xlab)

2) skala istirahat - ambil outlier ekstrim dan kompres mereka ke jendela sempit di setiap ujung dengan skala yang jauh lebih terkompresi daripada di tengah. Saya sangat merekomendasikan penembusan total pada seluruh skala jika Anda melakukan ini.

boxplot dengan jeda skala

opar <- par()
layout(matrix(1:3,nr=1,nc=3),heights=c(1,1,1),widths=c(1,6,1))
par(oma = c(5,4,0,0) + 0.1,mar = c(0,0,1,1) + 0.1)
stripchart(x[x< -4],pch=1,cex=1,xlim=c(-80,-5))
boxplot(x[abs(x)<4],horizontal=TRUE,ylim=c(-4,4),at=0,boxwex=.7,cex=1)
stripchart(x[x> 4],pch=1,cex=1,xlim=c(5,80))
par(opar)

3) pemangkasan outlier ekstrim (yang biasanya tidak saya sarankan tanpa menunjukkan ini dengan sangat jelas, tapi sepertinya plot berikutnya, tanpa "<5" dan "2>" di kedua ujungnya), dan

4) apa yang saya sebut ekstrim-outlier "panah" - mirip dengan pemangkasan, tetapi dengan jumlah nilai yang dipangkas ditunjukkan pada setiap ujung

boxplot dengan hitungan, dan panah yang menunjuk ke, nilai ekstrim

xout <- boxplot(x,range=3,horizontal=TRUE)$out
xin <- x[!(x %in% xout)]
noutl <- sum(xout<median(x))
nouth <- sum(xout>median(x))
boxplot(xin,horizontal=TRUE,ylim=c(min(xin)*1.15,max(xin)*1.15))
text(x=max(xin)*1.17,y=1,labels=paste0(as.character(nouth)," >"))
text(x=min(xin)*1.17,y=1,labels=paste0("< ",as.character(noutl)))
Glen_b -Reinstate Monica
sumber
Terima kasih telah meluangkan waktu untuk menulis ini! Ini adalah jawaban yang saya harapkan. Sekarang saya hanya perlu mencari tahu bagaimana mengimplementasikan plot-plot ini dengan R :)
static_rtti
1
Beberapa kode ada di sana sekarang. Saya tidak memberikan kode untuk 3) karena ini adalah versi yang lebih sederhana dari 4); Anda harus bisa mendapatkannya dengan memotong garis-garis dari sana.
Glen_b -Reinstate Monica
Kebetulan sebagian besar dari ide-ide ini bekerja juga dengan tampilan hebat lainnya yang disarankan di sini - stripchart yang gelisah dan plot lebah / sarang lebah dan plot biola dan semacamnya.
Glen_b -Reinstate Monica
Terima kasih lagi. Saya yakin jawaban ini akan bermanfaat bagi beberapa orang.
static_rtti
Saya setuju, ini menjawab pertanyaan jauh lebih baik daripada jawaban saya. Barang bagus.
TooTone
4

Secara pribadi saya suka menggunakan stripplot dengan jitter setidaknya untuk merasakan data. Plot di bawah ini adalah dengan kisi di R (maaf tidak ggplot2). Saya suka plot ini karena sangat mudah diinterpretasikan. Seperti yang Anda katakan, satu alasan untuk ini adalah tidak ada transformasi.

df <- data.frame(y1 = c(rnorm(100),-4:4), y2 = c(rnorm(100),-5:3), y3 = c(rnorm(100),-3:5))
df2 <- stack(df)
library(lattice)
stripplot(df2$values ~ df2$ind, jitter=T)

masukkan deskripsi gambar di sini

The beeswarm paket menawarkan alternatif yang bagus untuk stripplot (terima kasih kepada @January untuk saran).

beeswarm(df2$values ~ df2$ind)

masukkan deskripsi gambar di sini

Dengan data Anda, karena biasanya terdistribusi secara normal, hal lain yang dapat dicoba adalah qqplot, qqnorm dalam kasus ini.

par(mfrow=c(1,3))
for(i in 1:3) { qqnorm(df[,i]); abline(c(0,0),1,col="red") }

masukkan deskripsi gambar di sini

TooTone
sumber
2
Saya juga suka stripplot, tetapi pertanyaannya secara eksplisit tentang apa yang harus dilakukan dengan distribusi berekor berat.
Nick Cox
1
Intinya hanya saran yang digunakan misalnya qqnorm tidak cocok dengan pertanyaan. Saya setuju, jenis plot kuantil-kuantil lainnya bisa menjadi ide yang sangat bagus, seperti yang saya sebutkan sebelumnya.
Nick Cox
1
Bahkan lebih baik daripada stripplot dari R adalah plot dari beeswarmpaket.
Januari
1
@ Januari Ya itu cukup keren, saya menambahkannya ke jawaban saya (jika Anda keberatan katakan saja).
TooTone
1
Jawaban saya telah diposting di stats.stackexchange.com/questions/13086 , yang saya anggap sebagai versi (yang lebih sempit) dari pertanyaan ini. Saya meringkasnya sebagai "jangan ubah algoritma boxplot: ekspresikan kembali data sebagai gantinya." Masalah yang diisyaratkan oleh "diadaptasi" dalam pertanyaan ini ditangani oleh teknik standar Analisis Data Eksplorasi untuk menemukan ekspresi variabel yang bermanfaat.
whuber
2

Anda dapat menempel pada plot box. Ada berbagai kemungkinan untuk mendefinisikan kumis. Bergantung pada ketebalan ekor, jumlah sampel, dan toleransi terhadap pencilan, Anda dapat memilih dua kuantil yang lebih atau kurang ekstrim. Mengingat masalah Anda, saya akan menghindari kumis yang ditentukan melalui IQR.
Kecuali tentu saja Anda ingin mengubah data Anda, yang dalam hal ini membuat pemahaman lebih sulit.

Kuarsa
sumber
1
Kalimat terakhir terlalu wajar untuk dilewati tanpa komentar. Transformasi bukan obat mujarab, tetapi tidak mentransformasikan data yang sangat miring tidak membuat lebih mudah untuk dipahami. Jika semua data positif, Anda setidaknya dapat mencoba menggunakan skala root, logaritmik, atau timbal balik. Jika itu benar-benar tidak membantu, maka mundurlah.
Nick Cox
Untuk kesulitan apa dalam memahami data miring yang Anda maksud? Mereka yang memiliki kumis yang bergantung pada IQR? Itu masalah bahkan dengan ekor yang ringan. Dan bukankah kita berbicara tentang ekor yang berat, terlepas dari kemiringan? Transformasi yang mencerahkan ekor tentu saja memberikan plot kotak yang lebih teratur, tetapi menambahkan lapisan interpretasi, memperdagangkan pemahaman untuk kenyamanan. Tetapi orang dapat menyebutnya fitur jika dia suka.
Kuarsa
2
Transformasi sering membantu: itulah intinya saya. Orang statistik yang belum belajar bahwa banyak hal terlihat lebih jelas pada skala logaritmik (terutama) kehilangan salah satu trik tertua dan paling efektif yang ada. Anda sepertinya menyangkal hal itu; Saya harap saya salah membaca Anda.
Nick Cox
1
Saya tidak setuju. Saya mengubah data yang sangat miring sepanjang waktu dan pengalaman saya adalah bahwa ini jauh lebih dari masalah estetika. Ini sering berhasil. Seorang ahli statistik anonim menulis beberapa waktu lalu bahwa lognormal lebih normal daripada normal. Dia sedikit ceroboh tetapi ada kebenaran penting di sana juga. (Tidak banyak distribusi lain yang mungkin tidak cocok.)
Nick Cox
1
Saya kira saya harus berhenti di sini untuk membiarkan orang lain menilai, tetapi pandangan saya tidak eksentrik. Transformasi dibahas sebagai satu kemungkinan di eg stats.stackexchange.com/questions/13086/... Saya menyarankan Anda menjawab atau berkomentar di sana untuk menjelaskan mengapa saran itu tidak sehat.
Nick Cox
0

Saya berasumsi pertanyaan ini adalah tentang memahami data (sebagai lawan dari “mengelola” itu).
Jika data tersebut berekor berat dan / atau multimodal, saya menemukan "lapisan" ggplot2 ini sangat berguna untuk tujuan: geom_violindan geom_jitter.

Ke-6
sumber
3
Bisakah Anda meringkas mengapa plot biola dan / atau poin jitter akan berguna dengan distribusi berekor berat?
chl