R veya SPSS kullanarak Likert yanıtlarını görselleştirme


19

Her biri 1 - 5 (kesinlikle katılıyorum - kesinlikle katılmıyorum) olmak üzere 65 likert sorudan oluşan bir anketi tamamlayan 2 grupta 82 katılımcım var (A Grubu'nda 43 ve B Grubu'nda 39). Bu nedenle 66 sütun (her soru için 1 + grup tahsisini gösteren) ve 82 satır (her katılımcı için 1) ile bir veri çerçevesi var.

R veya SPSS kullanmak bu verileri görselleştirmenin iyi bir yolunu bilir.

Böyle bir şeye ihtiyacım var: enter image description here
( Jason Bryer'dan )

Ama kodun ilk bölümünü çalıştıramadım. Alternatif olarak, önceki Çapraz Onaylı bir gönderiden Likert verilerinin nasıl görselleştirileceğine dair gerçekten iyi örnekler buldum: Likert Öğe Yanıt Verilerini Görselleştirme, ancak R veya SPSS kullanarak bu ortalanmış sayı grafiklerinin veya yığılmış çubukların nasıl oluşturulacağına dair kılavuzlar veya talimatlar yok.


1
Merhaba Adam, daha fazla açıklığa kavuşturmak için, gruplar arasındaki farklılıkları göstermek için görselleştirmeleri kullanmak ister misiniz? Öyleyse, bu önerilen bir yöntem değildir.
Michelle

Jason Bryer'ın paketi benim için işe yaramadı, ama sanırım onu ​​güncelledi ve şu anda güzel çalışıyor. Ayrıca, sütun adlarını öznitelikler ve gruplar olarak saklamak için ekstra bir özellik içeren bir çekme isteği ekledim. Bunu kullanarak, 45 soru Likert anketini gruplara bölünmüş, hatta seçersem başka bir değişkene bölünmüş olarak kolayca görselleştirebiliyorum. (Knitr kullanarak çıktı, bu yüzden bir devasa arsa değil, bir web sitesinde çok sayıda alt parsel ile sonuçlanır). Burada ayrıntılı bir yazı yazdım
Stian Håklev

Bilginize, gelecekte bu cevapları okuma o sizin için, bu özelliklerin ve verilerin Likert ilgili irutils bazı işlevlerini benziyor içine taşındı Likert R paketinin ( burada cran bakınız ).
firefly2442

Bryer.org/2011/visualizing-likert-items bağlantısı kopmuş gibi görünüyor. Bir düzeltme veya değiştirme memnuniyetle karşılanacaktır.
Nick Cox

1
Bu tür bir soru - özel koda güçlü odaklanması ile 2018'de 2012'de olduğundan daha az hoş karşılanmaktadır. Buna rağmen, bununla ilgilenen herkes için bazı çapraz referanslar stats.stackexchange.com/questions/56322/ … Ve istatistikler.stackexchange.com/questions/148554/…
Nick Cox

Yanıtlar:


30

Gerçekten çok sayıda öğeyle yığılmış barchar kullanmak istiyorsanız, işte iki olası çözüm.

kullanma irutils

Birkaç ay önce bu pakete rastladım.

İtibariyle üzerinde 0573195c07 taahhüt Github , kod çalışmaz grouping=argüman. Cuma günkü hata ayıklama oturumuna geçelim.

Github'dan sıkıştırılmış bir sürümü indirerek başlayın. R/likert.RDosyayı, özellikle likertve plot.likertişlevlerini hacklemeniz gerekir . İlk olarak, içinde likert, cast()kullanılan ancak reshape(bir yöntemi olmamasına rağmen paket yüklü asla import(reshape)içinde talimat NAMESPACEdosyası). Bunu önceden kendiniz yükleyebilirsiniz. İkincisi, i175. satırın etrafında sarkan bir öğe etiketi getirmek için yanlış bir talimat likert$items[,i]var likert$items[,1]. Ardından, paketi makinenize alıştığınız şekilde yükleyebilirsiniz. Mac bilgisayarımda yaptım

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

Ardından, R ile aşağıdakileri deneyin:

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)

Bu sadece işe yaramalı, ancak görsel render çok sayıda öğe nedeniyle korkunç olacak. Yine de gruplama olmadan çalışır (örn plot(likert(resp)).).

resim açıklamasını buraya girin

Bu nedenle, veri kümenizi daha küçük öğelerin alt kümelerine indirmenizi öneririm. Örneğin, 12 öğe kullanarak,

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

'Okunabilir' yığılmış bir barchart alıyorum. Muhtemelen daha sonra bunları işleyebilirsiniz. (Bunlar ggplot2nesnelerdir, ancak gridExtra::grid.arrange()okunabilirlik sorunu nedeniyle bunları tek bir sayfada düzenleyemezsiniz !)

