Day 16~20 : 프로젝트 기간
EDA를 통한 호텔 예약 취소율 개선
SQL과 Excel을 통해 EDA를 진행하면서 데이터 분석 역량을 키우는 것이 목적이라고 생각했다. 따라서 데이터분석에 입문자인만큼 EDA를 수행하기가 버겁지 않은 적합한 데이터셋을 kaggle에서 찾았고 팀원들과 2가지 데이터로 후보를 정했다.
1) Average Time Spent By A User On Social Media
처음에는 요즘 사회적 이슈인 '도파민 중독'의 가장 대표적인 예인 소셜미디어 사용 시간을 분석해보고 싶어서 해당 주제를 선택하였고, 사용자 특성(나이, 직업, 성별 등)에 따른 시간 분포를 분석하여 중독 예방 정책 수립에 도움을 주는 방향으로 나아가자는 결론을 지었다.
하지만 기초 데이터 분석을 진행한 결과 컬럼에 따른 데이터 수(가 너무 일정하게 들어가 있어(1:1:1 이런식으로 구성되어 있었다) 유의미한 결과를 얻기 어려울 것이라는 결론이 났다.
따라서, 주제 변경을 결정하였다.
두번째로는 호텔 예약 데이터를 선택하게 되었다. 그 이유는 우선, 데이터 분석이 많이 이루어진 데이터로서 참고할 수 있는 정보가 많았으며 분류모델 입문에 좋은 데이터셋이라는 유저들의 평가도 있었기 때문이다.
또한 분석을 위한 다양한 컬럼이 존재하였고 컬럼에 대한 설명도 자세히 되어있어 해당 데이터 셋을 선택하여 호텔 예약 취소율을 줄이는 방향으로 분석을 진행하게 되었다.
컬럼 설명
Booking_ID : 각 예약의 고유 식별자
no_of_adults : 성인 수
no_of_children : 자녀 수
no_of_weekend_nights : 고객이 호텔에 숙박했거나 예약한 주말 밤 수 (토요일 또는 일요일)
no_of_week_nights : 고객이 호텔에 숙박했거나 예약한 주중 밤 수(월요일~금요일)
type_of_meal_plan : 고객이 예약한 식사 플랜 유형
required_car_parking_space : 고객의 주차 공간을 요청 여부 (0 - 아니요, 1 - 예)
room_type_reserved : 고객이 예약한 객실 유형. 값은 INN Hotels에 의해 암호화(인코딩).
Lead_time : 예약일과 도착일 사이의 일수
Arrival_year : 도착일 연도
Arrival_month : 도착일 월
Arrival_date : 해당 월의 날짜
market_segment_type : 예약 방식
Repeat_guest : 재방문 여부 (0 - 아니요, 1 - 예)
no_of_previous_cancellations : 현재 예약 이전에 고객이 취소한 이전 예약 수
no_of_previous_bookings_not_canceled : 현재 예약 이전에 고객이 취소하지 않은 이전 예약 수
avg_price_per_room : 예약의 일일 평균 가격. 객실 가격은 유동적 (유로로)
no_of_special_requests : 고객이 요청한 총 특별 요청 수(예: 고층, 객실에서 보이는 전망 등)
booking_status : 예약 취소 여부
효과적인 데이터 분석을 위해 데이터에 대한 이해가 필요하다고 생각되어 데이터 전처리 및 데이터 분석을 실시하였다.
데이터셋에 기록된 데이터는 2017년과 2018년의 예약 데이터였으나, 특이하게 2017년은 7월부터 12월까지의 데이터밖에 없었다.
그렇기에 2018년에 비해 2017년 데이터가 수가 많이 부족하여 편향을 불러일으킬 수 있기 때문에 년도 구분이 데이터 분석 목적에 크게 영향을 주지 않을 것으로 판단하여 2017년 데이터를 제외한 2018년 데이터만 사용하였다.
기존 데이터셋에서 설정되어있던 컬럼 이름으로는 고유한 속성을 한눈에 파악하기가 어렵다고 판단되는 것들은 구분을 다시하여 분석을 진행하였다.
1) no_of_weekend_nights와 no_of_week_night는 only_week, only_weekend, week and weekend로 분류
2) no_of_adults와 no_children은 only_adults, only_children, adults and children으로 분류
호텔 예약 취소율 개선이 합리적인 목표 설정인지 확인하기 위해서 현재 예약 취소 여부가 기록된 booking_status 컬럼을 통해 취소율이 37%임을 확인하여 프로젝트 목적이 합리적임을 확인하였다.
컬럼들을 더 효과적으로 살피기 위해 시각화를 진행하였다.


