Power BI tutorial week 4: relaties en modelleren van data
Companies that use data effectively are 5x more likely to make better decisions and 6x more likely to be profitable.
— McKinsey & Company
Inleiding
Vandaag de dag speelt data een cruciale rol in het behalen van bedrijfsdoelen. Zo becijferde McKinsey & Company in 2016 in het rapport “The Age of Analytics: Competing in a Data-Driven World” dat bedrijven die hun data effectief benutten vijf keer zo waarschijnlijk betere beslissingen namen en zes keer meer kans hadden op winstgevendheid. Dashboards vormen een essentiële schakel in dit proces.
Het doel van deze tutorial is om je stap voor stap door een praktijkvoorbeeld te begeleiden waarin Business Intelligence wordt ingezet. Hiervoor maken we gebruik van Power BI en een dataset van een fictief snoepgoedbedrijf (afkomstig van Kaggle). We kiezen voor Power BI vanwege de volgende redenen:
- Microsoft Power BI wordt door Gartner als leider erkend in Business Intelligence;
- Power BI Desktop is gratis beschikbaar in de Microsoft Store;*
- Heeyoo heeft uitgebreide ervaring met het bouwen van op maat gemaakte dashboards in Power BI.
*Disclaimer: Deze tutorial is specifiek ontworpen voor Power BI Desktop op Windows-systemen, aangezien Power BI Desktop momenteel alleen beschikbaar is voor Windows-gebruikers. Als je een Mac-gebruiker bent, kun je de tutorial niet rechtstreeks uitvoeren. Als je Power BI Desktop wilt gebruiken op een Mac, kun je een virtuele Windows-machine draaien via bijvoorbeeld Parallels of Boot Camp. Wel is het mogelijk Power BI Service via je webbrowser te gebruiken om rapporten en dashboards te bekijken en te delen. Houd er rekening mee dat de functionaliteit van de webversie beperkter is dan die van Power BI Desktop.
Door deze tutorial te volgen, krijg je niet alleen inzicht in de mogelijkheden van Power BI, maar ook praktische handvatten om data effectief in te zetten binnen jouw organisatie.
In de afgelopen weken hebben we alle datasets ingeladen, bewerkt en verkend met de Power Query. Nadat we daar vorige week mee zijn geëindigd, is de volgende stap op weg naar ons dashboard data modelleren. Een solide datamodel is essentieel voor een goed functionerend dashboard. Data modelleren is een vak op zich, daarom zullen we ons in deze tutorial beperken tot de belangrijkste punten. We sluiten af met het maken van enkele visuals op basis van ons kersverse datamodel!
Feit- versus dimensietabel
- Allereerst openen we zoals elke week het .pbix bestand van vorige week.
- We navigeren naar de Model view, waar we onze tabellen terugvinden. Misschien heb je ze eerder in deze tutorial op een iets andere manier neergezet. Het belangrijkste is dat de onderstaande vijf tabellen aanwezig zijn:

Voordat we de tabellen gaan rangschikken is het goed om te beseffen dat er in de praktijk verschillende manieren zijn om data te modelleren. Een veelgebruikte aanpak is het onderscheid tussen:
- Feittabellen: deze tabellen registreren gebeurtenissen, zoals transacties. In ons geval is Sales de enige feitentabel, omdat deze de ordergegevens bijhoudt.
- Dimensietabellen: Deze tabellen bevatten meer statische, beschrijvende data die helpen bij het analyseren van de gebeurtenissen. Voor ons model zijn Date, Customer, Product en Factory dimensietabellen, omdat ze context bieden bij de transacties in de feitentabel.
- Het is nu tijd om de tabellen op een – voor ons model – logische wijze te rangschikken. We plaatsen alle dimensietabellen naast elkaar en de feitentabel daaronder. Verder zorgen we ervoor dat de Factory-tabel naast de Product-tabel komt te staan (we leggen later uit waarom):

