domenica 7 febbraio 2021

Grafici a violino (violin plot)

I grafici a violino (violin plot) prendono lo spunto dai grafici a scatola con i baffi (boxplot) riportando per una distribuzione univariata, al posto delle classiche scatole, il profilo di densità dei valori osservati sotto forma di kernel density plot, l'alternativa/evoluzione ai/dei comuni istogrammi [1].

La forma tipica dei grafici, quella che dà loro il nome, deriva dal fatto che il kernel density plot dei dati è riportato simmetricamente da entrambi i lati della distribuzione. Mentre interessante, come vedremo tra poco, è che a un violin plot possono essere sovrapposti al bisogno un grafico a scatola con i baffi (boxplot) [vedi post] o un grafico a punti (dotplot) [vedi post], a testimonianza del fatto che si tratta di viste dei dati diverse ma tra loro integrate.

Per eseguire il codice che segue è necessario scaricare dal CRAN il pacchetto ggplot2 [2]. Come dati impieghiamo quelli rilevati su 202 atleti australiani riportati nel post Il set di dati ais nel quale trovate come scaricare il file contenente i dati, come installarli sul vostro PC, ovvero, in alternativa, come scaricare il pacchetto DAAG che li contiene.

Copiate questa prima parte dello script, incollatela nella Console di R e premete ↵ Invio.


# GRAFICI A VIOLINO (VIOLIN PLOT)...
#
ais <- read.table("c:/Rdati/ais.csv", header=TRUE, sep=";", dec=",") # importa i dati
library(ggplot2) # carica il pacchetto necessario
#
# ... con kernel density plot riportato per intero (1/6)
windows() # apre una nuova finestra
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=FALSE)
#

Se avete installato il pacchetto DAAG potete sostituire la prima riga di codice
ais <- read.table("c:/Rdati/ais.csv", header=TRUE, sep=";", dec=",")
con
library(DAAG)
in quanto il pacchetto DAAG già contiene i dati di esempio nell'oggetto ais.

La seconda riga di codice carica il pacchetto ggplot2 che contiene le funzioni necessarie per realizzare i grafici a violino/violin plot.

Dopo (terza riga) avere aperto e inizializzato con la funzione windows() una nuova finestra grafica, arriviamo finalmente all'unica riga di codice necessaria per realizzare il nostro primo grafico a violino mediante due funzioni concatenate:
la funzione ggplot() che specifica come primo argomento i dati da impiegare (ais) e come secondo argomento impiega la funzione aes() per realizzare il grafico per la variabile eritrociti (y=rcc) separatamente per ciascuno sport praticato (x=sport), riempiendo i grafici con un colore differente per ciascuno sport (fill=sport);
la funzione geom_violin che realizza il grafico riportando per intero il kernel density plot calcolato sui dati.

Questo è quindi il primo grafico:













Minimizzate la finestra ma non chiudetela: vi sarà utile riaprirla per confrontare questo primo grafico con il secondo e con i successivi grafici.

Ora copiate e incollate nella Console di R la seconda parte dello script e premete ↵ Invio.

# ... con kernel density plot/violin plot troncato ai valori minimo e massimo osservati (2/6)
windows() # apre una nuova finestra
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=TRUE)
#

Ponendo nella funzione geom_violin() l'argomento trim=TRUE il kernel density plot/violin plot viene ora troncato in corrispondenza del valore minimo e del valore massimo osservati, o se preferite viene tracciato solamente all'interno del range/intervallo dei valori osservati. Il che corrisponde ad una regola aurea in quanto in statistica (ma non solo in statistica) effettuare una estrapolazione, ovvero andare oltre i dati, quindi andare al di la dell'informazione in nostro possesso, significa addentrarsi in un terreno molto scivoloso.

Questo è il secondo grafico:














Ora copiate e incollate nella Console di R la terza parte dello script e premete ↵ Invio.

# ... con sovrapposto grafico a scatola con i baffi/boxplot (3/6)
windows() # apre una nuova finestra
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=TRUE) + geom_boxplot(width=0.1, fill="white")
#


