class: center, middle, inverse, title-slide # Visualizzazione ### Stefano Bussolon ### marzo 2019 --- # 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 --- ## 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, massimizza il rapporto fra informazione e *rumore*, senza indurre un sovraccarico cognitivo; * gli aspetti estetici contribuiscono 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 o 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; 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. --- # ggplot2 --- class: vCentrale ### 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, 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) ```r grafico <- ggplot(data = <DATA>) + <GEOM_FUNCTION>( mapping = aes(<MAPPINGS>), stat = <STAT>, position = <POSITION> ) + <COORDINATE_FUNCTION> + <FACET_FUNCTION> print (grafico) ``` --- ## Risorse * [Fundamentals of Data Visualization](https://serialmentor.com/dataviz/aesthetic-mapping.html) * [The Grammar of Graphics](https://www.cs.uic.edu/~wilkinson/TheGrammarOfGraphics/GOG.html) * [A Comprehensive Guide to the Grammar of Graphics for Effective Visualization of Multi-dimensional…](https://towardsdatascience.com/a-comprehensive-guide-to-the-grammar-of-graphics-for-effective-visualization-of-multi-dimensional-1f92b4ed4149) * [The Art of Effective Visualization of Multi-dimensional Data](https://towardsdatascience.com/the-art-of-effective-visualization-of-multi-dimensional-data-6c7202990c57) * [Grammar of Graphics in R](https://houstonusers.github.io/intro-to-ggplot2/#/jacques-bertin-1967) * [3 Data visualisation | R for Data Science](https://r4ds.had.co.nz/data-visualisation.html) * [Quick-R: ggplot2 Graphs](https://www.statmethods.net/advgraphs/ggplot2.html) * [Data visualization with ggplot2](https://datacarpentry.org/R-ecology-lesson/04-visualization-ggplot2.html) * [Before Tufte, there was Bertin – Karl Sluis – Medium](https://medium.com/@karlsluis/before-tufte-there-was-bertin-63af71ceaa62) * [Beyond Tufte – Karl Sluis – Medium](https://medium.com/@karlsluis/beyond-tufte-fd93cbcec6af) * [Top 50 ggplot2 Visualizations - The Master List (With Full R Code)](http://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html) --- # 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). ```r # install.packages("ggplot2") library(ggplot2) # partecipanti <- readRDS("https://s3.eu-central-1.amazonaws.com/bussolon/dati/parole_nonparole_pulito.rds") partecipanti <- readRDS("~/documenti/didattica/r_dottorato/dati/parole_nonparole_pulito.rds") ``` --- ## Barplot Creaiamo un grafico a barre con la distribuzione della scolarità. Mappiamo anche la dimensione del genere. ```r 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", x="", y="") ``` --- ```r print (ggBar1) ``` ![](visualizzazione_files/figure-html/plot_vis_barchart-1.png)<!-- --> --- Un secondo esempio di barplot per visualizzare la distribuzione del sesso. ```r 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") ``` --- ```r plot(ggBar2) ``` ![](visualizzazione_files/figure-html/plot_vis_barchart2-1.png)<!-- --> --- ## Grafico a torta In ggplot2 un grafico a torta è un grafico a barre con coordinate polari. ```r ggPie <- ggBar2 + coord_polar("y", start=0) ``` --- ```r plot(ggPie) ``` ![](visualizzazione_files/figure-html/plot_vis_pie-1.png)<!-- --> --- ## Istogramma L'istogramma della distribuzione delle risposte corrette ```r 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") ``` --- ```r plot(ggHist) ``` ``` ## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`. ``` ![](visualizzazione_files/figure-html/plot_vis_hist-1.png)<!-- --> [Histograms and frequency polygons — geom_freqpoly • ggplot2](https://ggplot2.tidyverse.org/reference/geom_histogram.html) ## Density plot ```r 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") ``` --- ```r plot(ggDensity) ``` ![](visualizzazione_files/figure-html/plot_vis_density-1.png)<!-- --> --- 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. ```r 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") ``` --- ```r plot(ggDensity2) ``` ![](visualizzazione_files/figure-html/plot_vis_density2-1.png)<!-- --> --- ## Boxplot Il boxplot della distribuzione delle risposte corrette, distinte per scolarità ```r ggBoxplot <- ggplot(data=partecipanti, aes(scol,corrette)) + geom_boxplot(varwidth=T) + # , fill="plum" labs(title="Corrette x scolarità", x="Risposte corrette", y="", subtitle="Numero di risposte corrette", caption="Parole non parole - Boxplot") ``` --- ```r plot(ggBoxplot) ``` ![](visualizzazione_files/figure-html/plot_vis_boxplot-1.png)<!-- --> --- ## 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. ```r 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="Risposte corrette", y="", subtitle="Numero di risposte corrette", caption="Parole non parole - Boxplot") ``` --- ```r plot(ggBoxplot2) ``` ![](visualizzazione_files/figure-html/plot_vis_boxplot2-1.png)<!-- --> --- ### Violin plot ![xkcd](https://imgs.xkcd.com/comics/violin_plots.png) --- ```r ggViolin <- ggplot(data=partecipanti, aes(scol,corrette)) + geom_violin() + # , fill="plum" labs(title="Corrette x scolarità", x="Risposte corrette", y="", subtitle="Numero di risposte corrette", caption="Parole non parole - Boxplot") ``` --- ```r plot(ggViolin) ``` ![](visualizzazione_files/figure-html/plot_vis_violin-1.png)<!-- --> --- ## Scatterplot ```r 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") ``` In questo grafico abbiamo mappato 4 dimensioni, ma il rischio è di sovraccaricare il grafico. --- ```r plot(ggScatter) ``` ![](visualizzazione_files/figure-html/plot_vis_scatterplot-1.png)<!-- --> --- ```r 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 = "Exp. parole non parole") ``` --- ```r plot(ggJitter) ``` ![](visualizzazione_files/figure-html/plot_vis_jitter-1.png)<!-- --> --- # Esercizi --- Caricare il data frame df_simulato ```r df_simulato <- read.csv( "https://s3.eu-central-1.amazonaws.com/bussolon/dati/df_simulato.csv") ``` Riprodurre i seguenti grafici --- ![](visualizzazione_files/figure-html/sim_barplot1-1.png)<!-- --> --- ![](visualizzazione_files/figure-html/sim_barplot2-1.png)<!-- --> --- ![](visualizzazione_files/figure-html/sim_pie-1.png)<!-- --> --- ![](visualizzazione_files/figure-html/sim_donut-1.png)<!-- --> --- ![](visualizzazione_files/figure-html/sim_hist-1.png)<!-- --> --- ![](visualizzazione_files/figure-html/sim_density-1.png)<!-- --> --- ![](visualizzazione_files/figure-html/sim_scatter-1.png)<!-- --> --- ![](visualizzazione_files/figure-html/sim_boxplot-1.png)<!-- -->