Seaborn per la visualizzazione dei dati | Una guida per principianti a Seaborn

Contenuti

Questo articolo è stato pubblicato nell'ambito del Blogathon sulla scienza dei dati.

introduzione

Una guida passo passo per iniziare con Seaborn!!

Si matplotlib “cerca di rendere le cose facili facili e le cose difficili possibili”, Seaborn cerca di rendere facili anche un insieme ben definito di cose difficili.

Freschezza di mare:

I maggiori punti di forza di Seaborn sono la sua diversità di capacità di tracciamento. Ci permette di realizzare grafiche complicate anche in una sola riga di codice!!

In questo tutorial, useremo tre librerie per fare il lavoro: Matplotlib, Seaborn, panda. Se sei un principiante assoluto in Python, Ti suggerisco di iniziare e familiarizzare un po' con Matplotlib e Pandas.

Se segui esattamente questo tutorial, sarai in grado di creare bellissime grafiche con queste tre librerie. Prossimo, puoi usare il mio codice come modello per future attività di visualizzazione in futuro.

Iniziamo il nostro viaggio in mare con il famoso dataset Pokémon. Prima di cominciare, Consiglio vivamente di scrivere i propri codici di base per ogni grafico e provare a sperimentare con i grafici.

Puoi trovare il set di dati Pokémon su Kaggle. tuttavia, per facilitare il tuo viaggio, Ho accorciato e pulito questa versione del set di dati.

Puoi scaricare il set di dati qui: https://github.com/shelvi31/Seaborn-Experiments

Il mio super risparmiatore: Vorrei menzionare una risorsa che è sempre il mio super risparmio quando sono bloccato. https://python-graph-gallery.com/ .

Cominciamo ora:

Inizieremo con l'importazione delle librerie necessarie:

#importazione di librerie
importa panda come pd
importa matplotlib.pyplot come plt
import seaborn come sns

Leggi il file CSV

data = pd.read_csv(“Pokemon.csv”,encoding= 'unicode_escape')

Ho modificato l'errore del codec utf8 definendo un pacchetto di codec diverso nel comando read_csv ().

I nostri dati sono così....

data.head()

Produzione:

1ntc2mvcn4dz7uexdgfr1og-5583287Produzione

Il nome delle colonne non semplifica chiaramente il loro scopo. È importante conoscere il set di dati prima di lavorarci sopra.

Ecco la descrizione semplificata del set di dati per te.

Questo set di dati include 150 Pokémon, si tratta di giochi pokemon (NESSUNA carta Pokémon o Pokémon Go).

In questo set di dati, avere 150 righe e 13 colonne.

Descrizione delle colonne:

# ID per ogni pokemon
# Nome: Nome di ogni pokemon
# Tipo 1: ogni pokemon ha un tipo, questo determina la debolezza / resistenza agli attacchi
# Tipo 2: Alcuni Pokémon sono di doppio tipo e hanno 2
# Totale: somma di tutte le statistiche che vengono dopo questa, una guida generale su quanto è forte un Pokémon
# HP: punti ferita, o salute, definisce quanti danni può subire un pokemon prima di svenire
# attacco: la mod base per gli attacchi normali (ad esempio, Graffio, Punch)
# difendendo: resistenza ai danni di base contro gli attacchi normali.
# SP Atk: attacco speciale, il modificatore di base per gli attacchi speciali (ad esempio, esplosione di fuoco, raggio di bolle)
# SP Def: resistenza ai danni di base contro gli attacchi speciali
# Velocità: determina quale Pokémon attacca per primo in ogni round.
# Palcoscenico: Numero di generazione
#Leggendario: vero se è un pokemon leggendario, falso si no

Ho rinominato i nomi delle colonne per dare più senso alla nostra trama e per chiarezza mentale. Anche se è facoltativo, Consiglio vivamente di farlo per eliminare ogni possibilità di confusione.

