Accéder au contenu principal

Tutoriel visualiser des données avec Python et Tableau

Découvrez comment utiliser Python pour étendre les capacités de visualisation de données de Tableau.
Actualisé 19 sept. 2026  · 15 min lire

Explorer avec l’IA

ChatGPTClaudePerplexity

Python Tableau Tutorial

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. 

Data Visualization with Tableau
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. 

  1. Extraction de user_id en filtrant les chiffres dans le lien, ce qui retourne « 73376016 ». 
  2. 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 ».
  3. 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()

Converting JSON to Pandas Dataframe

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. 

Final Dataframe

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.

Goodreads Clean CSV File

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.  

Connecting Data and Modifying Data Types
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

User Rating Histogram Part 1
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.

User Rating Histogram Part 2
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. 

User Rating Histogram Part 4
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 :

  1. Faites glisser le champ Book.Publication Year vers les étagères Rows et Columns.
  2. Transformez le champ de Rows en décompte en faisant un clic droit puis Measure > Count
  3. Passez le champ de Columns en dimension via clic droit > Dimensions.
  4. Dans le panneau Marks, ouvrez le menu Automatic et choisissez Line
  5. Nettoyez les libellés d’axe, personnalisez le graphique, ajoutez un titre et supprimez les valeurs nulles.

Book Publication Year Line Plot
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 :

  1. Faites glisser le champ Books.Ratings Count vers l’étagère Rows. Passez-le de Discrete à Continuous
  2. Faites glisser le champ Books.Ratings Count vers l’option Detail du panneau Marks. Passez-le de Measure à Dimension.
  3. Cliquez sur Show Me et choisissez l’option box-and-whisker plots. 
  4. Déplacez le champ de Rows vers Columns pour l’afficher à l’horizontal. 
  5. Terminez par la personnalisation : augmentez la taille, changez la couleur, ajoutez un titre et renommez l’axe en « Popularity ».

Number of Reviews per Book Boxplot
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

Creating Calculated Field
Création d’un champ calculé

Une nouvelle fenêtre s’ouvre :

  1. Renommez le titre en « Read Duration »
  2. Utilisez la fonction DATEDIFF pour calculer la différence entre Read At et Started At.
  3. Assurez-vous que le premier argument de la fonction est « day ».
  4. Glissez-déposez ou saisissez les noms de champs entre crochets comme deuxième et troisième arguments. 

Read Duration in Days
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). 

  1. Faites glisser le champ `Read Duration` nouvellement créé vers l’étagère Rows.
  2. Cliquez sur Show Me et sélectionnez histogram. Un champ de classes (bin) sera créé automatiquement.

Creates a Bin Field
Création d’un champ de classes 

  1. Faites un clic droit sur le champ Read Duration (bin) nouvellement créé et sélectionnez l’option Read Duration in Days.
  2. 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. 

Editing Bins
Édition des classes

Le plus dur est fait, place maintenant au résultat. 

  1. Pour une visualisation simple, cliquez sur Show Me et choisissez packed bubbles. Vous verrez des cercles monochromes de différentes tailles. 
  2. Pour ajouter de la couleur, faites glisser le champ Read Duration sur l’option Color du panneau Marks
  3. Transformez le champ couleur en Count (Distinct) via clic droit > Measure > Count (Distinct). Chaque classe/étiquette aura ainsi une couleur unique. 

Unicolor Packed Bubbles Plot
Bulles empaquetées monochromes

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

Packed Bubbles Plot
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.

Sujets
Tableau
Visualisation des données
Python

Cours Tableau et Python sur DataCamp 

Cours

Introduction à Python

4 h
7M
Apprenez les bases de l’analyse de données avec Python en quatre heures et explorez ses principaux packages.
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow