Bagaimana Anda bisa memvisualisasikan hubungan antara 3 variabel kategori?

21

Saya memiliki dataset dengan tiga variabel kategori dan saya ingin memvisualisasikan hubungan antara ketiganya dalam satu grafik. Ada ide?

Saat ini saya menggunakan tiga grafik berikut: masukkan deskripsi gambar di sini

Setiap grafik adalah untuk tingkat depresi dasar (Ringan, Sedang, Parah). Kemudian dalam setiap grafik saya melihat hubungan antara pengobatan (0,1) dan peningkatan Depresi (tidak ada, sedang, substansial).

3 grafik ini berfungsi untuk melihat hubungan 3 arah, tetapi adakah cara yang diketahui untuk melakukan ini dengan satu grafik?

Alejandro Ochoa
sumber
4
Mem-posting data akan memungkinkan orang bermain.
Nick Cox
1
Anda memiliki 3 kategori dasar, 2 kategori perawatan dan 3 hasil depresi. Diberikan terakhir. proporsi masing-masing jenis depresi dapat ditampilkan oleh 6 poin pada plot segitiga (trilinear, ternary).
Nick Cox
4
Apa yang salah dengan grafik ini?
Aksakal
Bisakah Anda memberikan data, seperti yang diminta oleh @NickCox? Saya mengumpulkan hanya 18 angka.
gung - Reinstate Monica

Jawaban:

12

Ini adalah kumpulan data yang menarik untuk dicoba disajikan secara grafis, sebagian karena itu tidak terlalu kategorikal. Kedua faktor 3-tingkat bersifat ordinal dan ada kemungkinan saling mempengaruhi di antara mereka (mungkin, lebih sulit untuk mild baselinedimiliki substantial improvement- atau mungkin substantial improvementberarti sesuatu yang berbeda untuk masing-masing baseline).

Dengan banyak variabel, biasanya tidak ada tampilan tunggal yang menunjukkan semua fitur yang mungkin Anda pedulikan. Beberapa faktor akan lebih mudah dibandingkan daripada yang lain. Saya pikir tampilan awal Anda baik dan akan lebih baik dengan saran Nick Cox: menghapus duplikat legenda dan menggunakan skala warna ordinal.

Jika Anda paling menarik dalam melihat perbedaan antara perawatan, Anda dapat menekankan perubahan dengan menggunakan plot area yang ditumpuk alih-alih bar yang ditumpuk.

masukkan deskripsi gambar di sini

Saya biasanya waspada menumpuk secara umum karena lebih sulit untuk membaca nilai-nilai tengah, tetapi itu menegakkan kembali sifat jumlah tetap dari data ini. Dan itu membuatnya mudah untuk membaca jumlah moderate+ substantialjika itu relevan. Saya telah membalik urutan improvementlevel sehingga lebih tinggi lebih baik untuk frekuensi.

Tanpa susun, padanannya adalah grafik kemiringan.

masukkan deskripsi gambar di sini

Lebih mudah membaca setiap level, tetapi lebih sulit untuk memahami interaksi. Anda harus ingat bahwa baris ketiga secara langsung tergantung pada dua lainnya.

Mengingat sifat ordinal dari data, mungkin bermanfaat untuk mengubah improvementnilai menjadi skor numerik, seperti yang sering dilakukan dengan data Likert . Misalnya, none=0, moderate=1, substantial=2. Kemudian Anda bisa membuat grafik variabel itu dalam skala berkelanjutan. Kelemahannya adalah Anda harus menemukan skor yang masuk akal (mis., Mungkin 0, 1 dan 5 akan menjadi representasi yang lebih benar).

masukkan deskripsi gambar di sini

Colophon : Plot-plot ini dibuat dengan fitur Graph Builder dalam paket perangkat lunak JMP (yang saya bantu kembangkan). Meskipun dibuat secara interaktif, skrip, misalnya, untuk plot area, tanpa penyesuaian pewarnaan, adalah:

Graph Builder(
    Graph Spacing( 15 ),
    Variables( X( :treatment ), Y( :frequency ),
        Group X( :baseline ), Overlay( :improvement )
    ),
    Elements( Area( X, Y ) )
);
xan
sumber
2
+1. Beberapa ide bagus di sini. Meskipun saya merasa mual tentang penumpukan, saya pikir grafik pertama berfungsi paling baik. Ini memunculkan interaksi yang menarik: pengobatan 1 selalu menghasilkan lebih banyak contoh peningkatan substansial dan lebih banyak tidak ada!
Nick Cox
Pos yang bagus. Apakah ada yang bisa membuat grafik pertama yang Anda tampilkan di R? Saya belum pernah menggunakan JMP.
Alejandro Ochoa
1
@AlejandroOchoa ggplot memiliki geom area. Lihat Membuat plot area bertumpuk menggunakan ggplot2 .
xan
10

