Analyse met de tweede datum in Tableau Desktop

Dit is de tweede fase van de zelfstudie en deze gaat ervan uit dat de eerste fase, De tweede datum zoeken met Tableau Prep, is voltooid.

In de eerste fase hebben we onze originele dataset aangepast om de volgende vragen te beantwoorden:

  1. Hoeveel dagen zaten er tussen de eerste en de tweede overtreding voor elke bestuurder?

  2. Vergelijk de boetebedragen voor de eerste en tweede overtreding. Zijn ze gecorreleerd?

  3. Welke chauffeur betaalde in totaal het meest? Wie betaalde het minst?

  4. Hoeveel bestuurders begingen meerdere soorten overtredingen?

  5. Wat was het gemiddelde boetebedrag voor bestuurders die nooit een verkeerscursus hadden gevolgd?

Nu we deze vragen verder onderzoeken, wordt het duidelijk dat de eerste datastructuur die we hebben gecreëerd, zowel voor- als nadelen heeft. We gaan terug naar Tableau Prep Builder en voeren nog wat aanpassingen door. Vervolgens bekijken we welke impact dat heeft op dezelfde analyse in Tableau Desktop. Tot slot bekijken we aanpak met alleen Tableau Desktop voor de analyse met behulp van Level of Detail (LOD)-expressies met de oorspronkelijke data.

Het doel van deze zelfstudie is om verschillende concepten te presenteren in de context van een realistisch scenario en de opties te bespreken. Het doel is niet om voor te schrijven welke het beste is. Aan het einde van de cursus hebt u meer inzicht in de impact die een datastructuur op berekeningen en analyses heeft. Ook bent u beter bekend met verschillende aspecten van Tableau Prep en berekeningen in Tableau Desktop.

Opmerking: om de taken in deze zelfstudies te voltooien hebt u een installatie van Tableau Prep en eventueel Tableau Desktop nodig.

Zie voor het installeren van Tableau Prep en Tableau Desktop de Implementatiegids voor Tableau Desktop en Tableau Prep(Link wordt in een nieuw venster geopend). U kunt ook gratis proefversies van Tableau Prep(Link wordt in een nieuw venster geopend) en Tableau Desktop(Link wordt in een nieuw venster geopend) downloaden.

De dataset is de uitvoer van Bestuurdersovertredingen.tflx, zoals opgezet in de eerste fase.

Analyse in Tableau Desktop

Nu we onze data hebben geconfigureerd, importeren we deze in Tableau Desktop. Sommige vragen kunnen we eenvoudig beantwoorden, maar andere vergen een paar (of veel) berekeningen. Probeer de onderstaande vragen eens uit. U kunt ze uitbreiden met basisinformatie over wat u moet doen als u ergens vastloopt.

Opmerking: u kunt de werkmap Bestuurdersovertredingen.twbx(Link wordt in een nieuw venster geopend) downloaden om de oplossingen in context te bekijken. Houd er rekening mee dat er mogelijk alternatieve manieren zijn om de analyse te interpreteren of antwoorden te vinden.

1. Hoeveel dagen zaten er tussen de eerste en de tweede overtreding voor elke bestuurder?
  1. Om deze vraag in Tableau Desktop te beantwoorden gebruiken we de functie DATEDIFF. Deze functie heeft drie argumenten: het datumgedeelte, de begindatum en de einddatum. Omdat we de dagen tussen deze gebeurtenissen willen weten, gebruiken we het datumgedeelte 'dag'. Onze begin- en einddatums staan in de dataset als Datum van de eerste overtreding en Datum van de tweede overtreding.

  2. De berekening is:

    Tijd tussen overtredingen = DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])

  3. We kunnen deze uitzetten tegen Bestuurders-ID als een staafdiagram. Zeven bestuurders hebben geen tweede overtreding begaan, dus zijn er zeven nullen.

    Staafdiagram van bestuurders volgens de tijd tussen overtredingen

2. Vergelijk de boetebedragen voor de eerste en tweede overtreding. Zijn ze gecorreleerd?
  1. Om deze vraag in Tableau Desktop te beantwoorden maken we een spreidingsdiagram van Eerste boetebedrag en Tweede boetebedrag. Door Bestuurders-ID naar de container Detail van de kaart Markeringen te brengen kunnen we voor elke bestuurder een markering maken.

  2. Voor het toevoegen van een trendlijn gebruikt u het tabblad Analyse in het linkerdeelvenster en voegt u een lineaire trendlijn toe. Als we de muisaanwijzer op de trendlijn houden, zien we dat de R-kwadraatwaarde vrijwel nul is en dat de p-waarde ver boven elke grenswaarde voor significantie ligt. We kunnen vaststellen dat er geen verband bestaat tussen het eerste en het tweede boetebedrag.

    Als we dit spreidingsdiagram in een dashboard zouden gebruiken, zou de trendlijn moeten worden verwijderd.

Spreidingsdiagram van eerste en tweede boetebedrag volgens bestuurders-ID, met de weergegeven trendlijnknopinfo

3. Welke chauffeur betaalde in totaal het meest? Wie betaalde het minst?

Wanneer we dieper op de analyse willen ingaan, moeten we misschien een aantal berekeningen uitvoeren.

  1. Om deze vraag in Tableau Desktop te kunnen beantwoorden moeten we de boetes voor beide overtredingen in één veld samenvoegen. Omdat sommige bestuurders mogelijk geen tweede overtreding hebben begaan, moeten we de nullwaardefunctie ZN gebruiken om alle nullen voor Tweede boetebedrag in nullen te veranderen. Als u dit niet doet, krijgen we nullen als er geen tweede boete volgt.

  2. De berekening is:

    Totaal betaald bedrag = [1st Fine Amount] + ZN([2nd Fine Amount])

  3. We kunnen nu Totaal betaald bedrag uitzetten tegen Bestuurders-ID en het staafdiagram sorteren.