data.rename(colonne = {“#”:"No.","Tipo 1":"Tipo_Pokémon","Tipo 2":"PokémonTipo2"",'Totale':"Somma dell'attacco","HP":"Punti Ferita","Attacco" : "Forza d'attacco", "Difesa":"Forza difensiva",”Sp. ATT”:"Stenth attacco speciale",”Sp. def”:"Forza di difesa speciale","Palcoscenico":"Generazione"}, al posto = vero)data.head()

La mia uscita ora sembra:

1q7lk5dweusqe-swaeoi9ba-7965674Meglio!

Iniziamo la visualizzazione con quelli semplici, il grafico di distribuzione.

Grafici di distribuzione:

UN trama di distribuzione mostra un distribuzione y rango de un conjunto de valores numéricos trazados contra una dimensione. Il istogrammi le permiten trazar las distribuciones de variables numéricas.

Avrei potuto usare “Data.hist (dimensione del fico = (12,10), bidoni = 20)” , pero como no todas las columnas de esta Banca dati tienen valores numéricos. Perciò, Devo tracciare trame di distribuzione individuali.

plt.figure(figsize=(4,3))
sns.distplot(x=dati["Somma dell'attacco"],colore=”Arancione”,dove = Vero,tappeto = Vero);
plt.mostra()

Output grafico di distribuzione: Somma attacchi Pokémon

La funzione plot Seaborn traccia un istogramma con una curva di densità. Possiamo eliminare la densità usando l'opzione kde = ”False”. Verificare la presenza di tappeti utilizzando rug = ”True”.

Esistono molti modi alternativi per tracciare un istogramma in Python:

plt.figure(figsize=(3,3))
sns.histplot(x=dati["Somma dell'attacco"],colore=”Verde”);
plt.mostra()
Risultato: Somma degli attacchi Pokémon

Un altro modo è: usando plt.hist ()

plt.figure(figsize=(3,3))
plt.hist(x=dati["Somma dell'attacco"],colore="rosso",contenitori=20);
plt.mostra()
Partenza: istogramma, Matplotlib

Perciò, ci sono molti modi per rappresentare graficamente le distribuzioni. Tutte le funzioni pyplot.hist, seaborn.coOutuntplot e seaborn.displot fungono da wrapper per un grafico a barre matplotlib e possono essere utilizzati se la stampa manuale di un grafico a barre di questo tipo è considerata troppo ingombrante.

  • Per variabili discrete, un seaborn.countplot è più conveniente.
  • Per variabili continue: pyplot.hist oh seaborn.distplot sono usati.

Trame di distribuzione congiunte:

I diagrammi di distribuzione congiunti combinano le informazioni dei grafici a dispersione e degli istogrammi per fornirci informazioni dettagliate per le distribuzioni bivariate..

sns.jointplot(x=dati["Somma dell'attacco"],y = dati[“Forza difensiva”],colore=”Rosso”);
1oaifcmdjkydf4jc89dfmiw-1929873

Partenza: Trama comune

Grafici di densità:

I grafici di densità mostrano la distribuzione tra due variabili.

sns.kdeplot(x=dati["Somma dell'attacco"],y = dati[“Forza difensiva”])
plt.mostra()
13rfvxuah1m7x_etcoadunq-5218802Partenza: Grafico della densità

Grafico a barre

I grafici a barre ci aiutano a visualizzare le distribuzioni delle variabili categoriali: Countplot è un tipo di grafico a barre.

plt.figure(figsize=(10,6));
sns.countplot(x=data.Pokemon_Type,tavolozza=pkmn_type_colors);
plt.mostra()
1lc4mpdykjuhs8gx4i7j4na-9020691Partenza: Grafico a barre

Mappa di calore

Mappa di calore ci aiuta a visualizzare i dati della matrice sotto forma di punti caldi e freddi. I colori caldi hanno indicato le sezioni con la maggior interazione dei visitatori.

plt.figure(figsize=(8,6));
sns.heatmap(data.corr());# Ruota le etichette x con l'aiuto di matplotlib
plt.xticks(rotazione=-45);
1frw2vrtgip5479a0bfegog-1640678Partenza: mappa di calore

Grafico a dispersione:

UN grafico a dispersione (anche conosciuto come dispersione grafico, Grafico a dispersione) utilizza i punti per rappresentare i valori per due diverse variabili numeriche. La posizione di ciascun punto sull'asse orizzontale e verticale indica i valori per un singolo punto dati.

Grafico a dispersione sono usati per osservare le relazioni tra le variabili.

Ho confrontato le statistiche di attacco e difesa dei nostri Pokémon con l'aiuto di diagrammi a dispersione.

1t7kwpsrtx-m2pz7tpcrc2a-6289070Partenza: grafico a dispersione

Seaborn no tiene una función de Diagramma di dispersione dedicada, quindi vediamo una linea diagonale (linea di regressione) qui per impostazione predefinita.

fortunatamente, seaborn ci aiuta a modificare la trama:

  • fit_reg = False viene utilizzato per rimuovere la linea di regressione
  • tonalità = 'Fase’ se usa para colorear puntos por un tercer valor variabile. così, ci permette di esprimere la terza dimensione dell'informazione usando il colore.

Qui ho lo stadio di evoluzione dei Pokémon come terza variabile!!

#Ottimizzazione con scatter plotsns.lmplot(x='Forza d'attacco', y='Forza difensiva', dati = dati,
 fit_reg = Falso, #Eliminazione della linea di regressione
 hue=”Generazione”); #Separazione secondo la generazione pokemon
1khildisnqqzx7wqnlb8w3a-2590333Risultato: grafico a dispersione montato

Più della densità cade nel segno 40-120, Altererò i limiti dell'asse con l'aiuto di matplotlib:

sns.lmplot(x='Forza d'attacco', y='Forza difensiva', dati = dati,
fit_reg = Falso, #Eliminazione della linea di regressione
hue=”Generazione”); #Separazione secondo pokemon generationplt.ylim(20,130);
plt.xlim(25,125);

Ora possiamo vedere un grafico migliore e più focalizzato!!

1jndlxwrmufgwu3o4e7lrwg-5414401Risultato: miglior grafico a dispersione

Trama scatola

Un diagramma a scatola viene utilizzato per rappresentare gruppi di dati numerici attraverso il loro quartili.

Il box plot también pueden tener líneas que se extienden desde las cajas indicando variabilidad fuera del quartili superiore e inferiore, da qui i termini box-and-whisker plot e box-and-whisker plot

Possiamo eliminare la colonna “Somma attacco” poiché abbiamo statistiche individuali. Possiamo anche rimuovere le colonne “Generazione” e “Leggendario” perché non stanno combattendo le statistiche.

plt.figure(figsize=(15,7));# DataFrame preformattato
stats_data = data.drop(["Somma dell'attacco", 'Generazione', 'Leggendario'], asse=1);
 
# Nuovo boxplot usando stats_df
sns.boxplot(data=stats_data,
 showfliers=Falso); #Rimozione outlierssns.set_style(“griglia bianca”)
1eo6ldo0simjfsrnkj8bz7a-9034159Partenza: Trama scatola

Recuerde mantener el tamaño de la figura antes de trazar el gráfico.

Cornici per violino

Ora ricalcherò la trama del violino.

I Fiddle plot sono alternative ai box plot. Mostra la distribuzione (attraverso lo spessore del violino) invece di semplici statistiche riassuntive.

Qui ho mostrato la distribuzione dell'Attacco per tipo primario di Pokémon

plt.figure(figsize=(15,7));
sns.violinplot(x=data.Pokemon_Type, y = dati["Forza d'attacco"]);
1qnzsrsrsqmf1c9hro9vvjw-9594682Partenza: Trama del violino

Come potete vedere, I tipi di drago tendono ad avere statistiche di attacco più elevate rispetto ai tipi di Spettro, ma hanno anche una variazione maggiore.

Ora, I fan dei Pokémon potrebbero trovare qualcosa di abbastanza stridente in quella trama: I colori sono assurdi. Perché il tipo Erba è rosa o il tipo Acqua arancione?? Dobbiamo risolvere questo problema immediatamente!!

fortunatamente, Seaborn ci consente di configurare tavolozze di colori personalizzate. Possiamo semplicemente creare un ordine Elenco Python valori di colore esadecimali.

He usado Bulbapedia para crear una nueva Tavolozza.

# usando Bulbapedia per creare una nuova tavolozza di colori:#Bulbapedia : https://bulbapedia.bulbagarden.net/wiki/Category:Type_color_tempatspkmn_type_colors = ['#78C850', # Erba
 '#F08030', # Fuoco
 '#6890F0', # Acqua
 '#A8B820', # Insetto
 '#A8A878', # Normale
 '#A040A0', # Veleno
 '#F8D030', # Elettrico
 '#E0C068', # Terreno
 '#EE99AC', # Fata
 '#C03028', # Battagliero
 '#F85888', # Psichico
 '#B8A038', # Musica rock
 '#705898', # Fantasma
 '#98D8D8', # Ghiaccio
 '#7038F8', # Drago
 ]

