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.
geom_bar(aes(x = class)) nel dataset mpg.
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).La funzione diventerebbe
geom_bar(aes(x, y), stat = "identity"). Il risultato sarebbe:
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.
geom_bar(aes(x = class, y = after_stat(100*count / sum(count)))):
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.
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")
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() |