resim açıklamasını buraya girin

Alternatif çözüm

Dikkatinizi, Likert ölçeklerini farklı yığın yığınları olarak çizmenize izin veren başka bir paket olan HH'ye çekmek istiyorum . Yukarıdaki kodu aşağıda gösterildiği gibi tekrar kullanabiliriz:

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

ancak bu, işleri biraz zorlaştıracaktır, çünkü frekansları sayımlara dönüştürmemiz, likertürettiği nesneyi alt kümeye irutilskoymamız, paketi ayırmamız vb.

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

resim açıklamasını buraya girin

Bir gruplandırma değişkeni kullanmak için arraysayısal değerlerden biriyle çalışmanız gerekir .

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

Bu, iki ayrı panel üretecektir, ancak tek bir sayfaya sığar.

resim açıklamasını buraya girin

Düzenle 2016-6-3

  1. Şu an itibariyle likert ayrı paket olarak mevcuttur.
  2. Sen gerek yok yeniden şekillendirmek kütüphane ya da her ikisi ayırmak irutils ve yeniden biçimlendirme

Son grafik bana nüfus piramitlerini hatırlatıyor. Düzgün olmayan bazı verilerle "vahşi doğada" nasıl çalıştıklarını görmek için bazı gerçek veriler almalıyız. Göz alıcı ve güzel olduklarını itiraf edeceğim.
Andy W

@Andy Gerçekten de durum böyle. Bkz HH::as.pyramidLikert.
chl

1
+1, kütüphane (HH) kesinlikle gitmenin yolu. Ancak, katılıyorum / katılmıyorum vb. Siparişinde son arsa ile bir şeyler ters gitti
Peter Ellis

@PeterEllis Yup, yanıt kategorilerinin yanlış sırada olduğu anlaşılıyor. (Etiketlerin sipariş verilerini tabulating zaman kayboldu ve tablo adları lexicographic emirlerini göre yerleştirilmektedir.) Hızlı bir hack için, sadece yerini alabilir t(apply(resp, 2, table))ile t(apply(resp, 2, table))[,levels(resp[,1])]. Ve sana da +1!
chl

7

SPSS'de bahsettiğiniz yazıdaki ( Likert Öğe Yanıt Verilerini Görselleştirme) birçok çizelgeyi yeniden oluşturma hakkında bir blog yazısı yazmaya başladım, bu yüzden bunu bitirmek için iyi bir motivasyon olacağını varsayalım.

Michelle'in belirttiği gibi, gruplarınız olması, önceki sorulara kıyasla yeni bir bükülme. Gruplar yığılmış çubuk grafikler kullanılarak dikkate alınabilirken IMO, chl'nin orijinal gönderisindeki nokta çizim örneğine çok daha kolay bir şekilde dahil edilir. Ben yazının sonunda bu oluşturmak için SPSS kodunu dahil ettik, temelde söz konusu arsa (umarım bazılarını temizlemek için kodda sağlanan ek açıklama) oluşturmak için uygun biçimde verilerinizi yeniden şekillendirmeyi bilmeyi gerektirir. Burada iki gruptan gelen noktaları ayırt etmek için bazı gereksiz kodlama (renk ve şekil) kullandım ve noktaları ne zaman üst üste bindiklerini anlayabilmeniz için yarı saydam yaptım (başka bir seçenek üst üste geldiklerinde noktaları atlatmak olacaktır).

Şekil 1: Gruba Göre Nokta Grafikleri

Bu neden yığılmış çubuk grafiklerden daha iyi? Yığılmış çubuk grafikler çubukların uzunluğundaki bilgileri kodlar. Aynı eksen kategorisinde veya paneller arasında çubuk uzunlukları arasında karşılaştırma yapmaya çalıştığınızda, yığınlama çubukların ortak bir ölçeğe sahip olmasını engeller. Bir örnek olarak, Şekil 2'de, başlangıç ​​konumlarının farklı olduğu bir grafiğe iki çubuğun yerleştirildiği, hangi çubuğun daha geniş olanı (yatay eksen boyunca) yerleştirildiği bir görüntü sağladım?

Şekil 2: Ortak Ölçeği Olmayan Çubuklar

Bunu, iki çubuğun (aynı uzunlukta) aynı başlangıç ​​noktasından çizildiği aşağıdaki Şekil 3'teki grafikle karşılaştırın. Görevi kasten zorlaştırdım, ancak hangisinin daha uzun olduğunu söyleyebilmelisin.

Şekil 3: Ortak Ölçekli Çubuklar