Pertama, ini adalah bacaan saya dari grafik yang disediakan data untuk mereka yang ingin bermain (bereksperimen, jika Anda suka). Kesalahan off-by-one NB tentu saja mungkin terjadi, demikian pula dengan kesalahan kotor.

    improvement  treatment   baseline   frequency  
           none          0       mild          5  
       moderate          0       mild         41  
    substantial          0       mild          4  
           none          1       mild         19  
       moderate          1       mild         19  
    substantial          1       mild         12  
           none          0   moderate         19  
       moderate          0   moderate         24  
    substantial          0   moderate          7  
           none          1   moderate         20  
       moderate          1   moderate         14  
    substantial          1   moderate         16  
           none          0     severe          7  
       moderate          0     severe         21  
    substantial          0     severe         22  
           none          1     severe         12  
       moderate          1     severe         15  
    substantial          1     severe         23  

Ini adalah pengerjaan ulang dari desain aslinya. Satu detail dari data asli membuat semuanya menjadi sederhana: jumlah orang di masing-masing kombinasi prediktor adalah sama, sehingga frekuensi plot dan persentasi plotnya sama. Di sini alih-alih bagan batang yang ditumpuk (dibagi lagi, tersegmentasi), kami memisahkan batang dalam bagan batang dua arah atau desain plot tabel.

Banyak detail dalam grafis hanya itu, detail. Beberapa kelemahan kecil dalam grafik dapat merusak efektivitasnya dan beberapa perbaikan kecil juga dapat membantu.

masukkan deskripsi gambar di sini

Untuk mengejanya:

  1. Tiga panel tidak diperlukan di sini, dengan pengulangan sumbu, legenda, dan teks.

  2. Legenda selalu mengutuk serta memberkati, mewajibkan pembaca untuk "bolak-balik" secara mental (atau menghafal legenda, bukan sesuatu yang menarik, betapapun mudahnya). Teks informatif tepat di bar lebih mudah diikuti.

  3. Pengodean warna salad buah dapat digunakan. Tampaknya sewenang-wenang juga: peningkatan "substansial" adalah masalah besar, tetapi saya menemukan warna kuning yang kuat dan lembut. Tetapi kita tidak perlu warna ketika kita memiliki teks untuk dijelaskan.

  4. Meskipun beberapa akan menjerit ngeri karena melanggar perbedaan antara Gambar dan Tabel, kita dapat menunjukkan frekuensi juga. Sangat membantu untuk dapat berpikir "4 orang dalam kategori ini".

  5. Ada penghormatan di sini untuk merencanakan respons tradisional pada sumbu vertikal, seperti pada aslinya.

Semua itu mengatakan, sulit untuk melihat banyak struktur dalam data ini. Ketika itu terjadi, sulit juga untuk berbagi kesalahan antara (a) data tanpa banyak struktur dan (b) kelemahan desain grafis untuk memilih tidak hanya efek prediktor tetapi juga kemungkinan interaksi. Perawatan tampaknya kurang penting daripada kondisi awal. Tetapi kemudian, jika garis dasarnya "ringan", berapa banyak ruang lingkup yang ada untuk perbaikan "substansial"? Saya akan berhenti di sana untuk berhenti membodohi diri sendiri ketika studi tentang data kesehatan mental jelas bukan spesialisasi, terutama jika data itu ternyata palsu. Tetapi jika itu nyata, kita bisa melakukannya dengan ukuran sampel yang jauh lebih besar. (Kami biasanya mengatakan itu, tapi begitulah.)

EDIT Grafik mungkin secara alami menjadi rumit oleh skema warna ordinal jika diinginkan:

masukkan deskripsi gambar di sini

Sebagai catatan: grafik menggunakan kode Stata, termasuk program saya sendiri yang dapat tabplotdiunduh menggunakan ssc inst tabplot.

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*4)) bfcolor(emerald*0.2)

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*2)) ///
sep(improvement2) bar3(bfcolor(emerald*0.2)) bar2(bfcolor(emerald*0.6)) ///
bar1(bfcolor(emerald)) barall(blcolor(green)) 
Nick Cox
sumber
Apakah ada cara lain untuk mengunggah grafik Anda dengan skema warna yang mencerminkan sifat ordinal data? Juga perangkat lunak apa yang Anda gunakan untuk membuat visual?
Alejandro Ochoa
Ini adalah plot yang sangat tampan
shadowtalker
4

