Seaborn pour la visualisation des données | Guide du débutant à Seaborn

Contenu

Cet article a été publié dans le cadre du Blogathon sur la science des données.

introduction

Un guide étape par étape pour démarrer avec Seaborn !!

Si matplotlib « essayer de rendre les choses faciles faciles et les choses difficiles possibles », Seaborn essaie également de faciliter un ensemble bien défini de choses difficiles.

Fraîcheur marine:

Les plus grandes forces de Seaborn sont sa diversité de capacités de traçage. Il nous permet de faire des graphiques compliqués même en une seule ligne de code !!

Dans ce tutoriel, nous utiliserons trois bibliothèques pour faire le travail: Matplotlib, Seaborn, Pandas. Si vous êtes un débutant complet en Python, Je vous suggère de commencer et de vous familiariser un peu avec Matplotlib et Pandas.

Si vous suivez exactement ce tutoriel, vous pourrez créer de beaux graphismes avec ces trois bibliothèques. Ensuite, vous pouvez utiliser mon code comme modèle pour les futures tâches de visualisation à l'avenir.

Commençons notre voyage en mer avec le célèbre jeu de données Pokémon. Avant de commencer, Je vous recommande fortement d'écrire vos propres codes de base pour chaque graphique et d'essayer d'expérimenter avec les graphiques.

Vous pouvez trouver l'ensemble de données Pokémon sur Kaggle. Cependant, pour faciliter votre voyage, J'ai raccourci et nettoyé cette version de l'ensemble de données.

Vous pouvez télécharger l'ensemble de données ici: https://github.com/shelvi31/Seaborn-Experiments

Mon super économiseur: Je voudrais mentionner une ressource qui est toujours mes super économies quand je suis coincé. https://python-graph-gallery.com/ .

Commençons maintenant:

Nous allons commencer par importer les bibliothèques nécessaires:

#importation de bibliothèques
importer des pandas au format pd
importer matplotlib.pyplot en tant que plt
importer seaborn comme sns

Lire le fichier CSV

données = pd.read_csv("Pokemon.csv",encoding='unicode_escape')

J'ai modifié l'erreur de codec utf8 en définissant un pack de codecs différent dans la commande read_csv ().

Nos données ressemblent à ceci....

data.head()

Production:

1ntc2mvcn4dz7uexdgfr1og-5583287Production

Le nom des colonnes ne simplifie pas clairement leur objectif. Il est important de connaître le jeu de données avant de travailler dessus.

Voici la description simplifiée du jeu de données pour vous.

Cet ensemble de données comprend 150 Pokémon, il s'agit de jeux pokémon (PAS de cartes Pokémon ou Pokémon Go).

Dans cet ensemble de données, avoir 150 rangées et 13 Colonnes.

Description des colonnes:

# ID pour chaque pokémon
# nom: Nom de chaque pokémon
# Type 1: chaque pokémon a un type, cela détermine la faiblesse / résistance aux attaques
# Type 2: Certains Pokémon sont de type double et ont 2
# Total: somme de toutes les statistiques qui suivent, un guide général sur la force d'un Pokémon
# HP: points de dommage, ou la santé, définit combien de dégâts un pokémon peut subir avant de s'évanouir
# Attaque: le mod de base pour les attaques normales (par exemple, Rayure, Coup de poing)
# Défendre: résistance aux dégâts de base contre les attaques normales.
# Attaque SP: attaque spéciale, le modificateur de base pour les attaques spéciales (par exemple, Incendie / Explosion, faisceau de bulle)
# Déf SP: résistance aux dégâts de base contre les attaques spéciales
# La vitesse: détermine quel Pokémon attaque en premier à chaque tour.
# Étape: Numéro de génération
#Légendaire: vrai si c'est un pokémon légendaire, faux oui non

J'ai renommé les noms des colonnes pour donner plus de sens à notre intrigue et pour plus de clarté d'esprit. Bien qu'il soit facultatif, Je vous recommande fortement de le faire pour éliminer tout risque de confusion.