Qui è stata aggiunta la funzione geom_boxplot() che sovrappone al grafico a violino/violin plot un grafico a scatola con i baffi/boxplot specificando di rappresentare le scatole dei grafici:
→ con width"0.1" che definisce la larghezza delle scatole/box;
→ con fill"white" che specifica il colore di riempimento delle scatole/box.

Da notare che sono stati impiegati gli stessi dati utilizzati nel post Grafici a scatola con i baffi (boxplot) proprio per consentirvi di effettuare un immediato confronto tra le due rappresentazioni grafiche.

Questo è il terzo grafico realizzato:














Copiate e incollate nella Console di R la quarta parte dello script e premete ↵ Invio.

# ... senza legenda (4/6)
windows() # apre una nuova finestra
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=TRUE) + geom_boxplot(width=0.1, fill="white") + theme(legend.position="none")
#

Questa volta aggiungendo theme(legend.position="none") abbiamo tolto, in quanto ridondante, la legenda generata automaticamente che compariva sulla destra.

Questo è conseguentemente il quarto grafico:














Copiate e incollate nella Console di R la quinta parte dello script e premete ↵ Invio.

# ... con titolo ed etichette degli assi (5/6)
windows() # apre una nuova finestra
ggplot(ais, aes(x=sport, y=rcc, fill=sport)) + geom_violin(trim=TRUE) + geom_boxplot(width=0.1, fill="white") + theme(legend.position="none") + labs(title="Concentrazione degli eritrociti per sport praticato", x="Sport", y = "Concentrazione degli eritrociti (10^12/L)")
#

Ogni grafico che si rispetti prevede un titolo e la descrizione della variabili rappresentate, cosa che viene qui realizzata con la funzione labs() nella quale sono specificati titolo (title=), etichetta dell'asse delle x (x=) ed etichetta dell'asse delle y (y=).

Questo è il relativo e quinto grafico:














Per eseguire la sesta e ultima parte dello script copiate e incollate nella Console di R il codice che segue e premete ↵ Invio.

# ... con sovrapposto grafico a punti/dotplot e imponendo i valori minimo e massimo per l'asse delle y (6/6)
windows() # apre una nuova finestra
ggplot(ais, aes(x=sport, y=hg, fill=sport)) + geom_violin(trim=TRUE) + geom_dotplot(method="dotdensity", binaxis='y', stackdir="center", stackratio=1, dotsize=0.7, binwidth=0.2, show.legend=FALSE) + coord_cartesian(ylim=c(10,20)) + theme(legend.position="none") + labs(title="Concentrazione dell'emoglobina nel sangue per sport praticato", x="Sport praticato", y="Emoglobina (g/dL)")
#

Qui i dati sono cambiati: abbiamo riportato, per ciascuno sport praticato, la concentrazione dell'emoglobina, la stessa impiegata per realizzare i Grafici a punti (dotplot)per consentirvi di effettuare un immediato confronto tra le due rappresentazioni grafiche.

Inoltre è stata aggiunta la funzione coord_cartesian() mediante la quale sono fissati (ylim=) il limite inferiore (10) e il limite superiore (20) entro i quali rappresentare i valori.

E questo è il sesto e ultimo grafico:


















Potete ovviamente riunire le varie parti di codice sopra riportate in un unico script, come pure ricomporle e adattarle per ottenere la rappresentazione che più vi interessa, aiutandovi anche con la documentazione del pacchetto [2].

Per riutilizzare lo script è sufficiente assegnare (<-) i vostri dati all'oggetto ais ricordando che:
→ i dati devono contenere una variabile numerica da analizzare;
→ i dati devono contenere un fattore, cioè una variabile qualitativa con la quale aggregare i dati in sottoinsiemi;

→ potete ovviamente cambiare il nome dell'oggetto contenente i vostri dati, ricordandovi di cambiarlo ogniqualvolta compare nello script.

