Guida Pratica a Seaborn per Python: Visualizzare Dati da Zero (Esempi 2025)

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
tutorial seaborn python in italiano

Quante volte ti sei trovato davanti a una tabella piena di numeri, cercando di capire la storia che nasconde? L’analisi dei dati non è solo calcolare medie e totali; è l’arte di rendere quei numeri comprensibili, di trasformarli in intuizioni visive. Un buon grafico può rivelare un trend, evidenziare un’anomalia o comunicare un’idea complessa in un istante.

È qui che entra in gioco Seaborn. Non è solo una libreria per “disegnare grafici”, ma un vero e proprio alleato per chiunque lavori con i dati in Python. Che tu sia un data analyst in una startup che cerca di capire il comportamento dei clienti, o un ricercatore che deve presentare i risultati di un esperimento, Seaborn ti aiuta a passare dai dati grezzi a visualizzazioni chiare, professionali e ricche di informazioni, con uno sforzo minimo.

In questa guida non ci limiteremo a elencare funzioni.

Esploreremo insieme la logica dietro ogni tipo di grafico, usando esempi pratici per capire non solo come si crea, ma perché è lo strumento giusto per rispondere a una specifica domanda.

Introduzione a Seaborn

Seaborn è una libreria di visualizzazione dati per Python basata su Matplotlib. Fornisce un’interfaccia di alto livello per creare grafici statistici attraenti e informativi. Essendo strettamente integrata con le strutture dati di Pandas, rende l’analisi e la visualizzazione dei dati estremamente efficiente.

L’obiettivo principale di Seaborn è rendere la visualizzazione dei dati statistici una parte centrale dell’esplorazione e della comprensione dei dati. Offre una vasta gamma di tipi di grafici che vanno oltre le capacità di base di Matplotlib, specialmente per i dati multivariati.

Perché usare Seaborn?

  • Estetica migliorata: I grafici di Seaborn sono esteticamente più gradevoli di quelli di Matplotlib, con temi e palette di colori predefinite che migliorano la leggibilità e l’impatto visivo.
  • Funzionalità avanzate per grafici statistici: Seaborn è specializzato in grafici statistici, offrendo funzioni dedicate per la visualizzazione di distribuzioni, relazioni tra variabili, regressioni e molto altro.
  • Integrazione con Pandas: Funziona perfettamente con i DataFrame di Pandas, permettendo di specificare le colonne direttamente per gli assi e le variabili di raggruppamento.
  • Facilità d’uso: Nonostante la sua potenza, Seaborn è relativamente facile da usare, con sintassi concise che permettono di creare grafici complessi con poche righe di codice.
  • Supporto per dati complessi: Gestisce automaticamente molti aspetti della visualizzazione di dati complessi, come la gestione dei valori mancanti, il raggruppamento e l’aggregazione.

In questo tutorial, esploreremo le funzionalità chiave di Seaborn, partendo dalle basi fino ad arrivare a esempi più avanzati.


Installazione di Seaborn

Per installare Seaborn e le sue dipendenze, esegui il seguente comando:

pip install seaborn matplotlib pandas numpy

Per verificare l’installazione:

import seaborn as sns
print(sns.__version__)
# Output atteso: 0.12.2 (o versione successiva)

Preparazione del Dataset di Esempio

Useremo il dataset integrato “tips” di Seaborn per i nostri esempi:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# Carica il dataset
tips = sns.load_dataset('tips')

# Visualizza le prime righe
print(tips.head())

Output atteso:

   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4

Tipi di Grafici Principali e Esempi Pratici

1. Grafici di Distribuzione

Domanda guida: Cosa voglio scoprire?

  • • Come si distribuiscono i valori di una singola variabile?
  • • Sono concentrati attorno a un valore centrale o sono molto sparsi?
  • • Ci sono picchi o anomalie?

Histplot (Istogramma)

Visualizza la distribuzione di una variabile numerica.

