Data visualization en Python avec des librairies telles que Matplotlib et Seaborn

William JACQUES
France School of AI
8 min readMay 13, 2019

Cet article fait partie d’une série expliquant le traitement avec Pandas de données scrapées sur Internet. Il fait suite aux précédents :

Initiation au web-scraping avec Python

Initiation au data cleaning en Python avec la librairie Pandas

Après avoir nettoyé vos données, il est maintenant temps de faire un peu de data visualization pour appréhender visuellement les données.

Qu’est ce que la data visualization ?

C’est tout simplement un processus permettant de mettre en perspective des informations en apparence complexes ou noyées dans une grande quantité de paramètres en les représentant sous forme graphique.

Il existe différentes méthodes afin d’obtenir ces informations. Certaines utilisent des sites qui proposent des services de visualisation rapide par “drag and drop”. Nous allons privilégier des approches par le code en utilisant Python et ses librairies.

Pour cela vous allez principalement utiliser Matplotlib et une librairie complémentaire, Seaborn. Je t’invite à aller faire un tour sur les deux sites.

Si vous utilisez la distribution Anaconda, vous n’avez pas à installer ces librairies étant donné qu’elles viennent directement avec Anaconda.

Préparation du notebook Jupyter

Importer toutes les librairies et les modules necéssaires

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Ici vous allez importer les différentes librairies qui vous serons utiles afin de créer vos graphiques. Pandas va vous permettre de charger votre dataset et de manipuler toutes vosdonnées comme vous le souhaitez Matplotlib et Seaborn vont vous permettre de créer les représentations visuelles et de les mettre en forme.

Charger les données

Pour les besoins de l’article, nous allons continuer d’utiliser le dataset d’annonces de location immobilière à Paris scrapé sur SeLoger.com

df = pd.read_csv('seloger_clean.csv')
df.head()

Avec Pandas, vous allez charger votre dataset avec la fonction pd.read_csv qui va s’occuper de le convertir en DataFrame. Vous demandez avec .head() d’afficher (par défaut) les cinq premières lignes du dataset.

df.info

Vous pouvez ici afficher les caractéristiques de votre DataFrame avec .info, qui s’occupera d’afficher le nombre de lignes, de colonnes, le nom de chaque colonne ainsi que le type de données dans chaque colonne.

Analyser les données afin de créer des graphiques

Utilisation de Pandas et de Matplotlib

Choisir ce que l’on cherche à représenter

Ici puisque vous travaillez avec des données immobilières, vous avez plusieurs choix afin de représenter ces dernières. Ici nous allons te présenter six graphiques réalisés :

Trois graphiques faits avec Pandas et Matplotlib

  1. Un diagramme circulaire de la proportion d’annonces par arrondissement à Paris
  2. Un cercle de corrélation entre les différentes caractéristiques du DataFrame
  3. Un nuage de points du prix par rapport à la superficie

Trois graphiques faits avec Seaborn et Matplotlib

  1. Une matrice de corrélation entre les différentes caractéristiques du DataFrame
  2. Un histogramme du nombre d’annonces par arrondissement à Paris
  3. Un histogramme du loyer moyen par arrondissement à Paris

Pandas & Matplotlib

Diagramme circulaire :

df["Lieu"].value_counts(normalize=True).plot(kind='pie')
Meh

Première visualisation, plutôt simple. Commencez en appelant la colonne de ton DataFrame que vous souhaitez représenter avec df[“Lieu”] où ici ‘Lieu’ correspond à nos arrondissements. Vous allez demander à Pandas de compter le nombre d’annonces par arrondissement avec .value_counts() et vous insérez normalize=True qui permet de normaliser les données.

Pour construire ce diagramme vous allez utiliser .plot() en précisant le type de graphique que vous souhaitez avec kind=’pie’

Simple n’est-ce pas ?

Nuage de points :

df.plot.scatter(x='Superficie',y='Prix')

