본문 바로가기

카테고리 없음

[Kaggle] Hotel Booking Demand 데이터셋 분석 3-2 (데이터 시각화 / 리뷰)

728x90

이전 내용은 아래 글에서 확인 하실 수 있습니다.

[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 타입 객실이 평균 일일 숙박비가 높습니다.
   - 보증금이 없는 경우 평균 일일 숙박비가 다른 경우에 비해 더 높습니다. 
   - 예약 취소를 한 경우 평균 일일 숙박비가 조금 높지만 큰 차이가 없습니다.

728x90