La visualizzazione dei dati
I grafici
I grafici costituiscono una forma di rappresentazione visiva, su di un'area bidimensionale, di un insieme di informazioni.
Le dimensioni spaziali e visive vengono utilizzate per rappresentare dati quantitativi, ordinali o categoriali.
Vantaggi
Uno dei vantaggi della rappresentazione grafica è che sfrutta alcune caratteristiche del sistema visivo:
- la capacità di elaborare preattentivamente, in parallelo, un'ampia quantità di dati;
- la capacità di identificare pattern, distribuzioni, relazioni fra i dati;
- la capacità di percepire l'allineamento, orizzontale e verticale, degli elementi grafici;
- la capacità di stimare, anche se approssimativamente, differenze di lunghezza, di luminosità, di colore e di forma degli elementi
Più in generale, le rappresentazioni grafiche sfruttano alcuni dei princìpi della gestalt:
- prossimità
- continuità
- allineamento
- connessione
- chiusura
Un buon grafico:
- riesce a comunicare una appropriata quantità di informazioni in maniera corretta, non distorta e facile da comprendere;\
- permette di far emergere pattern, distribuzioni di variabili, relazioni fra variabili, presenza di outlier, relazioni fra osservazioni o fra statistiche, e di stimare, seppure approssimativamente, il valore delle singole osservazioni.
- è intuitivo, e massimizza il rapporto fra informazione e carico cognitivo;
- usa gli aspetti estetici per contribuire a rappresentare l'informazione
Gli elementi grafici
Un grafico è un oggetto grafico complesso. Gli oggetti grafici complessi sono composti da
- uno spazio grafico (bidimensionale)
- degli oggetti grafici (complessi o semplici)
- delle strutture di riferimento (titoli, legende, assi, etichette, annotazioni), che permettono l'interpretazione e facilitano la lettura dei dati
La definizione è ricorsiva: un oggetto grafico complesso può contenere altri oggetti grafici complessi.
Gli oggetti grafici
Gli oggetti grafici rappresentano:
- osservazioni
- statistiche
- relazioni (fra osservazioni o fra statistiche)
Gli oggetti grafici semplici sono formati da figure geometriche: punti (0d), linee o curve (1d), rettangoli o aree (2d), da icone e da elementi testuali
Rappresentare le relazioni
Le relazioni (fra osservazioni o statistiche) sono rappresentate attraverso differenti modalità:
- clustering spaziale
- inclusione in un contenitore (categoriale)
- utilizzo di separatori (categoriale)
- allineamento (relazione ordinale)
- collegamento: generalmente le osservazioni sono punti (nodi), i collegamenti linee o curve (archi); possono essere rappresentati varie tipologie di grafi: catene, loop, grafi complessi, alberi
Codifica delle variabili
Gli oggetti grafici codificano l'informazione in base ad alcune dimensioni. Le principali sono
- la posizione sugli assi x ed y
- la forma
- il colore
- la luminosità
- la dimensione
Altre possibili dimensioni sono il tipo e lo spessore dei bordi o delle linee, il pattern in caso di aree.
Dimensioni e tipologia di dati
Le coordinate x e y sono adatte a rappresentare variabili continue, ordinali e categoriali.
La forma (dei punti), il tipo di linea, alcuni pattern di riempimento delle aree, e alcune palette di colore sono adatti a rappresentare un numero limitato di categorie.
Alcune palette di colore, la luminosità degli oggetti e la densità dei pattern sono adatti a rappresentare le variabili ordinali, mentre sono meno adatti a rappresentare le variabili ad intervalli, in quanto la capacità del nostro sistema visivo di stimare gli intervalli è meno precisa.
Percezione e stima dei valori
Il sistema visivo riesce a stimare abbastanza bene la dimensione degli oggetti (rappresentazione grafica dei punti, la lunghezza delle linee, la dimensione delle aree) se si sviluppa in una sola dimensione, mentre ha difficoltà a stimare la dimensione in base all'area.
Anche la stima angolare è più approssimativa (e dunque è più difficile stimare le proporzioni nei grafici con assi radiali: grafici a torta o a ciambella)
Rappresentazione multivariata
È potenzialmente possibile rappresentare, in un grafico, fino a 5 variabili di ogni osservazione, attraverso le coordinate x e y (a intervalli, ordinali o categoriali), la forma (categorie), il colore (ordinale o categoriale) e la dimensione (ordinale o a rapporti).
In pratica, però, si rischia l'overload cognitivo.
 È pertanto opportuno limitarsi a rappresentare fino a 3, al massimo 4 variabili.