Apportare modifiche alla trama del violino in base al colore del tipo di Pokémon:

plt.figure(figsize=(15,7));
sns.violinplot(x=data.Pokemon_Type, 
 y = dati["Forza d'attacco"],
 tavolozza = pkmn_type_colors);
1-tvwskx4h42-98x_zjjnpq-2443527Risultato: Miglior trama di violino 🙂

Trame di sciami

Come hai visto, i grafici a violino sono ottimi per visualizzare le distribuzioni.

tuttavia, visto che abbiamo solo 150 Pokémon nel nostro set di dati, potremmo voler mostrare solo ogni punto. Ecco dove trama dello sciame entra. Questa visualizzazione mostrerà ogni punto, Mentre “appello” quelli con valori simili.

plt.figure(figsize=(12,5));
sns.swarmplot(x=data.Pokemon_Type,y = dati["Forza d'attacco"],tavolozza=pkmn_type_colors);
1knf0pcuh9euqlto6qy353g-2332982Trama dello sciame: Tipo di Pokémon contro forza d'attacco

Questo sembra buono, ma per immagini migliori, Possiamo combinare questi due! Dopotutto, mostra le stesse informazioni.

Grafica sovrapposta

plt.figure(figsize=(10,10))sns.violinplot(x=data.Pokemon_Type, y = dati["Forza d'attacco"],
 interno=Nessuno, 
 tavolozza = pkmn_type_colors);sns.swarmplot(x="Tipo_Pokémon",
y=”Forza d'Attacco”,
dati = dati,
colore='nero', #fare punti neri
alfa=0,5);plt.titolo("Forza d'attacco in base al tipo di Pokemon");
19wpmqdoiwqqrzvx4paraxg-3042779Grafica sovrapposta

Punti da considerare:

interno = Nessuno: rimuovere le barre all'interno dei violini

alfa = 0.5: rende i punti leggermente trasparenti: ricorda che il valore alfa deve essere float, non tenerlo acceso “”

Puoi trovare i riferimenti per il colore navy qui: https://python-graph-gallery.com/100-calling-a-color-with-seaborn/

Grafici dei fattori

I grafici dei fattori semplificano la separazione dei grafici per classi categoriali.

plt.figure(figsize=(5,15))
factplot= sns.factorplot(x="Tipo_Pokémon",y ="Forza d'attacco",dati = dati,tonalità="Generazione",col="Generazione",gentile="sciame");factplot.set_xticklabels(rotazione=-45)
plt.mostra()
14qb1b2gfb2csf8dbhbsyxg-8854765Fattore trama: per classi categoriche separate

Note veloci:

  • plt.xticks (rotazione = -45): non funziona perché ruota solo l'ultimo grafico
  • Bisogno di usare: set_xticklabels
Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.