기초적인 데이터 분석이 끝난 후 전체 데이터셋의 컬럼과 취소율 간의 관계성을 살펴 취소율이 영향을 미치는 핵심 컬럼을 선별하였다.
1) Price - Cancellation

현재 예약 상태가 Canceled인 경우 평균 price가 더 높다.
2) Lead time - Cancellation

현재 예약 상태가 Canceled인 경우 평균 lead time이 더 길다.
3) Special requests - Cancellation

특별 요청 수가 많은 경우 현재 예약 상태가 Not Canceled인 경우가 많다.
현재 예약 상태가 Canceled인 경우 평균 price가 높다는 것을 기초 데이터 분석에서 확인하였다.
따라서 가격에 영향을 미치는 요인에 대해 분석을 진행하였다.
1. 요일별 평균 price
실제로 호텔을 예약할 때 주중과 주말이 가격이 다른점에 착안하여 날짜, 요일에 따른 가격변화를 확인해보았다.


결과는 취소된 예약은 주중, 주중+주말, 주말 순으로 가격이 높았음을 확인할 수 있었다.
또한 주중+주말, 주중, 주말 순으로 취소 예약 건수가 많았다.
이러한 두 정보를 종합하여 주중의 높은 가격이 취소 원인이 될 수 있다고 판단하였습니다.
2. 월 별 price
다음으로는 날짜 중 month 별 가격 변화를 확인하였다.
실제로 호텔의 가격은 요일뿐만 아니라 성수기와 비수기 등 월별로도 차이가 있다는 점에서 착안하였다.
취소율까지 동반하여 분석을 진행하였다.



3. 예약 방법 별 price
예약 방법에 따라서도 가격 변동이 있을 것으로 예측하여 분석을 진행하였다.
취소율도 같이 확인하였다.
예약 방법에는 online, offline, corporate, complementary, aviation 이렇게 5가지가 있으나 이 중 corporate, complementary, aviation은 가격 외에 외부 변수의 영향이 클 것으로 판단하여 online과 offline 두 가지만 비교하였다.


현재 예약 상태가 Canceled인 경우 Not Canceled인 경우의 평균 lead time이 길다는 것을 기초 데이터 분석에서 확인하였다.
따라서 lead time을 낮춘다면 취소건수 또한 개선될 것으로 생각하여 lead time에 영향을 미치는 요인에 대해 분석을 진행하였다.
1. 월 별 lead time
성수기와 비수기 등의 이유로 예약이 치열해져서 월별로 lead time이 길어질 수 있다고 생각하여 월별 lead time을 분석해보았다.


분석 결과 6,7,8,9,10월에 유독 긴 lead time을 보였으며 취소율 또한 비례함을 확인할 수 있다.
예약이 치열해서 lead time이 길어졌는지에 대한 가설을 확인하기 위해 월별 방문객 수(기초 데이터 분석)을 확인한 결과 7월을 제외한 6,8,9,10월에 고객 수가 많음을 확인하였다.
2. (월 별) 요일별 lead time
더 자세한 분석을 위해 6,8,9,10월을 대상으로 방문한 요일에 따른 lead time 변화도 살펴보았다.


3. 객실 유형과 lead time
다음으로는 고객이 선택한 객실 유형과 lead time간의 관계를 확인해보았다.
인기있는 객실일수록 예약이 치열해서 일반적인 예약보다 더 빨리 예약해두는 경향(lead time이 길어지는 경향)이 있을 것이라고 예측했기 때문이다.