Het belang van een datamodel
- Om het concept van relaties te illustreren, zullen we eerst een zogenaamde visual toevoegen. Hiervoor navigeren we naar de Report view, die tot nu toe nog leeg is. Stel dat we het aantal verkochte eenheden (Units) per product in een tabel willen zetten, dan selecteren we eerst de ‘Matrix’-visual (een iets meer geavanceerde versie van de ‘Tabel’-visual).
- Vervolgens kiezen we uit het Data-paneel de Product-tabel en voegen we de kolom ‘Product name’ toe aan het Rows-veld. Uit de Sales-tabel voegen we het aantal ‘Units’ toe aan het Values-veld. Wat we vervolgens zien, is dat elke rij exact hetzelfde getal geeft. De reden hiervoor is dat de twee tabellen waaruit we de velden hebben geselecteerd nog niet gekoppeld zijn. Daarom toont Power BI ons simpelweg het totaal aantal verkochte units:

Het aanleggen van relaties
Laten we nu terugkeren naar de Model View in Power BI. De eerste relatie die we gaan leggen, is die tussen de Product– en de Sales-tabel. Hierbij leggen we het belangrijke concept van sleutels. Elke rij in een dimensietabel, zoals de Product-tabel, is uniek en wordt geïdentificeerd door een specifieke kolom, die de primaire sleutel (primary key) wordt genoemd. De primaire sleutel voor de Product-tabel is de kolom Product ID (genummerd met ‘1.’ in onderstaand screenshot); dit is de unieke code die als identificatie van elk product dient. Als we de Sales-tabel bekijken, zien we dat daar ook een kolom Product ID aanwezig is (hieronder genummerd met ‘2.’). De kolom in deze tabel, die naar de Product-tabel verwijst, wordt een vreemde sleutel (foreign key) genoemd: 
- Het is een goede gewoonte om in elke dimensietabel de primaire sleutel te markeren. Dit doe je door de Product-tabel te selecteren en het Properties-paneel aan de rechterkant uit te klappen. Hier kies je de ‘Product ID’ in de drop-down voor Key column. We zien dat er nu een sleutelpictogram naast ‘Product ID’ is verschenen:

- We verbinden de primaire sleutel in de dimensietabel (Product) met de vreemde sleutel in de feittabel (Sales) om zo de relatie te leggen. Dit doen we door de kolommen naar elkaar toe te slepen:

We zoomen nog even in op het New relationship-venster, wat je altijd kunt openen door dubbel te klikken op de relatie die we hierboven zagen. Hier kun je twee belangrijke aspecten van een relatie instellen: cardinality en cross-filter direction. Even uitleggen wat dat betekent:
- Cardinality (kardinaliteit): Dit bepaalt de aard van de relatie tussen twee tabellen. Er zijn drie opties:
- One to One (1:1): Eén waarde in de ene tabel komt overeen met precies één waarde in de andere tabel.
- One to Many (1:) / Many to One (:1): Dit zijn eigenlijk twee zijden van dezelfde relatie. Het betekent dat één waarde in de ene tabel overeenkomt met meerdere waarden in de andere tabel, of andersom.
- Many to Many (:): Dit is een complexere relatie waarbij één waarde meerdere keren voorkomt in de ene tabel en ook meerdere keren in de andere.
- Cross-filter Direction (Kruisfilterrichting): Dit bepaalt in welke richting de filters tussen tabellen worden doorgegeven. Er zijn twee opties:
- Single: Filters worden slechts in één richting doorgegeven: van de ene tabel naar de andere. Dit is meestal de beste keuze.
- Both: Filters kunnen in beide richtingen doorgegeven worden. Dit wordt vaak gebruikt in scenario’s waar je gegevens van beide tabellen dynamisch wilt kunnen filteren, maar het kan leiden tot complexe berekeningen en performanceproblemen.
Voor deze tutorial is het voldoende om te weten dat one-to-many kardinaliteit (van dimensie naar feittabel) en single cross-filter direction in het algemeen de voorkeur hebben voor een efficiënte en overzichtelijke datamodellering.
- Na het leggen van de relatie tussen de Product– en Sales-tabellen, keren we terug naar de Report View. De visual ziet er nu een stuk beter uit. Nu worden de juiste aantallen verkochte eenheden per ‘Product Name’ getoond:

