Visualizzazione post con etichetta t(). Mostra tutti i post
Visualizzazione post con etichetta t(). Mostra tutti i post

lunedì 10 dicembre 2018

Grafici a barre (barplot) [2]

Dopo la prima parte dedicata ai grafici a barre (bar plot o barplot[1] continuiamo ora estendendo la rappresentazione a un numero maggiore di dati con l'esempio tratto da Marubini [2] relativo al grado di protezione rilevato per cinque differenti vaccini contro l'influenza. Questi sono i dati espressi in percentuale:

Esito
Vaccino_1
Vaccino_2
Vaccino_3
Vaccino_4
Vaccino_5
Influenza_si
18.1
21.0
9.1
18.3
20.0
Influenza_no
81.9
79.0
90.8
81.7
80.0

Questo script permette di generare un classico grafico a barre affiancate. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# GRAFICO A BARRE PER L'EFFICACIA DI 5 VACCINI
#
cells <- c(18.1,21,9.1,18.3,20,81.9,79,90.9,81.7,80) # genera l'array cells con i valori di percentuale
rnames <- c("Influenza_si", "Influenza_no") # genera l'array rnames con i nomi delle righe
cnames <- c("Vaccino_1", "Vaccino_2", "Vaccino_3", "Vaccino_4", "Vaccino_5") # genera l'array cnames con i nomi delle colonne
mydata <- matrix(cells, nrow=2, ncol=5, byrow=TRUE, dimnames=list(rnames, cnames)) # genera la matrice dati
#
mydata # mostra la matrice dati
t(mydata) # mostra la matrice dati trasposta
#
windows() # apre una nuova finestra
barplot(t(mydata), beside=TRUE, legend=TRUE, ylim=c(0,150), col=c("red","orange", "yellow", "green", "skyblue"), ylab="Frequenze osservate", xlab="Esiti delle vaccinazioni", main="Valutazione dell’efficacia di 5 vaccini influenzali") # traccia il grafico a barre verticali
#

Lo script segue lo schema già visto, nelle prime tre righe sono generati con la funzione c():
il vettore che contiene i dieci dati (che come si vede devono essere inseriti in sequenza leggendoli dalla tabella da sinistra a destra e dall'alto in basso) che sono salvati nell'oggetto cells;
il vettore che contiene i nomi delle righe, salvato nell'oggetto rnames;
il vettore che contiene i nomi delle colonne, salvato nell'oggetto cnames.

I tre vettori sono combinati a formare la matrice dei dati mediante la funzione matrix() che impiega gli argomenti che indicano:
l'oggetto/vettore contenente i dati (cells);
il numero di righe (nrow) e il numero di colonne (ncol) della matrice;
la modalità di riempimento della matrice, che deve essere riempita per righe (byrow=TRUE) quindi da sinistra a destra e dall'alto in basso;
i nomi da assegnare alle righe e alle colonne (dimnames=list(rnames, cnames)).

A questo punto per fare il punto della situazione sono mostrate sia la matrice dati mydata sia la sua matrice trasposta t(mydata) [3]:

> mydata # mostra la matrice dati 
             Vaccino_1 Vaccino_2 Vaccino_3 Vaccino_4 Vaccino_5
Influenza_si      18.1        21       9.1      18.3        20
Influenza_no      81.9        79      90.9      81.7        80
> t(mydata) # mostra la matrice dati trasposta 
          Influenza_si Influenza_no
Vaccino_1         18.1         81.9
Vaccino_2         21.0         79.0
Vaccino_3          9.1         90.9
Vaccino_4         18.3         81.7
Vaccino_5         20.0         80.0

Viene quindi aperta una nuova finestra con la funzione windows() (utile se per caso avete già un'altra finestra grafica aperta) e viene generato un primo grafico a barre con la funzione barplot() [4] impiegando questi argomenti:
per i dati viene impiegata la matrice dati trasposta t(mydata);
l'argomento beside=TRUE specifica che le barre sono affiancate e non sovrapposte in pila;
con l'argomento legend=TRUE viene generata una legenda;
con l'argomento ylim=c(0,150) sono impostati il valore minimo e il valore massimo per l'asse delle y;
→ con l'argomento col è impostato il colore delle barre.


Ora copiate e incollate nella Console di R queste due righe di codice e premete ↵ Invio:

#
windows() # apre una nuova finestra
barplot(mydata, beside=FALSE, legend=TRUE, ylim=c(0,150), col=c("red", "green"), density = 40, angle = 45, ylab="Frequenze osservate", xlab="Vaccino infuenzale", main="Valutazione dell’efficacia di 5 vaccini influenzali") # traccia il grafico a barre verticali
#

Con lo script dopo avere aperto una nuova finestra grafica con windows() viene realizzato un nuovo grafico a barre impiegando la funzione barplot() con queste variazioni rispetto al precedente:
per i dati viene impiegata la matrice mydata;
l'argomento beside=FALSE specifica che le barre sono sovrapposte in pila;
con l'argomento col=c("yellow", "green") viene fornito l'array contenente i colori da applicare;
→ con gli argomenti density = 40, angle = 45 sono specificati la densità e l'angolo delle linee colorate che andranno a riempire le barre.

Il risultato è ora questo grafico con le barre sovrapposte in pila (attenzione al fatto che ogni nuova finestra grafica si sovrappone alla precedente, spostatela per visualizzarle entrambe):


Nota: questo esempio illustra un caso classico nel quale l'impiego delle barre impilate non solo è corretto, ma consente di rendere meglio delle barre affiancate l'informazione contenuta nei risultati.

Finora i grafici a barre sono stati generati specificando per ciascuna barra il numero dei casi. Ma se i dati sono numerosi è possibile impiegare la funzione table() che genera tabelle di contingenza che riportano i dati dei conteggi effettuati per noi da R [5].

Per farlo è necessario il pacchetto DAAG [6]. Il pacchetto contiene tra gli altri il set di dati ais sul quale effettuiamo il conteggio e la rappresentazione sotto forma di grafico a barre prima del numero degli atleti per sport praticato e poi del numero degli atleti per sesso e per sport praticato.

Ora copiate e incollate nella Console di R queste righe di codice e premete ↵ Invio:

# GRAFICI A BARRE DA UNA TABELLA DI CONTINGENZA
#
library(DAAG) # carica il pacchetto e il set di dati ais
#
# grafico a barre per sport praticato
#
tab <- table(ais$sport) # tabula i dati per sport
windows() # apre una nuova finestra
barplot(t(tab), beside=TRUE, legend=TRUE, cex.names = 0.8, las = 2, xlab= "Sport praticato", ylab = "Numero degli atleti", main = "Numero degli atleti per sport praticato", col = "green") # grafico a barre
#
# grafico a barre per sport praticato e per sesso
#
tab <- table(ais$sport, ais$sex) # tabula i dati per sport e per sesso
windows() # apre una nuova finestra
barplot(t(tab), beside=TRUE, legend=TRUE, cex.names = 0.8, las = 2, xlab= "Sport praticato", ylab = "Numero degli atleti", main = "Numero degli atleti per sport praticato e per sesso", col = c("green", "yellow")) # grafico a barre
#

Questo è il grafico a barre con il numero degli atleti per sport praticato


e questo è il grafico a barre con il numero degli atleti per sport praticato ulteriormente suddiviso per sesso dell'atleta


In entrambi i casi viene impiegata la matrice trasposta t(tab) ma le cose più interessanti sono:
→ l'espressione table(ais$sport) impiegata per tabulare i dati in base alla variabile sport (lo sport praticato dall'atleta);
→ l'espressione table(ais$sport, ais$sex) impiegata per tabulare i dati in base alla variabile sport e suddividerli ulteriormente in base alla variabile sex (il sesso dell'atleta);
→ l'argomento cex.names = 0.8 che rimpicciolisce le etichette che riportano lo sport corrispondente a ciascuna della barre;
→ l'argomento las = 2 che le ruota verticalmente.

Conclusione: in questo e nel post precedente [1] abbiamo finora impiegato per la realizzazione dei grafici a barre le sole funzioni contenute nella installazione base di R, che sono abbastanza limitate. Per rappresentazioni più complesse e molto più articolate è sicuramente utile ricorrere alle funzioni contenute nel pacchetto ggplot2 [7].


----------

[1] Vedere il post Grafici a barre (barplot) [1].


[3] Digitate help(t) nella Console di R per la documentazione della funzione t().

[4] Digitate help(barplot) nella Console di R per la documentazione della funzione barplot().

[5] Digitate help(table) nella Console di R per la documentazione della funzione table().

[6] Vedere il post Il set di dati ais nel quale trovate anche come caricare i dati della tabella senza installare il pacchetto DAAG


Grafici a barre (barplot) [1]

I grafici a barre (bar plot o barplotsono i più adatti a rappresentare i risultati dei conteggi. Riprendiamo i dati di Snedecor relativi ai decessi avvenuti in un gruppo di non fumatori e in un gruppo di fumatori di pipa [1], trasformandoli ora in percentuale:

Esito
Non_fumatori
Fumatori_di_pipa
Deceduti
11.0
13.4
Viventi
89.0
86.6

Questo script permette di generare due differenti grafici a barre per questi dati. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# GRAFICI A BARRE AFFIANCATE
#
cells <- c(11.0,13.4,89.0,86.6) # genera l'array cells con i valori numerici contenuti nelle celle
rnames <- c("Deceduti", "Viventi") # genera l'array rnames con i nomi delle righe
cnames <- c("Non_fumatori", "Fumatori_di_pipa") # genera l'array cnames con i nomi delle colonne
mydata <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) # genera la matrice dati
#
mydata # mostra la matrice dati
t(mydata) # mostra la matrice dati trasposta
#
windows() # apre una nuova finestra
barplot(mydata,beside=TRUE, legend=TRUE, ylim=c(0,150), col=c("darkblue","red"), ylab="Frequenze osservate", xlab="", main="Grafico a barre matrice originale") # grafico a barre con la matrice originale
#
windows() # apre una nuova finestra
barplot(t(mydata),beside=TRUE, legend=TRUE, ylim=c(0,150), col=c("darkblue","red"), ylab="Frequenze osservate", xlab="", main="Grafico a barre matrice trasposta") # grafico a barre con la matrice trasposta
#

Nelle prime tre righe sono generati con la funzione c():
il vettore che contiene i quattro dati (che come si vede devono essere inseriti in sequenza leggendoli dalla tabella da sinistra a destra e dall'alto in basso) che sono salvati nell'oggetto cells;
il vettore che contiene i nomi delle righe, salvato nell'oggetto rnames;
il vettore che contiene i nomi delle colonne, salvato nell'oggetto cnames.

I tre vettori sono combinati a formare la matrice dei dati mediante la funzione matrix() che impiega gli argomenti che indicano:
l'oggetto/vettore contenente i dati (cells);
il numero di righe (nrow) e il numero di colonne (ncol) della matrice;
la modalità di riempimento della matrice, che deve essere riempita per righe (byrow=TRUE) quindi da sinistra a destra e dall'alto in basso;
i nomi da assegnare alle righe e alle colonne (dimnames=list(rnames, cnames)).

A questo punto per fare il punto della situazione sono mostrate sia la matrice dati mydata sia la sua matrice trasposta t(mydata) [2]:

> mydata # matrice dati
         Non_fumatori Fumatori_di_pipa
Deceduti           11             13.4
Viventi            89             86.6
> t(mydata) # matrice trasposta
                 Deceduti Viventi
Non_fumatori         11.0    89.0
Fumatori_di_pipa     13.4    86.6

Viene quindi aperta una nuova finestra con la funzione windows() e viene generato un primo grafico a barre con la funzione barplot() [3] impiegando questi argomenti:
per i dati viene impiegata la matrice dati originale mydata;
l'argomento beside=TRUE specifica che le barre sono affiancate e non sovrapposte in pila;
con l'argomento legend=TRUE viene generata una legenda;
con l'argomento ylim=c(0,150) sono impostati il valore minimo e il valore massimo per l'asse delle y;
→ con l'argomento col è impostato il colore delle barre.


Viene quindi aperta una nuova finestra con la funzione windows() una nuova finestra (attenzione al fatto che ogni nuova finestra grafica si sovrappone alla precedente, spostatela per visualizzarle entrambe) e viene generato con la funzione barplot() un secondo grafico a barre con gli stessi argomenti del precedente ma impiegando i dati della matrice trasposta t(mydata).


Riprendiamo ora i dati sui quali è stato effettuato in precedenza il test di McNemar [4]. Nella sperimentazione 250 pazienti sofferenti di artrite erano sottoposti al trattamento con il farmaco A e al trattamento con il farmaco B. Era stato poi rilevato il grado di soddisfazione di ciascuno di essi rispetto all'uno e all'altro trattamento:

Esito
Soddisfatto_da_A
Non_soddisfatto_da_A
Soddisfatto_da_B
150
20
Non_soddisfatto_da_B
30
50

In totale 150 soggetti si erano mostrati soddisfatti di entrambi i trattamenti, 50 avevano espresso insoddisfazione per entrambi, mente altri 50 si sono mostrati insoddisfatti 20 dell'uno e 30 dell'altro. In questo caso è inutile trasformare i dati in percentuali, in quanto le proporzioni non cambierebbero.

Questo script permette di generare per questi dati due differenti grafici a barre, il primo a barre affiancate e e il secondo a barre sovrapposte. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# GRAFICI A BARRE AFFIANCATE E A BARRE SOVRAPPOSTE
#
cells <- c(150,20,30,50) # genera l'array cells con i valori numerici contenuti nelle celle
rnames <- c("Soddisfatto_da_B", "Non_soddisfatto_da_B") # genera l'array rnames con i nomi delle righe
cnames <- c("Soddisfatto_da_A", "Non_soddisfatto_da_A") # genera l'array cnames con i nomi delle colonne
mydata <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) # genera la matrice dati
#
mydata # mostra la matrice dati
#
windows() # apre una nuova finestra
barplot(mydata,beside=TRUE, legend=TRUE, ylim=c(0,200), col=c("darkblue","red"), ylab="Frequenze osservate nel campione", xlab="", main="Soddisfazione in seguito al trattamento in 250 soggetti") # i risultati sono arricchiti con un grafico a barre
#
windows() # apre una nuova finestra
barplot(mydata,beside=FALSE,legend=TRUE, ylim=c(0,200), col=c("darkblue","red"), ylab="Frequenze osservate nel campione", xlab="", main="Soddisfazione in seguito al trattamento in 250 soggetti") # i risultati sono arricchiti con un grafico a barre
#

Qui a parte i diversi limiti ylim=c(0,200) per la scala dell'asse delle y non compare nulla di rilevante rispetto allo script precedente, se non l'argomento beside che nel primo grafico viene posto beside=TRUE per generare il grafico a barre affiancate


mentre nel secondo grafico viene posto beside=FALSE per generare un grafico a barre sovrapposte


Notare come queste rappresentazioni grafiche sono complementari all'analisi statistica. Nella seconda parte dei grafici a barre [5] sono riportati altri esempi utili con script che possono essere salvati per essere riadattati al bisogno. Per rappresentazioni più complesse si può ricorrere alle funzioni contenute nel pacchetto ggplot2 [6].


----------


[2] Digitate help(t) nella Console di R per la documentazione della funzione t().

[3] Digitate help(barplot) nella Console di R per la documentazione della funzione barplot().

[4] Vedere il post Test di McNemar

[5] Vedere il post Grafici a barre (barplot) [2].