Staafdiagram van het betaalde bedrag volgens bestuurders-ID, waarbij de berekeningseditor het betaalde bedrag weergeeft

4. Hoeveel bestuurders begingen meerdere soorten overtredingen?
  1. Om dit in Tableau Desktop te beantwoorden moeten we een ingewikkelder IF -berekening uitvoeren, waarbij wordt vergeleken of de eerste en tweede soort overtreding hetzelfde zijn. Als dat zo is, willen we de waarde 1 toewijzen. Als ze niet hetzelfde zijn, wijzen we 2 toe. Omdat we alleen rekening houden met meerdere soorten overtredingen, wordt aan elk ander resultaat, zoals nul voor tweede overtredingssoort, een 1 toegewezen.

  2. De berekening is:

    Aantal soorten overtredingen =

    IF [1st Infraction Type]=[2nd Infraction Type] THEN 1 
    ELSEIF [1st Infraction Type]!= [2nd Infraction Type] THEN 2 
    ELSE 1 END
  3. We kunnen nu Aantal soorten overtredingen uitzetten tegen Bestuurders-ID en het staafdiagram sorteren.

Staafdiagram van het aantal soorten overtredingen volgens bestuurders-ID, waarbij de berekeningseditor het aantal soorten overtreding weergeeft

5. Wat was het gemiddelde boetebedrag voor bestuurders die nooit een verkeerscursus hadden gevolgd?
  1. Om deze vraag in Tableau Desktop te beantwoorden kunnen we niet zomaar het totale boetebedrag door twee delen, aangezien sommige bestuurders slechts één overtreding hadden begaan. We kunnen ook niet de gemiddelde boete per bestuurder berekenen en het gemiddelde van die waarden nemen, omdat het middelen van gemiddelden tot inconsistenties kan leiden. In plaats daarvan moeten we het totale bedrag berekenen dat is betaald door bestuurders die nooit een verkeerscursus hebben gevolgd, en dit delen door het totale aantal overtredingen die met die boetes gepaard gaan.

    1. Eerst moeten we bepalen of elke bestuurder een tweede overtreding heeft begaan. We kunnen gebruikmaken van het feit dat de informatie in alle "2e" velden nul zal zijn als er geen tweede overtreding is geweest en de berekening starten:

      IFNULL([2nd Infraction Type], 'no')

      Hiermee wordt een soort overtreding geretourneerd als deze bestaat, of 'nee' als er geen tweede overtreding is geweest.

    2. Vervolgens moeten we deze informatie vertalen naar het aantal overtredingen, 1 of 2. Als het resultaat van onze berekening IFNULL "nee" is, moet de bestuurder worden aangemerkt als iemand met één boete. Elk ander resultaat moet worden gemarkeerd als twee boetes. De berekening is:

      Aantal overtredingen =

      IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1 
      ELSE 2 
      END
    3. Nu moeten we het totale boetebedrag bekijken. Net als bij vraag 3 hierboven tellen we het eerste en tweede boetebedrag bij elkaar op, met de functie ZN functie rondom de tweede. Omdat we dit echter op het niveau van de gehele dataset willen berekenen, is het een goede gewoonte om de aggregaties, SOM, in de berekening zelf te specificeren. De berekening is: 

      SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) )

    4. Om het allemaal bij elkaar op te tellen nemen we dit totale boetebedrag en delen het door ons nieuwe berekende veld Aantal overtredingen om het gemiddelde boetebedrag te bepalen:

      Gemiddelde boete = ( SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) ) ) / SUM([Number of Infractions])

  2. We moeten ook de bestuurders eruit filteren die ooit een verkeerscursus hebben gevolgd, maar die informatie wordt ook in twee velden opgeslagen.

    1. Tableau is zeer efficiënt met numerieke berekeningen. We zullen dit in cijfers omschrijven om de prestaties zo goed mogelijk te helpen. Om deze twee velden te combineren maken we voor elk veld een berekening met de waarden Ja = 1 en Nee = 0 (null moet ook = 0 zijn, voor bestuurders zonder tweede overtreding). Als we de uitkomsten van deze berekeningen bij elkaar optellen, blijkt dat alle bestuurders met een totale waarde van 0 nooit een verkeerscursus hebben gevolgd (en de waarde 1 of 2 geeft aan hoe vaak ze een een verkeerscursus hebben gevolgd). Vervolgens kunnen we filteren om alleen de bestuurders met de waarde 0 over te houden.

    2. Deze keer gebruiken we een CASE -instructie in plaats van IF. Ze werken vrijwel hetzelfde, maar hebben een andere syntaxis. Het begin van de berekening zou er als volgt uit moeten zien:

      CASE [1st Traffic School]
      WHEN 'Yes' THEN 1
      WHEN 'No' THEN 
      ELSE 0
      END
    3. En dan doen we hetzelfde voor de tweede verkeerscursus. We kunnen beide onderdelen in dezelfde berekening optellen door elke CASE-instructie tussen haakjes te plaatsen en er een plusteken tussen te zetten. Als we een aantal regelafbrekingen verwijderen, ziet het er zo uit:

      Aantal bezoeken aan verkeerscursussen =

      (CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
      +
      (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
      
    4. Als we Aantal bezoeken aan verkeerscursussen naar het gebied Afmetingen van het deelvenster Dataslepen (boven de lijn), worden de waarden 0-2 discreet.

    5. Als we nu filteren op Aantal bezoeken aan verkeerscursussen, kunnen we gewoon de 0 selecteren en weten we dat we te maken hebben met bestuurders die nooit een verkeerscursus hebben gevolgd.

  3. Om de oorspronkelijke vraag te beantwoorden brengen we simpelweg Gemiddelde boete naar de container Tekst op de kaart Markeringen.

    Omdat we de aggregaties in de berekening hebben ingebouwd, is de aggregatie in het veld AGG en dat kunnen we niet veranderen. Dat is wat we zouden verwachten.

Enkelvoudige nummerweergave van het gemiddelde betaalde bedrag met de rekeneditor open om het aantal bezoeken aan verkeerscursussen

Nog een stap verder - gedraaide data

Hoewel de data waarmee we hebben gewerkt, goed gestructureerd zijn om met name vragen over eerste en tweede overtredingen te beantwoorden, is het niet de standaardstructuur die wordt aanbevolen voor gebruik met Tableau Desktop. Hoe meer onze analyses verwijderd raken van de basisvragen rondom de data van overtredingen, hoe ingewikkelder het wordt om met onze berekeningen de relevante informatie te combineren tot een bruikbare vorm.

Wanneer data worden opgeslagen met meerdere kolommen voor hetzelfde type data (bijvoorbeeld twee kolommen voor de datum, twee kolommen voor het boetebedrag, enz.) en unieke informatie in de veldnaam wordt opgeslagen (bijvoorbeeld of het de eerste of tweede overtreding betreft), is dit doorgaans een indicatie dat de data moeten worden gedraaid.

U kunt dit prima doen door een meervoudige draaiing in Tableau Prep Builder uit te voeren. We kunnen starten vanaf het einde van de in Tableau Prep-flow gemaakte Bestuurdersovertreding in de vorige zelfstudie De tweede datum zoeken met Tableau Prep.

Tip: zorg ervoor dat u weer in Tableau Prep bent voor de volgende stappen.

  1. Voeg in de laatste opschoningsstap een Draaistap toe die om elk dubbel veld draait. Gebruik het pluspictogram in de rechterbovenhoek van de het gebied Gedraaide velden om meer Draaipuntwaarden toe te voegen. Elke set velden (zoals het eerste en tweede boetebedrag) moet gezamenlijk worden gedraaid.

    Zie Data opschonen en vormgeven voor meer informatie over draaien.

  2. In het gebied Gedraaide velden, onder de kolom Draai1-namen, dubbelklikt u op elke waarde en wijzigt u de naam in eerste en tweede.

    Draai1-configuratievenster in Tableau Prep met de vijf draaipunten

U kunt de resultaten opschonen door lege datums te verwijderen en door de velden een andere naam en volgorde te geven.

  1. Voeg na het draaien een opschoningsstap toe. Klik in de kolom Datum van de overtreding met de rechtermuisknop op de nulbalk en kies Uitsluiten.

  2. Dubbelklik op de veldnaam Draaipunt1-namen en wijzig de naam in Overtredingsnummer.

  3. Versleep de velden naar wens om ze opnieuw te ordenen, zoals hieronder:

    Voorbeeld van de gedraaide en opgeschoonde data

  1. Maak vanuit de nieuwe, gedraaide data een uitvoer met de naam Gedraaide bestuurdersovertredingen en kopieer deze naar Tableau Desktop. (Vergeet niet de flow uit te voeren nadat u de stap Uitvoer hebt toegevoegd.)

Nu kunnen we met deze aangepaste datastructuur opnieuw naar onze vijf vragen kijken. U kunt elke vraag uitbreiden met basisinformatie over wat u moet doen als u vastloopt.

Opmerking: u kunt het voltooide flowbestand Gedraaide bestuurdersovertredingen.tflx downloaden om uw werk te controleren, of de werkmap Gedraaide bestuurdersovertredingen.twbx downloaden om de oplossingen in context te bekijken. Houd er rekening mee dat er mogelijk alternatieve manieren zijn om de analyse te interpreteren of antwoorden te vinden.

1. Hoeveel dagen zaten er tussen de eerste en de tweede overtreding voor elke bestuurder?
  1. Om deze vraag in Tableau Desktop te beantwoorden, zoals we dat met de eerste dataset deden, gebruiken we de functie DATEDIFF . Voor deze functie is een begin- en einddatum vereist. Deze informatie is in onze data aanwezig, maar staat allemaal in één veld. We moeten de informatie in twee velden verdelen.

    1. Maak twee voorlopig berekende velden:

      Datum van de eerste overtreding = IF [Infraction Number] = "1st" THEN [Infraction Date] END

      Datum van de tweede overtreding = IF [Infraction Number] = "2nd" THEN [Infraction Date] END

    2. Omdat we zeker willen weten dat beide waarden voor elke bestuurder met elkaar vergeleken kunnen worden, moeten we ze vastleggen op het niveau van de Bestuurders-ID.

      Opmerking: gelooft u het niet? Probeer eens een DATEDIFF -berekening uit te voeren met deze twee velden zoals ze zijn: Tijd tussen overtredingen = DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])
      U krijgt overal nulresultaten, omdat Tableau vergelijkingen probeert te maken in een datastructuur die er als volgt uitziet:
      teksttabel met nulresultaten
      Hier weet de rij die de eerste datum kent, niet wat de tweede datum is, en omgekeerd. Om dit te omzeilen gebruiken we een FIXED LOD (Level of Detail)-expressie om te forceren dat deze eerste en tweede datums worden gerelateerd door Bestuurders-ID.

    3. Bewerk elke berekening als volgt:

      Datum van de eerste overtreding = { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "1st" THEN [Infraction Date] END ) }

      Datum van de tweede overtreding = { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "2nd" THEN [Infraction Date] END ) }

      Opmerking: de oorspronkelijke IF-berekening moet worden samengevoegd wanneer deze is ingesloten in een LOD-expressie. We kunnen elke basisaggregatie gebruiken die de datumwaarde behoudt (dus aggregaties zoals SUM, AVG of MIN werken wel, maar CNT of CNTD niet).

      Opmerking: deze berekeningen kunnen ook worden gecreëerd in Tableau Prep Builder. Zie Berekeningen voor detailniveau, rangschikking en tegels maken voor meer informatie over LOD-expressies in Prep.

    4. Nu kunnen we de berekening DATEDIFF als volgt creëren:

      Tijd tussen overtredingen = DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])

      • Als we naar weken of maanden willen kijken, hoeven we alleen maar het datumgedeelte aan te passen (momenteel 'day').

      • Het zou ook mogelijk zijn om één berekening voor het geheel te maken door de FIXED-berekeningen rechtstreeks in de DATEDIFF te plaatsen: 

        DATEDIFF ( 'day',

        { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "1st" THEN [Infraction Date] END ) },

        { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "2nd" THEN [Infraction Date] END ) }

        )

    5. Zet Tijd tussen overtredingen uit op Kolommen en Bestuurders-ID op rijen.

