Memvisualisasikan tanggapan Likert menggunakan R atau SPSS

19

Saya memiliki 82 responden dalam 2 kelompok (43 di Grup A dan 39 di Grup B) yang menyelesaikan survei dari 65 pertanyaan Likert masing-masing mulai dari 1 - 5 (sangat setuju - sangat tidak setuju). Karenanya saya memiliki kerangka data dengan 66 kolom (1 untuk setiap pertanyaan + 1 yang menunjukkan alokasi grup) dan 82 baris (1 untuk setiap responden).

Menggunakan R atau SPSS apakah ada yang tahu cara yang bagus untuk memvisualisasikan data ini.

Saya butuh sesuatu seperti ini: masukkan deskripsi gambar di sini
(dari Jason Bryer )

Tapi saya tidak bisa mendapatkan bagian awal kode berfungsi. Sebagai alternatif, saya menemukan contoh yang sangat bagus tentang bagaimana memvisualisasikan data Likert dari posting Cross Validated sebelumnya: Memvisualisasikan Data Respons Item Likert tetapi tidak ada panduan atau instruksi tentang cara membuat grafik hitungan terpusat ini atau barchart ditumpuk menggunakan R atau SPSS.

Adam
sumber
1
Hai Adam, untuk menjelaskan lebih lanjut, apakah Anda ingin menggunakan visualisasi untuk menunjukkan perbedaan antara kelompok? Jika demikian, itu bukan metode yang disarankan.
Michelle
Paket Jason Bryer tidak digunakan untuk bekerja untuk saya, tetapi saya pikir dia memperbaruinya, dan itu berfungsi dengan baik sekarang. Saya juga menambahkan permintaan tarik dengan fitur tambahan untuk menyimpan nama kolom sebagai atribut, dan grup. Dengan menggunakan ini, saya dapat dengan mudah memvisualisasikan 45 pertanyaan Likert kuesioner dibagi menjadi kelompok, bahkan terpecah terhadap variabel lain jika saya mau. (Saya output menggunakan rajutan, sehingga berakhir dengan banyak sub plot di situs web, bukan satu plot raksasa). Saya melakukan Langgan rinci di sini: reganmian.net/blog/2013/10/02/...
Stian Håklev
Hanya FYI, bagi Anda yang membaca jawaban ini di masa mendatang, sepertinya beberapa fitur dan fungsionalitas irutils mengenai data likert telah dipindahkan ke dalam paket Likert R ( lihat CRAN di sini ).
firefly2442
Tautan bryer.org/2011/visualizing-likert-items tampaknya rusak. Koreksi atau penggantian akan diterima.
Nick Cox
1
Pertanyaan semacam ini - dengan fokus kuat pada kode tertentu - kurang diterima pada tahun 2018 dibandingkan tahun 2012. Terlepas dari itu, beberapa referensi silang untuk siapa pun yang tertarik dengan ini adalah stats.stackexchange.com/questions/56322/ ... dan stats.stackexchange.com/questions/148554/…
Nick Cox

Jawaban:

30

Jika Anda benar-benar ingin menggunakan barchart bertumpuk dengan sejumlah besar item, berikut adalah dua solusi yang mungkin.

Menggunakan irutils

Saya menemukan paket ini beberapa bulan yang lalu.

Pada komit 0573195c07 di Github , kode tidak akan berfungsi dengan grouping=argumen. Mari kita pergi untuk sesi debugging hari Jumat.

Mulailah dengan mengunduh versi zip dari Github. Anda harus meretas R/likert.Rfile, khususnya likertdan plot.likertfungsinya. Pertama, in likert, cast()digunakan tetapi reshapepaket tidak pernah dimuat (meskipun ada import(reshape)instruksi dalam NAMESPACEfile). Anda dapat memuat ini sendiri sebelumnya. Kedua, ada instruksi yang salah untuk mengambil label item, di mana a itergantung di sekitar baris 175. Ini harus diperbaiki juga, misalnya dengan mengganti semua kemunculan likert$items[,i]dengan likert$items[,1]. Kemudian Anda dapat menginstal paket seperti yang biasa Anda lakukan pada mesin Anda. Di Mac saya, saya lakukan

% tar -czf irutils.tar.gz jbryer-irutils-0573195
% R CMD INSTALL irutils.tar.gz

Kemudian, dengan R, coba yang berikut ini:

library(irutils)
library(reshape)

# Simulate some data (82 respondents x 66 items)
resp <- data.frame(replicate(66, sample(1:5, 82, replace=TRUE)))
resp <- data.frame(lapply(resp, factor, ordered=TRUE, 
                          levels=1:5, 
                          labels=c("Strongly disagree","Disagree",
                                   "Neutral","Agree","Strongly Agree")))
grp <- gl(2, 82/2, labels=LETTERS[1:2]) # say equal group size for simplicity

# Summarize responses by group
resp.likert <- likert(resp, grouping=grp)

Itu seharusnya bekerja, tetapi rendering visual akan mengerikan karena jumlah item yang tinggi. Ini bekerja tanpa pengelompokan (misalnya, plot(likert(resp))).

masukkan deskripsi gambar di sini

Karena itu saya menyarankan untuk mengurangi dataset Anda menjadi subset item yang lebih kecil. Misalnya, menggunakan 12 item,

plot(likert(resp[,1:12], grouping=grp))

Saya mendapatkan barchart bertumpuk yang 'dapat dibaca'. Anda mungkin dapat memprosesnya setelah itu. (Itu adalah ggplot2objek, tetapi Anda tidak akan dapat mengaturnya pada satu halaman dengan gridExtra::grid.arrange()karena masalah keterbacaan!)

masukkan deskripsi gambar di sini

Solusi alternatif

Saya ingin menarik perhatian Anda pada paket lain, HH , yang memungkinkan untuk memplot skala Likert sebagai divergen barchart bertumpuk. Kita dapat menggunakan kembali kode di atas seperti yang ditunjukkan di bawah ini:

resp.likert <- likert(resp)
detach(package:irutils)
library(HH)
plot.likert(resp.likert$results[,-6]*82/100, main="")

tetapi hal itu akan sedikit mempersulit karena kita perlu mengonversi frekuensi menjadi jumlah, mengelompokkan likertobjek yang dihasilkan oleh irutils, melepaskan paket, dll. Jadi mari kita mulai lagi dengan statistik (hitungan) yang baru:

plot.likert(t(apply(resp, 2, table)), main="", as.percent=TRUE,
            rightAxisLabels=NULL, rightAxis=NULL, ylab.right="", 
            positive.order=TRUE)

masukkan deskripsi gambar di sini

Untuk menggunakan variabel pengelompokan, Anda harus bekerja dengan arraynilai numerik.

# compute responses frequencies separately by grp
resp.array <- array(NA, dim=c(66, 5, 2))
resp.array[,,1] <- t(apply(subset(resp, grp=="A"), 2, table))
resp.array[,,2] <- t(apply(subset(resp, grp=="B"), 2, table))
dimnames(resp.array) <- list(NULL, NULL, group=levels(grp))
plot.likert(resp.array, layout=c(2,1), main="")

Ini akan menghasilkan dua panel terpisah, tetapi cocok pada satu halaman.

masukkan deskripsi gambar di sini

Edit 2016-6-3

  1. Sampai sekarang likert tersedia sebagai paket terpisah.
  2. Anda tidak perlu membentuk kembali perpustakaan atau melepaskan kedua irutils dan membentuk kembali
chl
sumber
Plot terakhir mengingatkan saya pada piramida populasi. Kita harus mendapatkan beberapa data nyata untuk melihat bagaimana mereka bekerja "di alam liar", dengan beberapa data yang tidak begitu teratur. Saya akui mereka menarik perhatian dan cantik.
Andy W
@Andy Memang benar begitu. Lihat HH::as.pyramidLikert.
chl
1
+1, perpustakaan (HH) jelas merupakan cara yang harus ditempuh. Tapi ada yang tidak beres dengan plot kedua Anda yang terakhir dalam urutan setuju / tidak setuju, dll.
Peter Ellis
@PeterEllis Yup, sepertinya kategori responsnya salah, memang. (Urutan label hilang saat menabulasi data, dan nama tabel disusun mengikuti urutan leksikografis.) Untuk peretasan cepat, kita bisa menggantinya t(apply(resp, 2, table))dengan t(apply(resp, 2, table))[,levels(resp[,1])]. Dan memberi +1 kepada Anda juga!
chl
7

