import streamlit as st import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import plotly.express as px from PIL import Image st.set_page_config( page_icon='Hotel Reservation and Prediction', layout='wide', initial_sidebar_state='expanded') def run(): # membuat judul st.title('Hotel Reservation and Prediction') # Membuat Sub header st.subheader ('EDA Hotel Reservation and Prediction') # Menambahkan gambar image = Image.open('images.jpg') st.image(image) # Menambahkan deskripsi st.write('Ditengah ramainya pertumbuhan era digitalisasi, maka industri perhotelan pun tidak ikut ketinggalan dalam era ini, dimana reservasi sekarang mulai di kolaborasikan dengan berbagai macam aplikasi, namun ini menyebabkan masalah baru juga, dimana pelangan dapat dengan mudah membatalkan reservasi yang dapat berdampak pada pendapatan hotel yang berkurang dari efek tersebut.') # mbuat garis lurus st.write('---') # Magic Syntax ''' Dataset ini berisisikan data reservasi dari suatu hotel baik online maupun offline. Selain itu ada dataset juga berisi booking status dari reservasi tersebut, ada yang di cancel dan ada yang tidak. Disini saya akan mencoba untuk menganalisis data reservasi yang berstatus cancel berdasarkan berbagai kolom-kolom lainnya. ''' # menambhakan dataframe data=pd.read_csv('https://raw.githubusercontent.com/pram2601/Hacktiv8/main/Hotel%20Reservations.csv') st.dataframe(data) # memuat data pada kolom booking_status yang berstatus canceled data_canceled= data[data['booking_status']=='Canceled'] # menampilkan pie chart untuk kolom kolom pada dataset st.write('### Data Booking Status Cancel Berdasarkan Kondisi') fig= plt.figure(figsize=(20, 5)) plt.subplot(1, 3, 1) plt.pie(data['booking_status'].value_counts(), labels=['Not Canceled', 'Canceled'], autopct='%1.1f%%') plt.title('Booking Status') plt.subplot(1, 3, 2) plt.pie(data_canceled['arrival_year'].value_counts(), labels=['2018', '2017'],autopct='%1.1f%%') plt.title('Booking Status Canceled By Arival Year') plt.subplot(1, 3, 3) plt.pie(data_canceled['required_car_parking_space'].value_counts(),labels=['No', 'Yes'],autopct='%1.1f%%') plt.title('Booking Status Canceled By Required Car Carking Spaces') st.pyplot(fig) # menambahkan deskripsi st.write('- Dari chart diatas data imbalance dimana banyak yang tidak cancel, dan yang cancel lebih sedikit. Dalam hal bisnis ini cukup baik untuk pihak hotelnya, karena hanya sedikit yang sudah reservasi dan membatalkannya, hanya 11.885 dari total keseluruhan data yaitu 36.275') st.write('- Kebanyakan pembatalan reservasi terjadi pada tahun 2018') st.write('- Hampir padad semua pembatalan reservasi, kebanyakan pelanggan tidak membutuhkan parkiran mobil') # memnampilkan booking status canceled berdasarkan kolom lain ke dalam chart fig = plt.figure(figsize=(30, 5)) plt.subplot(1, 3, 1) sns.countplot(x=data_canceled['room_type_reserved']) plt.title('Booking Status Canceled By Room Type Reserved') plt.subplot(1, 3, 2) sns.countplot(x=data_canceled['no_of_adults']) plt.title('Booking Status Canceled By Number Of Adults') plt.subplot(1, 3, 3) sns.countplot(x=data_canceled['no_of_children']) plt.title('Booking Status Canceled By Number of Children') st.pyplot(fig) # menambahkan deskripsi st.write('- Pembatalan reservasi kebanyakan terjadi pada room type 1') st.write('- Pembatalan paling banyak ada pada pemesanan yang satu kamar akan ditempati oleh 2 orang dewasa saja') st.write('- Kebanyakan pelanggan yang membatalkan reservasi tidak membawa anak, makanya grafik pada no_of_childrennya untuk 0 sangat tinggi di bandingkan yang lainnya') # memnampilkan booking status canceled berdasarkan kolom lain ke dalam chart fig = plt.figure(figsize=(20, 5)) plt.subplot(1, 3, 1) sns.countplot(x=data_canceled['no_of_weekend_nights']) plt.title('Booking Status Canceled By No of Weekend Nights') plt.subplot(1, 3, 2) sns.countplot(x=data_canceled['no_of_week_nights']) plt.title('Booking Status Canceled By Number of Week Nights') plt.subplot(1, 3, 3) sns.countplot(x=data_canceled['no_of_special_requests']) plt.title('Booking Status Canceled By Repeated Guest') st.pyplot(fig) # menambahkan deskripsi st.write('- Dari chart number of weekend night dapat terlihat bahwa reservasi yang cancel kebanyakan tidak mengambil weekend night (sabtu atau minggu) pada saat reservasi. dapat terlihat dari pada chart weekend night 0 nya yang tinggi') st.write('- Dari chart Number of Week Nights, orang orang yang melakukan cancel kebanyakan memesaan 1-3 hari pada hari biasa, antara senin sampai jumat') st.write('- Kebanyakan reservasi yang dicancel mayoritas tidak mennyebutkan spesial request, jadi langsung pesan ssaja tanpa ada pesan khusus') # membuat fungsi untuk kolom avg_price_per_room dan kolom lead_time def avg_price_per_room_group(x): if x <= 50.0 : x= 'Price below 50' elif x >50.0 and x <=150.0: x= 'Price from 50 to 150' elif x >150.0 and x <=300.0: x= 'Price from 150 to 300' elif x >300.0 and x <=450.0: x= 'Price from 300 to 450' else: x= 'Price 450+' return x def lead_time_group(x): if x <= 30.0 : x= 'Dibawah 1 Bulan' elif x >30.0 and x <= 60: x= 'Dibawah 2 Bulan' elif x > 60.0 and x <=90.0: x= 'Dibawah 3 Bulan' else: x= 'Diatas 3 Bulan' return x # menambhakan kolom baru hasil fungsi data_canceled['price_per_room_group']=data_canceled['avg_price_per_room'].apply(avg_price_per_room_group) data_canceled['lead_time_group']=data_canceled['lead_time'].apply(lead_time_group) # memnampilkan booking status canceled berdasarkan kolom lain ke dalam chart fig = plt.figure(figsize=(20, 5)) plt.subplot(1, 3, 1) sns.countplot(x=data_canceled['price_per_room_group']) plt.title('Booking Status Canceled By Price Per Room Group') plt.xticks(rotation=90) plt.subplot(1, 3, 2) sns.countplot(x=data_canceled['lead_time_group']) plt.title('Booking Status Canceled By Lead Time Group') plt.xticks(rotation=90) plt.subplot(1, 3, 3) sns.countplot(x=data_canceled['market_segment_type']) plt.title('Booking Status Canceled By Market Segment Type') st.pyplot(fig) # menambahkan deskripsi st.write('- Reservasi yang di cancel mayoritas berada pada range harga 50-150, pada range harga tersebut banyak yang membatalkan reservasinya') st.write('- Selisih waktu booking dan kedatangan pelanggan yang diatas 3 bulan sangat rawan sekali terjadi pembatalan, terlihat pada grafik Booking Status Canceled By Lead Time Group diatas') st.write('- Kebanyakan pembatalan berada pada market segment online, dimana memang ini adalah masalah baru dalam dunia bisnis hotel sejak merambah ke pasar online, dimana fee pembatalan yang rendah, dengan mudahnya mengcancele dari aplikasi') # memnampilkan booking status canceled berdasarkan kolom lain ke dalam chart fig = plt.figure(figsize=(30, 5)) plt.subplot(1, 3, 1) sns.countplot(x=data_canceled['type_of_meal_plan']) plt.title('Booking Status Canceled By type of Meal Plan') plt.subplot(1, 3, 2) sns.countplot(x=data_canceled['arrival_month']) plt.title('Booking Status Canceled By Arrival Month') plt.subplot(1, 3, 3) sns.countplot(x=data_canceled['arrival_date']) plt.title('Booking Status Canceled By Arrival Date') st.pyplot(fig) # menambahkan deskripsi st.write('- Dalam kolom meal plan, yang mengcancel reservasi kebanyakan memilih meal plan 1') st.write('- Reservasi yang dibatalkan kebanyakan pelanggan yang akan menginap pada bulan 10 atau oktober, diamana pada akhir tahun lebih sedikit pelanggan yang membatalkan reservasi') st.write('- Untuk reservasi yang cancel berdasarkan tanggal kedatangan ini hasilnya rata, tidak ada tanggal yang benar benar mencolok') # memnampilkan booking status canceled berdasarkan kolom lain ke dalam chart fig = plt.figure(figsize=(30, 5)) plt.subplot(1, 3, 1) plt.pie(data['repeated_guest'].value_counts(), labels=['No', 'Yes'], autopct='%1.1f%%') plt.title('Booking Status Canceled By Repeated Guest') plt.subplot(1, 3, 2) sns.countplot(x=data_canceled['no_of_previous_cancellations']) plt.title('Booking Status Canceled By No of Previous Cancellation') plt.subplot(1, 3, 3) sns.countplot(x=data_canceled['no_of_previous_bookings_not_canceled']) plt.title('Booking Status Canceled By No of Previous Bookings Not Canceled') st.pyplot(fig) # menambahkan deskripsi st.write('- Ada sedikit pelanggan yang pernah menginap lalu reservasi lagi dan tiba-tiba membatalkan reservasi tersebut') # mmebuat garis lurus st.write('---') st.write('Dari hasil EDA didapati bahwa pelanggan yang mungkin akan membatalkan reservasi adalah pelanngan yang memesan pada tahun 2018 untuk 2 orang dewasa tanpa membawa anak, dan memiliki waktu pemesanan dengan kedatangan memiliki selisih waktu diatas 3 bulan bertipe segment online dan dengan room type 1 dengan rentang harga per room 50 - 150') if __name__ == '__main__': run()