plt.figure(figsize=(10, 6))
sns.histplot(data=tips, x='total_bill', kde=True, bins=20)
plt.title('Distribuzione del Conto Totale')
plt.xlabel('Conto Totale ($)')
plt.ylabel('Frequenza')
plt.savefig('histplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

SeaBorn istogramma

KDE Plot (Kernel Density Estimate)

Mostra una stima della densità di probabilità di una variabile.

L’istogramma raggruppa i dati in “cassetti” (bins) per mostrarne la frequenza, mentre il KDE plot fornisce una visione più smussata della distribuzione.

plt.figure(figsize=(10, 6))
sns.kdeplot(data=tips, x='tip', hue='sex', fill=True, alpha=0.6)
plt.title('Distribuzione delle Mance per Sesso')
plt.xlabel('Mancia ($)')
plt.ylabel('Densità')
plt.savefig('kdeplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

SeaBorn distribuzione delle mance per prezzo KDE

Displot (Distribuzione a livello di figura)

Versione più flessibile per grafici di distribuzione.

g = sns.displot(data=tips, x='total_bill', col='time', kind='kde', fill=True, height=4, aspect=1.2)
g.fig.suptitle('Distribuzione del Conto Totale per Ora del Giorno', y=1.02)
plt.savefig('displot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Displot (Distribuzione a livello di figura)

2. Grafici di Relazione

Domanda guida: Cosa voglio scoprire?

  • Esiste una correlazione tra due variabili numeriche?
  • Al crescere di una, l’altra tende a crescere (correlazione positiva), a diminuire (correlazione negativa), o non c’è un legame evidente?
Forse potrebbe interessarti anche:  ANOVA: 6 Esercizi Pratici per Comprendere l'Analisi della Varianza (con Codice Python)

Come interagiscono due o più variabili tra loro?

Scatterplot (Grafico a dispersione)

Mostra la relazione tra due variabili numeriche.

Perfetto per vedere se esiste una relazione tra due variabili numeriche.

C’è un legame tra l’importo del conto e la mancia?

plt.figure(figsize=(10, 6))
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='time', style='sex', s=100)
plt.title('Relazione tra Conto Totale e Mancia')
plt.xlabel('Conto Totale ($)')
plt.ylabel('Mancia ($)')
plt.savefig('scatterplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Scatterplot (Grafico a dispersione)

Lineplot (Grafico a linee)

Ideale per mostrare trend nel tempo.

# Creiamo dati temporali di esempio
import numpy as np
dates = pd.date_range('2023-01-01', periods=100, freq='D')
values = np.cumsum(np.random.randn(100)) + 50
time_data = pd.DataFrame({'date': dates, 'value': values})

plt.figure(figsize=(12, 6))
sns.lineplot(data=time_data, x='date', y='value')
plt.title('Andamento Temporale')
plt.xlabel('Data')
plt.ylabel('Valore')
plt.xticks(rotation=45)
plt.savefig('lineplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Lineplot (Grafico a linee)

Relplot (Grafico di relazione a livello di figura)

Combina scatterplot e lineplot in una griglia.

relplot è una funzione più potente che ci permette di creare sotto-grafici (facet) basati su altre variabili. Vediamo la relazione conto-mancia separata per momento della giornata.

g = sns.relplot(data=tips, x='total_bill', y='tip', col='time', hue='sex', 
                style='sex', kind='scatter', height=4, aspect=1.2)
g.fig.suptitle('Relazione tra Conto e Mancia per Ora e Sesso', y=1.02)
plt.savefig('relplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Relplot (Grafico di relazione a livello di figura)

3. Grafici Categoriali

Domanda guida: Cosa voglio scoprire?

  • Come cambia la distribuzione (mediana, quartili, dispersione) di una variabile numerica tra diversi gruppi o categorie (es. giorni della settimana, tipi di prodotto)?

Come si comportano le variabili numeriche attraverso diverse categorie?

Boxplot (Diagramma a scatola e baffi)

Mostra la distribuzione di dati categoriali.

plt.figure(figsize=(10, 6))
sns.boxplot(data=tips, x='day', y='total_bill', hue='sex')
plt.title('Distribuzione del Conto per Giorno e Sesso')
plt.xlabel('Giorno')
plt.ylabel('Conto Totale ($)')
plt.savefig('boxplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Boxplot (Diagramma a scatola e baffi)

Violinplot

Combina boxplot con la distribuzione di densità.

plt.figure(figsize=(10, 6))
sns.violinplot(data=tips, x='day', y='total_bill', hue='sex', split=True)
plt.title('Distribuzione del Conto per Giorno e Sesso')
plt.xlabel('Giorno')
plt.ylabel('Conto Totale ($)')
plt.savefig('violinplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Violinplot

Boxplot e Violinplot

Entrambi mostrano la distribuzione di una variabile numerica per diverse categorie. Il Boxplot è un classico: mostra mediana, quartili e outlier. Il Violinplot è un’evoluzione: combina un boxplot con un KDE plot, mostrandoci anche la forma della distribuzione.

Barplot (Grafico a barre)

Mostra stime puntuali e intervalli di confidenza.

plt.figure(figsize=(10, 6))
sns.barplot(data=tips, x='day', y='total_bill', hue='sex', ci='sd')
plt.title('Conto Medio per Giorno e Sesso')
plt.xlabel('Giorno')
plt.ylabel('Conto Totale Medio ($)')
plt.savefig('barplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Barplot (Grafico a barre)

Countplot

Conta le osservazioni in ogni categoria.

plt.figure(figsize=(10, 6))
sns.countplot(data=tips, x='day', hue='sex')
plt.title('Numero di Prenotazioni per Giorno e Sesso')
plt.xlabel('Giorno')
plt.ylabel('Conteggio')
plt.savefig('countplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Barplot e Countplot

Il Barplot mostra una stima di una metrica centrale (di default, la media) per ogni categoria. Il Countplot è più semplice: conta le occorrenze in ogni categoria.

Catplot (Grafico categoriale a livello di figura)

Versione flessibile per grafici categoriali.

g = sns.catplot(data=tips, x='day', y='total_bill', hue='sex', 
                col='time', kind='box', height=4, aspect=1.2)
g.fig.suptitle('Distribuzione del Conto per Giorno, Sesso e Ora', y=1.02)
plt.savefig('catplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Catplot (Grafico categoriale a livello di figura)

4. Grafici di Regressione

Domanda guida: Cosa voglio scoprire?

  • Oltre a vedere se esiste una relazione, posso visualizzare un modello lineare che la riassuma?
  • Questa tendenza è statisticamente significativa?

Possiamo tracciare una linea che modelli la relazione tra due variabili?

Regplot (Grafico di regressione)

Mostra la relazione tra due variabili con una linea di regressione.

plt.figure(figsize=(10, 6))
sns.regplot(data=tips, x='total_bill', y='tip', 
            scatter_kws={'alpha':0.5, 'color':'gray'},
            line_kws={'color':'red'})
plt.title('Regressione tra Conto Totale e Mancia')
plt.xlabel('Conto Totale ($)')
plt.ylabel('Mancia ($)')
plt.savefig('regplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Regplot (Grafico di regressione)

Lmplot (Grafico di regressione a livello di figura)

Combina regplot con FacetGrid.

Simile a relplot, lmplot disegna uno scatterplot con una linea di regressione lineare, e permette di creare facilmente una griglia di grafici.

g = sns.lmplot(data=tips, x='total_bill', y='tip', hue='sex', 
               col='time', height=4, aspect=1.2)
g.fig.suptitle('Regressione tra Conto e Mancia per Sesso e Ora', y=1.02)
plt.savefig('lmplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Lmplot (Grafico di regressione a livello di figura)

5. Grafici a Matrice

Domanda guida: Cosa voglio scoprire?

  • Come posso visualizzare rapidamente le correlazioni tra tutte le coppie di variabili numeriche nel mio dataset per avere una visione d’insieme?
Forse potrebbe interessarti anche:  Algoritmo di Bellman-Ford: Come Trovare il Cammino Minimo (anche con Pesi Negativi)

Questi grafici ci aiutano a vedere le relazioni tra più variabili contemporaneamente.

Heatmap (Mappa di calore)

Visualizza dati matriciali con colori.

Visualizza una matrice di dati dove i valori sono rappresentati da colori.

È perfetta per le matrici di correlazione.

# Calcola la matrice di correlazione
corr = tips[['total_bill', 'tip', 'size']].corr()

plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0,
            square=True, linewidths=0.5)
plt.title('Matrice di Correlazione')
plt.savefig('heatmap_example.png', dpi=300, bbox_inches='tight')
plt.show()

Heatmap (Mappa di calore)

Clustermap

Heatmap con clustering gerarchico.

# Prepara i dati per il clustermap
pivot_data = tips.pivot_table(values='total_bill', 
                             index='day', 
                             columns='time', 
                             aggfunc='mean')

plt.figure(figsize=(8, 6))
sns.clustermap(pivot_data.fillna(0), cmap='viridis', standard_scale=1)
plt.suptitle('Clustermap del Conto Medio per Giorno e Ora', y=1.02)
plt.savefig('clustermap_example.png', dpi=300, bbox_inches='tight')
plt.show()

Clustermap

6. Griglie di Grafici

Pairplot (Grafico a coppie)

Mostra le relazioni tra tutte le coppie di variabili.

Crea una griglia di scatterplot per ogni coppia di variabili in un dataset e, sulla diagonale, un istogramma o KDE della singola variabile.

È uno strumento di analisi esplorativa potentissimo.

g = sns.pairplot(tips[['total_bill', 'tip', 'size', 'sex']], 
                 hue='sex', diag_kind='kde', height=2)
g.fig.suptitle('Pairplot delle Variabili Numeriche per Sesso', y=1.02)
plt.savefig('pairplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Pairplot (Grafico a coppie)

Jointplot (Grafico congiunto)

Combina un grafico di relazione con le distribuzioni marginali.

g = sns.jointplot(data=tips, x='total_bill', y='tip', 
                  hue='sex', kind='scatter', alpha=0.7)
g.fig.suptitle('Distribuzione Congiunta di Conto e Mancia', y=1.02)
plt.savefig('jointplot_example.png', dpi=300, bbox_inches='tight')
plt.show()

Jointplot (Grafico congiunto)

FacetGrid (Griglia di facet)

Crea una griglia di grafici basata su variabili categoriali.

g = sns.FacetGrid(tips, col='day', row='time', height=3, aspect=1.2)
g.map_dataframe(sns.scatterplot, x='total_bill', y='tip', hue='sex')
g.add_legend()
g.fig.suptitle('Relazione Conto-Mancia per Giorno e Ora', y=1.02)
plt.savefig('facetgrid_example.png', dpi=300, bbox_inches='tight')
plt.show()

FacetGrid (Griglia di facet)


Personalizzazione dei Grafici

Un grafico non è finito finché non è perfettamente leggibile. Titoli, etichette e colori sono fondamentali.

Seaborn permette una ampia personalizzazione dei grafici:

# Imposta lo stile di Seaborn
sns.set_style("whitegrid")
sns.set_palette("husl")

# Crea un grafico con personalizzazioni
plt.figure(figsize=(10, 6))
ax = sns.barplot(data=tips, x='day', y='total_bill', hue='sex', ci='sd')

# Personalizza il grafico
plt.title('Conto Medio per Giorno e Sesso', fontsize=16, fontweight='bold')
plt.xlabel('Giorno', fontsize=12)
plt.ylabel('Conto Totale Medio ($)', fontsize=12)
plt.legend(title='Sesso', title_fontsize=12, fontsize=11)

# Aggiungi i valori sulle barre
for p in ax.patches:
    ax.annotate(f'{p.get_height():.1f}', 
                (p.get_x() + p.get_width() / 2., p.get_height()), 
                ha='center', va='center', fontsize=10, color='black', 
                xytext=(0, 5), textcoords='offset points')

plt.tight_layout()
plt.savefig('customized_plot.png', dpi=300, bbox_inches='tight')
plt.show()

Personalizzazione dei Grafici

 

Analisi Approfondita degli Esempi

1. Histplot con KDE (kde=True)

  • Obiettivo Applicativo: Capire la forma della distribuzione dei conti. La maggior parte dei clienti spende poco, tanto, o c’è una spesa “tipica” intorno alla media?
  • L’aggiunta di kde=True è un “superpotere”. Non solo vedi i conteggi esatti nei bins (istogramma), ma ottieni anche una curva smussata che suggerisce la forma della distribuzione sottostante. In questo caso, vediamo una distribuzione “asimmetrica a destra” (right-skewed), il che significa che la maggior parte dei conti è di importo basso-medio, ma c’è una “coda” di pochi conti molto alti che “tira” la media verso destra.

2. Scatterplot con hue e style

  • Obiettivo Applicativo: Verificare la nostra ipotesi che “a conto più alto corrisponde mancia più alta”. Vogliamo anche sapere se questo comportamento cambia in base all’orario (pranzo/cena) o al fatto che il cliente sia un fumatore.
  • Questo grafico è un esempio magistrale di visualizzazione multivariata. Con una sola riga di codice, stiamo visualizzando quattro variabili contemporaneamente: total_bill (asse x), tip (asse y), time (colore) e smoker (forma del punto). Questo ci permette di notare pattern complessi, come il fatto che i conti più alti (e le mance più alte) avvengono quasi esclusivamente a cena.

3. Violinplot con split=True

  • Obiettivo Applicativo: Confrontare la distribuzione dei conti tra uomini e donne per ogni giorno della settimana. Vogliamo una visione più dettagliata di un semplice boxplot.
  • L’opzione split=True è unica e potentissima. Invece di mostrare due “violini” affiancati per maschi e femmine, li unisce in uno solo, usando metà violino per ogni categoria. Questo rende il confronto diretto incredibilmente facile ed efficiente in termini di spazio. Ad esempio, possiamo vedere chiaramente che il venerdì la distribuzione dei conti per gli uomini è più “ampia” (più variegata) rispetto a quella delle donne.

4. Lmplot con col e hue

  • Obiettivo Applicativo: Analizzare se la relazione tra conto e mancia (la pendenza della linea di regressione) è diversa per uomini e donne, e se cambia ulteriormente a seconda che siano fumatori o meno.
  • lmplot eccelle nel “model fitting visuale”. Non solo traccia la linea di regressione, ma mostra anche l’intervallo di confidenza (l’area ombreggiata). Usando col e hue, creiamo una piccola griglia di grafici che risponde a una domanda complessa in modo visivo. Possiamo confrontare le pendenze e vedere, ad esempio, se la correlazione è più forte per un gruppo rispetto a un altro.
Forse potrebbe interessarti anche:  Matrici di Adiacenza in Python: Analisi e Applicazioni Pratiche per Reti Sociali e IoT

5. Pairplot

  • Obiettivo Applicativo: È il primo passo di quasi ogni analisi esplorativa seria. Ci dà una visione d’insieme rapidissima di tutte le relazioni a coppie tra le variabili numeriche e della distribuzione di ogni singola variabile.
  • In un solo comando, otteniamo una matrice di grafici. La vera forza sta nell’usare hue. In questo modo, non solo vediamo la relazione tra total_bill e tip, ma vediamo anche se i punti appartenenti a uomini e donne si raggruppano in modo diverso. Sulla diagonale, diag_kind='kde' ci mostra le distribuzioni separate per sesso, permettendoci di vedere se, in media, un gruppo spende più di un altro. È l’epitome dell’efficienza nell’analisi esplorativa.

Mettiti alla Prova: Mini Quiz su Seaborn 

Ora che hai visto i principali tipi di grafici, consolida le tue conoscenze con queste domande.

Scegli il grafico più adatto per ogni scenario.

1. Scenario: Analisi delle vendite Vuoi visualizzare la frequenza con cui i clienti spendono determinate cifre (es. 0-10€, 10-20€, ecc.) in un negozio. Quale grafico è il più adatto a mostrare questa distribuzione?

  • a) barplot
  • b) scatterplot
  • c) histplot
  • d) lineplot

2. Scenario: Ricerca scientifica Per scoprire se c’è una relazione diretta tra le ore di studio di uno studente e il suo voto all’esame, quale grafico useresti per visualizzare ogni singolo studente come un punto?

  • a) boxplot
  • b) scatterplot
  • c) countplot
  • d) heatmap

3. Scenario: Risorse Umane Il tuo obiettivo è confrontare la distribuzione completa degli stipendi (mediana, quartili, range) tra diversi dipartimenti aziendali per verificare eventuali disparità.

Quale grafico offre questa visione in modo più efficace?

  • a) barplot
  • b) boxplot (o violinplot)
  • c) lmplot
  • d) pairplot

