Bezetting van ziekenhuisbedden met Tableau Prep

Het bereiken van de maximale capaciteit in een ziekenhuis is een probleem, maar een teveel aan resources ook. Het is belangrijk om ziekenhuisbedden te begrijpen vanuit het perspectief van het bed als resource. Vaak worden data echter opgeslagen vanuit het perspectief van een patiënt. Hoe kunnen we data verzamelen die vastleggen wanneer patiënten in bed liggen, en het bedgebruik bepalen?

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.

U moet ook drie databestanden downloaden. U wordt aangeraden deze op te slaan in de map Mijn Tableau Prep-opslagplaats > Databronnen.
- Bedden.xlsx(Link wordt in een nieuw venster geopend)
- Uren.xlsx(Link wordt in een nieuw venster geopend)
- Patiëntbedden.xlsx(Link wordt in een nieuw venster geopend)

De data

Voor onze vier bedden A, B, C en D houden we bij welke patiënt in welk bed lag en hoe laat deze daar begon en eindigde. De data zien er als volgt uit:

Voorbeeld van de dataset Patiëntbed

Voorlopige analyse

Als we deze data importeren in Tableau Desktop, kunnen we een Gantt-diagram maken waarop te zien is wanneer er patiënten in bedden liggen.

Gantt-diagram in Tableau Desktop van de dataset Patiëntbed

Dit is een handig visueel hulpmiddel. We zien dat er slechts kleine tussenpozen zijn in het gebruik van bed A en B, maar bed C wordt nauwelijks gebruikt. Voor patiëntbed D is er geen eindtijd, maar met wat berekeningen kunnen we daar wel rekening mee houden. Dit geeft ons een visueel overzicht van hoe de bedden worden gebruikt.

Maar als we nu eens willen tellen gedurende hoeveel uren een bed leeg is? Of als we de tijd dat een bed leeg is, willen vergelijken vóór en ná de invoering van een nieuw beleid? Met de data zoals ze nu zijn gestructureerd, is er geen eenvoudige manier om dat te doen.

Gewenste datastructuur

Door in Tableau Prep een aantal heel eenvoudige datasets te maken en deze te combineren kunnen we deze dataset aanpassen naar een vorm waarmee we diepgaandere analyses kunnen uitvoeren en nog nuttigere visualisaties kunnen maken.

Voordat we met Tableau Prep beginnen, moeten we even een stap terug doen en bedenken wat we moeten maken om deze vraag te beantwoorden: 'Hoeveel uur stond elk bed leeg?'

We moeten elk bed per uur kunnen bekijken en weten of er een patiënt in dat bed lag. Op dit moment zijn er alleen data van momenten waarop er een patiënt in het bed lag; we hebben Tableau geen informatie gegeven over de uren waarop het bed leeg was.

Om de volledige matrix van alle bedden en alle uren te creëren maken we twee nieuwe datasets. De ene is simpelweg een lijst met bedden (A, B, C, D) en de andere is een lijst met uren (1, 2, 3, …, 23, 24). Door een cross join uit te voeren (een join maken tussen elke rij in de ene dataset en elke rij in de andere dataset) krijgen we alle mogelijke combinaties van bedden en uren.

De dataset Bedden.xlsx ziet er als volgt uit:De dataset Uren.xlsx ziet er als volgt uit:En de resultaten van de cross join zien er als volgt uit: 
Voorbeeld van de dataset BeddenVoorbeeld van de dataset UrenVoorbeeld van de matrixdata Bed-Uur

Vervolgens voegen we de informatie van Patiëntenbedden toe, waarbij voor elke bed-uurcombinatie wordt aangegeven of er sprake is van een bepaalde patiënt of niet. We eindigen met een dataset die een rij heeft voor elk beduur, en als een patiënt in het bed lag, het aantal patiënten en de begin- en eindtijd. Nulwaarden geven aan dat het bed niet bezet was.

Voorbeeld van de Bed-Uur-Patiënt-matrixdata

