Visualizzare la relazione fra due variabili likert

Lavorando nel campo della psicologia, spesso mi trovo ad avere a che fare con variabili che derivano da riposte a questionari fornite utilizzando scale di tipo Likert. Si tratta di variabili che possono assumere un numero molto limitato di modalità, comunemente da tre a cinque. Quando le categorie di riposta sono almeno cinque, spesso queste variabili vengono considerate come se fossero continue e di conseguenza vengono analizzate usando indicatori e modelli statistici pensati appunto per variabili continue.

Con questo post non voglio entrare nel merito della correttezza di queste scelte (condivisibili o meno, a seconda dei casi), ma concentrarmi sul modo di utilizzare al meglio gli strumenti statistici, principalmente i grafici.

Di seguito viene costruito il data frame likert che contiene due variabili: item1 e item2, che riportano le risposte (espresse su scala Likert a cinque punti) di sessanta ipotetiche persone a due ipotetiche domande di un ipotetico questionario.

likert <- data.frame(
    item1 = c(5,3,5,5,4,1,2,3,3,5,5,2,1,3,3,3,4,2,4,1,
              3,4,4,5,3,4,5,2,1,4,3,2,3,2,4,5,5,2,5,3,4,
              4,3,2,1,1,1,5,2,3,1,1,2,2,2,3,4,2,4,3),
    item2 = c(5,2,5,4,4,1,3,3,1,3,3,2,1,3,1,3,1,2,4,1,
              3,4,2,4,4,5,5,2,1,1,1,4,4,2,4,4,5,2,5,4,5,
              3,3,1,2,2,1,5,5,5,3,4,1,1,3,2,4,2,3,2)
)
&#91;/code&#93;

Per studiare la relazione tra due variabili di questo tipo, quello che comunemente viene fatto è calcolare l'indice di correlazione lineare. Possiamo usare l'indice di Pearson oppure l'indice di Spearman, basato sui ranghi.

Attraverso il comando <b>cor</b> di R possiamo calcolare entrambi gli indici; se non viene specificato nulla nell'argomento <i>method</i>, verrà calcolata la correlazione di Pearson:

[code language="R"]
> with(likert, cor(item1, item2))
[1] 0.5901713

Se invece vogliamo calcolare l'indice di Spearman, dobbiamo esplicitare questa richiesta nell'argomento method:

> with(likert, cor(item1, item2, method="spearman"))
[1] 0.5864863

Entrambi gli indici evidenziano un'ottima correlazione fra le due variabili (“ottima” almeno per gli standard in psicologia): si sfiora lo 0.6, che è un valore abbastanza elevato.

Quello che - ahimè - non fa quasi nessuno, è visualizzare la relazione tra le due variabili. I grafici hanno sempre tanto da raccontare e talvolta è proprio dalle visualizzazioni che emergono gli aspetti più interessanti. Proviamo quindi a creare uno scatterplot per visualizzare la relazione fra item1 e item2. Utilizziamo il comando plot, aumentando la dimensione dei punti sfruttando l'argomento cex:

with(likert, plot(item1, item2, cex=2))

Scatter-plot fra item1 e item2

Beh, che ve ne pare? Si tratta di una buona visualizzazione? Secondo me, no.

A vedere questo grafico a me sorgono molte perplessità. Abbiamo appena detto che la relazione lineare tra le due variabili è buona, ma dal grafico proprio non si direbbe: i punti sono sparpagliati un po' ovunque e le due variabili sembrano tutto fuorché correlate.

Il problema di questo grafico è che le variabili possono assumere pochi valori (da 1 a 5), per cui moltissime risposte si sovrappongono. Ognuno di quei pallini in realtà ha una densità, perché su ognuno di essi si sovrappongono le risposte di più individui. Osservando bene l'immagine, infatti, possiamo notare che ci sono pallini il cui contorno è più scuro di altri; ebbene, nelle coordinate più scure si concentrano le risposte di più persone.

Il numero di osservazioni presente in ogni coordinata è un dato fondamentale per comprendere la relazione tra due variabili che assumono un numero ridotto di modalità, ma nell'immagine qui sopra questa informazione non è ben rappresentata.

La “densità” può essere calcolata semplicemente contando il numero di risposte che occorrono per ognuno degli incroci dei valori delle due variabili, ovvero costruendo una tabella di frequenza a doppia entrata:

> tab <- with(likert, table(item1, item2))
> tab
     item2
item1 1 2 3 4 5
    1 5 2 1 1 0
    2 3 6 2 1 1
    3 3 3 5 3 1
    4 2 1 2 5 2
    5 0 0 2 3 6

Osservando la tabella qui sopra possiamo notare come le frequenze maggiori siano collocate sulla diagonale, fenomeno che supporta la presenza di una relazione lineare e che giustifica valori di correlazione così elevati. Ma come fare per considerare questa informazione nel grafico?

Adesso vi proporrò due alternative; entrambe richiedono che la tabella di frequenza che abbiamo appena costruito venga convertita in un oggetto di tipo data.frame:

> tab <- as.data.frame(tab)
> head(tab)
  item1 item2 Freq
1     1     1    5
2     2     1    3
3     3     1    3
4     4     1    2
5     5     1    0
6     1     2    2

Grafico a bolle (bubble chart)


Quello che manca al grafico costruito poco sopra è l'informazione sul numero di osservazioni in ogni coordinata. Il modo più semplice di considerare quella che è a tutti gli effetti una terza variabile è fare in modo che il diametro di ogni punto dipenda dalla frequenza. Verrà creato così un grafico nel quale saranno presenti punti più grandi e punti più piccoli: più grande sarà il punto, maggiore sarà la concentrazione di dati.

Per realizzare questo grafico possiamo usare il comando symbols, specificando nell'argomento inches un'unità di misura per calibrare la dimensione dei punti.

with(tab, symbols(item1, item2, Freq, inches=0.6))

Bubble-plot fra item1 e item2

Il risultato conferma che la densità è maggiore sulla diagonale e va diminuendo con l'allontanarsi da questa. I dati quindi non sono sparpagliati in maniera casuale come poteva sembrare nel primo grafico, ma la relazione fra item1 e item2 segue un andamento ben preciso (nello specifico lineare).

Grafico a mattonelle (tile plot)


Un altro tipo di grafico che ci viene in aiuto è il tile plot. In questo tipo di visualizzazione, i dati sono rappresentati attraverso delle mattonelle che vengono colorate a seconda del valore assunto da una terza variabile. Per costruire il tileplot dobbiamo installare e attivare il pacchetto ggplot2 (del quale abbiamo già parlato).

Allo strato di base costruito con il comando ggplot dobbiamo aggiungere un livello creato con geom_tile e un gradiente di colore con scale_fill_gradient; infine, possiamo specificare un tema (io ho scelto theme_bw):

library(ggplot2)
ggplot(data=tab, aes(x=item1, y=item2, fill=Freq)) +
    geom_tile(colour="white") +
    scale_fill_gradient(low="white", high="red3") +
    theme_bw()

Tile-plot fra item1 e item2

Il grafico a mattonelle è forse quello più accattivante, ma probabilmente anche il più complicato da costruire, visto che richiede l'uso di ggplot2.

E voi, quali soluzioni prediligete in questi casi?

Print Friendly