De resultaten zijn identiek aan de uitkomst met de niet-gedraaide datastructuur.

2. Vergelijk de boetebedragen voor de eerste en tweede overtreding. Zijn ze gecorreleerd?
  1. Om deze vraag in Tableau Desktop te beantwoorden gebruiken we vrijwel dezelfde logica als bij de vorige vraag. We gebruiken Overtredingsnummer om vast te stellen of een bepaalde overtreding de eerste of tweede is, en vervolgens het boetebedrag op te halen.

    1. Als we alleen een spreidingsdiagram willen maken, kunnen we het LOD-gedeelte overslaan en gewoon de IF -berekening gebruiken:

      Eerste boetebedrag = IF [Infraction Number] = "1st" THEN [Fine Amount] END

      Tweede boetebedrag = IF [Infraction Number] = "2nd" THEN [Fine Amount] END

    2. Als we echter de hoogte van de boetes voor één bestuurder met elkaar willen vergelijken en het verschil in bedrag willen zien, lopen we tegen hetzelfde probleem aan als bij de datums. Het kan geen kwaad om deze berekeningen in een FIXED -LOD te zetten, dus het is misschien een goed idee om dit vanaf het begin te doen:

      Eerste boetebedrag = { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "1st" THEN [Fine Amount] END ) }

      Tweede boetebedrag = { FIXED [Driver ID] : MIN ( IF [Infraction Number] = "2nd" THEN [Fine Amount] END ) }

      Deze berekeningen kunnen ook worden gemaakt in Tableau Prep Builder. Zie Berekeningen voor detailniveau, rangschikking en tegels maken voor meer informatie over LOD-expressies in Prep.

    3. Maak een spreidingsdiagram met Eerste boetebedrag op Kolommen en Tweede boetebedrag op rijen en voeg een lineaire trendlijn toe zoals eerder.

