Woher die Daten stammen
Der Datensatz wurde im Februar 2019 von Nuno Antonio, Ana de Almeida und Luis Nunes in der Zeitschrift Data in Brief (Band 22) unter dem Titel Hotel booking demand datasets veröffentlicht. Die Autoren haben die Buchungsdaten zweier portugiesischer Hotels aus deren Property-Management-Systemen gezogen, personenbezogene Angaben entfernt und die Daten unter der Lizenz CC BY 4.0 freigegeben – jeder darf sie nutzen, solange die Quelle genannt wird. Genau deshalb steht sie in der Fußzeile des Dashboards.
Das Projekt verwendet die Fassung, die 2020 im TidyTuesday-Projekt der R-Community erschienen ist und
wortgleich auf Kaggle als Hotel Booking Demand liegt: Die beiden Originaldateien sind zu einer
zusammengefügt, die Spalte hotel unterscheidet die Häuser. Das Notebook lädt diese Datei direkt
von GitHub, ohne Anmeldung – das ist der reproduzierbare Weg aus Lab 02.
Der Datensatz ist echt, aber ohne Personenbezug: Namen, Adressen, Kontaktdaten fehlen; Agenturen und Firmen tragen nur Kennnummern. Deshalb darf er in Colab, in einer Datenbank auf einem Hochschulserver und in einem öffentlichen Repository liegen. Für Daten aus einem eigenen Praxisprojekt gilt das nicht automatisch – siehe Lab 02, Abschnitt Datenschutz.
Die 32 Spalten
Jede Zeile ist eine Buchung. Die Spalten lassen sich in fünf Gruppen lesen; die Reihenfolge in der Datei ist die der Autoren, nicht die der Logik.
| Gruppe | Spalte | Bedeutung | Werte |
|---|---|---|---|
| Haus und Status | hotel | welches Haus | City Hotel (79.330), Resort Hotel (40.060) |
is_canceled | storniert? | 1 = ja (44.224), 0 = nein | |
reservation_status, reservation_status_date | letzter Status und sein Datum | Check-Out, Canceled, No-Show | |
| Zeit | lead_time | Tage zwischen Buchung und Anreise | 0 bis 737, Median 69 |
arrival_date_year, _month, _week_number, _day_of_month | Anreisedatum, in vier Spalten zerlegt | 2015–2017; Monat als englisches Wort | |
stays_in_weekend_nights, stays_in_week_nights | Nächte am Wochenende und unter der Woche | Summe = Aufenthaltsdauer | |
| Gäste | adults, children, babies | Personen je Buchung | children fehlt in 4 Zeilen |
country | Herkunftsland | ISO-3-Code, 177 Länder, 488-mal leer | |
is_repeated_guest, previous_cancellations, previous_bookings_not_canceled | Vorgeschichte des Gasts | Zahlen | |
| Vertrieb und Vertrag | market_segment | über welchen Markt die Buchung kam | Online TA, Offline TA/TO, Groups, Direct, Corporate, Complementary, Aviation, Undefined |
distribution_channel | Vertriebskanal | TA/TO, Direct, Corporate, GDS, Undefined | |
customer_type, deposit_type | Kundentyp und Kautionsart | Transient, Transient-Party, Contract, Group · No Deposit, Non Refund, Refundable | |
agent, company | Kennnummer der Agentur bzw. Firma | „NULL“ als Text, wenn keine | |
| Zimmer und Preis | meal | Verpflegung | BB, HB, FB, SC, Undefined |
reserved_room_type, assigned_room_type | gebuchter und zugeteilter Zimmertyp | Buchstabencodes A–L | |
adr | Average Daily Rate: Zimmerpreis je Nacht | −6,38 bis 5.400; 1.959-mal 0 | |
booking_changes, days_in_waiting_list, required_car_parking_spaces, total_of_special_requests | Änderungen, Warteliste, Parkplätze, Sonderwünsche | Zahlen |
Was der Datensatz nicht enthält, ist ebenso wichtig: keine Zimmerzahl je Haus, keinen Nebenumsatz, keinen Buchungspreis für Frühstück oder Parkplatz, keinen Namen. Lab 00 hat daraus die Grenzen des Projekts abgeleitet.
Datentypen und Rollen
Beim Einlesen ordnet pandas jeder Spalte einen Typ zu: 16 Spalten sind ganze Zahlen, 4 sind Dezimalzahlen, 12 sind Text. Für die Auswertung zählt die Rolle einer Spalte; sie entscheidet später, ob die Spalte in die Faktentabelle oder in eine Dimension wandert.
Vier Rollen
- Kennzahl (measure) – wird summiert oder gemittelt:
adr,lead_time, die Nächte,adults. Ausadrmal Nächte entsteht späterrevenue. - Merkmal (dimension) – wird gefiltert und gruppiert:
hotel,market_segment,country,deposit_type. Wenige verschiedene Werte, oft Text. - Flag – ein Ja/Nein, gespeichert als 0 und 1:
is_canceled,is_repeated_guest. Der Mittelwert eines Flags ist ein Anteil – der Mittelwert vonis_canceledist die Stornoquote. - Zeitangabe – das Anreisedatum in vier Spalten und das Statusdatum. Beide werden im Sternschema zu Schlüsseln auf eine Datumsdimension.
Eine Zahl ist nicht automatisch eine Kennzahl. agent ist eine Nummer, aber summieren wäre
Unsinn – sie ist ein Merkmal. Die Probe: Ergibt die Summe über alle Buchungen einen Sinn? Bei
adr nein (je Nacht), bei revenue ja, bei agent nie.
Eigenheiten, die man kennen muss
Diese sechs sind dokumentiert – im Notebook, in den Aussagen des Dashboards und in der Literatur zum Datensatz. Wer sie kennt, erkennt sie später in jeder Auswertung wieder.
In agent und company steht bei fehlender Angabe der Text NULL –
16.340- bzw. 112.593-mal. Für pandas ist das je nach Version eine Zeichenkette, nicht ein fehlender Wert.
Das Notebook ersetzt den Text durch echtes NaN, sonst zählt „NULL“ als Agentur.
488 Buchungen haben kein Herkunftsland. Das Notebook setzt UNK ein, damit die Zeilen nicht aus
Joins fallen. Der Code CN steht im Datensatz für China – kein gültiger ISO-3-Code, aber so
geliefert; das Dashboard übersetzt ihn.
1.959 Buchungen haben einen Zimmerpreis von 0 (Freiplätze, Reklamationen), eine ist negativ (−6,38, eine Gutschrift) und eine liegt bei 5.400 € – ein Tippfehler. Ein Mittelwert reagiert auf solche Ausreißer; der Median nicht. Das Projekt lässt die Werte stehen und benennt sie.
14.587 Buchungen sind „nicht erstattbar“ – und 99,4 % davon storniert. Fachlich unplausibel; die Erklärung liegt in Sammelbuchungen, die nach Nichterscheinen als storniert verbucht wurden. Ein bekanntes Artefakt dieses Datensatzes, das jede Stornoanalyse erwähnen muss.
715 Buchungen haben null Nächte – Tagesnutzung oder Stornierung am Anreisetag. Ihr revenue
ist 0, obwohl adr gesetzt sein kann. Für die Aufenthaltsdauer zählen sie mit.
meal hat 1.169-mal „Undefined“, was laut Autoren dasselbe bedeutet wie SC (keine
Verpflegung). market_segment und distribution_channel haben je eine Handvoll
„Undefined“. Das Dashboard zeigt sie als „Nicht angegeben“.
Storniert ist nicht dasselbe wie nicht erschienen. is_canceled = 1 fasst
zwei Status zusammen: Canceled (43.017) und No-Show (1.207). Für die Stornoquote zählen
beide, für eine Analyse der Stornofristen nur der erste. Wer das eine meint, muss das andere ausschließen.
Eine Buchung als Datensatz
Ein Buchungssystem liefert eine Buchung über eine Schnittstelle als JSON; pandas zeigt dieselbe erste Zeile als Tabelle. Beide Formen tragen dieselbe Information, nur die JSON-Form macht die Typen sichtbar: Zahlen ohne Anführungszeichen, Text mit, Wahrheitswerte als true/false.
print("Zeilen, Spalten:", df.shape)
df.head(1).T
| hotel | Resort Hotel |
| is_canceled | 0 |
| lead_time | 342 |
| arrival_date_year | 2015 |
| arrival_date_month | July |
| adults | 2 |
| country | PRT |
| market_segment | Direct |
| deposit_type | No Deposit |
| adr | 0.0 1 |
| reservation_status | Check-Out |
Nachbildung der Oberfläche, Stand 09/2026 – Beschriftungen wie im Original; Ausgabe auf elf Spalten gekürzt.
- 1Die allererste Buchung des Datensatzes hat null Nächte und einen Zimmerpreis von 0 – ein Beispiel dafür, dass „erste Zeile“ nicht „typische Zeile“ heißt.
Übungen
Fünf Übungen: Herkunft und Lizenz, die Rollen der Spalten, die Eigenheiten, eine Buchung als JSON und die Bedeutung einzelner Werte.
Zusammenfassung
- Die Daten stammen aus zwei portugiesischen Hotels und wurden 2019 von Antonio, de Almeida und Nunes unter CC BY 4.0 veröffentlicht; das Projekt liest die TidyTuesday-Fassung per URL.
- 32 Spalten in fünf Gruppen: Haus und Status, Zeit, Gäste, Vertrieb und Vertrag, Zimmer und Preis.
- Nicht der Typ, die Rolle zählt: Kennzahl, Merkmal, Flag, Zeitangabe. Der Mittelwert eines Flags ist ein Anteil.
- Sechs Eigenheiten: „NULL“ als Text, fehlende Länder, adr mit 0, negativ und 5.400, Non Refund zu 99 % storniert, null Nächte, „Undefined“.
- Storniert umfasst Canceled und No-Show; wer Fristen analysiert, trennt sie.
- Eine Buchung lässt sich als JSON-Objekt schreiben; die Form macht die Typen sichtbar.