Fundamentals of Data Visualization
ggplot2
ggplot2 è un pacchetto per creare grafici in R. ggplot2 è molto popolare, in quanto
- crea grafici esteticamente piacevoli
- è molto potente
- utilizza in maniera esplicita l'approccio di Grammar of Graphics
La logica
Con ggplot2 la creazione di un grafico avviene attraverso una serie di passi, che possono essere concatenati:
- creare l'oggetto ggplot ed associare il set di dati (generalmente un data.frame) da rappresentare
- calcolare le eventuali statistiche
- identificare la variabile (analisi univariata) o le variabili (rappresentazione bi- o multivariata) da mappare sugli assi x e y o sulle dimensioni grafiche del colore, della dimensione, della forma
- decidere la geometria, ovvero il tipo di elementi visuali (punti, linee, aree o oggetti complessi) in base alla tipologia di dati e delle eventuali statistiche da rappresentare
- definire le scale e le eventuali trasformazioni
- creare uno o più livelli grafici (layer) dove collocare 
  - gli elementi grafici (semplici e complessi)
- le strutture di supporto alla lettura ed interpretazione (titoli, assi, scale, griglie)
 
La sovraimposizione di livelli diversi permette di rappresentare, sullo stesso spazio bidimensionale, osservazioni, statistiche e strutture di supporto
La sintassi
La creazione di un grafico ggplot2 utilizza una sintassi che può essere sintetizzata nel seguente template (cita fonte)
grafico <- ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>(
     mapping = aes(<MAPPINGS>),
     stat = <STAT>, 
     position = <POSITION>
  ) +
  <COORDINATE_FUNCTION> +
  <FACET_FUNCTION>
print (grafico)
Risorse
- Fundamentals of Data Visualization
- The Grammar of Graphics
- A Comprehensive Guide to the Grammar of Graphics for Effective Visualization of Multi-dimensional…
- The Art of Effective Visualization of Multi-dimensional Data
- Grammar of Graphics in R
- 3 Data visualisation | R for Data Science
- Quick-R: ggplot2 Graphs
- Data visualization with ggplot2
- Before Tufte, there was Bertin – Karl Sluis – Medium
- Beyond Tufte – Karl Sluis – Medium
- Top 50 ggplot2 Visualizations - The Master List (With Full R Code)
Esempi
Per mostrare ggplot2 in azione, carichiamo il dataframe parole_nonparole_pulito.rds e carichiamo la libreria ggplot2 (eventualmente la installiamo se non presente nel nostro sistema).
# install.packages("ggplot2")
library(ggplot2)
# partecipanti <- readRDS("https://s3.eu-central-1.amazonaws.com/bussolon/dati/parole_nonparole_pulito.rds")
partecipanti <- readRDS("../../dati/parole_nonparole_pulito.rds")
## Warning in gzfile(file, "rb"): non è possibile aprire il file '../../dati/parole_nonparole_pulito.rds', motivo 'File
## o directory non esistente'
## Error in gzfile(file, "rb"): non è possibile aprire la connessione
Barplot
Creaiamo un grafico a barre con la distribuzione della scolarità. Mappiamo anche la dimensione del genere.
ggBar1 <- ggplot(partecipanti, aes(scol))
ggBar1 + geom_bar(aes(fill=sex), width = 0.5) + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
  labs(title="Scolarità", 
       subtitle="Scolarità, per sesso", 
       caption="Parole non parole - barplot")
print (ggBar1)
Un secondo esempio di barplot per visualizzare la distribuzione del sesso.
ggBar2 <- ggplot(partecipanti, aes(x="", fill=sex)) +
	geom_bar(width = 0.5) + 
	#theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
	labs(title="Genere", 
       #subtitle="Genere", 
			 x= "",
			 y= "Frequenza",
       caption="Parole non parole - barplot 2")
plot(ggBar2)
Grafico a torta
In ggplot2 un grafico a torta è un grafico a barre con coordinate polari.
ggPie <- ggBar2 +
	coord_polar("y", start=0)