4. Scenario: Finanza Hai un dataset con 10 indici di borsa e vuoi vedere rapidamente la matrice di correlazione tra tutti loro per identificare le coppie che si muovono insieme.

Lo strumento ideale è:

  • a) relplot
  • b) heatmap
  • c) pairplot
  • d) catplot

5. Scenario: Analisi Complessa Vuoi mostrare la relazione tra conto e mancia, ma separatamente per ogni giorno della settimana E per orario (pranzo/cena) in un’unica, ordinata griglia di grafici.

Quale funzione figure-level è la più indicata per questo compito?

  • a) sns.scatterplot()
  • b) sns.lmplot()
  • c) sns.relplot()
  • d) sns.jointplot()

Soluzioni del Quiz

  1. Risposta corretta: c) histplot. L’istogramma è perfetto per raggruppare una variabile numerica continua (la spesa) in intervalli (bins) e contarne la frequenza.
  2. Risposta corretta: b) scatterplot. Il grafico a dispersione è lo standard per visualizzare la relazione tra due variabili numeriche (ore di studio e voto), dove ogni osservazione è un punto.
  3. Risposta corretta: b) boxplot (o violinplot). Il barplot mostrerebbe solo la media. Il boxplot (o il suo cugino più dettagliato, il violinplot) è progettato specificamente per confrontare la distribuzione completa (centro, dispersione, forma) di una variabile attraverso diverse categorie.
  4. Risposta corretta: b) heatmap. Mentre il pairplot potrebbe funzionare, diventerebbe molto grande e illeggibile con 10 variabili. La heatmap è lo strumento più compatto ed efficace per visualizzare una matrice di correlazione, usando il colore per indicare l’intensità della relazione.
  5. Risposta corretta: c) sns.relplot(). Questa funzione è progettata per creare griglie (facet) di grafici di relazione (come lo scatterplot). Usando relplot(..., col='day', row='time') si otterrebbe esattamente la griglia desiderata.

Conclusioni

Seaborn è una libreria potente e versatile per la visualizzazione dei dati in Python. In questo tutorial abbiamo esplorato i principali tipi di grafici offerti da Seaborn, con esempi pratici per ciascuno di essi.

Ricorda che la scelta del grafico appropriato dipende dal tipo di dati che stai analizzando e dalla domanda a cui vuoi rispondere.

Per approfondire, consulta la documentazione ufficiale di Seaborn.

Pubblicità