Cursus

Waarom Python gebruiken met Tableau
Tableau biedt verschillende opties om data aan te vullen en nieuwe velden te maken. Met berekende velden kun je rekenkundige, logische, ruimtelijke en voorspellende functies uitvoeren. Tableau is een krachtige Business Intelligence (BI)-tool, maar er zijn beperkingen; daar schiet de programmeertaal Python te hulp.
Python is populair onder data-professionals. Je kunt het gebruiken om data te extraheren, schoon te maken, te verwerken en complexe statistische functies toe te passen. Het biedt machine learning-frameworks, data-orkestratie, multiprocessing en rijke libraries om bijna elke denkbare taak uit te voeren.
Python is een veelzijdige taal en in combinatie met Tableau geeft het ons de vrijheid om zeer complexe taken uit te voeren. In deze tutorial gebruiken we Python om de data te extraheren en schoon te maken. Vervolgens gebruiken we de opgeschoonde data om visualisaties te maken in Tableau.
We gebruiken Tabpy niet om een Tableau Python-server op te zetten en Python-scripts binnen Tableau uit te voeren. In plaats daarvan extraheren en schonen we eerst de data in Python (Jupyter Notebook) en maken we daarna interactieve visualisaties in Tableau.

Goodreads Data Viz | Tableau Public
Dit is een stapsgewijze, codegerichte tutorial over de Goodreads API en het maken van complexe visualisaties in Tableau. Bekijk de link hieronder om toegang te krijgen tot de code en het Tableau-dashboard.
Data-inname en -verwerking met Python
In het eerste deel van de tutorial leren we de Goodreads API te gebruiken om publieke data te benaderen. In ons geval richten we ons op het gebruikersprofiel en zetten we dit om naar een leesbare Pandas-dataframe. Vervolgens schonen we de data en exporteren we die naar CSV-formaat.
Aan de slag
We gebruiken DataLab om de Python-code uit te voeren. Dat bevat de nodige Python-packages voor data science-taken.
Ben je nieuw met Python en wil je de omgeving lokaal instellen, installeer dan Anaconda. Daarmee installeer je Python, Jupyter Notebook en de benodigde Python-packages.
Voordat we code schrijven, moeten we het xmltodict-pakket installeren, omdat dit geen onderdeel is van de DataLab- of Anaconda-datastack. We gebruiken `pip` om het ontbrekende Python-pakket te installeren.
Opmerking: Het `!`-symbool werkt alleen in Jupyter Notebooks. Hiermee krijgen we toegang tot de terminal binnen de Jupyter-codecel.
!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
In de volgende stap importeren we de benodigde packages.
import pandas as pd
import xmltodict
import urllib.request
De profiellink parsen
Om gebruikersdata te extraheren, hebben we zowel het user id als de gebruikersnaam nodig. In deze sectie parsen we de Abid-profiellink.
Opmerking: Je kunt het profiel van een vriend gebruiken of je eigen profiellink, en dit script draaien.
- Het extraheert user_id door cijfers uit de link te filteren en geeft “73376016” terug.
- Om user_name te extraheren, splitsen we de string op user_id en vervolgens op “-” om de gebruiker te krijgen. Door “-” te vervangen door een spatie krijgen we de gebruikersnaam “abid”.
- Tot slot concateneren we user_id met user_name. Deze unieke id gebruiken we in de volgende sectie om gebruikersdata te benaderen.
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
Goodreads-data extraheren
Eind 2020 stopte Goodreads met het aanbieden van een developer-API. Je kunt het volledige bericht hier lezen. Om dit te omzeilen gebruiken we API-sleutels van oudere projecten zoals streamlit_goodreads_app. Dat project legt uit hoe je via de API toegang krijgt tot Goodreads-gebruikersdata.
Goodreads biedt ook de optie om data te downloaden in CSV-formaat zonder API-sleutel, maar dat is beperkt tot één gebruiker en geeft ons niet de vrijheid om realtime data te extraheren.
In deze sectie maken we functies die user_id_name, version, shelf, per_page en apiKey aannemen.
- apiKey: om toegang te krijgen tot de publieke data
- version: om het nieuwste datatype te specificeren
- shelf: er zijn meerdere planken in het gebruikersprofiel, meestal read, to-read en currently-reading
- per_page: aantal boeken per pagina
De functie neemt gebruikersinvoer aan om de URL voor te bereiden en downloadt vervolgens de data met urllib.request. Uiteindelijk krijgen we de data in XML-formaat.
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'
XML naar JSON converteren
Onze initiële data is in XML-formaat, en er is geen directe manier om die om te zetten naar een gestructureerde database. Daarom transformeren we het naar JSON met het Python-pakket xmltodict.
De XML-data wordt omgezet naar geneste JSON, en om de eerste invoer in de boekrecensiedata te tonen, gebruiken we vierkante haken om de ingesloten data te benaderen.
Je kunt experimenteren met metadata en meer opties verkennen, maar in deze tutorial focussen we op gebruikersreviewdata.
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': .........
JSON naar Pandas-dataframe converteren
Om JSON om te zetten naar een Pandas-dataframe, gebruiken we de functie json_normalize. De reviewdata staat op het derde niveau; om die te benaderen gebruiken we GoodreadsResponse, reviews en review.
Voor we het dataframe tonen, filteren we irrelevante data weg door boeken te droppen met een missende kolom date_updated.
Leer verschillende manieren om CSV-bestanden, spreadsheets, JSON, SQL-databases en API’s in te lezen met Pandas in de cursus Streamlined Data Ingestion with pandas.
df = pd.json_normalize(contents_json["GoodreadsResponse"]["reviews"]["review"])
df = df[df["date_updated"].notnull()]
df.head()

