Context
Industri perhotelan dan pariwisata saat ini telah bertransformasi menjadi salah satu sektor yang paling bergantung pada data (data-driven) di dunia. Dengan menjamurnya Online Travel Agents (OTA) dan platform pemesanan digital, akses pelanggan terhadap pemesanan kamar menjadi sangat mudah dan transparan. Namun, kemudahan ini membuat pelanggan dapat membandingkan harga secara real-time dan melakukan pemesanan spekulatif di berbagai tempat sekaligus. Fenomena ini menciptakan volatilitas permintaan yang tinggi, di mana pola pemesanan tradisional tidak lagi cukup untuk menjamin tingkat hunian yang optimal (Journal of Hospitality Marketing & Management).
Perubahan perilaku konsumen ini memunculkan tantangan operasional utama, yaitu ketidakpastian kehadiran customer. Banyak pelanggan memanfaatkan kebijakan pembatalan gratis (free cancellation policy) yang ditawarkan hotel sebagai strategi fleksibilitas perjalanan mereka. Akibatnya, hotel sering kali menghadapi pembatalan mendadak atau customer yang tidak datang (no-show). Ketidakpastian ini bukan hanya masalah administratif, tetapi merupakan gangguan serius terhadap rantai pasok layanan hotel, mulai dari perencanaan staf, penyediaan makanan, hingga manajemen inventaris kamar.
Jika hotel terlalu konservatif, banyak kamar akan kosong. Sebaliknya, jika hotel melakukan overbooking** tanpa perhitungan matang untuk mengantisipasi pembatalan, mereka berisiko merusak reputasi brand karena menolak customer yang sudah datang. Oleh karena itu, revenue Management menjadi kunci pertahanan profitabilitas hotel.
Dalam upaya memitigasi risiko ini, metode konvensional yang hanya mengandalkan intuisi manajer hotel atau analisis spreadsheet sederhana tidak lagi memadai. volume data transaksi yang masif, variasi segmen pasar, serta pola musiman yang kompleks memerlukan pendekatan analitik yang lebih canggih. Penerapan Machine Learning memungkinkan hotel untuk beralih dari sekadar bereaksi terhadap pembatalan menjadi memprediksi pembatalan tersebut sebelum terjadi. Dengan mengenali pola karakteristik customer yang berisiko batal, hotel dapat mengambil tindakan preventif yang lebih strategis.
Berdasarkan data internal perusahaan yang kita miliki saat ini, urgensi untuk melakukan analisis mendalam sangatlah mendesak. Data historis menunjukkan bahwa tingkat pembatalan terbesar ada pada hotel bertipe City Hotel (74.9%), yang dimana 3x lebih besar dibandingkan dengan resort hotel (25.1%). Tanpa intervensi berbasis data untuk memahami faktor dan segmentasi pengunjung melakukan pembatalan pesananan, hotel tidak bisa merancang strategi yang baik dalam menghadapi kondisi-kondisi tertentu.
Problem Statement
Berdasarkan business problem tersebut, maka dalam kasus ini ditentukan terdapat 2 permasalahan yang akan dibahas. Diantaranya :
- Faktor apa saja yang memengaruhi cancel dalam proses booking hotel?
- Bagaimana mengetahui potensi customer akan melakukan cancel atau tidak untuk pengendalian resiko?
Untuk menjawab semua masalah yang muncul, maka pada analisis ini memiliki tujuan sebagai berikut :
- Mengetahui faktor yang menjadi pengaruh terbesar dalam cancel hotel sehingga memberikan pandangan untuk lebih waspada terhadap fenomena serupa
- Memberikan prediksi terhadap calon customer yang berpotensi melakukan cancel terhadap pemesanan hotel
Untuk menjawab rumusan masalah dan mencapai tujuan yang telah ditetapkan, analisis ini akan dilakukan melalui beberapa tahapan sistematis sebagai berikut:
-
Data Cleaning and Understanding:
- Identifikasi awal untuk melihat kualitas data dan melakukan cleaning untuk menjaga integritas data
-
Exploratory Data Analysis (EDA):
- Menganalisis distribusi data univariat dan multivariat untuk memahami karakteristik market.
-
Data Preprocessing:
- Melakukan Encoding pada fitur kategorikal dan Scaling pada fitur numerikal.
- Menangani ketidakseimbangan kelas (Imbalanced Data Handling) jika diperlukan, mengingat pembatalan mencapai 37%.
-
Model Benchmarking & Selection:
- Melatih beberapa algoritma Machine Learning (seperti Logistic Regression, Decision Tree, Random Forest, XGBoost, dll).
- Membandingkan performa model dasar (baseline) untuk memilih algoritma kandidat terbaik.
-
Model Evaluation & Tuning:
- Melakukan Hyperparameter Tuning pada model terbaik.
- Mengevaluasi model menggunakan metrik yang relevan dengan konteks bisnis (dijelaskan detail di bawah).
-
Interpretation & Recommendation:
- Menggunakan Feature Importance (SHAP values) untuk menjelaskan faktor penyebab pembatalan.
- Memberikan rekomendasi bisnis berdasarkan insight yang ditemukan.
Dalam kasus klasifikasi prediksi pembatalan hotel, kita perlu menerjemahkan hasil statistik model ke dalam dampak finansial riil. Target variabel kita adalah:
- 0 (Negative Class): Customer tidak membatalkan pesanan sampai waktu kedatangan (Check-In).
- 1 (Positive Class): Customer membatalkan pesanan sebelum waktu kedatangan (canceled).
Berikut adalah konsekuensi dari kesalahan prediksi model (Confusion Matrix):
-
True Positive (TP): Model memprediksi customer Batal, dan customer Benar-benar Batal.
- Dampak: Positif. Hotel bisa segera menjual kembali kamar tersebut ke orang lain atau tidak menyiapkan amenities, sehingga mencegah revenue Leakage.
-
True Negative (TN): Model memprediksi customer Tidak Batal, dan customer Benar-benar Tidak Batal.
- Dampak: Positif. Operasional berjalan lancar sesuai rencana.
-
False Positive (FP) - Type 1 Error: Model memprediksi customer Batal, padahal customer Tidak Batal.
- Dampak Bisnis: Risiko Reputasi & Biaya Kompensasi. Jika hotel mengambil tindakan agresif (seperti menjual kamar ke orang lain/overbooking) berdasarkan prediksi ini, Customer yang datang tidak akan mendapatkan kamar. Ini menyebabkan komplain, biaya ganti rugi, dan kerusakan citra brand.
-
False Negative (FN) - Type 2 Error: Model memprediksi customer Tidak Batal, padahal customer Batal.
- Dampak Bisnis: Kehilangan Pendapatan (revenue Leakage). Hotel menahan kamar untuk customer tersebut, menolak pemesan lain, namun akhirnya kamar kosong. Ini adalah sumber utama kerugian yang ingin kita minimalkan sesuai Problem Statement.
Tujuan utama kita adalah meminimalkan revenue Leakage (menekan False Negative). Oleh karena itu, kita ingin nilai Recall setinggi mungkin agar tidak ada pembatalan yang terlewat.
Namun, kita tidak bisa hanya mengejar Recall. Jika kita memprediksi semua customer akan batal, Recall akan 100%, tapi Precision akan hancur (banyak False Positive). Terlalu banyak False Positive akan membuat tim operasional tidak percaya pada model (karena banyak "alarm palsu") dan berisiko merugikan customer setia.
Oleh karena itu, kita membutuhkan keseimbangan antara kemampuan mendeteksi pembatalan (Recall) dan ketepatan prediksi tersebut (Precision). Metrik yang paling tepat untuk mengakomodasi keseimbangan ini adalah F1-Score.
Metrik Terpilih: Kami akan menggunakan F1-Score sebagai metrik evaluasi utama. Kami ingin model yang mampu menangkap sebanyak mungkin potensi pembatalan, namun tetap menjaga presisi agar rekomendasi yang diberikan kepada manajemen dapat dipercaya dan tidak memicu kebijakan overbooking** yang gegabah.
Dimana:
-
$Recall = \frac{TP}{TP + FN}$ (Fokus meminimalkan kamar kosong/batal) -
$Precision = \frac{TP}{TP + FP}$ (Fokus meminimalkan risiko salah prediksi batal)
Justifikasi Pemilihan Metrik:
Meskipun tujuan utama adalah menekan False Negative (memaksimalkan Recall agar tidak ada potensi pembatalan yang terlewat), kami memilih F1-Score (seimbang) alih-alih F2-Score.
Alasannya adalah pertimbangan risiko bisnis pada False Positive. Jika model memiliki presisi yang buruk (banyak False Alarm), dan hotel mengambil keputusan agresif (seperti menjual kembali kamar tersebut), hal ini dapat menyebabkan insiden customer datang tanpa mendapatkan kamar (Overbooking* incident*). Risiko kerusakan reputasi dan biaya kompensasi customer (Walked Guest Cost) dianggap setara atau bahkan lebih berbahaya daripada risiko kamar kosong. Oleh karena itu, keseimbangan antara Recall dan Precision sangat krusial.
| Nama Variabel | Deskripsi |
|---|---|
hotel |
Hotel (H1 = Resort Hotel or H2 = City Hotel). |
is_canceled |
Value indicating if the booking was canceled (1) or not (0) |
lead_time |
Number of days that elapsed between the entering date of the booking into the PMS and the arrival date |
arrival_date_year |
Year of arrival date |
arrival_date_month |
Month of arrival date |
arrival_date_week_number |
Week number of year for arrival date |
arrival_date_day_of_month |
Month number of year for arrival date |
stays_in_weekend_nights |
Number of weekend nights (Saturday or Sunday) the guest stayed or booked to stay at the hotel |
stays_in_week_nights |
Number of week nights (Monday to Friday) the guest stayed or booked to stay at the hotel |
adults |
Number of adults |
children |
Number of children |
babies |
Number of babies |
meal |
Type of meal booked. Categories are presented in standard hospitality meal packages: Undefined/SC – no meal package; BB – Bed & Breakfast; HB – Half board (breakfast and one other meal – usually dinner); FB – Full board (breakfast, lunch and dinner) |
country |
Country of origin. Categories are represented in the ISO 3155–3:2013 format |
market_segment |
market segment designation. In categories, the term “TA” means “Travel Agents” and “TO” means “Tour Operators" |
distribution_channel |
booking distribution channel. The term “TA” means “Travel Agents” and “TO” means “Tour Operators” |
is_repeated_guest |
Value indicating if the booking name was from a repeated guest (1) or not (0) |
previous_cancellations |
Number of previous bookings that were cancelled by the customer prior to the current booking |
previous_ bookings_not_canceled |
Number of previous bookings not cancelled by the customer prior to the current booking |
reserved_room_type |
Code of room type reserved. Code is presented instead of designation for anonymity reasons. |
assigned_room_type |
Code for the type of room assigned to the booking. Sometimes the assigned room type differs from the reserved room type due to hotel operation reasons (e.g. over booking) or by customer request. Code is presented instead of designation for anonymity reasons. |
booking_changes |
Number of changes/amendments made to the booking from the moment the booking was entered on the PMS until the moment of check-in or cancellation |
deposit_type |
Indication on if the customer made a deposit to guarantee the booking. This variable can assume three categories: No Deposit – no deposit was made; Non Refund – a deposit was made in the value of the total stay cost; Refundable – a deposit was made with a value under the total cost of stay. |
agent |
ID of the travel agency that made the booking |
company |
ID of the company/entity that made the booking or responsible for paying the booking. ID is presented instead of designation for anonymity reasons |
days_in_waiting_list |
Number of days the booking was in the waiting list before it was confirmed to the customer |
customer_type |
Type of booking, assuming one of four categories: Contract - when the booking has an allotment or other type of contract associated to it; Group – when the booking is associated to a group; Transient – when the booking is not part of a group or contract, and is not associated to other transient booking; Transient-party – when the booking is transient, but is associated to at least other transient booking |
adr |
Average Daily rate as defined by dividing the sum of all lodging transactions by the total number of staying nights |
required_car_parking_spaces |
Number of car parking spaces required by the customer |
total_of_special_requests |
Number of special requests made by the customer (e.g. twin bed or high floor) |
reservation_status |
Reservation last status, assuming one of three categories: canceled – booking was canceled by the customer; Check-Out – customer has checked in but already departed; No-Show – customer did not check-in and did inform the hotel of the reason why |
reservation_status_date |
Date at which the last status was set. This variable can be used in conjunction with the ReservationStatus to understand when was the booking canceled or when did the customer checked-out of the hotel |
- Kebijakan Deposit Dinamis (Dynamic Deposit Policy) Penerapan: Gunakan model untuk memprediksi risiko setiap pesanan baru secara real-time.
-
Jika prediksi "Berisiko Tinggi": Wajibkan deposit Non-Refundable atau minimal deposit satu malam untuk mengikat komitmen tamu.
-
Jika prediksi "Berisiko Rendah": Tawarkan opsi No Deposit atau Free Cancellation sebagai insentif untuk menarik lebih banyak tamu setia (Loyal Customers).
- Strategi Overbooking yang Terukur
- Alih-alih melakukan overbooking secara membabi buta yang berisiko membuat tamu marah (walking guest), gunakan probabilitas pembatalan dari model untuk menentukan jumlah kamar yang bisa di-overbook dengan aman pada tanggal-tanggal sibuk.
- Customer Relationship Management (CRM) Tertarget
- Pre-arrival Engagement: Untuk segmen "High Value - High Risk" (tamu yang membayar mahal tapi berisiko batal), kirimkan email pengingat, penawaran upgrade kamar diskon, atau layanan antar-jemput beberapa hari sebelum kedatangan untuk meningkatkan switching cost (rasa sayang jika membatalkan).
- Restriksi pada Lead Time Panjang
- Karena Lead Time yang panjang berkorelasi dengan pembatalan tinggi, hotel dapat menerapkan kebijakan pembatalan yang lebih ketat (misalnya maks H-7) untuk pemesanan yang dilakukan jauh-jauh hari (>3 bulan).