Per una guida rapida all'importazione dei dati potete consultare i link:
importazione dei dati da un file .xls o .xlsx
importazione dei dati da un file .csv

Infine si rammenta che nel post Salvare i grafici di R in un file è riportato uno script che consente di trasformare i grafici in immagini e salvarli sotto forma di file .bmp, .jpeg, .png, .pdf, .ps per poterli stampare, archiviare, inserire in una pubblicazione, in un post o in un sito web.


-----------


[1] Vedere anche il post Istogrammi e kernel density plot.

[2] Il manuale di riferimento Package ‘ggplot2’ lo trovate facendo click sul link Reference manual nella pagina di documentazione del pacchetto. URL consultato il 7/02/2021: https://bit.ly/3ioEJfE


mercoledì 25 novembre 2020

Grafici a punti (dotplot)

I grafici a punti (dotplot) rappresentano una interessante alternativa ai grafici a scatola con i baffi (boxplot) [vedi post] nei casi di distribuzioni univariate che includono pochi dati e per le quali non volete perdere il dettaglio dei singoli valori. Possono inoltre essere sovrapposti sia a questi ultimi sia ai grafici a violino (violin plot) [vedi post] a testimonianza del fatto che si tratta di viste dei dati diverse ma tra loro integrate.

Per eseguire i due script che seguono è necessario scaricare dal CRAN il pacchetto ggplot2 [1] e il pacchetto gridExtra [2]. Accertatevi inoltre di avere già installato il pacchetto DAAG che contiene i dati impiegati nello script, o in alternativa installatelo procedendo come indicato nel post Il set di dati ais. Copiate questo primo script, incollatelo nella Console di R e premete ↵ Invio.

# UN GRAFICO A PUNTI (DOTPLOT)
#
library(DAAG) # carica il pacchetto DAAG che include il set di dati ais
library(ggplot2) # carica il pacchetto necessario per la grafica
#
ggplot(ais, aes(x=sport, y=hg, fill=sport)) + geom_dotplot(method="dotdensity", binaxis='y', stackdir="center", stackratio=1, dotsize=1, binwidth=0.2, show.legend=FALSE) + coord_cartesian(ylim=c(10, 20)) + labs(title="Concentrazione dell'emoglobina nel sangue per sport praticato", x="Sport praticato", y="Emoglobina (g/dL)") + theme_classic() # traccia dotplot dell'emoglobina per sport
#


Come vedete il pacchetto ggplot2 consente di realizzare il grafico a punti o dotplot impiegando di fatto una sola riga di codice che include cinque funzioni concatenate:
la funzione ggplot() che specifica i dati da impiegare (ais) e con la funzione aes() specifica di realizzare il grafico a punti separatamente per ciascuno sport praticato (x=sport) per la variabile emoglobina (y=hg);
la funzione geom_dotplot() che di fatto realizza il grafico con una serie piuttosto articolata di argomenti per il dettaglio dei quali rimando alla documentazione della funzione inclusa nel manuale di riferimento del pacchetto [1];
la funzione coord_cartesian() che viene impiegata per stabilire (ylim=) valore minimo e valore massimo pare rappresentare la distribuzione dei punti sull'asse delle y;
la funzione labs() che molto banalmente riporta titolo ed etichette degli assi;
la funzione theme_classic() che definisce “il look” del grafico.