Met de data in deze structuur kunnen we dit soort analyses uitvoeren, waardoor we net zo gemakkelijk de lege bedden als de patiëntbedden kunnen onderzoeken.

Dashboard met gevormde data die het bedgebruik per uur en per patiënt weergeven

De data herstructureren

Hoe bereiken we dat nu met Tableau Prep? We bouwen de flow op in twee delen. Eerst maken we de matrix Beduren en vervolgens combineren we deze met de data over patiëntbedden. Zorg ervoor dat u alle drie de Excel-bestanden hebt gedownload (Bedden.xlsx, Uren.xlsx en Patiëntbedden.xlsx) om dit te volgen.

Matrix Beduren

Eerst maken we verbinding met het bestand Bedden.xlsx.

  1. Open Tableau Prep.

  2. Klik op het startscherm op Verbinding maken met data.

  3. Klik in het deelvenster Verbindingen op Microsoft Excel. Ga naar de locatie waar u Bedden.xlsx hebt opgeslagen en klik op Openen.

  4. Het blad Bedden zou automatisch naar het deelvenster Flow moeten gaan.

Tip: zie Verbinding maken met data(Link wordt in een nieuw venster geopend) voor meer informatie over verbinding maken met data.

Vervolgens moeten we een veld maken dat om te gebruiken voor de cross join met de dataset Uren. We voegen een berekening toe die simpelweg de waarde 1 is.

  1. Selecteer in het deelvenster Flow de optie Bedden en klik op de voorgestelde Opschoningsstap.

  2. Met de Opschoningsstap die we zojuist hebben toegevoegd, verschijnt het deelvenster Profiel. Klik op Berekend veld maken in de werkbalk.

  3. Geef het veld de naam Cross Join en voer de waarde 1 in.

  4. Het Dataraster zou de huidige status van de data moeten weergeven.

Nu herhalen we het proces met de dataset Uren.

Klik hier voor aanwijzingen

Beide datasets hebben nu een gedeeld veld, Cross join, en er kan een join worden gemaakt.

  1. Maak een join van de twee opschoningsstappen door Opschonen 2 naar Opschonen 1 te slepen en op de optie Join neer te zetten.

    Het deelvenster Flow met het Join-neerzetgebied op het moment dat Opschonen 1 naar Opschonen 2 wordt gesleept

  2. In het profiel Join hieronder zouden de join-configuraties automatisch moeten zijn ingevuld.

    • Omdat we beide velden de naam Cross join hebben gegeven, identificeert Tableau Prep ze automatisch als het gedeelde veld en maakt de juiste Toegepaste join-componenten.

    • Het standaard Join-type is 'inner', en dat is wat we willen.

    • Deze join zal alle rijen van Bedden matchen met alle rijen van Uren, zoals we zagen in het Dataraster.

    Het deelvenster Join-profiel met verschillende elementen die volgens het onderschrift overeenkomen met de lijst erboven

    A. JOIN-component

    B. Join-type

    C. Datarasterresultaten

Tip: zie Joins maken van uw data(Link wordt in een nieuw venster geopend) voor meer informatie over het maken van joins.

We hebben de Cross join-velden niet meer nodig, dus die kunnen we verwijderen.

  1. Selecteer in het deelvenster Flow de optie Join 1, klik op het pluspictogram en selecteer Opschoningsstap toevoegen.

  2. Selecteer de velden Cross join 1 en Cross join en klik op Velden verwijderen.

  3. Dubbelklik op het label Opschonen 3 en wijzig de naam van deze stap in Matrix Beduren.

We hebben nu de dataset Matrix Beduren, die alle bedden en uren bevat. Ook hebben we het eerste deel van het opbouwen van de dataset afgerond.

Gebruik van patiëntbedden

Deel twee gaat over het gebruik van patiëntbedden. Allereerst maken we verbinding met de data.

  1. Klik in het deelvenster Verbindingen op de knop Verbinding toevoegen om nog een dataverbinding toe te voegen.

  2. Kies Microsoft Excel, selecteer het bestand Patiëntbedden.xlsx en klik op Openen.

  3. Selecteer in het deelvenster Flow de optie Patiëntbedden en klik op de voorgestelde Opschoningsstap om deze aan de flow toe te voegen.