Toujours simple, vous allez ici faire un nuage de points pour chaque ligne du DataFrame.

Vous allez just demander un .plot puis préciser directement à la suite le type de plot (vous auriez aussi pu faire comme précédemment avec kind=’scatter’) ,ici .scatter() en lui précisant les deux colonnes à comparer avec x=’ ’ et y=’ ‘

Cercle de corrélation :

fig, axes = plt.subplots(figsize=(10,10))
axes.set_xlim(-1,1)
axes.set_ylim(-1,1)
X = df[['Prix', 'Superficie', 'Chambres', 'Nb_photos']]
for j in range(p):
plt.annotate(X.columns[j],(corvar[j,0],corvar[j,1]))
plt.plot([-1,1],[0,0],color='red',linestyle='-',linewidth=1) plt.plot([0,0],[-1,1],color='red',linestyle='-',linewidth=1)cercle = plt.Circle((0,0),1,color='blue',fill=False)
axes.add_artist(cercle)
plt.title('Cercle de corrélation\n', fontsize=20, color='red')
plt.show()

Ici, le cercle de corrélation sert à illustrer les liens entre les différentes variables quantitatives de votre DataFrame.

Vous commencez par fixer la taille du graphique avec figsize=(10,10)

.set_xlim() et .set_ylim() servent à encadrer le cercle. Ici c’est un cercle de centre (0,0) et de rayon 1

Ensuite faites une boucle for sur les variables du dataset. Vous séléctionnez les colonnes une par une avec columns[j] et vous calculez les corrélations entre variables avec corvar

plt.plot() permet d’afficher les deux axes avec une couleur et l’épaisseur des axes modifiés

plt.Circle() affiche le cercle de centre (0,0) et de rayon égal à 1. Vous mettez fill = False pour ne pas remplir le cercle et le laisser transparent.

Seaborn & Matplotlib

Matrice de corrélation :

sns.heatmap(df.corr())

Pour obtenir la matrice suivante vous allez simplement utiliser Seaborn pour la visualisation avec .heatmap et en lui précisant comme argument, le DataFrame avec .corr() qui permet avec Pandas de créer cette matrice de corrélation.

Plutôt compliqué à lire n’est-ce pas ?

À première vue, il est plutôt compliqué de comprendre ce que dit ce graphique. Vous allez donc faire un peu de customization pour celui-ci et pour tous les suivants. Personnellement nous avons personnalisé Seaborn en changeant la police d’écriture par défaut par Montserrat.

sns.heatmap(df.corr(), annot=True, cmap='Greens')
plt.title("Matrice de corrélation entre les différentes caractéristiques des annonces\n", fontsize=18, color='#009432')

Ici vous allez ajouter quelques lignes de code à ta cellule :

  • annot=True permet d’afficher les probabilités sur chaque case
  • cmap=’Greens’ permet de modifier la palette de couleurs. Tu peux remplacer le Greens par Reds, Blues, Purples, etc… (le ‘s’ sert à afficher un dégradé de couleur)
  • plt.title(“ \n”) permet de rajouter un titre au graphique. Vous pouvez sauter une ligne en rajouter \n directement à la fin de votre titre pour améliorer l’affichage. Vous pouvez ajouter d’autres propriétés, ici nous avons décidé de modifier la taille du titre avec fontsize=18 et la couleur en précisant un code hexadécimal color=’#009432' (nous vous conseillons ce site pour les couleurs)

Voici ce que vous obtenez après modification :

Voilà qui est déjà mieux!

Cela devient maintenant plus lisible, on comprend bien de quoi il s’agît. Les couleurs sont bien choisies du plus foncé pour une forte corrélation au plus clair pour une faible corrélation.

Histogramme du nombre d’annonces par arrondissement à Paris :

Pour les deux histogrammes, vous allez devoir créer un autre DataFrame à partir de celui qui contient vos données pour pouvoir créer vos graphiques :

