📊 DATA ANALYSIS/스터디노트

[스터디노트] 숙박예약 수요 분석

bodeok 2024. 5. 24. 15:03

상황

A호텔은 요즘 코로나 여파로 인하여 고생을 겪고 있다.
객실 예약 건수도 줄고 있는 마당에 노쇼/취소 고객도 증가있는 것이 가장 큰 문제이다.  
캔슬 고객은 그나마 다행이지만 노쇼 고객의 경우 객실을 하루 날려버리는 것과 같아서, 비용적인 문제에서도 큰 영향을 끼치고 있다.
따라서 노쇼와 취소고객을 사전 예측하고, 운영 비용을 상황에 맞춰 조정하려고 한다.

 

데이터 구조

hotel is_canceled lead_time arrival_date_year arrival_date_month arrival_date_week_number
호텔명 취소여부 입실까지 남은일
arrival_date_day_of_month stays_in_weekend_nights stays_in_week_nights adults children babies
주말 포함 일수 평일 포함 일수 성인 어린이 영유아
meal country market_segment distribution_channel is_repeated_guest previous_cancellations
식사 나라 예약유통채널상세 예약유통채널 기존고객여부 과거 취소한 예약수
previous_bookings_not_canceled reserved_room_type assigned_room_type booking_changes deposit_type agent
과거 취소하지않은 예약수 예약객실타입 배정된객실타입 예약변경횟수 보증금여부 여행사ID
company days_in_waiting_list customer_type adr
예약지불회사 대기자 명단에 있었던 일수 계약타입 평균객실비용
required_car_parking_spaces total_of_special_requests reservation_status reservation_status_date
요구주차대수 특별요청수 예약상태 예약상태 업데이트 날짜

 

119,390 row, 32 col

 

분석과정 요약

1. EDA 및 객실 수요 파악
2. 취소, 노쇼 고객 분석
    -월에 따른 취소/노쇼율 비교
    -Resort Hotel과 City Hotel 비교 (hotel변수)
    -주말 예약 일수에 따른 비교
    -객실타입에 따른 비교
    -lead_time(입실까지 남은일)에 따른 비교
3. ML 활용 취소/노쇼 고객 예측

 

1. EDA 및 객실 수요 파악

df.shape                       #행,열 수 확인
df.info()                        #data type 확인
df.isnull().sum()          #결측치 확인
df.describe()               #이상치 확인
  • children, country, agent, company 컬럼의 결측치는 0 대체
  • adr 컬럼이 음수일 수는 없으므로, 음수인 삭제
  • 연도별, 월별 객실 예약 현황 파악 (value_counts 활용)

  • 2015년은 7월부터 데이터 존재, 2016년은 12개월 모두 존재, 2017년은 1~8월까지만 존재 -> plotting하기 어려움
  • barplot, order 옵션을 활용하여 가독성 높임

 

 

 

2. 취소, 노쇼 고객 분석

취소 및 노쇼 비율

  • reservation_status는 Check-out, Canceled, No-Show로 구성되어 있으며, 아래 코드를 통해 취소 및 노쇼비율을 구한다.
    (약 37.5%)
  • 3개의 범주로 구성되어 있는 종속변수 reservation_status를 Check-out유무에 따른 2가지 구분으로 변환한다.
    (취소/노쇼인 경우는 1, Check-out인 경우는 0)
df['reservation_status'] = np.where(df['reservation_status'] != 'Check-Out', 1, 0)
df['reservation_status'].value_counts()

 

취소 노쇼 고객 특성 분석

월에 따른 취소/노쇼율 비교
Resort Hotel과 City Hotel 비교 (hotel변수)
주말 예약 일수에 따른 비교
객실타입에 따른 비교
lead_time(입실까지 남은일)에 따른 비교

 


< 월에 따른 취소/노쇼율 비교 >

 


 

 

< Resort Hotel City Hotel 비교 >

 

 


 

< 주말 예약 일수에 따른 비교 >

 

  • stays_in_weekend_nights를 2와 8을 기준으로 3구간화하여 그룹별 비교

 

구간화 전 후

 


 

< 객실타입에 따른 비교 >

 

 


< lead_time(입실까지 남은일)에 따른 비교>

  • displot를 확인 후, 구간화
  • 100, 200을 기준으로 3그룹화 후 비교

 

 

 

 

 

3. ML 활용 취소/노쇼 고객 예측

 

모델 학습 및 평가

  • 'is_canceled', 'reservation_status_date' 변수 삭제
  • 종속변수 reservation_status 분류 예측
  • 범주형변수 LabelEndoing
  • RandomForestClassifier 모델 사용
  • roc_auc_score 이진분류기 성능 평가할때 많이 사용하는 지표

중요변수 파악 및 1위 변수 탐색

deposit_type이 월등히 높은 중요도를 나타낸다. 세부 탐색 해보자.

 

deposit_type에 따른 예약 상태. 환불 불가인데도, 취소율이 높다

 

 

 

+2위, 4위 변수도 살펴보면... (3위 lead_time는 이미 앞에서 했음)

country와 total_of_special_requests

 

 

 

모델 저장 후 활용한다면?

import pickle
# 모델 저장
saved_model = pickle.dumps(rfc)

# 모델 Read
clf_from_pickle = pickle.loads(saved_model)
# 4월 취소/노쇼 고객을 예측한다고 가정할 시
Data_mart_3월마감 = pd.read_csv("3월31일 마감.csv") # 3월31일 기준으로 Data mart 생성
pred = clf_from_pickle.predict(Data_mart_3월마감)   #예측

# predict 데이터 3월 Data mart 데이터에 결합 후 노쇼/캔슬(1)에 해당하는 데이터 추출
Data_mart_3월마감['Y'] = pred
Data_mart_3월마감[Data_mart_3월마감['Y']==1]

 

 

 

 

 

 


위 교육 자료는 zerobase로부터 제공받아 작성되었습니다.