données.renommer(colonnes = {"#":"Non.","Taper 1":"Pokemon_Type","Taper 2":"PokemonType2",'Le total':« Somme de l'attaque »,« HP »:"Points de dommage","Attaque" : "Force d'attaque", "La défense":« Force défensive »,”Esp. Atk":"Stenth d'attaque spéciale",”Esp. Déf":« Force de défense spéciale »,"Organiser":"Génération"}, en place = vrai)data.head()

Ma sortie ressemble maintenant:

1q7lk5dweusqe-swaeoi9ba-7965674Beaucoup mieux!

Commençons la visualisation par les plus simples, le graphique de répartition.

Parcelles de distribution:

UNE parcelle de distribution montrer un Distribution et plage d’un ensemble de valeurs numériques tracées en fonction d’un dimension. Les histogrammes vous permettent de tracer les distributions de variables numériques.

Aurait pu utiliser « Data.hist (taille de la figue = (12,10), bacs = 20) » , mais comme toutes les colonnes de ce base de données ont des valeurs numériques. Donc, Je dois tracer des parcelles de distribution individuelles.

plt.figure(taille de la figue=(4,3))
sns.distplot(x=données["Somme d'attaque"],couleur = "Orange",où = vrai,tapis = vrai);
plt.show()

Sortie du tracé de distribution: Somme d'attaque Pokémon

La fonction Seaborn plot trace un histogramme avec une courbe de densité. Nous pouvons éliminer la densité en utilisant l'option kde = ”False”. Vérifiez la présence de tapis à l'aide de rug = « True ».

Il existe de nombreuses façons alternatives de tracer un histogramme en Python:

plt.figure(taille de la figue=(3,3))
sns.histplot(x=données["Somme d'attaque"],couleur = "Vert");
plt.show()
Résultat: Somme des attaques Pokémon

Une autre façon est: en utilisant plt.hist ()

plt.figure(taille de la figue=(3,3))
plt.hist(x=données["Somme d'attaque"],couleur="rouge",bacs=20);
plt.show()
Départ: histogramme, Matplotlib

Donc, il existe de nombreuses façons de représenter graphiquement les distributions. Toutes les fonctions pyplot.hist, seaborn.coOutuntplot Oui seaborn.displot ils agissent comme des enveloppes pour un graphique à barres matplotlib et peuvent être utilisés si le traçage manuel d'un tel graphique à barres est considéré comme trop lourd.

  • Pour les variables discrètes, un seaborn.countplot il est plus commode.
  • Pour les variables continues: pyplot.hist O seaborn.distplot Ils sont utilisés.

Parcelles de distribution commune:

Les diagrammes de distribution conjoints combinent les informations des nuages ​​de points et des histogrammes pour nous fournir des informations détaillées sur les distributions bivariées..

sns.jointplot(x=données["Somme d'attaque"],y = données[« Force défensive »],couleur = "Rouge");
1oaifcmdjkydf4jc89dfmiw-1929873

Départ: Terrain commun

Tableaux de densité:

Les graphiques de densité montrent la distribution entre deux variables.

sns.kdeplot(x=données["Somme d'attaque"],y = données[« Force défensive »])
plt.show()
13rfvxuah1m7x_etcoadunq-5218802Départ: Graphique de densité

Graphique à barres

Les graphiques à barres nous aident à visualiser les distributions des variables catégorielles: Countplot est un type de graphique à barres.

plt.figure(taille de la figue=(10,6));
sns.countplot(x=données.Pokemon_Type,palette=pkmn_type_colors);
plt.show()
1lc4mpdykjuhs8gx4i7j4na-9020691Départ: Graphique à barres

Carte de chaleur

Carte de chaleur nous aide à visualiser les données matricielles sous forme de points chauds et froids. Les couleurs chaudes ont indiqué les sections avec le plus d'interaction avec les visiteurs.

plt.figure(taille de la figue=(8,6));
sns.heatmap(data.corr());# Faire pivoter les étiquettes x à l'aide de matplotlib
plt.xticks(rotation=-45);
1frw2vrtgip5479a0bfegog-1640678Départ: carte de chaleur

Nuage de points:

UNE nuage de points (Aussi connu comme dispersion graphique, Nuage de points) utilise des points pour représenter les valeurs de deux variables numériques différentes. La position de chaque point sur l'axe horizontal et vertical indique les valeurs pour un point de données individuel.

Nuage de points sont utilisés pour observer les relations entre les variables.

J'ai comparé les statistiques d'attaque et de défense de nos Pokémon à l'aide de diagrammes de dispersion.

1t7kwpsrtx-m2pz7tpcrc2a-6289070Départ: nuage de points

Seaborn n’a pas de Diagramme de dispersion dédié, donc on voit une ligne diagonale (ligne de régression) ici par défaut.

Heureusement, Seaborn nous aide à modifier l'intrigue:

  • fit_reg = False est utilisé pour supprimer la ligne de régression
  • teinte = ‘Étape’ Il est utilisé pour colorer les points pour une troisième valeur variable. De cette façon, nous permet d'exprimer la troisième dimension de l'information en utilisant la couleur.

Ici, j'ai le stade d'évolution Pokémon comme troisième variable !!

#Ajustement avec les nuages ​​de points ns.lmplot(x='Force d'attaque', y='Force défensive', données = données,
 fit_reg = Faux, #Supprimer la ligne de régression
 teinte = "Génération"); #Se séparer selon la génération de pokémon
1khildisnqqzx7wqnlb8w3a-2590333Résultat: nuage de points ajusté

Plus de la densité tombe sur la marque 40-120, Je vais modifier les limites de l'axe à l'aide de matplotlib:

sns.lmplot(x='Force d'attaque', y='Force défensive', données = données,
fit_reg = Faux, #Supprimer la ligne de régression
teinte = "Génération"); #Séparation selon pokemon generationplt.ylim(20,130);
plt.xlim(25,125);

Maintenant, nous pouvons voir un graphique meilleur et plus ciblé !!

1jndlxwrmufgwu3o4e7lrwg-5414401Résultat: meilleur nuage de points

Box plot

Une boîte à moustaches est utilisée pour représenter des groupes de données numériques à travers leur quartiles.

Les boîtes à moustaches Ils peuvent également avoir des lignes s’étendant à partir des boîtes, indiquant une variabilité à l’extérieur de la quartiles supérieur et inférieur, d'où les termes diagramme en boîtes et moustaches et diagramme en boîtes et moustaches

On peut supprimer la colonne « Somme d'attaque » puisque nous avons des statistiques individuelles. On peut aussi supprimer les colonnes « Génération » Oui « Légendaire » parce qu'ils ne combattent pas les statistiques.

plt.figure(taille de la figue=(15,7));# DataFrame préformaté
stats_data = data.drop([« Somme de l'attaque », 'Génération', 'Légendaire'], axe=1);
 
# Nouveau boxplot utilisant stats_df
sns.boxplot(data=stats_data,
 showfliers=Faux); #Suppression des valeurs aberrantessns.set_style(« grille blanche »)
1eo6ldo0simjfsrnkj8bz7a-9034159Départ: Box plot

N’oubliez pas de conserver le Taille de la figurine Avant de tracer le graphique.

Cadres de violon

Maintenant je vais retracer l'intrigue du violon.

Les Fiddle plots sont des alternatives aux box plots. Afficher la répartition (à travers l'épaisseur du violon) au lieu de simples statistiques récapitulatives.

Ici, j'ai montré la répartition de l'attaque par type principal de Pokémon

plt.figure(taille de la figue=(15,7));
sns.violinplot(x=données.Pokemon_Type, y = données["Force d'attaque"]);
1qnzsrsrsqmf1c9hro9vvjw-9594682Départ: Complot de violon

Comme tu peux le voir, Les types de dragon ont tendance à avoir des statistiques d'attaque plus élevées que les types de fantôme, mais ils ont aussi une plus grande variation.

À présent, Les fans de Pokémon peuvent trouver quelque chose d'assez choquant dans cette intrigue: Les couleurs sont absurdes. Pourquoi le type Herbe est-il rose ou le type Eau orange ?? Nous devons résoudre ce problème immédiatement !!

Heureusement, Seaborn nous permet de configurer des palettes de couleurs personnalisées. Nous pouvons simplement créer une commande liste Python valeurs de couleur hexadécimales.

J’ai utilisé Bulbapedia pour en créer un nouveau Palette de couleurs.

# utiliser Bulbapedia pour créer une nouvelle palette de couleurs:#Bulbapédie : https://bulbapedia.bulbagarden.net/wiki/Category:Type_color_templatespkmn_type_colors = ['#78C850', # Herbe
 '#F08030', # Feu
 '#6890F0', # L'eau
 « #A8B820 », # Bogue
 '#A8A878', # Normal
 ‘#A040A0’, # Poison
 '#F8D030', # Électrique
 ‘#E0C068’, # Sol
 « #EE99AC », # Fée
 ‘#C03028’, # Combat
 '#F85888', # Psychique
 '#B8A038', # Roche
 '#705898', # Fantôme
 '#98D8D8', # La glace
 '#7038F8', # Dragon
 ]

Apporter des modifications à l'intrigue du violon en fonction de la couleur du type de Pokémon:

plt.figure(taille de la figue=(15,7));
sns.violinplot(x=données.Pokemon_Type, 
 y = données["Force d'attaque"],
 palette = pkmn_type_colors);
1-tvwskx4h42-98x_zjjnpq-2443527Résultat: Meilleure intrigue pour violon 🙂

Nuées d'essaims

Comme vous l'avez vu, les tableaux de violon sont parfaits pour visualiser les distributions.

Cependant, puisque nous n'avons que 150 Pokémon dans notre ensemble de données, nous pouvons vouloir juste montrer chaque point. C'est là que le parcelle d'essaim Entrez. Cette visualisation montrera chaque point, alors que « faire appel » ceux avec des valeurs similaires.

plt.figure(taille de la figue=(12,5));
sns.swarmplot(x=données.Pokemon_Type,y = données["Force d'attaque"],palette=pkmn_type_colors);
1knf0pcuh9euqlto6qy353g-2332982Swarmplot: Force d'attaque Pokémon Type Vs

Cela semble bon, mais pour de meilleures images, On peut combiner ces deux! Après tout, afficher les mêmes informations.

Graphismes superposés

plt.figure(taille de la figue=(10,10))sns.violinplot(x=données.Pokemon_Type, y = données["Force d'attaque"],
 intérieur=Aucun, 
 palette = pkmn_type_colors);sns.swarmplot(x = "Pokemon_Type",
y = "Force d'attaque",
données = données,
couleur='noir', #rendre les points noirs
alpha=0,5);plt.titre("Force d'attaque selon le type de Pokémon");
19wpmqdoiwqqrzvx4paraxg-3042779Graphismes superposés

Points à considérer:

intérieur = aucun: enlever les barres à l'intérieur des violons

alpha = 0.5: rend les points légèrement transparents: rappelez-vous que la valeur alpha doit être flottante, ne le garde pas « »

Vous pouvez trouver les références pour la couleur marine ici: https://python-graph-gallery.com/100-calling-a-color-with-seaborn/

Graphiques factoriels

Les graphiques factoriels permettent de séparer facilement les graphiques par classes catégorielles.

plt.figure(taille de la figue=(5,15))
factplot= sns.factorplot(x="Pokemon_Type",y ="Force d'attaque",données = données,teinte ="Génération",col="Génération",genre ="essaim");factplot.set_xticklabels(rotation=-45)
plt.show()
14qb1b2gfb2csf8dbhbsyxg-8854765Diagramme factoriel: pour des classes catégorielles séparées

Notes rapides:

  • plt.xticks (rotation = -45): cela ne fonctionne pas car il ne fait que tourner le dernier graphique
  • Besoin d'utiliser: set_xticklabels
Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.

Haut-parleur de données