- Hierbij kunnen we alvast stilstaan bij het begrip impliciete measure. Wat hierboven namelijk gebeurt, is dat Power BI automatisch de som van het aantal Units neemt. Wanneer we naar het Values-veld navigeren en dit uitvouwen, zien we dat Power BI sum als ‘summarization’-methode heeft gekozen. Dat is precies wat we hier willen, maar het is dus ook mogelijk om in plaats daarvan bijvoorbeeld het gemiddelde (‘average’) of het minimum te tonen.

Volgende week zullen we uitgebreid ingaan op het verschil tussen impliciete en expliciete measures.
Afronding van het datamodel
- We keren terug naar de Model View. Probeer nu zelf eens de primaire sleutels van de andere dimensietabellen te identificeren. Als het goed is kom je tot het volgende schema:

- Probeer vervolgens de relaties aan te leggen tussen de Date-tabel en de Sales-tabel, als ook tussen de Customer-tabel en de Sales-tabel. De Factory-tabel behandelen we straks. Hopelijk lukt het, en zo niet, dan kun je de stappen in de gif hieronder volgen:

Hopelijk is het gelukt, maar wellicht vond je het lastig om in de Sales-tabel de vreemde sleutel uit te kiezen voor de primaire sleutel uit de Date-tabel, omdat deze zowel aan Order date als Ship date kan worden gekoppeld. In deze tutorial zullen we de Order date gebruiken en Ship date buiten beschouwing laten.
Een belangrijke opmerking is dat er slechts één actieve relatie tussen twee tabellen kan bestaan. Nu volgt een korte demo die laat zien dat we in theorie de Date uit de Date-tabel ook kunnen koppelen aan de ‘Ship date’, waarbij dit een zogenaamde inactieve relatie is. Het gebruik van inactieve relaties valt echter buiten de scope van deze tutorial en daarom verwijderen we deze weer (simpelweg de relatie aanklikken en op ‘delete’ drukken):
- De laatste tabel die nog moet worden gekoppeld is de Factory-tabel. Let op dat deze tabel extra informatie bevat voor elke fabriek! De vreemde sleutel voor deze tabel vinden we dan ook niet in de Sales-tabel, maar in de Product-tabel:

- Het uiteindelijke model dat we krijgen is de volgende. Let hierbij op dat elke relatie zowel de kardinaliteit (1-to-many (*)) als de cross-filterrichting (richting van de pijl) aangeeft:

Eerste visuals toevoegen aan het rapport
- Laten we nu naar de Report view gaan en de tijdelijke visual aanpassen, zodat we het totaal aantal orders per divisie zullen zien. We verwijderen de reeds geselecteerde velden en voegen vervolgens de gewenste velden toe:
- Rows: ‘Division’ (uit de Product-tabel)
- Values: ‘Order ID’ (uit de Sales-tabel)
Let op hoe we in dit geval de door Power BI automatisch gegeneerde impliciete measure (‘First Order ID’) aanpassen. We willen namelijk het unieke aantal orders per divisie weten, dus kiezen we hier voor ‘Count (distinct)’: 
- Ten slotte kopiëren we de visual (rechtermuisknop > copy gevolgd door rechtermuisknop > paste, maar je kunt ook gewoon de sneltoetsen ‘ctrl + c’ en dan ‘ctrl + v’ gebruiken) en navigeren we naar de Visual gallery terwijl de visual geselecteerd is. Uit dit menu kiezen we voor Clustered bar chart:

Hiermee ronden we week 4 van de tutorial af. We hebben geleerd hoe we een datamodel opbouwen en waarom dat zo belangrijk is voor het maken van krachtige visuals. Tot volgende week!

Een goed datamodel is de basis van betrouwbare inzichten. Wil je hier als organisatie steviger in staan? Neem gerust contact op. Onze Power BI Specialisten denken graag met je mee over de mogelijkheden!



















