Per una migliore visione, attiva JavaScript

Statistics su GGPLOT2

 ·  🕘 5 min lettura  ·  🤖 Matteo Miotto

Oggi affronteremo un concetto molto importante legato alle geometrie (geom_) di GGPLOT2: l’input stat = di geom_ e la funzione stat_. Ma a cosa ci riferiamo con stat? Stat sta per statistics, e riguarda le trasformazioni statistiche che ci sono dietro ogni comando geom_. Infatti, ad ogni comando geom_ è associata una statistica di base che associa ad ogni valore x un valore y.

Esempio 1 Geom_bar è associata ad una statistica ben precisa: count(). Vediamo in pratica cosa succede con geom_bar(aes(x = class)) nel dataset mpg.
Esempio di geom_bar

Figura 1: Esempio di geom_bar

Quello che la funzione ha prodotto è un barplot delle frequenze delle varie classi, con l’asse delle y rappresentante le count (numero di occorrenze) di ogni classe.
Andiamo ora ad analizzare le caratteristiche di stat.

Statistiche di default

Per prima cosa analizziamo l’input stat = della funzione geom_.
Come detto in precedenza, ad ogni geom_ è associata una statistica. Noi non andremo ad analizzarle tutte, l’elenco completo lo potete trovare nella tabella statistiche di default in fondo alla pagina.
Partiamo dall’esempio 1, la statistica associata a geom_bar è stat_count, ovvero sull’asse y sono plottate le occorrenze di ogni x nel dataset.
Si può vedere in tabella come molte geom_ siano associate a stat_identity, cosa significa? Sigifica che in quesi casi bisogna fornire sia la x che la y come aes() e che la funzione associerà ad ogni x il proprio valore di y.

Usare una statistica diversa da quella di default

Ovviamente, le statistiche di default possono essere sostituite all’occorrenza con una a piacimento (compatibile con la geometria).
Esempio 2 Se volessi usare geom_bar con due vettori x ed y noti, associando ad ogni x una y, dovrei usare la statistica “identity”.
La funzione diventerebbe geom_bar(aes(x, y), stat = "identity"). Il risultato sarebbe:
Cambiare la statistica permette di usare geom_bar con due vettori

Figura 2: Cambiare la statistica permette di usare geom_bar con due vettori

Se si dovesse omettere stat = "identity", si otterrebbe un errore.
NB: la funzione geom_col fa benissimo lo stesso lavoro senza aver bisogno della specifica della stat, in quanto la sua di default è identity.

Un altro modo per modificare i valori sull’asse y (dico sempre asse y per convenzione, ma si potrebbe benissimo mappare su y e far fare la statistica su x) è porre y = after_stat() e all’interno fargli fare qualunque operazione, senza necessità di aggiungere stat = dopo.

Esempio 3 Se volessi plottare sull’asse y di un barplot le percentuali relative ad ogni classe del dataset mpg, userei geom_bar(aes(x = class, y = after_stat(100*count / sum(count)))):
Come l'uso di *after_stat* permetta di ottenere le percentuali direttamente sul grafico, senza averle calcolate prima

Figura 3: Come l’uso di after_stat permetta di ottenere le percentuali direttamente sul grafico, senza averle calcolate prima

Funzione stat_

Stat però è anche una funzione di ggplot2, dalla struttura <stat_function>, che può o sostituire geom_ o aggiungersi al grafico.
Infatti, come si può vedere nella tabella complementari, molte geom_ possono essere sosituite direttamente da una corrispondente funzione stat_.
Per esempio, il grafico in figura 1 può essere ottenuto anche usando il comando ggplot(mpg) + stat_count(aes(x=class)). C’è da dire però che per convenzione, si usa sempre geom_ quando possibile e si usa la funzione stat_ solo quando non ci sono geom_ possibili.

Nella tabella geometrie di default c’è l’elenco delle possibili funzioni stat_, con la geometria di default associata.
Vediamone subito un esempio di applicazione.

Esempio 4 In questo esempio vedremo l’utilizzo di una delle più importanti funzioni stat, ovvero stat_summary. In questo caso plottiamo i punti corrispondenti ai valori minimi e massimi di cavalli (hp) per i tre sottogruppi di macchine (dataset mtcars), creati in basi al numero di cilindri (cyl).
ggplot(mtcars) +
  stat_summary(aes(x = factor(cyl), y = mpg), fun = min, color = "blue") +
  stat_summary(aes(x = factor(cyl), y = mpg), fun = max, color = "red") 
Esempio di utilizzo di *stat_summary*

Figura 4: Esempio di utilizzo di stat_summary

Ci sono innumerevoli utilizzi per le varie funzioni stat, per questo rimando alla documentazione corrispondente. Questo post serviva principalmente per illustrare, con qualche esempio, come sfruttare la componente stat di ggplot2.

Tabelle

Statistiche di default

Geom Statistica default
geom_abline() stat_identity()
geom_area() stat_identity()
geom_bar() stat_count()
geom_bin2d() stat_bin_2d()
geom_blank() None
geom_boxplot() stat_boxplot()
geom_col() stat_identity()
geom_count() stat_sum()
geom_countour_filled() stat_countour_filled()
geom_countour() stat_countour()
geom_crossbar() stat_identity()
geom_curve() stat_identity()
geom_density_2d_filled() stat_density_2d_filled()
geom_density_2d() stat_density_2d()
geom_density() stat_density()
geom_dotplot() stat_bindot()
geom_errorbar() stat_identity()
geom_errorbarh() stat_identity()
geom_freqpoly() stat_bin()
geom_function() stat_function()
geom_hex() stat_bin_hex()
geom_histogram() stat_bin()
geom_hline() stat_identity()
geom_jitter() stat_identity()
geom_label() stat_identity()
geom_line() stat_identity()
geom_linerange() stat_identity()
geom_map() stat_identity()
geom_path() stat_identity()
geom_point() stat_identity()
geom_pointrange() stat_identity()
geom_polygon() stat_identity()
geom_qq_line() stat_qq_line()
geom_qq() stat_qq()
geom_quantile() stat_quantile()
geom_raster() stat_identity()
geom_rect() stat_identity()
geom_ribbon() stat_identity()
geom_rug() stat_identity()
geom_segment() stat_identity()
geom_sf_label() stat_sf_coordinates()
geom_sf_text() stat_sf_coordinates()
geom_sf() stat_sf()
geom_smooth() stat_smooth()
geom_spoke() stat_identity()
geom_step() stat_identity()
geom_text() stat_identity()
geom_tile() stat_identity()
geom_violin() stat_ydensity()
geom_vline() stat_identity()
Condividi
Supporta l'autore con

Matteo Miotto
SCRITTO DA
Matteo Miotto
Genomic Data Science master student