Data opschonen
Het ruwe dataframe ziet er al redelijk schoon uit, maar we moeten het aantal kolommen nog terugbrengen.
Zoals je ziet zijn er 61 kolommen.
df.shape
(200, 61)
Laten we de lege kolommen droppen.
df.dropna(axis=1, how='all', inplace=True)
df.shape
(200, 58)
We hebben met succes 3 kolommen met missende waarden verwijderd.
We bekijken nu alle kolomnamen met `df.columns` en selecteren de meest bruikbare kolommen.
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()
Zoals je ziet is het definitieve dataframe netjes en bevat het de relevante datavelden.

CSV-bestand exporteren
In het laatste deel exporteren we het dataframe naar een CSV-bestand dat compatibel is met Tableau. Voeg in de functie to_csv de bestandsnaam met extensie toe en laat de index weg door het argument index op False te zetten.
final_df.to_csv("abid_goodreads_clean_data.csv",index=False)
Het CSV-bestand verschijnt in de huidige map.

Goodreads Clean CSV-bestand
Je kunt ook de Python Jupyter Notebook bekijken: Data Ingestion using Goodreads API. Dat helpt je bij het debuggen van je code en als je het Python-gedeelte wilt overslaan, kun je het bestand simpelweg downloaden door op de knop Copy & Edit te klikken en het script uit te voeren.
Datavisualisatie in Tableau
In het tweede deel gebruiken we de opgeschoonde data en maken we eenvoudige en complexe visualisaties in Tableau. Ons doel is interactieve grafieken te maken die helpen het leesgedrag van de gebruiker te begrijpen.
De data verbinden
We verbinden het CSV-bestand door de optie Text file te kiezen en het bestand abid_goodreads_clean_data.csv te selecteren. Daarna wijzigen we de velden Started At, Read At en Date Added naar Date & Time, zoals hieronder getoond.
Opmerking: Het is een goede gewoonte om je datavelden aan het begin te wijzigen.

Data verbinden en datatypen aanpassen
Histogram van beoordelingen maken
In deze sectie maken we een histogram van de boekbeoordelingen van de gebruiker.
- Sleep eerst het veld Rating naar de plank Rows.

Histogram gebruikersbeoordelingen deel 1
- Klik op de vervolgkeuzeknop Show Me om de visualisatiesjablonen te openen. We zetten het staafdiagram om naar een histogram door op de optie Histogram te klikken.

Histogram gebruikersbeoordelingen deel 2
- De Rating-as heeft tickmarks met een interval van 0,5. Pas de tickmarks aan door met de rechtermuisknop op de onderste as te klikken en Edit Axis te selecteren. Klik daarna op het tabblad Tick Marks en zet de Major Tick Marks op Fixed. Zorg dat de Tick Origin 0 is en het Tick Interval 1.

Histogram gebruikersbeoordelingen deel 3
- We personaliseren het histogram door aslabels op te schonen, de kleuren en randen van de staven te wijzigen en marklabels toe te voegen. Dit alles doe je via de opties in het Marks-paneel. Dat vind je links in het midden.

Histogram gebruikersbeoordelingen deel 4
De gebruiker gaf meestal beoordelingen tussen 3 en 4. De nullen zijn boeken die niet beoordeeld zijn.
Lijngrafiek
Zo maak je een lijngrafiek:
- Sleep het veld Book.Publication Year naar de planken Rows en Columns.
- Wijzig het veld op de Rows-plank naar count door er met rechts op te klikken en Measure > Count te kiezen.
- Wijzig het veld op de Columns-plank naar dimensions door er met rechts op te klikken en Dimensions te kiezen.
- Ga naar het Marks-paneel, klik op de vervolgkeuze bij Automatic en verander dit naar Line.
- Maak de aslabels netjes, pas de grafiek aan, voeg een titel toe en verwijder null-waarden.

Lijngrafiek publicatiejaar van boeken
De gebruiker heeft enkele oude boeken gelezen, maar is vooral geïnteresseerd in boeken die tussen 2015 en 2020 zijn uitgegeven.
Voelt dit wat veel en wil je de basis van Tableau leren, dan is de Tableau Tutorial for Beginners van Eugenia Anello wellicht nuttig.
Boxplot
Zo maak je een box-and-whisker-plot:
- Sleep het veld Books.Ratings Count naar de plank Rows. Zet het van Discrete naar Continuous.
- Sleep het veld Books.Ratings Count naar de optie Detail in het Marks-paneel. Zet het van Measure naar Dimension.
- Klik op de vervolgkeuze Show Me en selecteer de optie voor box-and-whisker plots.
- Verplaats het veld van Rows naar de plank Columns om het horizontaal te maken.
- Het laatste deel draait om personaliseren. We vergroten de grootte, veranderen de kleur, voegen een titel toe en hernoemen de as naar “Popularity”.