plot(ggPie)
Istogramma
L'istogramma della distribuzione delle risposte corrette
ggHist <- ggplot(data=partecipanti, aes(corrette)) + 
	geom_histogram() +
  labs(title="Corrette",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - barplot")
plot(ggHist)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Histograms and frequency polygons --- geom_freqpoly • ggplot2
Density plot
ggDensity <- ggplot(data=partecipanti, aes(corrette)) + 
	geom_density() +
  labs(title="Corrette",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - Density")
plot(ggDensity)
# geom_density(aes(fill=factor(cyl)), alpha=0.8) + 
Creiamo un nuovo density plot. In questo caso, però, definiamo il colore dell'area (fill) in base alla scolarità. In questo modo otterremo 6 aree sovrapposte.
Va notato che l'altezza delle aree è normalizzata, e non proporzionale alla frequenza delle varie categorie.
ggDensity2 <- ggplot(data=partecipanti, aes(corrette)) + 
	geom_density(aes(fill=factor(scol)), alpha=0.5) +
  labs(title="Corrette",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - Density")
plot(ggDensity2)
# geom_density(aes(fill=factor(cyl)), alpha=0.8) + 
Boxplot
Il boxplot della distribuzione delle risposte corrette, distinte per scolarità
ggBoxplot <- ggplot(data=partecipanti, aes(scol,corrette)) + 
	geom_boxplot(varwidth=T) + # , fill="plum"
  labs(title="Corrette x scolarità",
  		 x="Scolarità",
  		 y="Risposte corrette",
       subtitle="Numero di risposte corrette, per scolarità", 
       caption="Parole non parole - Boxplot")
plot(ggBoxplot)
Boxplot + jitter
In questo grafico al boxplot sono sovrapposti (in un layer superiore) i punti corrispondenti alle osservazioni.
 Viene usata la geometria jitter, che inserendo del rumore nei dati permette la visualizzazione dei punti altrimenti sovrapposti.
In questo grafico vediamo all'opera la logica dei layer sovrapposti.
ggBoxplot2 <- ggplot(data=partecipanti, aes(scol,corrette)) + 
	geom_boxplot(varwidth=T) + # , fill="plum"
	geom_jitter(width = .2, size=1, color="lightslateblue") +
  labs(title="Corrette x scolarità",
  		 x="Scolarità",
  		 y="Risposte corrette",
       subtitle="Numero di risposte corrette, per scolarità", 
       caption="Parole non parole - Boxplot")
plot(ggBoxplot2)
Violin plot
ggViolin <- ggplot(data=partecipanti, aes(scol,corrette)) + 
	geom_violin() + # , fill="plum"
  labs(title="Corrette x scolarità",
  		 x="Scolarità",
  		 y="Risposte corrette",
       subtitle="Numero di risposte corrette, per scolarità", 
       caption="Parole non parole - Boxplot")
plot(ggViolin)
Scatterplot
ggScatter <- ggplot(partecipanti, aes(x=risposte, y=corrette)) + 
  geom_point(aes(col=sex, size=as.numeric(scol))) +  # , size=scol
  labs(
    title="Scatterplot", 
  	subtitle="Risposte Vs Corrette", 
    y="Corrette", 
    x="Risposte date", 
    caption = "Exp. parole non parole")
plot(ggScatter)
## Warning: Removed 38 rows containing missing values (geom_point).
In questo grafico abbiamo mappato 3 dimensioni; in genere è necessario evitare il rischio è di sovraccaricare il grafico.
ggJitter <- ggplot(partecipanti, aes(x=risposte, y=corrette)) + 
  # geom_point(aes(col=sex, size=as.numeric(scol))) +  # , size=scol
	geom_jitter(aes(col=sex),width = .2, size=1) +
  labs(
    title="Jitterplot", 
  	subtitle="Risposte Vs Corrette", 
    y="Corrette", 
    x="Risposte date", 
    caption = "")
plot(ggJitter)
Esercizi
Caricare il data frame df_simulato
df_simulato <- read.csv(
	"https://s3.eu-central-1.amazonaws.com/bussolon/dati/df_simulato.csv")
Riprodurre i seguenti grafici