nbr = df[['Prix','Lieu']].groupby('Lieu').count().sort_values(by='Prix', ascending=False)
nbr.reset_index(0, inplace=True)
nbr.rename(columns={'Prix':'Nb_annonces'}, inplace=True)
nbr.head()

Donc là dans votre nouveau DataFrame nbr, vous allez placer deux colonnes, une pour chaque arrondissement et une autre pour le nombre d’annonces par arrondissement par rapport à vos données. Pour cela vous allez utiliser .groupby(), .count() et .sort_values() afin de compter combien d’annonces comporte chaque arrondissement et de les classer dans l’ordre. Vous allez utiliser .reset_index() afin de placer ‘Lieu’ (qui se trouvait en index) en tant que colonne comme comme vous pouvez voir sur l’image. Pour finir vous allez juste renommer la colonne ‘Prix’ en ‘Nb_annonces’ .

plt.figure(figsize=(10,6))
sns.barplot(x=nbr['Lieu'], y=nbr['Nb_annonces'], palette="Reds_r")
plt.xlabel('\nArrondissements', fontsize=15, color='#c0392b')
plt.ylabel("Nombre d'annonces\n", fontsize=15, color='#c0392b')
plt.title("Nombre d'annonces par arrondissement à Paris sur seloger.com\n", fontsize=18, color='#e74c3c')
plt.xticks(rotation= 45)
plt.tight_layout()
Cool !

Pour obtenir un histogramme comme celui-ci, vous allez d’abord devoir définir la taille souhaité. Ici, vous avez vingt différents labels sur l’axe X; avec plt.figure, vous réglez figsize à 10 par 6, ou plus si vous le désirez.

Vous précisez la colonne du DataFrame que vous souhaitez sur l’axe des abscisses avec x=’’ et des ordonnées y=’’ puis vous changez la couleur avec palette=’Reds’.

Vous pouvez rajouter un sous-titre sur les deux axes avec plt.xlabel() et plt.ylabel() en précisant les mêmes arguments que pour plt.title().

Pour finir, vous allez changer l’axe des labels sur l’axe X afin que ces derniers soient plus visibles avec plt.xticks() en précisant une rotation à 45°, puis vous allez ajouter pour chaque graphique plt.tight_layout() qui permet à chaque titre, sous-titre, label, etc… de s’ajuster automatiquement afin d’améliorer l’affichage de ces derniers sur votre graphique.

Histogramme du loyer moyen par arrondissement à Paris :

Comme pour l’histogramme précédent, vous allez créer le DataFrame suivant

prix = df[['Prix','Lieu']].groupby('Lieu').mean().round().sort_values(by='Prix', ascending=False)
prix.reset_index(0, inplace=True)
prix.head()

Ici, nous cherchons juste à obtenir le loyer moyen par arrondissement, le tout classé du plus élevé au plus faible. Pour cela vous allez encore utiliser .groupby() mais c’est fois ci avec .mean() afin d’obtenir la moyenne de chaque arrondissement que vous allez arrondir avec .round() et ordonner avec .sort_values()

plt.figure(figsize=(10,6))
sns.barplot(x=prix['Lieu'], y=prix['Prix'], palette="Blues_r")
plt.xlabel('\nArrondissements', fontsize=15, color='#2980b9')
plt.ylabel('Loyer moyen (en €)\n', fontsize=15, color='#2980b9')
plt.title("Loyer moyen par arrondissement à Paris sur seloger.com\n", fontsize=18, color='#3742fa')
plt.xticks(rotation= 45)
plt.tight_layout()
Pas mal !

Même procédé que pour votre graphique précédent, vous allez juste ici changer la palette de couleur ainsi que le titre et ses sous-titres.

Voilà, vous savez maintenant comment réaliser des graphiques simples mais plutôt stylés avec Pandas, Seaborn et Matplotlib !

Je t’invite à aller voir mon compte et de lire mes autres articles si cela t’intéresse!

Article publié par :

Vital Shchutski oumar niang Tommaso Signori

--

--