Se guardate alla struttura dei dati contenuti nell'oggetto ais digitando
str(ais)
notate che i dati impiegati per realizzare il grafico sono strutturati (l'ordine e il numero delle variabili è ovviamente indifferente) come segue

fattore valore
   A      4               
   B      2
   B      5
   A      4
   C      3
   A      5
   C      2
   B      7
  ...    ...

dove nel caso specifico il fattore è lo sport praticato contenuto nella variabile sport (riportata sull'asse orizzontale x) e il valore è la concentrazione di emoglobina contenuta nella variabile hg (riportata sull'asse verticale y). Quindi, in generale, per realizzare un grafico a punti o dotplot dovete avere una variabile numerica che contiene i valori osservati più una seconda variabile che contiene un criterio/fattore di classificazione per ciascuno dei valori osservati.

E questo è il grafico ottenuto con lo script.









fare click sull'immagine per ingrandirla










Ora copiate questo secondo script, incollatelo nella Console di R e premete ↵ Invio.

# DUE GRAFICI A PUNTI (DOTPLOT) AFFIANCATI
#

library(DAAG) # carica il pacchetto DAAG incluso il set di dati ais
#

library(ggplot2) # carica il pacchetto
plot1 <- ggplot(ais, aes(x=sex, y=hg, fill=sex)) + geom_dotplot(method="dotdensity", binaxis='y', stackdir="center", stackratio=1, dotsize=0.7, binwidth=0.2, show.legend=FALSE) + coord_cartesian(ylim=c(10, 20)) + labs(title="Emoglobina per sesso", x="Sesso", y="Emoglobina (g/dL)") + theme_classic() # dotplot dell'emoglobina per sesso
plot2 <- ggplot(ais, aes(x=sex, y=hc, fill=sex)) + geom_dotplot(method="dotdensity", binaxis='y', stackdir="center", stackratio=1, dotsize=1, binwidth=0.2, show.legend=FALSE) + coord_cartesian(ylim=c(35, 50)) + labs(title="Ematòcrito per sesso", x="Sesso", y="Ematòcrito (%)") + theme_classic() # dotplot dell'ematòcrito per sesso
#
library(gridExtra) # carica il pacchetto con la funzione necessaria per realizzare i grafici affiancati
grid.arrange(plot1, plot2, nrow = 1) # i due grafici sono affiancati orizzontalmente
#


Il codice per realizzare il grafico riportato nello script precedente viene in questo secondo script replicato due volte, per realizzare due grafici, e di fatto è sempre lo stesso tranne che per due aspetti:
→ il grafico a punti viene ora realizzato per sesso (x=sex) per la variabile ematòcrito (y=hc);
→ per affiancare i due grafici, dell'emoglobina per sesso e dell'ematòcrito per sesso, viene impiegata la funzione grid.arrange() inclusa nel pacchetto gridExtra [2] che consente di superare i limiti della analoga funzione par(mfrow=...) del pacchetto base di R [3] che in questo caso non consente di affiancare i grafici.

Questo è il risultato.









fare click sull'immagine per ingrandirla










Per adattare gli script ai vostri dati dovete semplicemente:
 nella funzione aes() sostituire in x il nome della variabile (sex) con quello della variabile/fattore che volete impiegare per raggruppare i vostri valori in sottoinsiemi;
→ nella funzione aes() sostituire in y il nome della variabile (hg) con quello della variabile che contiene i vostri valori;
→ nella funzione labs() adattare opportunamente titolo, nome del fattore e nome della variabile.

Ricordate infine che:
→ potete visualizzare il kernel density plot dei dati sovrapponendo ai grafici a punti i Grafici a violino (violin plot);
 potete salvare le immagini realizzate con R sotto forma di file .bmp, .jpeg, .png, .pdf, .ps per stamparle, archiviarle, inserirle in una pubblicazione, in un post o in un sito web, impiegando il codice riportato nel post Salvare i grafici di R in un file.

Un altro esempio di applicazione delle funzioni incluse nel pacchetto ggplot2 lo trovate nel post Istogrammi e kernel density plot. Se siete interessati a rappresentazioni grafiche più elaborate di quelle presenti nel pacchetto base di R potrebbe esservi utile approfondire le funzioni del pacchetto ggplot2 [1]. 


----------

[1] Il manuale di riferimento Package ‘ggplot2’ lo trovate facendo click sul link Reference manual nella pagina di documentazione del pacchetto. URL consultato il 2/10/2020: https://bit.ly/3ioEJfE

[2] Il manuale di riferimento Package ‘gridExtra’ lo trovate facendo click sul link Reference manual nella relativa pagina di documentazione del pacchetto. URL consultato il 2/10/2020: https://bit.ly/36qc9Ip

[3] Alcuni esempi di impiego della funzione par(mfrow=...) sono riportati nel post Inserire più grafici nella stessa immagine.

giovedì 19 novembre 2020

Link ai file di dati, ripristino

I link ai file di dati sono stati ripristinatiPer i dettagli sulle varie modalità che si hanno a disposizione per scaricare i file di dati di esempio impiegati nei post, si rimanda alla pagina Dati.

[vedi Link ai file di dati, crash]


mercoledì 18 novembre 2020

Link ai file di dati, crash

Attenzione: a causa di un problema momentaneo i link ai file contenenti i dati di esempio di volta in volta riportati nei singoli post non funzionano, tuttavia i file di dati possono essere scaricati sia singolarmente sia sotto forma di un unico file .zip (in quest'ultimo caso fate click su Code quindi su Download ZIPda GitHub al link http://bit.ly/32KRTvC 

I link ai file di dati - sia quelli contenuti nei singoli post sia quelli omnicomprensivi riportati alla pagina Dati - saranno ripristinati a breve, grazie per la comprensione.

[vedi Link ai file di dati, ripristino]


domenica 4 ottobre 2020

Grandezze e unità di misura

Se è vero che la statistica è la tecnica che consente di fornire un supporto scientifico alle evidenze fornite dalle misure [di qualsivoglia fenomeno qualitativo o quantitativo], ci sono dal punto di vista metodologico, nelle misure, quattro passaggi sull'importanza dei quali non mi stancherò mai di richiamare l'attenzione:
→ la necessità, nel caso di scale numeriche, di impiegare un sistema di unità di misura razionale, documentato e condiviso quale è il Sistema internazionale di unità (SI), applicandone integralmente e senza eccezioni le indicazioni formali che sono in realtà più che mai sostanziali [1, 2];
→ la necessità di impiegare le regole, una delle quali sistematicamente disattesa, che indicano come separare i decimali e come raggruppare le cifre.

Qualcuno potrà obiettare che nell'ambito della statistica si tratta di aspetti marginali. Sarà anche vero: tuttavia sono convinto della necessità di richiamare l'attenzione su questi passaggi in quanto, essendo dati per ovvi e scontati senza il minimo di approfondimento che richiederebbero, sono ancor oggi fonte di inesattezze tanto banali quanto fastidiose, che possono essere facilmente evitate seguendo le indicazioni delle fonti che ho riportato qui sopra.

Aggiungo qualche parola in più in merito a grandezze e unità di misura. Discendente diretto del sistema metrico decimale originato dalla rivoluzione francese (fondato su metro e kilogrammo) e del successivo sistema MKSA (fondato su metro, kilogrammo, secondo, ampere e conosciuto anche come Sistema Giorgi in onore del proponente italiano Giovanni Giorgi), il Sistema internazionale di unità (SI), accettato dalla Comunità Economica Europea (CEE) nel 1980 e divenuto legale in Italia nel 1982, il giorno 20 maggio 2019 ha visto cambiare le definizioni di chilogrammo, ampere, kelvin e mole [2]. Lo scopo di questo cambiamento è basare le sette unità di misura fondamentali del SI sulle leggi della fisica, dando loro un fondamento solido, immutabile nel tempo e nello spazio.

Ho riassunto brevemente la storia delle unità di misura, dall'antichità al cambiamento epocale del SI avvenuto il 20 maggio 2019, in un ebook, disponibile facendo click su questa immagine del logo del nuovo SI


Per scaricare sul PC o tablet o smartphone il libro in formato
.pdf, dopo avere aperto il libro online con l'opzione Leggi, fate click su I miei libri quindi fate click sui tre puntini disposti verticalmente in basso a destra sulla copertina del libro e infine fate click su Scarica PDF



----------

[1] Bureau International des Poids et Mesures. The International System of Units (SI). URL consultato il 3/10/2020: https://bit.ly/30tZOiq

[2] Bureau International des Poids et Mesures. SI Brochure. URL consultato il 3/10/2020: https://bit.ly/3le9aXR