Yığılmış çubuk grafikler temel olarak Şekil 2'de gösterilenleri yapıyor. Nokta grafikleri Şekil 3'te gösterilene daha benzer olarak düşünülebilir, sadece çubuğu çubuğun ucundaki bir nokta ile değiştirin.

Keşifsel veri analizi için belirli bir grafik oluşturmayın demeyeceğim, ancak çok fazla kategori kullanırken yığılmış çubuk grafiklerden kaçınmayı öneriyorum. Nokta grafikleri de her derde deva değildir, ancak nokta grafikleri olan paneller arasında karşılaştırma yapmanın yığılmış çubuk grafiklerden çok daha kolay olduğuna inanıyorum. Tablolar için de blog yayınımda sunduğum bazı tavsiyeleri düşünün , grafikleri anlamlı kategorilere ayırmaya ve / veya ayırmaya çalışın ve birlikte bakmak istediğiniz öğelerin grafiklerde birbirine daha yakın olduğundan emin olun. Bazı çizim yöntemleri birçok soruya göre iyi ölçülebilmesine rağmen (kategorik ısı haritaları bir örnektir), sıralama yapmadan (anlamlı aykırı değerlerin yanı sıra) herhangi bir anlamlı paterni tanımlamak hala zor olacaktır.

SPSS kullanımı hakkında bir not. SPSS, verilerinize nasıl şekil verileceğini bilmekle birlikte, önceki grafiklerle bağlantılı herhangi birini oluşturabilir (aynı şey ggplot için de geçerlidir, ancak insanlar esasen sizin için yeniden şekillendirme yapmak için paketler geliştirmektedir). SPSS'nin GPL dilinin nasıl daha iyi çalıştığını anlamak için aslında Hadley Wickham'ın ggplot2 hakkındaki kitabını okumanızı öneririm.Kullanım R! dizi. SPSS'nin GPL'nin nasıl çalıştığını anlamak için gerekli dilbilgisini ortaya koyar ve SPSS ile birlikte gelen GPL programlama kılavuzundan çok daha kolay okunur! SPSS'de belirli grafikler oluşturma hakkında herhangi bir sorunuz varsa, bir grafik için bir soru sormak en iyisi olacaktır (burada olduğu gibi yeterince konuştum!) Bu yanıtı bir bağlantıyla güncelleyeceğim, ancak diğer grafiklerin çoğaltan blog yazısı. Isı haritaları veya dalgalanma grafiklerinin kavramının bir kanıtı için başka bir blog yayınımı görebilirsiniz, SPSS'deki bazı örnek düzeltmeler .

Şekil 1'i oluşturmak için kullanılan SPSS kodu

****************************************.
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.
****************************************.

Kibarca için benden güçlü bir artı ama prensipte anlaşılması kolay, ancak pratikte kodu çözülmesi daha az kolay olan yığılmış çubuk grafiklerin eksikliklerini penetran bir şekilde tartışmak.
Nick Cox

5

Ah, açıklığa kavuşturmadan önce kodu buldum. Beklemeliydim, ancak buraya gelen herkesin bu kodu yeniden kullanabilmesi için yayınlamam gerektiğini düşündüm.

Görselleştirmek için kukla veriler

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

Isı haritası için kod

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

Bu temelde Jason Bryon'un web sitesinden bir ısı haritasındaki Likert öğelerini görselleştirmek için bir şablon.


1
github.com/jbryer/irutils/blob/master/R/likert.R , istediğiniz yığılmış çubuk grafiklerin kaynağıdır.
RJ-

Açıklığa kavuşturmak için gruplar arasında karşılaştırma yapmak istemiyorum. Her iki grubun yanıtlarını sofistike bir şekilde sunmak. Bu harika bir yanıt. Gerçekten takdir ediyorum. Teşekkürler.
Adam

3

@ RJ'nin kodu, gerçekten gölgeli hücreler içeren bir tablo olan böyle bir arsa üretir. Onun oldukça meşgul ve deşifre etmek biraz zor. Gölgelemesiz düz bir tablo daha etkili olabilir (ve verileri daha anlamlı bir sıraya koyabilirsiniz).

resim açıklamasını buraya girin

Tabii ki hangi ana mesajı iletmeye çalıştığınıza bağlı, ancak bence bu daha basit ve anlaşılması biraz daha kolay. Aynı zamanda (çoğunlukla!) Mantıksal bir sırayla soruları ve cevapları vardır.

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

resim açıklamasını buraya girin


Grafiğin meşgul göründüğünü kabul etti. Ancak, soruların bir tür sıraya göre gruplandırılması yararlı olabilir, örneğin Q1 - 10 belirli bir boyut hakkında sorular sorar ve bu böyle devam eder. Bir bakışta trendler açıksa renkler söylerdi.
RJ-
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.