이전 내용은 아래 글에서 확인 하실 수 있습니다.
[Data Analysis/Kaggle] - [Kaggle] Hotel Booking Demand 데이터셋 분석 1 (데이터 확인 / 질문)
[Kaggle] Hotel Booking Demand 데이터셋 분석 1 (데이터 확인 / 질문)
Hotel Booking Demand 데이터셋 분석 데이터셋 개요 : 도시 및 리조트 호텔의 예약정보 데이터 분석 목적 : 호텔 객실 예약 및 취소에 대한 정보 분석 데이터셋 출처 : https://www.kaggle.com/jessemo..
sks8410.tistory.com
[Data Analysis/Kaggle] - [Kaggle] Hotel Booking Demand 데이터셋 분석 2 (데이터 전처리)
[Kaggle] Hotel Booking Demand 데이터셋 분석 2 (데이터 전처리)
이전 내용은 아래 글에서 확인하실 수 있습니다. [Data Analysis/Kaggle] - [Kaggle] Hotel Booking Demand 데이터셋 분석 1 (데이터 확인 / 질문) [Kaggle] Hotel Booking Demand 데이터셋 분석 1 (데이터 확인 /..
sks8410.tistory.com
[Data Analysis/Kaggle] - [Kaggle] Hotel Booking Demand 데이터셋 분석 3-1 (데이터 시각화)
[Kaggle] Hotel Booking Demand 데이터셋 분석 3-1 (데이터 시각화)
이전 내용은 아래 글에서 확인 하실 수 있습니다. [Data Analysis/Kaggle] - [Kaggle] Hotel Booking Demand 데이터셋 분석 1 (데이터 확인 / 질문) [Kaggle] Hotel Booking Demand 데이터셋 분석 1 (데이터 확인..
sks8410.tistory.com
4-9 가장 많이 예약하는 세그먼트와 가장 많이 취소하는 세그먼트는?
# 세그먼트별 예약/취소 현황 시각화
fig = make_subplots(rows = 1, cols = 2, specs = [[{"type" : "xy"}, {"type" : "pie"}]],
subplot_titles = ("세그먼트별 예약/취소 현황", "세그먼트별 예약 취소 비율"))
fig.add_trace(
go.Bar(x = hotel_booked["market_segment"].value_counts().index,
y = hotel_booked["market_segment"].value_counts().values,
name = "Booked"),
row = 1, col = 1
)
fig.add_trace(
go.Bar(x = hotel_canceled["market_segment"].value_counts().index,
y = hotel_canceled["market_segment"].value_counts().values,
name = "Canceled"),
row = 1, col = 1
)
fig.add_trace(
go.Pie(labels = hotel_canceled["market_segment"].value_counts().index,
values = hotel_canceled["market_segment"].value_counts().values,
showlegend = False),
row = 1, col = 2
)
fig.update_traces(
textinfo = "label + percent",
row = 1, col = 2
)
fig.update_layout(
title = dict(
text = "<b>세그먼트별 예약/취소 현황</b>",
font_size = 20
),
legend = dict(
orientation = "h",
yanchor = "bottom",
y = 0.8,
xanchor = "right",
x = 0.45
),
template = "plotly_white"
)
fig.show()
Online TA 가 가장 많은 예약과 취소가 되는 세그먼트 입니다.
Groups 의 경우 예약 취소 비율이 두번째로 높으며 예약 완료보다 취소되는 비율이 더 높습니다.
4-10 재 방문 여부와 예약 취소와의 관계는?
# 재 방문 여부와 예약 취소 현황 시각화
fig = make_subplots(rows = 1, cols = 2)
fig.add_trace(
go.Bar(x = ["No", "Yes"],
y = hotel["repeated_guest"].value_counts().values,
marker_color = color_1, showlegend = False),
row = 1, col = 1
)
fig.add_trace(
go.Bar(x = ["No", "Yes"],
y = hotel_booked["repeated_guest"].value_counts().values,
name = "Booked"),
row = 1, col = 2
)
fig.add_trace(
go.Bar(x = ["No", "Yes"],
y = hotel_canceled["repeated_guest"].value_counts().values,
name = "Canceled"),
row = 1, col = 2
)
fig.update_xaxes(title = "재 방문 여부")
fig.update_layout(
title = dict(
text = "<b>재 방문 여부와 예약 취소 현황</b>",
font_size = 20
),
template = "plotly_white"
)
fig.show()
처음 방문인 고객이 재 방문인 고객보다 월등히 많고 예약 완료 및 취소 수가 모두 높습니다.
4-11 예약 객실과 배정된 객실이 동일할까?
# 예약 객실 수와 배정 객실 수 시각화
fig = make_subplots(rows = 1, cols = 2)
fig.add_trace(
go.Bar(x = hotel_booked["reserved_room_type"].value_counts().index,
y = hotel_booked["reserved_room_type"].value_counts().values,
marker_color = color_1),
row = 1, col = 1
)
fig.add_trace(
go.Bar(x = hotel_booked["assigned_room_type"].value_counts().index,
y = hotel_booked["assigned_room_type"].value_counts().values,
marker_color = color_1),
row = 1, col = 2
)
fig.update_xaxes(title = "예약 객실 타입", row = 1, col = 1)
fig.update_xaxes(title = "배정 객실 타입", row = 1, col = 2)
fig.update_layout(
title = dict(
text = "<b>예약 객실 수와 배정 객실 수 시각화</b>",
font_size = 20
),
showlegend = False,
template = "plotly_white"
)
fig.show()
A 타입 객실이 가장 많이 예약 및 배정 되었으며 예약 객실 타입 수와 배정 객실 타입 수가 크게 차이가 나지 않습니다.
# 예약 객실과 배정 객실이 동일할 경우 True, 다를 경우 False 를 반환하는 함수 설정
def room_type_check(x):
if x["reserved_room_type"] == x["assigned_room_type"]:
return True
else:
return False
# 반환된 값을 result_room_type 컬럼에 등록
hotel_booked["result_room_type"] = hotel_booked.apply(room_type_check, axis = 1)
hotel_booked["result_room_type"].head()
# 예약 객실과 배정 객실 동일 비율 시각화
fig = px.pie(labels = hotel_booked["result_room_type"].value_counts().index,
values = hotel_booked["result_room_type"].value_counts().values,
names = ["동일", "다름"])
fig.update_traces(
textinfo = "label + percent + value",
textfont_size = 15,
textfont_color = "white"
)
fig.update_layout(
title = dict(
text = "<b>예약 객실과 배정 객실 동일 비율</b>",
font_size = 20
)
)
fig.show()
예약 객실과 배정 객실이 동일할 경우는 약 81.4% 이며 약 18.6% 정도가 예약과 다른 객실을 배정 받습니다.
4-12 예약 후 변경한 횟수가 얼마나 될까?
# 호텔 방문/취소한 고객별 예약 후 변경 횟수 시각화
fig = make_subplots(rows = 1, cols = 2)
fig.add_trace(
go.Bar(x = hotel_booked["booking_changes"].value_counts().index,
y = hotel_booked["booking_changes"].value_counts().values,
marker_color = color_1),
row = 1, col = 1
)
fig.add_trace(
go.Bar(x = hotel_canceled["booking_changes"].value_counts().index,
y = hotel_canceled["booking_changes"].value_counts().values,
marker_color = color_1),
row = 1, col = 2
)
fig.update_xaxes(title = "호텔 방문 고객", dtick = 1, row = 1, col = 1)
fig.update_xaxes(title = "예약 취소 고객", dtick = 1, row = 1, col = 2)
fig.update_layout(
title = dict(
text = "<b>호텔 방문/취소한 고객별 예약 후 변경 횟수</b>",
font_size = 20
),
showlegend = False,
template = "plotly_white"
)
fig.show()
방문/취소 여부에 관계없이 대부분 예약 후 변경을 하지 않으며 1번 변경을 하는 고객이 그 다음으로 많습니다.
4-13 보증금과 예약 취소와의 관계는?
# 보증금 종류 시각화
hotel["deposit_type"].value_counts().iplot(kind = "bar",
layout = dict(
title = dict(
text = "<b>보증금 종류</b>",
font_size = 20
),
template = "plotly_white"
))
보증금이 없는 경우가 가장 많습니다.
# 보증금 종류와 취소 여부 시각화
fig = make_subplots(rows = 1, cols = 2, specs = [[{"type" : "pie"}, {"type" : "pie"}]])
fig.add_trace(
go.Pie(labels = hotel_booked["deposit_type"].value_counts().index,
values = hotel_booked["deposit_type"].value_counts().values),
row = 1, col = 1
)
fig.add_trace(
go.Pie(labels = hotel_canceled["deposit_type"].value_counts().index,
values = hotel_canceled["deposit_type"].value_counts().values),
row = 1, col = 2
)
fig.update_traces(
textinfo = "label + percent + value",
textfont_size = 15,
textfont_color = "white",
hole = .4
)
fig.update_layout(
title = dict(
text = "<b>보증금 종류별 예약 취소 비율</b>",
font_size = 20
),
showlegend = False,
# 파이 차트 가운데 글씨 넣기
annotations = [dict(text = "호텔 방문",
x = 0.19,
y = 0.505,
font_size = 15,
showarrow = False),
dict(text = "예약 취소",
x = 0.81,
y = 0.5,
font_size = 15,
showarrow = False)]
)
fig.show()
예약 취소의 경우 보증금이 없는 경우를 제외하면 환불 불가일때 예약 취소가 약 32.8%로 높게 나타납니다.
4-14 어떤 고객이 예약 취소를 많이 할까?
# 고객 유형 시각화
hotel["customer_type"].value_counts().iplot(kind = "bar",
layout = dict(
title = dict(
text = "<b>고객 유형</b>",
font_size = 20
),
template = "plotly_white"
))
Transient(단기 체류) 고객이 가장 많습니다.
# 보증금 종류와 취소 여부 시각화
fig = make_subplots(rows = 1, cols = 2, specs = [[{"type" : "pie"}, {"type" : "pie"}]])
fig.add_trace(
go.Pie(labels = hotel_booked["customer_type"].value_counts().index,
values = hotel_booked["customer_type"].value_counts().values),
row = 1, col = 1
)
fig.add_trace(
go.Pie(labels = hotel_canceled["customer_type"].value_counts().index,
values = hotel_canceled["customer_type"].value_counts().values),
row = 1, col = 2
)
fig.update_traces(
textinfo = "label + percent + value",
textfont_size = 15,
textfont_color = "black",
textposition = "outside",
hole = .4
)
fig.update_layout(
title = dict(
text = "<b>고객 유형별 예약 취소 비율</b>",
font_size = 20
),
showlegend = False,
# 파이 차트 가운데 글씨 넣기
annotations = [dict(text = "호텔 방문",
x = 0.19,
y = 0.505,
font_size = 15,
showarrow = False),
dict(text = "예약 취소",
x = 0.81,
y = 0.5,
font_size = 15,
showarrow = False)]
)
fig.show()
예약 취소 여부에 상관 없이 Transient 고객이 가장 많습니다.
4-15 평균 일일 숙박비와 예약 취소와의 관계는?
# 평균 일일 숙박비 분포 시각화
hotel_booked["adr"].iplot(kind = "box",
layout = dict(
title = dict(
text = "<b>평균 일일 숙박비 분포</b>",
font_size = 20
),
template = "plotly_white"
))
호텔의 평균 일일 숙박비는 대부분 100 근처에 분포해 있습니다.
# 호텔 종류별 평균 일일 숙박비 시각화
fig = px.box(x = hotel_booked["hotel_type"], y = hotel_booked["adr"])
fig.update_layout(
title = dict(
text = "<b>호텔 종류별 평균 일일 숙박비</b>",
font_size = 20
),
template = "plotly_white"
)
fig.show()
City Hotel 이 Resort Hotel 보다 평균 일일 숙박비가 더 높습니다.
# 연도별/월별 평균 일일 숙박비 시각화
f, ax = plt.subplots(1, 2, figsize = (16, 10))
order = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"]
sns.boxplot(data = hotel_booked, x = "arrival_date_year", y = "adr", ax = ax[0])
sns.boxplot(data = hotel_booked, x = "arrival_date_month", y = "adr", order = order, ax = ax[1])
ax[0].set_title("연도별 평균 일일 숙박비", size = 15)
ax[1].set_title("월별 평균 일일 숙박비", size = 15)
ax[1].set_xticklabels(ax[1].get_xticklabels(),rotation = 90)
plt.show()
2017년이 가장 평균 일일 숙박비가 높으며 매년 숙박비가 올라가는 경향을 보입니다.
8월에 가장 평균 일일 숙박비가 높으며 여름 숙박비가 다른 달에 비해 높은 경향을 보입니다.
# 객실 타입에 따른 평균 일일 숙박비 시각화
hotel_filtered = hotel[hotel["adr"] < 5400] # 숙박비가 5,400 이하인 데이터만 사용
fig = px.box(x = hotel_filtered["assigned_room_type"], y = hotel_filtered["adr"])
fig.update_layout(
title = dict(
text = "<b>객실 타입별 평균 일일 숙박비</b>",
font_size = 20
),
xaxis = dict(title = "객실 타입"),
yaxis = dict(title = "평균 일일 숙박비"),
template = "plotly_white"
)
fig.show()
H, G 타입 객실이 평균 일일 숙박비가 높습니다.
# 보증금 타입에 따른 평균 일일 숙박비
fig = px.box(x = hotel_filtered["deposit_type"], y = hotel_filtered["adr"])
fig.update_layout(
title = dict(
text = "<b>보증금 종류별 평균 일일 숙박비</b>",
font_size = 20
),
xaxis = dict(title = "보증금 종류"),
yaxis = dict(title = "평균 일일 숙박비"),
template = "plotly_white"
)
fig.show()
보증금이 없는 경우 평균 일일 숙박비가 다른 경우에 비해 더 높습니다.
# 예약 취소 여부별 평균 일일 숙박비 시각화
fig = px.box(x = hotel_filtered["canceled"], y = hotel_filtered["adr"])
fig.update_layout(
title = dict(
text = "<b>예약 취소 여부별 평균 일일 숙박비</b>",
font_size = 20
),
xaxis = dict(title = "예약 취소 여부(0:No / 1:Yes)"),
yaxis = dict(title = "평균 일일 숙박비"),
template = "plotly_white"
)
fig.show()
예약 취소를 한 경우 평균 일일 숙박비가 조금 높지만 큰 차이가 없습니다.
5. Review
1) 호텔 종류와 예약 취소와의 관계는?
- 호텔은 City Hotel, Resort Hotel 두가지가 있으며 City Hotel 이 더 많이 있습니다.
- 전체 예약 고객 중 약 37.1% 가 예약 취소를 하며, City Hotel 의 경우 전체 예약 고객 중 약 41.7% 가 취소를 하고, Resort Hotel 의 경우 전체 예약 고객 중 약 28% 가 취소를 합니다.
- Resort Hotel 이 City Hotel 보다 예약 취소율이 더 낮습니다.
2) 리드 타임과 예약 취소와의 관계는?
- lead time 은 대부분 200일 안쪽으로 몰려 있고, 리드 타임은 예약 취소 여부에 크게 영향을 미치지 않습니다.
3) 언제 방문을 가장 많이 할까?
- 2016년도에 가장 많이 호텔에 방문 했으며 주로 7,8월(여름)에 방문이 많습니다.
4) 언제 예약 취소를 가장 많이 할까?
- 2016년에 가장 예약 취소가 많고 8월에 가장 예약 취소가 많습니다.
5) 호텔에 얼마나 숙박을 할까?
- City Hotel 의 경우 대부분 1일 ~ 4일 숙박을 하고, Resort Hotel 의 경우도 1일 ~ 4일 숙박하는 경우가 많지만 7일 숙박을 하는 경우가 두번째로 많은 것이 특징입니다.
6) 호텔에 숙박하는 가족 수는 얼마나 될까?
- 두 호텔 다 2인 가족의 방문이 가장 많습니다.
7) 호텔 식사 예약 비율은?
- 식사 종류는 BB, HB, FB, undefined/SC 총 4가지 이며, 식사 예약은 대부분 BB 를 예약 합니다.
8) 호텔에 가장 많이 방문하는 고객의 국가와 가장 많이 취소하는 고객의 국가는?
- 포르투갈 국적의 고객이 두 호텔에 모두 가장 많이 방문하고 가장 많이 취소하는 국가도 포르투갈 입니다.
- City Hotel 취소 비율이 Resort Hotel 보다 훨씬 높은 것이 특징입니다.
9) 가장 많이 예약하는 세그먼트와 가장 많이 취소하는 세그먼트는?
- Online TA 가 가장 많은 예약과 취소가 되는 세그먼트 입니다.
- Groups 의 경우 예약 취소 비율이 두번째로 높으며 예약보다 취소되는 비율이 더 높습니다.
10) 재 방문 여부와 예약 취소와의 관계는?
- 처음 방문인 고객이 재 방문인 고객보다 월등히 많고 예약 완료 및 취소 수가 모두 높습니다.
11) 예약 객실과 배정된 객실이 동일할까?
- A 타입 객실이 가장 많이 예약 및 배정 되었으며 예약 객실 타입 수와 배정 객실 타입 수가 크게 차이가 나지 않습니다.
- 예약 객실과 배정 객실이 동일할 경우는 약 81.4% 이며 약 18.6% 정도가 예약과 다른 객실을 배정 받습니다.
12) 예약 후 변경한 횟수가 얼마나 될까?
- 방문/취소 여부에 관계없이 대부분 예약 후 변경을 하지 않으며 1번 변경을 하는 고객이 그 다음으로 많습니다.
13) 보증금과 예약 취소와의 관계는?
- 보증금이 없는 경우가 가장 많습니다.
- 예약 취소의 경우 환불 불가일때 예약 취소가 약 32.8%로 높게 나타납니다.
14) 고객 유형과 예약 취소와의 관계는?
- Transient(단기 체류) 고객이 가장 많이 숙박하고, 예약 취소도 Transient 고객이 가장 많습니다.
15) 평균 일일 숙박비와 예약 취소와의 관계는?
- 호텔의 평균 일일 숙박비는 대부분 100 근처에 분포해 있습니다.
- City Hotel 이 Resort Hotel 보다 평균 일일 숙박비가 더 높습니다.
- 2017년이 가장 평균 일일 숙박비가 높으며 매년 숙박비가 올라가는 경향을 보입니다.
- 8월에 가장 평균 일일 숙박비가 높으며 여름 숙박비가 다른 달에 비해 높은 경향을 보입니다.
- H, G 타입 객실이 평균 일일 숙박비가 높습니다.
- 보증금이 없는 경우 평균 일일 숙박비가 다른 경우에 비해 더 높습니다.
- 예약 취소를 한 경우 평균 일일 숙박비가 조금 높지만 큰 차이가 없습니다.