Omdat het bestand met de Matrix Beduren is gebaseerd op uur, maar Patiëntbedden is gebaseerd op werkelijke tijd, moeten we het uur uit de begin- en eindtijd van de patiëntbedden halen. Daarnaast willen we voor de eindtijd, als een patiënt aan het einde van de dag (middernacht, uur 24) nog in het bed ligt, aangeven dat het bed bezet is, ook al staat er geen eindtijd in de dataset. In deze nieuwe stap voegen we een berekend veld toe.

  1. Klik in de werkbalk op Berekend veld maken.

  2. Geef het veld de naam Uur begin. Voer voor de berekening DATEPART('hour',[Start Time]) in.

  3. Hiermee wordt het uur van de begintijd opgehaald. 1/1/18 9:35 AM wordt dus gewoon 9.

  4. Maak een ander berekend veld met de naam Uur einde. Voer voor de berekening IFNULL(DATEPART('hour',[End Time]), 24) in.

  5. Het gedeelte DATEPART neemt het uur van de eindtijd over. Het gedeelte IFNULL wijst aan elke ontbrekende eindtijd de eindtijd 24 (middernacht) toe.

Nu zijn we klaar om een join te maken tussen het gebruik van patiëntbedden en de Matrix Beduren. Dit is een iets complexere join dan we eerder hebben uitgevoerd. Een inner join retourneert alleen waarden die in beide datasets aanwezig zijn. Omdat we zeker willen weten dat we alle slots van beduren behouden, ongeacht of er wel of geen patiënt in het bed lag, moeten we een left join maken. Dit gaat een heleboel nullen opleveren, maar dat is niet erg.

We moeten ook rekening houden met het tijdstip waarop een beduurslot door een patiënt (of patiënten) wordt bezet. Behalve met het bed waarin de patiënt ligt, moeten we dus ook rekening houden met de tijd. De dataset Matrix Beduren heeft maar één veld voor Uur, en de dataset Patiëntbedden heeft Uur begin en Uur einde. We gebruiken wat basislogica om te bepalen of een patiënt aan een bepaald beduurslot moet worden toegewezen: Een patiënt wordt geacht in een bed te liggen als zijn/haar beginuur kleiner is dan of gelijk is aan (<=) het beduurslot EN zijn/haar einduur groter is dan of gelijk is aan (>=) het beduurslot.

Daarom zijn er drie join-clausules nodig om deze twee datasets op de juiste manier te matchen.

  1. Maak een join tussen de stap Opschonen 3 en de stap Matrix Beduren.

  2. In het gebied Toegepaste JOIN-componenten zou de standaard Uur = Uur einde moeten zijn. Klik op de JOIN-component om de operator te wijzigen van = in <=.

  3. Klik op de plusknop in de rechterbovenhoek van het gebied gebied Toegepaste JOIN-componenten om nog een JOIN-component toe te voegen. Stel dit in op Uur >= Uur begin

  4. Voeg een derde JOIN-component toe voor Bed = Ziekenhuisbed.

  5. Klik in de sectie Join-type op het niet-gearceerde gebied van de afbeelding naast Matrix Beduren om het join-type te wijzigen in een Links join.

    Het deelvenster Join-profiel voor Join 2 met de juiste configuratie

Opmerking: als u de Matrix Beduren naar Opschonen 3 sleept in plaats van andersom, kan het gewenste resultaat worden verkregen door een right join te gebruiken in plaats van een left join. De volgorde waarin u de stappen sleept, is van belang voor de richting van de verbinding. De JOIN-componenten staan ook in omgekeerde volgorde. Zorg ervoor dat u de juiste logica voor het vergelijken van de uren behoudt.