Boxplot aantal reviews per boek
Het lijkt erop dat de gebruiker minder populaire boeken leest en af en toe een paar bekende. Dat betekent dat de gebruiker een eigen smaak heeft op basis van de inhoud, niet op populariteit.
Bubbelplot
We hebben een eenvoudige maar sterke visualisatie gemaakt om het leesgedrag van de gebruiker te begrijpen. Nu leren we een complexere visualisatie, waarbij we een nieuw berekend veld maken, bins bewerken en meerdere lagen creëren.
In bubbelplots geven de labels het aantal dagen aan dat een gebruiker nodig had om een boek uit te lezen, en de grootte van de bubbel staat voor het aantal voorkomens. We hebben geen veld voor de duur, maar dat kunnen we maken met Started At en Read At.
In de eerste stap maken we een nieuw berekend veld door op het pijltje-omlaag in het Data-paneel te klikken en Create Calculated Field te kiezen.

Calculated Field maken
Er verschijnt een nieuw venster, en je moet:
- De titel hernoemen naar “Read Duration”
- De functie DATEDIFF gebruiken om het verschil tussen Read At en Started At te krijgen.
- Zorg dat het eerste argument van de functie “day” is.
- Sleep de veldnamen of typ ze in vierkante haken als tweede en derde argument.

Leestijd in dagen
Het veld Read Duration is continu en om een packed bubbles-visualisatie te maken, moeten we het veld opdelen in kleinere stukken, zogenaamde bins.
- Sleep het zojuist gemaakte veld `Read Duration` naar de plank Rows.
- Klik op Show Me en selecteer histogram. Er wordt automatisch een bin-veld voor je gemaakt.

Maakt een bin-veld aan
- Klik met rechts op het zojuist gemaakte veld Read Duration (bin) en selecteer de optie Read Duration in Days.
- Wijzig de Size of Bins naar 10. Dit creëert meerdere kleinere datastukken en helpt ons een verfijndere versie van de packed bubbles-plot te maken.

Bins bewerken
Het lastigste deel is voorbij; tijd om de vruchten te plukken.
- Voor de eenvoudige visualisatie klik je op Show Me en selecteer je de optie packed bubbles. Je ziet nu eenkleurige cirkels met verschillende groottes.
- Voor kleur slepen we het veld Read Duration naar de optie Color in het Marks-paneel.
- Wijzig het kleurveld naar Count (Distinct) door met rechts op het veld te klikken en Measure > Count (Distinct) te selecteren. Zo krijgt elke bin of elk label een eigen kleur.

Eenkleurige packed bubbles-plot
- Klik op de optie Color in het Marks-paneel en kies Edit Colors… > Sunrise-Sunset Diverging. Je kunt elke gradiënt kiezen die je aanspreekt.
- Het laatste deel draait om personaliseren en ervoor zorgen dat je visualisatie aantrekkelijk is en de juiste boodschap overbrengt.

Packed bubbles-plot
De meeste boeken waren in minder dan een dag uit. Je ziet ook een paar uitschieters boven de 300.
We kunnen ook een Tableau-dashboard maken door deze visualisaties te combineren. Leer in deze tutorial hoe je een Tableau-dashboard maakt.
Conclusie
In deze tutorial hebben we geleerd waarom Python belangrijk is en hoe je het met Tableau gebruikt. In het eerste deel extraheerden we Goodreads-gebruikersdata met de developer-API en zetten we de XML-data om naar een schoon en gestructureerd Pandas-dataframe. In het tweede deel gebruikten we de opgeschoonde data om zowel eenvoudige als complexe visualisaties te maken.
De combinatie van Python met Tableau opent een heel nieuwe wereld aan mogelijkheden. Je kunt datapijplijnen integreren, machine learning-modellen implementeren, complexe statistische analyses uitvoeren en allerlei taken uitvoeren die in Tableau alleen niet mogelijk zijn.
Je kunt de Python-code gratis draaien in DataLab, dat wordt geleverd met alle benodigde packages om dit voorbeeld te draaien. Voor de Tableau-visualisatie gebruikten we de gratis versie van Tableau: Tableau Public.
Ben je nieuw met Python en wil je meer leren over functionaliteiten en syntax, bekijk dan de cursus Introduction to Data Science in Python. Je kunt ook de basis van Tableau-visualisatie en -aanpassing beheersen met de skill track Tableau Fundamentals. Deze bestaat uit 5 cursussen die een introductie tot Tableau, data-analyse, interactieve dashboards maken, werken aan een casestudy en het verbinden van meerdere databronnen behandelen.