특별 요청이 많을수록 현재 예약 상태가 Not Canceled인 것을 기초 데이터 분석에서 확인하였다.
따라서 special request를 높여 취소건수를 낮추기 위해 special request에 영향을 주는 요인을 분석한다.
1. 객실 유형에 따른 special request
특별한 객실을 예약한 고객일수록 특별 요청 수도 자연스럽게 많았을 것으로 예상했기 때문에 분석을 진행하였다.


2. 방문객 유형에 따른 special request
어린이 동반 고객이나 인원이 많을 때 special request도 늘지 않을까 생각하여 분석을 진행하였다.


분석 결과, 어린이 동반 고객은 특병 요청 수가 많은 것을 알 수 있었으나 인원에는 크게 영향을 받지 않음을 알 수 있었다.
이에 반해 성인만 예약한 경우는 인원이 많을수록 특별 요청 수가 늘어나는 것을 확인할 수 있었다.
어린이만 예약한 경우는 높은 특별 요청 수를 갖음을 확인할 수 있었다.
3. 식사 유형에 따른 special request
호텔 식사를 신청한 경우에 special request도 높지 않을까 생각하여 분석을 진행하였다.


호텔 식사를 신청한 고객과 신청하지 않은 고객의 평균 특별 요청 수는 크게 차지 나지 않았으며, 식사 유형을 세분화하여도 큰 차이는 없었다.
따라서 식사 유형과 특별 요청 간의 관계성이 거의 없다고 판단하였다.
1) Price
Price는 예약 취소율과 비례 관계
(요일별) 고객이 주중에만 숙박하는 것으로 호텔을 예약했을 때 가격이 높아졌다.
(월별) 7, 8, 9월에 숙박을 예약했을 때 평소보다 가격이 높아졌다.
(예약방식별) online을 통한 예약 가격이 타 플랫폼을 통한 예약보다 가격이 높았다.
2) Lead time
Lead Time은 예약 취소율과 비례 관계
(월별) 고객이 6월, 7월, 8월, 9월, 10월에 예약했을 때 Lead Time 유독 길었다.
(월별-요일별) 해당 달에서도 주중과 주말 모두 숙박하는 것으로 예약했을 때 Lead Time이 길었다.
(객실 유형별) 객실 유형에는 Lead Time이 크게 영향받지 않았다.
3) Special request
Special Request는 예약 취소율과 반비례 관계
(고객유형별) 고객 중 어린이가 있을 시 Special Request가 많았고, 다수의 성인이 숙박을 예약했을 경우에 인원수와 요청 개수가 비례함을 확인했다.
(객실 유형, 식사 유형) 객실 유형과 호텔 식사 유형과는 유의미한 관계를 찾기 어려웠다.
결론을 바탕으로 예약 취소율을 개선하기 위해 다음과 같은 방안을 제시하였다.
평균 price가 올라가는 주중 및 7, 8, 9월에, 더 많은 멤버십 포인트를 적립시켜주는 행사나 한정 기간 특별 할인 등을 진행한다.
이를 통해 저렴한 가격으로 고객을 유인하되, 재방문까지 유도할 수 있을 것으로 기대할 수 있다.
online을 통해 예약하는 손님이 굉장히 많음에도 불구하고, online 가격이 타 예약 플랫폼에 비해 높으므로, online으로 예약하는 손님에게 멤버십 가입을 통한 적립 및 쿠폰 등의 혜택을 부여한다.
예약 경쟁의 지나친 과열로 인해 Lead Time이 길어지는 걸 막기 위해, 유독 가격이 높았던 7월 ~ 9월을 제외한 6월과 10월에 예약가를 적절하게 높임으로써 수요를 관리할 수 있을 것이다.
위 month 기간 중에서도 주중+주말 예약을 한 고객에게 프로모션을 실시하여 Lead Time을 줄일 수 있습니다. 예산이 넉넉하다면 호텔을 증설하여 과열된 예약 경쟁을 완화한다.
고객에 어린이가 포함된 경우, Special Request가 높아지므로 어린이를 유인할 수 있는 다양한 놀이 시설이나 부모 측을 위한 키즈 카페 등을 설치한다.
단체 손님에 대한 혜택 등을 제공하여 단체 예약을 유도하는 방안을 통해 Special Request를 높임으로써 취소율을 개선할 수 있다.