Op de data is nu een join toegepast, maar we moeten nog wat onvolkomenheden uit de join verwijderen en ervoor zorgen dat de velden netjes zijn. We hebben Uur begin en Uur einde niet meer nodig. Ziekenhuisbed en Bed zijn nu ook overbodig. Tot slot betekent de waarde nul in het veld Patiënt in feite dat het bed leeg is.

  1. Voeg in het deelvenster Flow een opschoningsstap toe, zodat we de join-data kunnen opruimen.

  2. Ctrl-klik (Command+klik op Mac) om de velden Uur einde, Uur begin en Ziekenhuisbed gezamenlijk te selecteren en klik op Velden verwijderen in de werkbalk.

  3. Dubbelklik op de veldprofielkaart Patiënt op de nulwaarde en typ Niet bezet.

We hebben nu een datastructuur met voor elk beduur een rij. Als er tijdens dat uur een patiënt in het bed lag, hebben we ook de patiëntdata. Het enige dat u nog hoeft te doen, is een uitvoerstap toevoegen en de dataset genereren.

  1. Selecteer Opschonen 4 in het deelvenster Flow, klik op het pluspictogram en selecteer Uitvoer toevoegen.

  2. Wijzig in het venster Uitvoer het Uitvoertype in .csv en klik op Bladeren.

  3. Geef als naam Matrix Beduren patiënt op en kies de gewenste locatie voordat u op Accepteren klikt om op te slaan.

  4. Klik op de knop Flow uitvoeren onder aan het deelvenster om uw uitvoer te genereren. Klik in het statusdialoogvenster op Gereed om het dialoogvenster te sluiten.

sTip: voor meer informatie over uitvoer en het uitvoeren van een flow raadpleegt u Uw werk opslaan en delen(Link wordt in een nieuw venster geopend).

De uiteindelijke flow ziet er ongeveer als volgt uit:

Het deelvenster Flow met alle voltooide stappen

Analyse in Tableau Desktop

Als u Tableau Desktop wilt installeren voordat u verdergaat met deze zelfstudie, kunt u de gratis proefperiode downloaden.

Nu we de dataset in de gewenste structuur hebben, kunnen we een diepere analyse uitvoeren dan met de oorspronkelijke data.

  1. Open Tableau Desktop. Selecteer in het venster Verbinding de optie Tekstbestand, ga naar het bestand Matrix Beduren patiënt.csv en klik op Openen.

  2. Op het tabblad Databron zouden de data standaard op het canvas moeten verschijnen. Klik op Blad 1.

  3. Sleep in het venster Data het Uur boven de lijn tussen Meetwaarden en Dimensies, zodat dit een discrete dimensie wordt.

  4. Sleep Bed naar de container Rijen en Uur naar de container Kolommen.

  5. Sleep Patiënt naar de container Kleur.

Basisweergave van vormgegeven data in Tableau Desktop, waarin het bedgebruik per uur wordt weergegeven

Opmaak is optioneel, maar kan de afbeelding wel leesbaarder maken.

  1. Klik op de container Kleur en selecteer Kleuren bewerken.

  2. Selecteer in het gebied aan de linkerkant de optie Niet bezet. Kies uit de vervolgkeuzelijst aan de rechterkant de het kleurenpalet Seattle-grijs.

  3. Selecteer het vierde, lichtste grijs en klik op OK.

  4. Klik opnieuw op de container Kleur en klik vervolgens op het vervolgkeuzemenu Rand. Kies de tweede optie voor grijs, helemaal rechts.

  5. Wijzig in de werkbalk in de vervolgkeuzelijst Formaat de optie Standaard in Breedte passend maken.

    Afbeelding van de locatie van de vervolgkeuzelijst Formaat in de werkbalk

  6. Klik op het menu Formaat en vervolgens op Randen.

  7. Klik voor Scheidingslijn rij op de vervolgkeuzelijst Deelvenster en kies een heel lichte grijze kleur.

  8. Zet de schuifregelaar Niveau bij het tweede vinkje.

  9. Herhaal dit met de Scheidingslijn kolom. Stel de kleur van Deelvenster in op lichtgrijs en zet het Niveau bij het tweede vinkje.

    Een fragment met het deelvenster Opmaak, met de juiste instellingen voor de randen

  10. Dubbelklik op het tabblad onderaan en wijzig de naam in Bedgebruik per uur.