Saya suka menggunakan sumbu x 2-level untuk data seperti ini. Jadi kategori x-axis Anda untuk satu bagan mungkin:

  • Perawatan = 0, Baseline = Ringan
  • Perawatan = 0, Baseline = Sedang
  • Perawatan = 0, Baseline = Parah
  • Perawatan = 1, Baseline = Ringan
  • Perawatan = 1, Baseline = Sedang
  • Perawatan = 1, Baseline = Parah

... dengan jumlah yang sama berdasarkan bar histogram [tidak ada / sedang / substansial].

Kekuatan penuh
sumber
+1. Saya setuju dengan ide utama di sini, sebagaimana diterapkan dalam jawaban saya. Saya tidak tahu seberapa dekat desain bagan saya dengan apa yang Anda bayangkan.
Nick Cox
Terima kasih, bagan Anda terlihat hebat. Apakah Anda mencoba melihatnya dengan Pengobatan 0/1 sebagai kategori luar, dan Baseline = Ringan / Sedang / Parah sebagai kategori yang lebih dekat dengan sumbu x? Saya pikir jika Anda menyajikannya seperti itu, Anda akan melihat pola yang lebih jelas - untuk dalam pengobatan = 0, bilah peningkatan "substansial" naik secara mantap saat garis dasar naik dari Mild / Moderate / Severe. Dan Anda akan melihat pola yang sama (pada tingkat yang lebih rendah) dalam perawatan = 1. Secara umum saya meletakkan variabel dengan kategori lebih sedikit (mis. Perawatan di sini) di luar. Tapi mungkin Anda sudah melihatnya seperti itu.
Max Power
Saya tidak mencoba cara lain, tetapi saya berpikir bahwa peneliti mungkin paling ingin membandingkan efek perawatan yang diberikan pada awal, yang seharusnya lebih mudah dengan cara saya melakukannya.
Nick Cox
Itu masuk akal bagi saya.
Max Power
4

Bukankah plot Mosaic dirancang khusus untuk tujuan ini?

Dalam R akan seperti

library(vcd)
d = read.table("data.dat", header=TRUE)
tab = xtabs(frequency ~ treatment+baseline+improvement, data=d)
mosaic(data=tab,~ treatment+baseline+improvement, shade=TRUE, cex=2.5)

Setiap variabel kategori menuju ke satu sisi dari bujur sangkar, yang dibagi lagi dengan labelnya. (Jadi, jika Anda membagi setiap sisi pada satu tingkat saja, paling banyak 4 variabel kategori dapat diwakili. IMHO, di luar 3 itu menjadi berantakan dan sulit untuk ditafsirkan). Ukuran persegi panjang sebanding dengan frekuensi. Ini adalah ide utama di balik plot mosaik dan itu sama dalam jawaban dan jawaban Paweł Kleka.