Saya mulai menulis posting blog tentang membuat kembali banyak bagan dalam posting yang Anda sebutkan ( Visualisasi Likert Item Response Data ) di SPSS jadi saya kira ini akan menjadi motivasi yang baik untuk menyelesaikannya.

Seperti yang dicatat oleh Michelle, fakta bahwa Anda memiliki grup adalah twist baru dibandingkan dengan pertanyaan sebelumnya. Dan sementara kelompok dapat diperhitungkan menggunakan grafik batang yang ditumpuk, IMO mereka jauh lebih mudah dimasukkan ke dalam contoh plot titik di pos asli chl. Saya telah memasukkan kode SPSS untuk menghasilkan ini di akhir posting, pada dasarnya itu mencakup mengetahui bagaimana membentuk kembali data Anda dalam format yang sesuai untuk menghasilkan plot tersebut (penjelasan yang disediakan dalam kode untuk semoga menghapus sebagian dari itu). Di sini saya menggunakan beberapa pengkodean berlebihan (warna dan bentuk) untuk membedakan titik-titik yang berasal dari dua kelompok, dan membuat titik-titik semi-transparan sehingga Anda dapat mengetahui kapan mereka tumpang tindih (opsi lain adalah menghindari titik-titik ketika mereka tumpang tindih).

Gambar 1: Dot Plots by Group

Mengapa ini lebih baik daripada bagan batang yang ditumpuk? Bagan batang yang ditumpuk menyandikan informasi di sepanjang batang. Ketika Anda mencoba membuat perbandingan antara panjang batang, baik dalam kategori sumbu yang sama atau antara panel, susunan menghalangi batang dari memiliki skala yang sama. Sebagai contoh, saya telah memberikan gambar pada Gambar 2 di mana dua batang ditempatkan di plot di mana lokasi awal mereka berbeda, batang mana yang lebih lebar (sepanjang sumbu horizontal)?

Gambar 2: Batang Tanpa Skala Umum

Bandingkan dengan plot pada Gambar 3 di bawah ini, di mana dua batang (dengan panjang yang sama) diplot dari titik awal yang sama. Saya sengaja membuat tugas ini sulit, tetapi Anda harus bisa membedakan mana yang lebih panjang.

Gambar 3: Bar Dengan Skala Umum

Bagan batang yang ditumpuk pada dasarnya melakukan apa yang ditampilkan pada Gambar 2. Dot plot dapat dianggap lebih mirip dengan yang ditampilkan pada Gambar 3, cukup ganti bar dengan titik di ujung bar.

Saya tidak akan mengatakan tidak menghasilkan grafik tertentu untuk analisis data eksplorasi, tapi saya sarankan menghindari grafik batang yang ditumpuk ketika menggunakan begitu banyak kategori. Titik plot juga bukan obat mujarab, tapi saya percaya membuat perbandingan antara panel dengan titik plot jauh lebih mudah daripada dengan grafik batang ditumpuk. Pertimbangkan beberapa saran yang saya berikan di posting blog saya di sini untuk tabel juga, cobalah untuk memesan dan / atau memisahkan grafik ke dalam kategori yang bermakna, dan pastikan bahwa item yang ingin Anda lihat bersama-sama lebih dekat dalam grafik. Sementara beberapa metode perencanaan mungkin cocok untuk banyak pertanyaan (peta panas kategoris adalah contoh), tanpa menyortirnya masih akan sulit untuk mengidentifikasi pola yang bermakna (selain outlier yang jelas).

Catatan tentang menggunakan SPSS. SPSS dapat menghasilkan apa pun yang sebelumnya ditautkan ke bagan, meskipun sering kali mengharuskan mengetahui cara membentuk data Anda (hal yang sama berlaku untuk ggplot, tetapi orang-orang telah mengembangkan paket yang pada dasarnya melakukan pembentukan kembali untuk Anda). Untuk memahami bagaimana bahasa GPL SPSS bekerja lebih baik, saya sebenarnya menyarankan untuk membaca buku Hadley Wickham di ggplot2dalam Penggunaan R! seri. Ini menjabarkan tata bahasa yang diperlukan untuk memahami cara kerja GPL SPSS, dan lebih mudah dibaca daripada manual pemrograman GPL yang disertakan dengan SPSS! Jika Anda memiliki pertanyaan tentang membuat grafik tertentu di SPSS, akan lebih baik untuk mengajukan satu pertanyaan untuk satu grafik (saya sudah cukup banyak berbicara di sini!) Saya akan memperbarui jawaban ini dengan tautan meskipun jika saya sempat membuat sendiri posting blog mereplikasi beberapa grafik lainnya. Untuk bukti konsep peta panas atau plot fluktuasi, Anda dapat melihat posting blog saya yang lain, Beberapa contoh Corrgrams di SPSS .

