상황
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위 변수 탐색
+2위, 4위 변수도 살펴보면... (3위 lead_time는 이미 앞에서 했음)
모델 저장 후 활용한다면?
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로부터 제공받아 작성되었습니다.
'📊 DATA ANALYSIS > 스터디노트' 카테고리의 다른 글
[스터디노트] 통신사 이탈 고객 예측 (0) | 2024.05.24 |
---|---|
[스터디노트] 품질관리를 위한 주요인자 분석 (0) | 2024.05.24 |
[스터디노트] 연관규칙분석을 통한 장바구니 분석(유통 데이터) (0) | 2024.05.23 |
[스터디노트] HR Analytics(이직예측) (4) | 2024.05.23 |
[스터디노트] 넷플릭스 선호 컨텐츠 분석 (0) | 2024.05.23 |