Perbedaannya terletak pada tata letak persegi panjang dan "kualitas" yang disediakan oleh paket-R tertentu yang digunakan untuk jenis plot ini. Seperti yang Anda lihat dari jawaban Paweka Kleka, graphicspaket membagi dua tepi atas pada 2 tingkat alih-alih menggunakan tepi kanan. Saya menggunakan vcdpaket dengan opsi default, sehingga warna menunjukkan tingkat asosiasi antara variabel. Gray berarti bahwa data konsisten dengan (Anda tidak dapat menolak hipotesis) independensi variabel. Biru berarti bahwa ada hubungan positif antara peningkatan "parah" dan peningkatan "substansial" untuk pengobatan "0" dan "1". (Kejutan, kejutan! Saya menerjemahkannya sebagai berikut: jika Anda mengalami depresi berat, kemungkinan Anda akan mendapatkan jauh lebih baik apakah Anda menjalani perawatan atau tidak.

Seseorang dapat menyesuaikan plot sesuai dengan kebutuhannya, lihat, misalnya, di sini . Paket ini juga memiliki beberapa sketsa, google "vcd mosaic example" (seperti yang baru saja saya lakukan). Artikel Wikipedia yang dikutip di awal juga menjelaskan bagaimana membangun tipe plot dan intuisi di baliknya.

masukkan deskripsi gambar di sini

Ketika Anda membandingkan gambar saya dengan gambar di jawaban Paweł Kleka, tidak masalah, bahwa 'perlakuan' ada di tepi kiri setiap gambar. Anda dapat dengan mudah mengubah lokasi tepi dengan mengubah baris terakhir kode saya dan menyesuaikan tata letak sesuai dengan kebutuhan Anda. Praktik umum adalah bahwa di sebelah kiri pergi variabel yang paling penting atau variabel dengan jumlah label paling sedikit. Anda juga dapat mengubah urutan label (misalnya, sehingga, di tepi kanan urutannya adalah "tidak ada yang cukup substansial") dengan membuat variabel faktor terkait dalam R yang dipesan dan menyesuaikan levelnya.

lanenok
sumber
Ada pada saat penulisan dua jawaban pada plot mosaik. Akan sangat membantu jika Anda masing-masing memperluas apa yang ditunjukkan plot Anda dan mengapa itu membantu, paling tidak karena plotnya sangat berbeda.
Nick Cox
@NickCox yang satu ini tentu saja terlihat berbeda dari yang lain. Tampilan mereka hampir tidak sama
shadowtalker
Keduanya memiliki pengobatan pada sumbu y. Apa yang akan menjadi emas dari para pendukung mereka adalah komentar tentang kelebihan dan keterbatasan setiap layar.
Nick Cox
Terima kasih telah memperluas jawaban Anda. Saya pikir minat di sini mungkin untuk membandingkan tanggapan yang diberikan pengobatan dan baseline. Saya tentu saja setuju bahwa Anda dapat mengutak-atik variabel mana yang berjalan, tetapi apakah Anda mencoba kemungkinan lain, dan mana yang paling berhasil? Dalam melihat respons di sini, pembaca harus membandingkan dua baris blok secara bersamaan.
Nick Cox
@Nick Cox Terima kasih atas komentar Anda. Itulah satu-satunya hal yang memotivasi saya untuk berkembang. Saya tidak mencoba kemungkinan lain. Sebenarnya, saya pikir, jika penulis pertanyaan menemukan jenis plot ini berguna, ia harus mencoba semuanya, kemudian memposting dan menjelaskan hasilnya untuk komunitas. Omong-omong, saya tidak mengatakan bahwa jenis plot ini lebih baik daripada yang lain. Intinya adalah: ia dirancang khusus untuk variabel kategori dan untuk memvisualisasikan kemerdekaan dan / atau pelanggaran kemerdekaan.
lanenok
3

Saya paling suka menggunakan plot mosaik

mosaicplot(table(moz), sort = c(3,1,2), color = T)

mosaicplot ()

Paweł Kleka
sumber
Ada pada saat penulisan dua jawaban pada plot mosaik. Akan sangat membantu jika Anda masing-masing memperluas apa yang ditunjukkan plot Anda dan mengapa itu membantu, paling tidak karena plotnya sangat berbeda.
Nick Cox
2

Pilihan yang saya pertimbangkan adalah menggunakan set paralel. Beberapa perbandingan akan lebih mudah daripada yang lain, tetapi Anda masih bisa melihat hubungan di antara tiga variabel kategori.

Ini dia contoh dengan data Titanic Survival:

Berikut adalah contoh data survival Titanic.

Di R (diberikan tag Anda) Saya telah menggunakan ggparallel untuk mengimplementasikannya. Beberapa orang telah membahas di sini di CV cara menerapkannya dengan cara lain.

nazareno
sumber
Saya kesulitan membayangkan ini. Apakah Anda bisa membuat contoh?
shadowtalker
Garis dalam plot memiliki lebar proporsional dengan frekuensi coocurrences dari dua kategori. Untuk data yang digunakan dalam plot dari pertanyaan awal, akan ada tiga sumbu horizontal: depresi dasar, pengobatan dan peningkatan depresi. Di masing-masing ada area terpisah untuk setiap tingkat kategori itu. Coocurrences terhubung, dengan lebar mewakili frekuensinya.
nazareno
2

Informasi ini juga dapat disampaikan menggunakan bagan garis sederhana berikut:

masukkan deskripsi gambar di sini

Peningkatan ditunjukkan oleh jenis garis yang berbeda sementara kelompok garis dasar ditampilkan dalam warna. Ini dan parameter x-axis (perawatan di sini) juga dapat dipertukarkan jika diinginkan.

juga
sumber
1

Mirip dengan set paralel, seperti yang diposting oleh nazareno di atas, Anda dapat menggunakan plot aluvial yang tersedia dari paket R alluvial. http://www.r-bloggers.com/alluvial-diagrams/

Ankur Chakravarthy
sumber