Kode SPSS digunakan untuk menghasilkan Gambar 1

****************************************.
input program. */making fake data similar to yours.
loop #i = 1 to 82.
compute case_num = #i.
end case.
end loop.
end file.
end input program.
execute.
dataset name likert.

*making number in groups.
compute group = 1.
if case_num > 43 group = 2.
value labels group
1 'A'
2 'B'.

*this makes 5 variables with categories between 0 and 5 (similar to Likert data with 5 categories plus missing data).
vector V(5).
do repeat V = V1 to V5.
compute V = TRUNC(RV.UNIFORM(0,6)).
end repeat.
execute.

value labels V1 to V5
0 'missing'
1 'very disagree'
2 'disagree'
3 'neutral'
4 'agree'
5 'very agree'.
formats case_num group V1 to V5 (F1.0).
*****************************************.

*Because I want to panel by variable, I am going to reshape my data so all of the "V" variables are in one column (stacking them in long format).
varstocases
/make V from V1 to V5
/index orig (V).

*I am going to plot the points, so I aggregate that information (you could aggregate total counts as well if you wanted to plot percentages.
DATASET DECLARE agg_lik.
AGGREGATE
  /OUTFILE='agg_lik'
  /BREAK=orig V group
  /count_lik=N.
dataset activate agg_lik.


*now the fun part, generating the chart.
*The X axis, dim(1) is the count of likert responses within each category for each original question.
*The Y axis, dim(2) is the likert responses, and the third axis is used to panel the observations by the original questions, dim(4) here beacause I want to panel
by rows instead of columns.
DATASET ACTIVATE agg_lik.
* Chart Builder.
GGRAPH
  /GRAPHDATASET NAME="graphdataset" VARIABLES=count_lik V group orig 
    MISSING=LISTWISE REPORTMISSING=NO
  /GRAPHSPEC SOURCE=INLINE.
BEGIN GPL
  SOURCE: s=userSource(id("graphdataset"))
  DATA: count_lik=col(source(s), name("count_lik"))
  DATA: V=col(source(s), name("V"), unit.category())
  DATA: group=col(source(s), name("group"), unit.category())
  DATA: orig=col(source(s), name("orig"), unit.category())
  GUIDE: axis(dim(1), label("Count"))
  GUIDE: axis(dim(2))
  GUIDE: axis(dim(4))
  GUIDE: legend(aesthetic(aesthetic.color.exterior), label("group"))
  GUIDE: text.title(label("Figure 1: Dot Plots by Group"))
  SCALE: cat(aesthetic(aesthetic.color.exterior), include("1", "2"))
  SCALE: cat(aesthetic(aesthetic.shape), map(("1", shape.circle), ("2", shape.square)))
  ELEMENT: point(position(count_lik*V*1*orig), color.exterior(group), color.interior(group), transparency.interior(transparency."0.7"), size(size."8px"), shape(group))
END GPL.
*The "SCALE: cat" statements map different shapes which I use to assign to the two groups in the plot, and I plot the interior of the points as partially transparent.
*With some post hoc editing you should be able to make the chart look like what I have in the stats post.
****************************************.
Andy W
sumber
Kuat plus dari saya karena dengan sopan tetapi dengan penuh semangat membahas kekurangan dari grafik batang yang ditumpuk, yang pada prinsipnya mudah dipahami tetapi seringkali jauh lebih mudah untuk diterjemahkan dalam praktik.
Nick Cox
5

Oh well, saya datang dengan kode sebelum Anda mengklarifikasi. Seharusnya menunggu tetapi berpikir saya harus mempostingnya sehingga siapa pun yang datang ke sini dapat menggunakan kembali kode ini.

Data dummy untuk divisualisasikan

# Response for http://stats.stackexchange.com/questions/25109/visualizing-likert-responses-using-r-or-spss
# Load libraries
library(reshape2)
library(ggplot2)

# Functions
CreateRowsColumns <- function(noofrows, noofcolumns) {
createcolumnnames <- paste("Q", 1:noofcolumns, sep ="")
df <- sapply(1:noofcolumns, function(i) assign(createcolumnnames[i], matrix(sample(1:5, noofrows, replace = TRUE))))
df <- sapply(1:noofcolumns, function(i) df[,i] <- as.factor(df[,i]))
colnames(df) <- createcolumnnames
return(df)}

# Generate dummy dataframe
LikertResponse <- CreateRowsColumns(82, 65)
LikertResponse[LikertResponse == 1] <- "Strongly agree"
LikertResponse[LikertResponse == 2] <- "Agree"
LikertResponse[LikertResponse == 3] <- "Neutral"
LikertResponse[LikertResponse == 4] <- "Disagree"
LikertResponse[LikertResponse == 5] <- "Strongly disagree"

Kode untuk peta panas

# Prepare data
LikertResponseSummary <- do.call(rbind, lapply(data.frame(LikertResponse), table))
LikertResponseSummaryPercent <- prop.table(LikertResponseSummary,1)

# Melt data
LikertResponseSummary <- melt(LikertResponseSummary)
LikertResponseSummaryPercent <- melt(LikertResponseSummaryPercent)

# Merge counts with proportions
LikertResponsePlotData <- merge(LikertResponseSummary, LikertResponseSummaryPercent, by = c("Var1","Var2"))

# Plot heatmap!
# Use the "geom_tile(aes(fill = value.y*100), colour = "white")" to control how you want the heatmap colours to map to.
ggplot(LikertResponsePlotData, aes(x = Var2, y = Var1)) +
    geom_tile(aes(fill = value.y*100), colour = "white") +
    scale_fill_gradient(low = "white", high = "steelblue", name = "% of Respondents") +
    scale_x_discrete(name = 'Response') +
    scale_y_discrete(name = 'Questions') +
    geom_text(aes(label = paste(format(round(value.y*100), width = 3), '% (', format(round(value.x), width = 3), ')')), size = 3) 

Ini pada dasarnya adalah template untuk memvisualisasikan item Likert pada peta panas dari situs web Jason Bryon.

RJ-
sumber
1
github.com/jbryer/irutils/blob/master/R/likert.R adalah sumber untuk bagan batang bertumpuk yang Anda inginkan.
RJ-
Untuk memperjelas, saya tidak ingin membandingkan antar grup. Hanya untuk menyajikan tanggapan kedua kelompok dengan cara yang canggih. Ini respons yang bagus. Sangat menghargai itu. Terima kasih.
Adam
3

Kode @ RJ menghasilkan plot seperti ini, yang sebenarnya adalah tabel dengan sel yang diarsir. Agak sibuk dan sedikit rumit untuk menguraikan. Tabel biasa tanpa naungan mungkin lebih efektif (dan Anda dapat menempatkan data dalam urutan yang lebih bermakna juga).

masukkan deskripsi gambar di sini

Tentu saja itu tergantung pada pesan utama apa yang ingin Anda komunikasikan, tetapi saya pikir ini lebih sederhana dan sedikit lebih mudah dimengerti. Ini juga memiliki pertanyaan dan tanggapan dalam urutan logis (kebanyakan!).

    library(stringr)
    LikertResponseSummary$Var1num <- 
      as.numeric(str_extract(LikertResponseSummary$Var1, "[0-9]+"))
    LikertResponseSummary$Var2 <- 
      factor(LikertResponseSummary$Var2, 
      levels =  c("Strongly disagree", "Disagree", "Neutral", "Agree", "Strongly agree"))

ggplot(LikertResponseSummary, 
       aes(factor(Var1num), value, fill = factor(Var2))) + 
       geom_bar(position="fill") +
       scale_x_discrete(name = 'Question', breaks=LikertResponseSummary$Var1num,
                        labels=LikertResponseSummary$Var1) +
       scale_y_continuous(name = 'Proportion') +
       scale_fill_discrete(name = 'Response') +
       coord_flip()

masukkan deskripsi gambar di sini

Ben
sumber
Setuju bahwa grafik terlihat sibuk. Akan tetapi akan berguna jika pertanyaan dikelompokkan dalam semacam urutan misalnya Q1 - 10 bertanya tentang dimensi tertentu dan sebagainya. Sepintas jika trennya jelas, warnanya akan tahu.
RJ-