De resultaten zijn identiek aan de uitkomst met de niet-gedraaide datastructuur.

3. Welke chauffeur betaalde in totaal het meest? Wie betaalde het minst?
  1. Voor het beantwoorden van deze vraag in Tableau Desktop is de gedraaide datastructuur ideaal. Het enige wat we hoeven te doen, is Bestuurders-ID en Boetebedrag in een staafdiagram te zetten. De standaardaggregatie is al SOM, dus het totaalbedrag dat de chauffeur betaalt, wordt automatisch weergegeven.

De resultaten zijn identiek aan de uitkomst met de niet-gedraaide datastructuur.

4. Hoeveel bestuurders begingen meerdere soorten overtredingen?
  1. Voor het beantwoorden van deze vraag in Tableau Desktop is de gedraaide datastructuur ideaal. Het enige wat we hoeven te doen is Bestuurders-ID en een Aantal uniek van Soort overtreding in een staafdiagram te zetten, en dan hebben we het antwoord.

De resultaten zijn identiek aan de uitkomst met de niet-gedraaide datastructuur.

5. Wat was het gemiddelde boetebedrag voor bestuurders die nooit een verkeerscursus hadden gevolgd?
  1. Om deze vraag in Tableau Desktop te beantwoorden kunnen we niet zomaar het totale boetebedrag door twee delen, aangezien sommige bestuurders slechts één overtreding hadden begaan. We kunnen ook niet de gemiddelde boete per bestuurder berekenen en het gemiddelde van die waarden nemen, omdat het middelen van gemiddelden tot inconsistenties kan leiden. In plaats daarvan moeten we het totale bedrag berekenen dat is betaald door bestuurders die nooit een verkeerscursus hebben gevolgd, en dit delen door het totale aantal overtredingen die met die boetes gepaard gaan.

    1. Eerst moeten we bepalen of elke bestuurder een tweede overtreding heeft begaan. We kunnen gebruikmaken van het feit dat de Datum van de tweede overtreding null is als er geen tweede overtreding is geweest en de berekening starten:

      IFNULL(STR([2nd Infraction Date]), 'no')

      Hiermee wordt de datum van de tweede overtreding geretourneerd als deze bestaat, of 'nee' als er geen tweede overtreding is geweest.

      Opmerking: het gedeelte STR van deze berekening is noodzakelijk omdat IFNULL  consistente datatypen in zijn argumenten vereist. Omdat we voor nullwaarden de tekenreeks "nee" willen retourneren, moeten we de datum ook naar een tekenreeks converteren.

    2. Vervolgens moeten we deze informatie vertalen naar het aantal overtredingen, 1 of 2. Als het resultaat van onze berekening IFNULL "nee" is, moet de bestuurder worden aangemerkt als iemand met één boete. Elk ander resultaat moet worden gemarkeerd als twee boetes. De berekening is:

      Aantal overtredingen =

      IF IFNULL(STR([2nd Infraction Date]), 'no')= 'no' THEN 1 
      ELSE 2 
      END
      
    3. Nu moeten we kijken naar het gemiddelde boetebedrag. We hebben al één veld voor Boetebedrag. Het enige wat we hoeven te doen, is dat te delen door ons nieuwe veld Aantal overtredingen veld, en beide in SOM te plaatsen: 

      Gemiddelde boete = (SUM([Fine Amount]) / SUM([Number of Infractions])

  2. Ook moeten we bestuurders die een verkeerscursus hebben gevolgd, eruit filteren. Het lijkt erop dat we het veld Verkeerscursus kunnen gebruiken en kunnen filtereren op Verkeerscursus = nee. Maar hierdoor zouden we filteren op overtredingen die niet met een verkeerscursus zijn gekoppeld, niet op bestuurders die nooit een verkeerscursus hebben gevolgd. Als een bestuurder voor de ene overtreding wel naar een verkeerscursus is geweest en voor de andere niet, dan willen we dat geen van beide overtredingen in aanmerking wordt genomen. Die bestuurder heeft wel een verkeerscursus gevolgd en voldoet dus niet aan de parameters van de vraag.

    Wat we willen, is alle bestuurders uitfilteren die een verkeerscursus hebben gevolgd. Wat de data betreft, willen we elke bestuurder uitfilteren die een "Ja" heeft voor Verkeerscursus op elke rij, ongeacht de overtreding waarmee deze geassocieerd wordt. Laten we onze berekening in fasen uitvoeren en daarbij een eenvoudig overzicht gebruiken om bij te houden wat er gebeurt:

    1. Ten eerste willen we weten of een bestuurder een "Ja" heeft voor de verkeerscursus. Sleep Bestuurders-ID naar Rijen en Verkeerscursus naar Kolommen. We krijgen een teksttabel met de tijdelijke tekst "Abc", die de relevante waarden voor elke bestuurder aangeeft.

    2. Vervolgens willen we een berekening maken die aangeeft of de waarde van Verkeerscursus "Ja" is. De eerste fase van de berekening is als volgt:

      Verkeerscursus gevolgd = CONTAINS([Traffic School), 'Yes')

      Als we Verkeerscursus gevolgd naar de container Kleur brengen op de kaart Markeringen, zien we dat deze nauwkeurig het label "Onwaar" geeft voor elke markering in de kolom "Nee" en "Waar" voor elke markering in de kolom "Ja".

    3. Maar wat we echt willen, is deze informatie op het niveau van de bestuurder, niet de overtreding. Een LOD-expressie is een logische keuze als u een resultaat wilt berekenen op een ander detailniveau dan de basisstructuur van de data. We maken hier een FIXED LOD-expressie van. Maar zoals we weten, moet het gedeelte van de geaggregeerde expressie van een LOD worden geaggregeerd. Eerder hebben we MIN gebruikt. Werkt dat hier ook? We passen de berekening als volgt aan: 

      Verkeerscursus gevolgd = { FIXED [Driver ID] : MIN( CONTAINS([Traffic School], 'Yes'))}

      Een weergave van Bestuurders-ID per Verkeerscursus, met Verkeerscursus gevolgd op Kleur

      Als we die verandering in de weergave toepassen, zien we het tegenovergestelde van wat we willen. Elke bestuurder met een "Nee" wordt overal als "Onwaar" gemarkeerd. In plaats daarvan willen we het "Ja" als een "Waar" meenemen voor elke record voor die bestuurder. Wat doet MIN hier? De functie kiest het eerste antwoord alfabetisch, namelijk: "Nee".

    4. En als we er MAX van maken? Zou dan het laatste alfabetische antwoord worden gekozen? We passen de berekening als volgt aan: 

      Verkeerscursus gevolgd = { FIXED [Driver ID] : MAX ( CONTAINS( [Traffic School], 'Yes') ) }

      Een weergave van Bestuurders-ID per Verkeerscursus, met Verkeerscursus gevolgd op Kleur

      En kijk eens aan: als een bestuurder ergens in de data "Ja" heeft, wordt deze gemarkeerd als "Waar" vanwege het volgen van een verkeerscursus, zelfs bij de overtreding waarbij geen verkeerscursus is gevolgd.

    5. Als we Verkeerscursus gevolgd naar de container Filter brengen en alleen "False" selecteren, houden we alleen bestuurders over die nooit een verkeerscursus hebben gevolgd.

  3. Om de oorspronkelijke vraag te beantwoorden brengen we met ons filter simpelweg Gemiddelde boete naar de container Tekst op de kaart Markeringen. Omdat we de aggregaties in de berekening hebben ingebouwd, is de aggregatie in het veld AGG en dat kunnen we niet veranderen. Dat is wat we zouden verwachten.

De resultaten zijn identiek aan de uitkomst met de niet-gedraaide datastructuur.

De voordelen van gedraaide data

We kunnen de originele datastructuur uit de zelfstudie aanhouden als we weten dat we alleen maar vragen hoeven te beantwoorden die met deze structuur eenvoudig te beantwoorden zijn. Maar de gedraaide data-indeling is flexibeler. Er zijn wel wat berekeningen nodig, maar als die eenmaal zijn uitgevoerd, is de resulterende dataset zeer geschikt om bredere vragen te beantwoorden.

Nog een extra stap verder - alleen berekeningen

En als u geen toegang hebt tot Tableau Prep Builder? Hebt u gewoon pech als u nog steeds de originele data hebt? Welnee!

Tableau Desktop en LOD-expressies kunnen al onze analytische vragen beantwoorden. Als we verbinding maken met het originele Verkeersovertredingen.xlsx(Link wordt in een nieuw venster geopend), lijkt dat erg op de gedraaide dataset, maar dan zonder het cruciale veld Overtredingsnummer. We moeten de uitkomst van de aggregatiestappen nabootsen via LOD-expressies.

Opmerking: u kunt de werkmap LOD-bestuurdersovertredingen.twbx(Link wordt in een nieuw venster geopend) downloaden om de oplossingen in context te bekijken. Houd er rekening mee dat er mogelijk alternatieve manieren zijn om de analyse te interpreteren of antwoorden te vinden.

1. Hoeveel dagen zaten er tussen de eerste en de tweede overtreding voor elke bestuurder?
  1. Om dit in Tableau Desktop te beantwoorden gebruiken we opnieuw de functie DATEDIFF . Voor deze functie is een begin- en einddatum vereist. Deze informatie is in onze data aanwezig, maar staat allemaal in één veld. We moeten de informatie in twee velden verdelen. Omdat we zeker willen weten dat beide waarden voor elke bestuurder met elkaar vergeleken kunnen worden, moeten we ze vastleggen op het niveau van de Bestuurders-ID.

    1. Om de datum van de eerste overtreding te vinden gebruiken we de volgende berekening:

      Eerste overtreding = { FIXED [Driver ID] : MIN ( [Infraction Date] ) } 

    2. De tweede overtredingsdatum voeren we gefaseerd uit.

      1. Om te beginnen hoeven we alleen naar de datums te kijken die later zijn dan de eerste datum:

        IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END

      2. Maar dit levert elke overtreding na de eerste op, en we willen alleen de tweede. We willen dus de eerste van deze datums. Zet het geheel in MIN:

        MIN( IF [Infraction] : [1st Infraction] THEN [Infraction Date] END )

      3. We willen ook de datum van de tweede overtreding voor elke bestuurder opnieuw berekenen. Daar hebben we de LOD-expressies voor nodig. We gaan dit oplossen tot het niveau van Bestuurders-ID:

        Tweede overtreding = { FIXED [Driver ID] : MIN ( IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END ) }

    3. En we kunnen nu de berekening DATEDIFF maken:

      Tijd tussen overtredingen = DATEDIFF('day', [1st Infraction], [2nd Infraction])

De resultaten zijn identiek aan de uitkomsten met de andere twee datastructuren.

2. Vergelijk de boetebedragen voor de eerste en tweede overtreding. Zijn ze gecorreleerd?
  1. Om deze vraag in Tableau Desktop te beantwoorden gebruiken we vrijwel dezelfde logica als bij de versie met gedraaide data van deze vraag. We gebruiken de velden Eerste overtreding en Tweede overtreding die we voor vraag I hebben gemaakt, om vast te stellen of een bepaalde rij de eerste of tweede overtreding is, en halen vervolgens het boetebedrag op.

    1. Als we alleen een spreidingsdiagram willen maken, kunnen we het LOD-gedeelte overslaan en gewoon een IF -berekening gebruiken:

      Eerste boetebedrag = IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END

      Tweede boetebedrag = IF [2nd Infraction] = [Infraction Date] THEN [Fine Amount] END

    2. Als we echter de hoogte van de boetes voor één bestuurder met elkaar willen vergelijken en het verschil in bedrag willen zien, lopen we aan tegen problemen met nullen, net als bij de eerste databronstructuur. Het kan geen kwaad om deze berekeningen in een FIXED LOD te zetten, dus het is misschien een goed idee om dit vanaf het begin te doen:

      Eerste boetebedrag = { FIXED [Driver ID] : MIN ( IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END ) }

      Tweede boetebedrag = {FIXED [Driver ID] : MIN( IF [2ndInfraction] = [Infraction Date] THEN [Fine Amount] END ) }

De resultaten zijn identiek aan de uitkomsten met de andere twee datastructuren.

3. Welke chauffeur betaalde in totaal het meest? Wie betaalde het minst?
  1. Om deze vraag in Tableau Desktop te kunnen beantwoorden moeten we eerst iets weten over de LOD-only-methode. Beide methoden filteren in Tableau Prep records uit die niet de eerste of tweede overtreding van een bestuurder zijn. De LOD-methode in Tableau Desktop behoudt alle records. Dit betekent dat als we een visualisatie zouden maken van SOM(Betaald bedrag) volgens Bestuurders-ID, de Tableau Desktop-versie hogere bedragen laat zien voor bestuurders met meer dan twee overtredingen. Om een waarde voor Totaal betaald bedrag uit de volledige data te krijgen die overeenkomt met de andere methoden, in plaats van de originele veld Boetebedrag, moeten we in plaats daarvan de eerste en tweede boete optellen, zoals we deden bij de eerste datastructuur.

  2. Met behulp van de velden die we voor vraag 2 hebben gemaakt, tellen we de twee boetebedragen bij elkaar op. ZN is noodzakelijk om te voorkomen dat bestuurders die slechts één overtreding hebben begaan, een nulresultaat krijgen. De berekening is: 

    Totaal betaald bedrag = [1st Fine Amount] + ZN([2nd Fine Amount])

De resultaten zijn identiek aan de uitkomsten met de andere twee datastructuren.

4. Hoeveel bestuurders begingen meerdere soorten overtredingen?
  1. Om deze vraag in Tableau Desktop te beantwoorden kunnen we niet zomaar Bestuurders-ID en een Aantal uniek voor Soort overtreding gebruiken. Omdat deze dataset overtredingen bevat die hoger zijn dan een tweede (derde, vierde, enz.), kunnen sommige bestuurders meer dan twee soorten overtredingen hebben. Om de resultaten te kunnen vergelijken met de andere methoden moeten we de reikwijdte beperken tot alleen de eerste twee overtredingen.

  1. We kunnen de eerste en tweede overtredingssoort ophalen en deze in LOD-expressies zetten om ze FIXED te maken voor de bestuurder, en dan een IF -berekening gebruiken om de soorten te tellen:

    1. Eerste soort overtreding = { FIXED [Driver ID] : MIN ( IF [1st Infraction] = [Infraction Date] THEN [Infraction Type] END ) }

    2. Tweede soort overtreding = { FIXED [Driver ID] : MIN ( IF [2nd Infraction] = [Infraction Date] THEN [Infraction Type] END ) }

    3. Aantal soorten overtredingen =

      IF [1st Infraction Type] = [2nd Infraction Type] THEN 1 
      ELSEIF [1st Infraction Type] != [2nd Infraction Type] THEN 2
      ELSE 1 END 

      Opmerking: het is ook mogelijk om veel van deze berekeningen als één veld te maken door de initiële berekeningen rechtstreeks in de grotere berekening te nesten. De gecombineerde berekening zou er dan als volgt uitzien:
      IF
      {FIXED [Driver ID] : MIN(IF [1st Infraction]=[Infraction Date] THEN [Infraction Type] END)}
      =
      {FIXED [Driver ID] : MIN(IF [2nd Infraction]=[Infraction Date] THEN [Infraction Type] END)}
      THEN 1

      ELSEIF
      {FIXED [Driver ID] : MIN(IF [1st Infraction]=[Infraction Date] THEN [Infraction Type] END)}
      !=
      {FIXED [Driver ID] : MIN(IF [2nd Infraction]=[Infraction Date] THEN [Infraction Type] END)}
      THEN 2

      ELSE 1
      END


      Dat is wat lastiger te begrijpen, maar het kan wel als u dat liever hebt. (Houd er rekening mee dat regelafbrekingen en bepaalde spaties geen invloed hebben op de manier waarop een berekening door Tableau wordt geïnterpreteerd.)

  2. We kunnen nu Aantal soorten overtredingen uitzetten tegen Bestuurders-ID en het staafdiagram sorteren.

De resultaten zijn identiek aan de uitkomsten met de andere twee datastructuren.

5. Wat was het gemiddelde boetebedrag voor bestuurders die nooit een verkeerscursus hadden gevolgd?
  1. Om deze vraag in Tableau Desktop te beantwoorden kunnen we niet zomaar het totale boetebedrag door twee delen, aangezien sommige bestuurders slechts één overtreding hadden begaan. We kunnen ook niet de gemiddelde boete per bestuurder berekenen en het gemiddelde van die waarden nemen, omdat het middelen van gemiddelden tot inconsistenties kan leiden. In plaats daarvan moeten we het totale bedrag berekenen dat is betaald door bestuurders die nooit een verkeerscursus hebben gevolgd, en dit delen door het totale aantal overtredingen die met die boetes gepaard gaan.

    1. Eerst moeten we bepalen of elke bestuurder een tweede overtreding heeft begaan. We kunnen gebruikmaken van het feit dat de informatie in alle "2e" velden nul zal zijn als er geen tweede overtreding is geweest en de berekening starten:

      IFNULL([2nd Infraction Type], 'no')

      Hiermee wordt een soort overtreding geretourneerd als deze bestaat, of 'nee' als er geen tweede overtreding is geweest.

    2. Vervolgens moeten we deze informatie vertalen naar het aantal overtredingen, 1 of 2. Als het resultaat van onze berekening IFNULL "nee" is, moet de bestuurder worden aangemerkt als iemand met één boete. Elk ander resultaat moet worden gemarkeerd als twee boetes. De berekening is:

      Aantal overtredingen =

      IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1
      ELSE 2
      END
    3. Voor het Totaal betaalde bedrag kunnen we de berekening uit vraag 3 gebruiken. Om het allemaal bij elkaar op te tellen nemen we dit totale boetebedrag en delen het door ons nieuwe berekende veld Aantal overtredingen om het gemiddelde boetebedrag te bepalen:

      Gemiddelde boete = SUM([Total Amount Paid]) / SUM([Number of Infractions])

  2. Ook moeten we bestuurders die een verkeerscursus hebben gevolgd, eruit filteren. Omdat deze dataset een aantal bestuurders met een derde of vierde overtreding bevat, kunnen we niet dezelfde methode gebruiken als bij de gedraaide datastructuur. In plaats daarvan volgen we dezelfde methode als bij de niet-gedraaide data, die hier wordt samengevat:

    1. Eerst moeten we twee berekeningen maken om vast te stellen of de eerste en tweede overtreding gerelateerd waren aan een verkeerscursus of niet: 

      Eerste verkeerscursus = { FIXED [Driver ID] : MIN (IF [1st Infraction] = [Infraction Date] THEN [Traffic School] END ) }

      Tweede verkeerscursus = { FIXED [Driver ID] : MIN (IF [2nd Infraction] = [Infraction Date] THEN [Traffic School] END ) }

    2. Vervolgens tellen we deze waarden bij elkaar op om het totale aantal bezoeken aan verkeerscursussen te krijgen: 

      Aantal bezoeken aan verkeerscursussen =

      (CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
      +
      (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)
    3. Als we Aantal bezoeken aan verkeerscursussen naar het gebied Dimensies van het venster Data slepen, worden de waarden 0–2 discreet.

    4. Als we nu filteren op Aantal bezoeken aan verkeerscursussen, kunnen we gewoon de 0 selecteren en weten we dat we te maken hebben met bestuurders die nooit een verkeerscursus hebben gevolgd.

  3. Om de oorspronkelijke vraag te beantwoorden brengen we simpelweg Gemiddelde boete naar de container Tekst op de kaart Markeringen. Omdat we de aggregaties in de berekening hebben ingebouwd, is de aggregatie in het veld AGG en dat kunnen we niet veranderen. Dat is wat we zouden verwachten.

De resultaten zijn identiek aan de uitkomsten met de andere twee datastructuren.

Houd er rekening mee dat deze oplossing veel geneste berekeningen en LOD-expressies bevat. Afhankelijk van de grootte van de dataset en de complexiteit van de data kunnen prestaties een probleem vormen.

Reflecteren over methoden

Welke route moet u dan nemen? Dat hangt helemaal van u af, en van de hulpmiddelen die u ter beschikking hebt.

  • Als u LOD's wilt vermijden, is er een datavormende oplossing, hoewel voor sommige analyses berekeningen nodig kunnen zijn (Analyse in Tableau Desktop).

  • Als u de data kunt vormgeven en vertrouwd bent met berekeningen, ook LOD's, biedt de middenwegoptie de meeste flexibiliteit (Nog een stap verder - gedraaide data).

  • Als u vertrouwd bent met LOD's, de impact op de prestaties minimaal is en/of u geen toegang hebt tot Tableau Prep, is het een haalbare optie om dit probleem alleen met LOD's op te lossen (Nog een extra stap verder - alleen berekeningen).

Het is op zijn minst nuttig om te begrijpen hoe aggregatie in Tableau Prep en Level of Detail-expressies in Tableau Desktop met elkaar samenhangen en hoe ze van invloed zijn op data-analyses. Zoals met de meeste dingen in Tableau is er meer dan één manier om iets te doen. Door alle verschillende opties te onderzoeken kunt u concepten bij elkaar brengen en de oplossing kiezen die voor u het beste is.

Gebruikte berekeningen:

Bestuurdersovertredingen

  • Tijd tussen overtredingen = DATEDIFF('day', [1st Infraction Date], [2nd Infraction Date])

  • Totaal betaald bedrag =[1st Fine Amount] + ZN([2nd Fine Amount])

  • Aantal soorten overtredingen = IF [1st Infraction Type]=[2nd Infraction Type] THEN 1 ELSEIF [1st Infraction Type]!= [2nd Infraction Type] THEN 2 ELSE 1 END

  • Aantal overtredingen = IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1 ELSE 2 END

  • Gemiddelde boete = ( SUM([1st Fine Amount]) + SUM( ZN([2nd Fine Amount]) ) ) / SUM([Number of Infractions])

  • Aantal bezoeken aan verkeerscursussen = (CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END) + (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)

Gedraaide bestuurdersovertredingen

  • Eerste overtreding = {FIXED [Driver ID] : MIN(IF [Infraction Number] = "1st" THEN [Infraction Date] END)}

  • Tweede overtreding = {FIXED [Driver ID] : MIN(IF [Infraction Number] = "2nd" THEN [Infraction Date] END)}

  • Tijd tussen overtredingen = DATEDIFF('day', [1st Infraction], [2nd Infraction])

  • Eerste boetebedrag = {FIXED [Driver ID] : MIN( IF [Infraction Number] = "1st" THEN [Fine Amount] END ) }

  • Aantal overtredingen = IF IFNULL(STR([2nd Infraction]), 'no')= 'no' THEN 1 ELSE 2 END

  • Gemiddelde boete = SUM([Fine Amount])/SUM([Number of Infractions])

  • Verkeerscursus gevolgd = { FIXED [Driver ID] : MAX( CONTAINS([Traffic School], 'Yes'))}

LOD-bestuurdersovertredingen

  • Eerste overtreding = {FIXED [Driver ID] : MIN([Infraction Date])}

  • Tweede overtreding = { FIXED [Driver ID] : MIN( IF [Infraction Date] > [1st Infraction] THEN [Infraction Date] END ) }

  • Tijd tussen overtredingen = DATEDIFF('day', [1st Infraction], [2nd Infraction])

  • Eerste boetebedrag = {FIXED [Driver ID] : MIN( IF [1st Infraction] = [Infraction Date] THEN [Fine Amount] END ) }

  • Tweede boetebedrag = {FIXED [Driver ID] : MIN( IF [2nd Infraction] = [Infraction Date] THEN [Fine Amount] END ) }

  • Totaal betaald bedrag = [1st Fine Amount] + ZN([2nd Fine Amount])

  • Eerste soort overtreding = {FIXED [Driver ID] : MIN( IF [1st Infraction] = [Infraction Date] THEN [Infraction Type] END ) }

  • Tweede soort overtreding = {FIXED [Driver ID] : MIN( IF [2nd Infraction] = [Infraction Date] THEN [Infraction Type] END ) }

  • Aantal soorten overtredingen = IF [1st Infraction Type]=[2nd Infraction Type] THEN 1 ELSEIF [1st Infraction Type]!= [2nd Infraction Type] THEN 2 ELSE 1 END

  • Aantal overtredingen = IF IFNULL([2nd Infraction Type], 'no') = 'no' THEN 1 ELSE 2 END

  • Gemiddelde boete = SUM ([Total Amount Paid]) / SUM([Number of Infractions])

  • Eerste verkeerscursus = {FIXED [Driver ID] : MIN (IF [1st Infraction] = [Infraction Date] THEN [Traffic School] END ) }

  • Tweede verkeerscursus = {FIXED [Driver ID] : MIN (IF [2nd Infraction] = [Infraction Date] THEN [Traffic School] END ) }

  • Aantal bezoeken aan verkeerscursussen = (CASE [1st Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END) + (CASE [2nd Traffic School] WHEN 'Yes' THEN 1 WHEN 'No' THEN 0 ELSE 0 END)

Opmerking: speciale dank aan het Workout Wednesday-onderwerp Do Customers Spend More on Their First or Second Purchase?(Link wordt in een nieuw venster geopend) (Geven klanten meer uit aan hun eerste of hun tweede aankoop?) van Ann Jackson, en Andy Kriebels Tableau Prep-tip Returning the First and Second Purchase Dates(Link wordt in een nieuw venster geopend) (De eerste en tweede aankoopdatum retourneren), die de oorspronkelijke inspiratie voor deze zelfstudie vormden. Als u op deze links klikt, verlaat u de website van Tableau. Tableau neemt geen verantwoordelijkheid voor de juistheid of actualiteit van pagina's die worden onderhouden door externe aanbieders. Neem contact op met de eigenaren als u vragen hebt over hun inhoud.

Bedankt voor uw feedback.De feedback is verzonden. Dank u wel.