Met deze weergave kunnen we snel zien wanneer een bepaald bed bezet of vrij is.

Een weergave van het bedgebruik per uur

Maar we kunnen nog verder gaan en het aantal uren tellen dat elk bed onbezet was.

  1. Klik op het pictogram voor een nieuwe tabblad onderaan om een leeg blad te openen.

  2. Sleep Patiënt naar Rijen.

  3. Sleep Uur naar Kolommen. Klik met de rechtermuisknop op het veld Uur om het menu te openen. Kies Meetwaarde > Aantal.

  4. Sleep een ander exemplaar van het veld Patiënt van het deelvenster Data naar de container Kleur.

  5. Klik met de rechtermuisknop op de as en selecteer As bewerken. Wijzig de titel in Uren en sluit het dialoogvenster.

  6. Wijzig de naam van het tabblad in Beduren per patiënt.

Een overzicht met de beduren per patiënt

Met deze weergave kunnen we vaststellen hoeveel onbezette beduren we hadden. Met de oorspronkelijke dataset konden we dat niet. Welke andere grafieken of dashboards kunt u maken? Probeer het nu uit, nu uw data de juiste structuur hebben.

Samenvatting en resources

Om deze datastructuur met Tableau Prep te kunnen bouwen moesten we de volgende acties uitvoeren:

  1. Een dataset maken voor elk aspect dat we willen analyseren, in dit geval Bedden en Uren.

  2. Een cross join uitvoeren op deze datasets om de dataset Matrix Beduren te maken met alle mogelijke combinaties van bedden en uren.

  3. Een join uitvoeren op de Matrix Beduren met de Patiëntbed-data, en daarbij zorgen dat de join alle beduurslots behield en dat de JOIN-componenten de patiëntbeddata op de juiste manier matchten met de beduurslots.

We hebben de volgende berekeningen gebruikt voor het maken van velden om joins op uit te voeren. Met de tweede en derde berekening wordt het uur uit de oorspronkelijke datum- en tijdvelden gehaald.

  • Cross join = 1

    • Hiermee wordt simpelweg de waarde 1 aan elke rij toegewezen

  • Uur begin = DATEPART('hour',[Start Time])

    • Hiermee wordt het uur van de begintijd opgehaald. 1/1/18 9:35 AM wordt dus gewoon 9.

  • Eind-uur = IFNULL(DATEPART('hour',[End Time]), 24)

    • We zouden DATEPART('hour',[End Time]) kunnen gebruiken, zoals we deden voor Begintijd. Hiermee wordt het uur van de eindtijd opgehaald. 1/1/18 16:34 AM wordt dus gewoon 4.

    • Maar we willen wel aangeven dat het bed van een patiënt dat nog bezet is (geen eindtijd), in gebruik is en niet leeg. Daarvoor moeten we een eindtijd van 24 (middernacht) toewijzen aan elke ontbrekende eindtijd met behulp van de functie IFNULL. Als het eerste argument DATEPART('hour',[End Time]) null is, zal de berekening in plaats daarvan 24 retourneren.

Opmerking: wilt u uw werk controleren? Download het ingepakte Tableau Prep-flowbestand (Ziekenhuisbedden.tflx(Link wordt in een nieuw venster geopend)) en het ingepakte Tableau Desktop-werkmapbestand (Ziekenhuisbedden.twbx(Link wordt in een nieuw venster geopend)).

Resources: meer training nodig? Volg een persoonlijke training(Link wordt in een nieuw venster geopend). Benieuwd naar de functies die we hebben besproken? Bekijk de andere onderwerpen in de online Help van Tableau Prep. Op zoek naar meer resources? De blogpost Tableau Prep leren gebruiken met deze lijst leermiddelen(Link wordt in een nieuw venster geopend) is net iets voor jou.