Cours

Pourquoi utiliser Python avec Tableau
Tableau propose plusieurs options pour enrichir et créer de nouveaux champs de données. Vous pouvez effectuer des opérations arithmétiques, logiques, spatiales et de modélisation prédictive via des champs calculés. Tableau est un puissant outil de Business Intelligence (BI), mais il a ses limites : c’est là que le langage Python fait la différence.
Python est très apprécié de la communauté data. Il permet d’extraire, nettoyer, traiter les données et d’y appliquer des fonctions statistiques complexes. Il met à votre disposition des frameworks de machine learning, de l’orchestration de données, du multiprocessing et des bibliothèques riches pour réaliser quasiment n’importe quelle tâche.
Langage polyvalent, Python, couplé à Tableau, offre la liberté d’exécuter des tâches très complexes. Dans ce tutoriel, nous allons utiliser Python pour extraire et nettoyer les données. Ensuite, nous utiliserons ces données nettoyées pour créer des visualisations dans Tableau.
Nous n’allons pas utiliser Tabpy pour créer un serveur Python pour Tableau et exécuter des scripts Python au sein de Tableau. À la place, nous allons d’abord extraire et nettoyer les données dans Python (Jupyter Notebook), puis utiliser Tableau pour créer des visualisations interactives.

Goodreads Data Viz | Tableau Public
Voici un tutoriel détaillé et guidé par le code sur l’API Goodreads et la création de visualisations avancées dans Tableau. Consultez le lien ci-dessous pour accéder au code et au tableau de bord Tableau.
Ingestion et traitement des données avec Python
Dans la première partie du tutoriel, nous allons apprendre à utiliser l’API Goodreads pour accéder à des données publiques. Dans notre cas, nous allons nous concentrer sur le profil utilisateur et le convertir en un dataframe Pandas lisible. Nous nettoierons ensuite les données et les exporterons au format CSV.
Premiers pas
Nous utiliserons DataLab pour exécuter le code Python. Il inclut les packages Python nécessaires aux tâches de data science.
Si vous débutez en Python et souhaitez configurer l’environnement sur votre machine, installez Anaconda. Il installera Python, Jupyter Notebook et les packages requis.
Avant d’écrire le code, nous devons installer le package xmltodict qui ne fait pas partie de la stack DataLab ou Anaconda. Nous utiliserons `pip` pour installer ce package manquant.
Remarque : le symbole `!` ne fonctionne que dans les Jupyter Notebooks. Il permet d’accéder au terminal depuis une cellule de code Jupyter.
!pip install xmltodict
>>> Collecting xmltodict
>>> Using cached xmltodict-0.13.0-py2.py3-none-any.whl (10.0 kB)
>>> Installing collected packages: xmltodict
>>> Successfully installed xmltodict-0.13.0
À l’étape suivante, nous importons les packages nécessaires.
import pandas as pd
import xmltodict
import urllib.request
Analyser le lien du profil
Pour extraire les données d’un utilisateur, nous avons besoin de son identifiant et de son nom. Dans cette section, nous allons analyser le lien du profil utilisateur (Abid).
Remarque : vous pouvez utiliser le profil d’un ami ou le vôtre et exécuter ce script.
- Extraction de user_id en filtrant les chiffres dans le lien, ce qui retourne « 73376016 ».
- Pour extraire user_name, nous découpons la chaîne autour de user_id puis sur « - » pour récupérer le nom. Après avoir remplacé « - » par un espace, nous obtenons « abid ».
- Enfin, nous concaténons user_id et user_name. Cet identifiant unique sera utilisé dans la section suivante pour accéder aux données utilisateur.
Goodread_profile = "https://www.goodreads.com/user/show/73376016-abid"
user_id = ''.join(filter(lambda i: i.isdigit(), Goodread_profile))
user_name = Goodread_profile.split(user_id, 1)[1].split('-', 1)[1].replace('-', ' ')
user_id_name = user_id+'-'+user_name
print(user_id_name)
>>> 73376016-abid
Extraction des données Goodreads
Fin 2020, Goodreads a cessé de fournir son API développeur. Vous pouvez lire le rapport complet ici. Pour contourner ce problème, nous utiliserons des clés d’API issues d’anciens projets comme streamlit_goodreads_app. Ce projet explique comment accéder aux données utilisateur Goodreads via l’API.
Goodreads permet aussi de télécharger les données au format CSV sans clé d’API, mais cela reste limité à l’utilisateur et ne permet pas d’extraire des données en temps réel.
Dans cette section, nous allons créer des fonctions prenant en paramètres user_id_name, version, shelf, per_page et apiKey.
- apiKey : donne accès aux données publiques
- version : pour spécifier la version de données la plus récente
- shelf : le profil utilisateur comporte plusieurs « étagères », principalement read, to-read et currently-reading
- per_page : nombre de livres par page
La fonction utilise ces paramètres pour construire l’URL puis télécharge les données via urllib.request. Au final, nous obtenons des données au format XML.
apiKey = "ZRnySx6awjQuExO9tKEJXw"
version = "2"
shelf = "read"
per_page = "200"
def get_user_data(user_id, apiKey, version, shelf, per_page):
api_url_base = "https://www.goodreads.com/review/list"
final_url = (
api_url_base
+ user_id
+ ".xml?key="
+ apiKey
+ "&v="
+ version
+ "&shelf="
+ shelf
+ "&per_page="
+ per_page
)
contents = urllib.request.urlopen(final_url).read()
return contents
contents = get_user_data(user_id_name,apiKey,version, shelf, per_page)
print(contents[0:100])
>>> b'<?xml version="1.0" encoding="UTF-8"?>\n<GoodreadsResponse>\n <Request>\n <authentication>true</aut'
Conversion de XML en JSON
Nos données initiales sont en XML, sans moyen direct de les convertir en base structurée. Nous allons donc les transformer en JSON avec le package Python xmltodict.
Les données XML sont converties en JSON imbriqué. Pour afficher la première entrée des critiques de livres, nous utiliserons des crochets pour accéder aux données encapsulées.
Vous pouvez explorer les métadonnées et d’autres options, mais dans ce tutoriel, nous nous concentrerons sur les données de critiques d’utilisateurs.
contents_json = xmltodict.parse(contents)
print(contents_json["GoodreadsResponse"]["reviews"]["review"][:1])
>>> [{'id': '4626706284', 'book': {'id': {'@type': 'integer', '#text': '57771224'}, 'isbn': '1250809606', 'isbn13': '9781250809605', 'text_reviews_count': {'@type': 'integer', '#text': '150'}, 'uri': 'kca://book/amzn1.gr.book.v3.tcNoY0o7ErAhczdQ', 'title': 'Good Intentions', 'title_without_series': 'Good Intentions', 'image_url': .........
Conversion de JSON en dataframe Pandas
Pour convertir le JSON en dataframe Pandas, nous utiliserons la fonction json_normalize. Les données de critiques se trouvent au troisième niveau ; pour y accéder, utilisez GoodreadsResponse, reviews, puis review.
Avant d’afficher le dataframe, nous filtrons les données non pertinentes en supprimant les livres dont la colonne date_updated est manquante.
Découvrez différentes manières d’ingérer des fichiers CSV, des feuilles de calcul, du JSON, des bases SQL et des API avec pandas dans le cours Streamlined Data Ingestion with pandas.
df = pd.json_normalize(contents_json["GoodreadsResponse"]["reviews"]["review"])
df = df[df["date_updated"].notnull()]
df.head()

Nettoyage des données
Le dataframe brut paraît déjà propre, mais nous devons encore réduire le nombre de colonnes.
On constate qu’il y a 61 colonnes.
df.shape
(200, 61)
Supprimons les colonnes vides.
df.dropna(axis=1, how='all', inplace=True)
df.shape
(200, 58)
Nous avons supprimé avec succès 3 colonnes entièrement vides.
Nous allons maintenant examiner tous les noms de colonnes avec `df.columns` et sélectionner les plus utiles.
final_df = df[
[
"rating",
"started_at",
"read_at",
"date_added",
"book.title",
"book.average_rating",
'book.ratings_count',
"book.publication_year",
"book.authors.author.name"
]
]
final_df.head()
Comme on peut le voir, le dataframe final est propre et ne contient que les champs pertinents.

Export au format CSV
Dans cette dernière section, nous exportons le dataframe au format CSV, compatible avec Tableau. Dans la fonction to_csv, indiquez le nom de fichier avec son extension et supprimez l’index en passant l’argument index à False.
final_df.to_csv("abid_goodreads_clean_data.csv",index=False)
Le fichier CSV apparaîtra dans le répertoire courant.

Fichier CSV Goodreads nettoyé
Vous pouvez aussi consulter le Jupyter Notebook Python : Data Ingestion using Goodreads API. Il vous aidera à déboguer votre code et, si vous souhaitez ignorer la partie programmation Python, vous pouvez simplement télécharger le fichier en cliquant sur le bouton Copy & Edit et en exécutant le script.
Visualisation des données dans Tableau
Dans la seconde partie, nous utiliserons les données nettoyées pour créer des visualisations simples et avancées dans Tableau. L’objectif : tracer des graphiques interactifs pour comprendre le comportement de lecture de l’utilisateur.
Connexion des données
Nous allons connecter le fichier CSV via l’option Text file et sélectionner le fichier abid_goodreads_clean_data.csv. Ensuite, nous modifierons les champs Started At, Read At et Date Added en Date & Time, comme ci-dessous.
Remarque : il est recommandé d’ajuster vos types de données dès le départ.

Connexion des données et modification des types
Créer un histogramme des notes
Dans cette section, nous allons créer l’histogramme des notes attribuées par l’utilisateur.
- Faites glisser le champ Rating vers l’étagère Rows.

Histogramme des notes — étape 1
- Cliquez sur le menu déroulant Show Me pour accéder aux modèles de visualisation. Nous convertirons le diagramme en barres en histogramme en cliquant sur l’option Histogram.

Histogramme des notes — étape 2
- L’axe Rating a des graduations à 0,5. Modifiez-les en cliquant avec le bouton droit sur l’axe inférieur et en sélectionnant Edit Axis. Puis, onglet Tick Marks, changez Major Tick Marks sur Fixed. Vérifiez que le Tick Origin est à 0 et le Tick Interval à 1.

Histogramme des notes — étape 3
- Personnalisez l’histogramme : simplifiez les libellés d’axes, changez les couleurs et bordures des barres, ajoutez des étiquettes. Toutes ces options se trouvent dans le panneau Marks au milieu à gauche.

Histogramme des notes — étape 4
L’utilisateur attribue le plus souvent des notes entre 3 et 4. Les zéros correspondent aux livres non notés.
Courbe (line plot)
Pour tracer un graphique en courbes :
- Faites glisser le champ Book.Publication Year vers les étagères Rows et Columns.
- Transformez le champ de Rows en décompte en faisant un clic droit puis Measure > Count.
- Passez le champ de Columns en dimension via clic droit > Dimensions.
- Dans le panneau Marks, ouvrez le menu Automatic et choisissez Line.
- Nettoyez les libellés d’axe, personnalisez le graphique, ajoutez un titre et supprimez les valeurs nulles.

Courbe par année de publication
L’utilisateur lit quelques ouvrages anciens, mais s’intéresse surtout aux livres publiés entre 2015 et 2020.
Si vous vous sentez dépassé et souhaitez apprendre les fondamentaux de Tableau, l’article Tableau Tutorial for Beginners d’Eugenia Anello pourra vous aider.
Boîte à moustaches (box plot)
Pour tracer un box-and-whisker plot :
- Faites glisser le champ Books.Ratings Count vers l’étagère Rows. Passez-le de Discrete à Continuous.
- Faites glisser le champ Books.Ratings Count vers l’option Detail du panneau Marks. Passez-le de Measure à Dimension.
- Cliquez sur Show Me et choisissez l’option box-and-whisker plots.
- Déplacez le champ de Rows vers Columns pour l’afficher à l’horizontal.
- Terminez par la personnalisation : augmentez la taille, changez la couleur, ajoutez un titre et renommez l’axe en « Popularity ».

Boîte à moustaches — nombre d’avis par livre
Il semble que l’utilisateur lise plutôt des livres peu populaires, avec quelques titres très connus. Son choix se base donc davantage sur le contenu que sur la popularité.
Graphique en bulles
Nous avons créé une visualisation simple mais efficace pour analyser le comportement de lecture. Passons maintenant à une visualisation plus avancée, avec création d’un champ calculé, édition de classes (bins) et superposition de plusieurs couches.
Dans les graphiques en bulles, les étiquettes indiquent le nombre de jours nécessaires pour terminer un livre, et la taille des bulles représente le nombre d’occurrences. Nous n’avons pas de champ de durée, mais nous pouvons le créer à partir de Started At et Read At.
Première étape : créez un nouveau champ calculé en cliquant sur la flèche du panneau Data puis Create Calculated Field.

Création d’un champ calculé
Une nouvelle fenêtre s’ouvre :
- Renommez le titre en « Read Duration »
- Utilisez la fonction DATEDIFF pour calculer la différence entre Read At et Started At.
- Assurez-vous que le premier argument de la fonction est « day ».
- Glissez-déposez ou saisissez les noms de champs entre crochets comme deuxième et troisième arguments.

Durée de lecture en jours
Le champ Read Duration est continu. Pour créer une visualisation en bulles empaquetées, nous devons le découper en segments plus petits, appelés bins (classes).
- Faites glisser le champ `Read Duration` nouvellement créé vers l’étagère Rows.
- Cliquez sur Show Me et sélectionnez histogram. Un champ de classes (bin) sera créé automatiquement.

Création d’un champ de classes
- Faites un clic droit sur le champ Read Duration (bin) nouvellement créé et sélectionnez l’option Read Duration in Days.
- Changez la Size of Bins à 10. Cela crée des segments plus fins et permet une version plus détaillée du graphique en bulles empaquetées.

Édition des classes
Le plus dur est fait, place maintenant au résultat.
- Pour une visualisation simple, cliquez sur Show Me et choisissez packed bubbles. Vous verrez des cercles monochromes de différentes tailles.
- Pour ajouter de la couleur, faites glisser le champ Read Duration sur l’option Color du panneau Marks.
- Transformez le champ couleur en Count (Distinct) via clic droit > Measure > Count (Distinct). Chaque classe/étiquette aura ainsi une couleur unique.

Bulles empaquetées monochromes
- Cliquez sur l’option Color du panneau Marks puis Edit Colors… > Sunrise-Sunset Diverging. Choisissez le dégradé qui vous convient.
- Terminez par la personnalisation pour garantir une visualisation lisible et percutante.

Graphique en bulles empaquetées
L’utilisateur a terminé la plupart des livres en moins d’une journée. On observe aussi quelques valeurs atypiques au-dessus de 300.
Nous pouvons également créer un tableau de bord Tableau en combinant ces visualisations. Apprenez à créer un tableau de bord Tableau dans ce tutoriel.
Conclusion
Dans ce tutoriel, nous avons vu l’intérêt de Python et comment l’utiliser avec Tableau. Dans la première partie, nous avons extrait des données utilisateur Goodreads via l’API développeur et converti le XML en un dataframe Pandas propre et structuré. Dans la seconde partie, nous avons utilisé ces données pour créer des visualisations simples et avancées.
L’association de Python et Tableau ouvre de nouvelles perspectives. Vous pouvez intégrer des pipelines de données, implémenter des modèles de machine learning, exécuter des analyses statistiques complexes et réaliser des tâches impossibles dans Tableau seul.
Vous pouvez exécuter le code Python gratuitement sur DataLab, qui inclut tous les packages nécessaires pour reproduire cet exemple. Pour la visualisation dans Tableau, nous avons utilisé la version gratuite appelée Tableau Public.
Si vous débutez en Python et souhaitez en savoir plus sur ses fonctionnalités et sa syntaxe, consultez le cours Introduction to Data Science in Python. Vous pouvez aussi maîtriser les bases de la visualisation et de la personnalisation dans Tableau avec le parcours de compétences Tableau Fundamentals. Il comprend 5 cours couvrant une introduction à Tableau, l’analyse de données, la création de tableaux de bord interactifs, une étude de cas et la connexion à plusieurs sources de données.