Introdução
Visão Geral
# O dataset "hotel_booking" contém informações de reservas feitas entre 1º de julho de 2015 e 31 de agosto de 2017
# para dois tipos de hotéis: "City Hotel" e "Resort Hotel". Este conjunto de dados contém 119.390 observações
# e 36 variáveis, incluindo dados sobre cancelamentos, tipos de clientes, tempo de estadia, e preferências de
# quartos. A análise busca identificar padrões sazonais, entender as razões por trás dos cancelamentos e explorar
# o comportamento dos hóspedes, com o objetivo de fornecer insights que possam ajudar na gestão de hotéis.
# As principais perguntas que este relatório visa responder incluem:
# 1. Quais são os fatores que mais influenciam os cancelamentos de reservas?
# 2. Como as reservas e cancelamentos variam ao longo do ano?
# 3. Quais são as preferências dos hóspedes em relação a tipos de quartos e serviços oferecidos pelos hotéis?
# 4. Qual é a duração média das estadias nos hotéis e como isso varia entre "City Hotel" e "Resort Hotel"?
# Essas questões serão respondidas através de uma série de análises exploratórias e visualizações de dados.
Objetivo
# O principal objetivo deste relatório é fornecer uma análise detalhada das reservas de hotéis para entender
# os padrões de comportamento dos clientes e as variáveis que afetam diretamente a operação dos hotéis.
# Com base nos dados, esperamos identificar:
# 1. Padrões sazonais que podem impactar a taxa de ocupação e a receita dos hotéis.
# 2. Fatores que influenciam diretamente o cancelamento de reservas, permitindo aos hotéis ajustar suas políticas de cancelamento.
# 3. Preferências dos hóspedes em termos de tipos de quartos e serviços, ajudando os hotéis a personalizar suas ofertas.
# 4. A duração média de estadia e como isso varia entre os dois tipos de hotéis (City Hotel e Resort Hotel), auxiliando na alocação eficiente de quartos.
# Ao fornecer esses insights, pretendemos apoiar os gestores hoteleiros na tomada de decisões estratégicas para otimizar a ocupação, reduzir cancelamentos e maximizar a satisfação dos clientes.
Carregamento dos Dados
# Pacotes utilizados
library(naniar)
library(ggplot2)
library(dplyr)
library(lubridate)
library(skimr)
# Carregando o dataset
hotel_booking <- read.csv("C:/Users/Arthu/Downloads/archive/hotel_booking.csv")
# Mostrando as primeiras linhas dos dados
head(hotel_booking)
## hotel is_canceled lead_time arrival_date_year arrival_date_month
## 1 Resort Hotel 0 342 2015 July
## 2 Resort Hotel 0 737 2015 July
## 3 Resort Hotel 0 7 2015 July
## 4 Resort Hotel 0 13 2015 July
## 5 Resort Hotel 0 14 2015 July
## 6 Resort Hotel 0 14 2015 July
## arrival_date_week_number arrival_date_day_of_month stays_in_weekend_nights
## 1 27 1 0
## 2 27 1 0
## 3 27 1 0
## 4 27 1 0
## 5 27 1 0
## 6 27 1 0
## stays_in_week_nights adults children babies meal country market_segment
## 1 0 2 0 0 BB PRT Direct
## 2 0 2 0 0 BB PRT Direct
## 3 1 1 0 0 BB GBR Direct
## 4 1 1 0 0 BB GBR Corporate
## 5 2 2 0 0 BB GBR Online TA
## 6 2 2 0 0 BB GBR Online TA
## distribution_channel is_repeated_guest previous_cancellations
## 1 Direct 0 0
## 2 Direct 0 0
## 3 Direct 0 0
## 4 Corporate 0 0
## 5 TA/TO 0 0
## 6 TA/TO 0 0
## previous_bookings_not_canceled reserved_room_type assigned_room_type
## 1 0 C C
## 2 0 C C
## 3 0 A C
## 4 0 A A
## 5 0 A A
## 6 0 A A
## booking_changes deposit_type agent company days_in_waiting_list customer_type
## 1 3 No Deposit NA NA 0 Transient
## 2 4 No Deposit NA NA 0 Transient
## 3 0 No Deposit NA NA 0 Transient
## 4 0 No Deposit 304 NA 0 Transient
## 5 0 No Deposit 240 NA 0 Transient
## 6 0 No Deposit 240 NA 0 Transient
## adr required_car_parking_spaces total_of_special_requests reservation_status
## 1 0 0 0 Check-Out
## 2 0 0 0 Check-Out
## 3 75 0 0 Check-Out
## 4 75 0 0 Check-Out
## 5 98 0 1 Check-Out
## 6 98 0 1 Check-Out
## reservation_status_date name email
## 1 2015-07-01 Ernest Barnes Ernest.Barnes31@outlook.com
## 2 2015-07-01 Andrea Baker Andrea_Baker94@aol.com
## 3 2015-07-02 Rebecca Parker Rebecca_Parker@comcast.net
## 4 2015-07-02 Laura Murray Laura_M@gmail.com
## 5 2015-07-03 Linda Hines LHines@verizon.com
## 6 2015-07-03 Jasmine Fletcher JFletcher43@xfinity.com
## phone.number credit_card
## 1 669-792-1661 ************4322
## 2 858-637-6955 ************9157
## 3 652-885-2745 ************3734
## 4 364-656-8427 ************5677
## 5 713-226-5883 ************5498
## 6 190-271-6743 ************9263
# Verificando a estrutura do dataset
str(hotel_booking)
## 'data.frame': 119390 obs. of 36 variables:
## $ hotel : chr "Resort Hotel" "Resort Hotel" "Resort Hotel" "Resort Hotel" ...
## $ is_canceled : int 0 0 0 0 0 0 0 0 1 1 ...
## $ lead_time : int 342 737 7 13 14 14 0 9 85 75 ...
## $ arrival_date_year : int 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
## $ arrival_date_month : chr "July" "July" "July" "July" ...
## $ arrival_date_week_number : int 27 27 27 27 27 27 27 27 27 27 ...
## $ arrival_date_day_of_month : int 1 1 1 1 1 1 1 1 1 1 ...
## $ stays_in_weekend_nights : int 0 0 0 0 0 0 0 0 0 0 ...
## $ stays_in_week_nights : int 0 0 1 1 2 2 2 2 3 3 ...
## $ adults : int 2 2 1 1 2 2 2 2 2 2 ...
## $ children : num 0 0 0 0 0 0 0 0 0 0 ...
## $ babies : int 0 0 0 0 0 0 0 0 0 0 ...
## $ meal : chr "BB" "BB" "BB" "BB" ...
## $ country : chr "PRT" "PRT" "GBR" "GBR" ...
## $ market_segment : chr "Direct" "Direct" "Direct" "Corporate" ...
## $ distribution_channel : chr "Direct" "Direct" "Direct" "Corporate" ...
## $ is_repeated_guest : int 0 0 0 0 0 0 0 0 0 0 ...
## $ previous_cancellations : int 0 0 0 0 0 0 0 0 0 0 ...
## $ previous_bookings_not_canceled: int 0 0 0 0 0 0 0 0 0 0 ...
## $ reserved_room_type : chr "C" "C" "A" "A" ...
## $ assigned_room_type : chr "C" "C" "C" "A" ...
## $ booking_changes : int 3 4 0 0 0 0 0 0 0 0 ...
## $ deposit_type : chr "No Deposit" "No Deposit" "No Deposit" "No Deposit" ...
## $ agent : num NA NA NA 304 240 240 NA 303 240 15 ...
## $ company : num NA NA NA NA NA NA NA NA NA NA ...
## $ days_in_waiting_list : int 0 0 0 0 0 0 0 0 0 0 ...
## $ customer_type : chr "Transient" "Transient" "Transient" "Transient" ...
## $ adr : num 0 0 75 75 98 ...
## $ required_car_parking_spaces : int 0 0 0 0 0 0 0 0 0 0 ...
## $ total_of_special_requests : int 0 0 0 0 1 1 0 1 1 0 ...
## $ reservation_status : chr "Check-Out" "Check-Out" "Check-Out" "Check-Out" ...
## $ reservation_status_date : chr "2015-07-01" "2015-07-01" "2015-07-02" "2015-07-02" ...
## $ name : chr "Ernest Barnes" "Andrea Baker" "Rebecca Parker" "Laura Murray" ...
## $ email : chr "Ernest.Barnes31@outlook.com" "Andrea_Baker94@aol.com" "Rebecca_Parker@comcast.net" "Laura_M@gmail.com" ...
## $ phone.number : chr "669-792-1661" "858-637-6955" "652-885-2745" "364-656-8427" ...
## $ credit_card : chr "************4322" "************9157" "************3734" "************5677" ...
# Resumo das variáveis
summary(hotel_booking)
## hotel is_canceled lead_time arrival_date_year
## Length:119390 Min. :0.0000 Min. : 0 Min. :2015
## Class :character 1st Qu.:0.0000 1st Qu.: 18 1st Qu.:2016
## Mode :character Median :0.0000 Median : 69 Median :2016
## Mean :0.3704 Mean :104 Mean :2016
## 3rd Qu.:1.0000 3rd Qu.:160 3rd Qu.:2017
## Max. :1.0000 Max. :737 Max. :2017
##
## arrival_date_month arrival_date_week_number arrival_date_day_of_month
## Length:119390 Min. : 1.00 Min. : 1.0
## Class :character 1st Qu.:16.00 1st Qu.: 8.0
## Mode :character Median :28.00 Median :16.0
## Mean :27.17 Mean :15.8
## 3rd Qu.:38.00 3rd Qu.:23.0
## Max. :53.00 Max. :31.0
##
## stays_in_weekend_nights stays_in_week_nights adults
## Min. : 0.0000 Min. : 0.0 Min. : 0.000
## 1st Qu.: 0.0000 1st Qu.: 1.0 1st Qu.: 2.000
## Median : 1.0000 Median : 2.0 Median : 2.000
## Mean : 0.9276 Mean : 2.5 Mean : 1.856
## 3rd Qu.: 2.0000 3rd Qu.: 3.0 3rd Qu.: 2.000
## Max. :19.0000 Max. :50.0 Max. :55.000
##
## children babies meal country
## Min. : 0.0000 Min. : 0.000000 Length:119390 Length:119390
## 1st Qu.: 0.0000 1st Qu.: 0.000000 Class :character Class :character
## Median : 0.0000 Median : 0.000000 Mode :character Mode :character
## Mean : 0.1039 Mean : 0.007949
## 3rd Qu.: 0.0000 3rd Qu.: 0.000000
## Max. :10.0000 Max. :10.000000
## NA's :4
## market_segment distribution_channel is_repeated_guest
## Length:119390 Length:119390 Min. :0.00000
## Class :character Class :character 1st Qu.:0.00000
## Mode :character Mode :character Median :0.00000
## Mean :0.03191
## 3rd Qu.:0.00000
## Max. :1.00000
##
## previous_cancellations previous_bookings_not_canceled reserved_room_type
## Min. : 0.00000 Min. : 0.0000 Length:119390
## 1st Qu.: 0.00000 1st Qu.: 0.0000 Class :character
## Median : 0.00000 Median : 0.0000 Mode :character
## Mean : 0.08712 Mean : 0.1371
## 3rd Qu.: 0.00000 3rd Qu.: 0.0000
## Max. :26.00000 Max. :72.0000
##
## assigned_room_type booking_changes deposit_type agent
## Length:119390 Min. : 0.0000 Length:119390 Min. : 1.00
## Class :character 1st Qu.: 0.0000 Class :character 1st Qu.: 9.00
## Mode :character Median : 0.0000 Mode :character Median : 14.00
## Mean : 0.2211 Mean : 86.69
## 3rd Qu.: 0.0000 3rd Qu.:229.00
## Max. :21.0000 Max. :535.00
## NA's :16340
## company days_in_waiting_list customer_type adr
## Min. : 6.0 Min. : 0.000 Length:119390 Min. : -6.38
## 1st Qu.: 62.0 1st Qu.: 0.000 Class :character 1st Qu.: 69.29
## Median :179.0 Median : 0.000 Mode :character Median : 94.58
## Mean :189.3 Mean : 2.321 Mean : 101.83
## 3rd Qu.:270.0 3rd Qu.: 0.000 3rd Qu.: 126.00
## Max. :543.0 Max. :391.000 Max. :5400.00
## NA's :112593
## required_car_parking_spaces total_of_special_requests reservation_status
## Min. :0.00000 Min. :0.0000 Length:119390
## 1st Qu.:0.00000 1st Qu.:0.0000 Class :character
## Median :0.00000 Median :0.0000 Mode :character
## Mean :0.06252 Mean :0.5714
## 3rd Qu.:0.00000 3rd Qu.:1.0000
## Max. :8.00000 Max. :5.0000
##
## reservation_status_date name email
## Length:119390 Length:119390 Length:119390
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## phone.number credit_card
## Length:119390 Length:119390
## Class :character Class :character
## Mode :character Mode :character
##
##
##
##
Limpeza de Dados
# Removendo colunas artificiais (como 'name', 'email', 'phone-number', 'credit_card')
hotel_booking <- hotel_booking %>%
select(-c(name, email, phone.number, credit_card))
# Verificando se há valores ausentes
sum(is.na(hotel_booking))
## [1] 128937
# Visualizando os valores ausentes graficamente
gg_miss_var(hotel_booking)

# Removendo valores ausentes
hotel_booking_clean <- na.omit(hotel_booking)
# Convertendo colunas de datas (arrival_date_year, arrival_date_month, arrival_date_day_of_month)
hotel_booking_clean$arrival_date <- as.Date(with(hotel_booking_clean,
paste(arrival_date_year, arrival_date_month, arrival_date_day_of_month, sep="-")),
format = "%Y-%B-%d")
# Verificando a limpeza inicial
skim(hotel_booking_clean)
## Warning: There was 1 warning in `dplyr::summarize()`.
## ℹ In argument: `dplyr::across(tidyselect::any_of(variable_names),
## mangled_skimmers$funs)`.
## ℹ In group 0: .
## Caused by warning:
## ! There were 2 warnings in `dplyr::summarize()`.
## The first warning was:
## ℹ In argument: `dplyr::across(tidyselect::any_of(variable_names),
## mangled_skimmers$funs)`.
## Caused by warning in `min.default()`:
## ! nenhum argumento não faltante para min; retornando Inf
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
Data summary
| Name |
hotel_booking_clean |
| Number of rows |
217 |
| Number of columns |
33 |
| _______________________ |
|
| Column type frequency: |
|
| character |
12 |
| Date |
1 |
| numeric |
20 |
| ________________________ |
|
| Group variables |
None |
Variable type: character
| hotel |
0 |
1 |
10 |
12 |
0 |
2 |
0 |
| arrival_date_month |
0 |
1 |
3 |
9 |
0 |
12 |
0 |
| meal |
0 |
1 |
2 |
2 |
0 |
4 |
0 |
| country |
0 |
1 |
3 |
3 |
0 |
18 |
0 |
| market_segment |
0 |
1 |
6 |
13 |
0 |
6 |
0 |
| distribution_channel |
0 |
1 |
3 |
9 |
0 |
4 |
0 |
| reserved_room_type |
0 |
1 |
1 |
1 |
0 |
5 |
0 |
| assigned_room_type |
0 |
1 |
1 |
1 |
0 |
9 |
0 |
| deposit_type |
0 |
1 |
10 |
10 |
0 |
3 |
0 |
| customer_type |
0 |
1 |
5 |
15 |
0 |
4 |
0 |
| reservation_status |
0 |
1 |
7 |
9 |
0 |
3 |
0 |
| reservation_status_date |
0 |
1 |
10 |
10 |
0 |
76 |
0 |
Variable type: Date
| arrival_date |
217 |
0 |
Inf |
-Inf |
NA |
0 |
Variable type: numeric
| is_canceled |
0 |
1 |
0.08 |
0.27 |
0 |
0 |
0 |
0 |
1 |
▇▁▁▁▁ |
| lead_time |
0 |
1 |
40.52 |
61.75 |
0 |
12 |
27 |
36 |
364 |
▇▁▁▁▁ |
| arrival_date_year |
0 |
1 |
2015.47 |
0.72 |
2015 |
2015 |
2015 |
2016 |
2017 |
▇▁▂▁▂ |
| arrival_date_week_number |
0 |
1 |
38.20 |
12.89 |
1 |
33 |
45 |
46 |
53 |
▁▁▁▁▇ |
| arrival_date_day_of_month |
0 |
1 |
10.82 |
7.58 |
1 |
6 |
9 |
13 |
31 |
▇▇▂▁▂ |
| stays_in_weekend_nights |
0 |
1 |
1.57 |
1.49 |
0 |
0 |
2 |
2 |
9 |
▇▇▁▁▁ |
| stays_in_week_nights |
0 |
1 |
4.63 |
3.55 |
0 |
2 |
4 |
6 |
21 |
▇▅▂▁▁ |
| adults |
0 |
1 |
1.41 |
0.52 |
1 |
1 |
1 |
2 |
3 |
▇▁▅▁▁ |
| children |
0 |
1 |
0.04 |
0.23 |
0 |
0 |
0 |
0 |
2 |
▇▁▁▁▁ |
| babies |
0 |
1 |
0.00 |
0.00 |
0 |
0 |
0 |
0 |
0 |
▁▁▇▁▁ |
| is_repeated_guest |
0 |
1 |
0.07 |
0.25 |
0 |
0 |
0 |
0 |
1 |
▇▁▁▁▁ |
| previous_cancellations |
0 |
1 |
0.01 |
0.14 |
0 |
0 |
0 |
0 |
2 |
▇▁▁▁▁ |
| previous_bookings_not_canceled |
0 |
1 |
0.15 |
0.72 |
0 |
0 |
0 |
0 |
7 |
▇▁▁▁▁ |
| booking_changes |
0 |
1 |
1.29 |
1.25 |
0 |
0 |
1 |
2 |
6 |
▇▃▁▁▁ |
| agent |
0 |
1 |
202.62 |
111.49 |
5 |
185 |
185 |
324 |
444 |
▃▁▇▅▁ |
| company |
0 |
1 |
262.11 |
103.60 |
9 |
281 |
281 |
281 |
499 |
▂▁▇▂▁ |
| days_in_waiting_list |
0 |
1 |
0.00 |
0.00 |
0 |
0 |
0 |
0 |
0 |
▁▁▇▁▁ |
| adr |
0 |
1 |
63.79 |
38.82 |
0 |
40 |
48 |
85 |
246 |
▇▃▂▁▁ |
| required_car_parking_spaces |
0 |
1 |
0.09 |
0.29 |
0 |
0 |
0 |
0 |
1 |
▇▁▁▁▁ |
| total_of_special_requests |
0 |
1 |
0.20 |
0.55 |
0 |
0 |
0 |
0 |
3 |
▇▁▁▁▁ |
Análise de Cancelamentos
1. Taxa de Cancelamento Geral:
# Calculando a taxa de cancelamento
cancel_rate <- hotel_booking_clean %>%
summarise(taxa_cancelamento = mean(is_canceled) * 100)
# Exibindo a taxa de cancelamento
cancel_rate
## taxa_cancelamento
## 1 7.834101
2. Cancelamentos por Tipo de Hotel:
# Calculando a taxa de cancelamento por tipo de hotel
cancel_by_hotel_type <- hotel_booking_clean %>%
group_by(hotel) %>%
summarise(taxa_cancelamento = mean(is_canceled) * 100)
# Visualizando com um gráfico de barras
ggplot(cancel_by_hotel_type, aes(x = hotel, y = taxa_cancelamento, fill = hotel)) +
geom_bar(stat = "identity") +
labs(title = "Taxa de Cancelamento por Tipo de Hotel",
x = "Tipo de Hotel",
y = "Taxa de Cancelamento (%)") +
scale_fill_manual(values = c("City Hotel" = "lightblue", "Resort Hotel" = "lightgreen"))

3. Cancelamentos por Mês:
# Agrupando por mês e calculando a taxa de cancelamento
cancel_by_month <- hotel_booking_clean %>%
group_by(arrival_date_month) %>%
summarise(taxa_cancelamento = mean(is_canceled) * 100)
# Ordenando os meses no formato correto
cancel_by_month$arrival_date_month <- factor(cancel_by_month$arrival_date_month,
levels = month.name)
# Visualizando a taxa de cancelamento por mês
ggplot(cancel_by_month, aes(x = arrival_date_month, y = taxa_cancelamento, group = 1)) +
geom_line(color = "blue") +
geom_point() +
labs(title = "Taxa de Cancelamento por Mês",
x = "Mês",
y = "Taxa de Cancelamento (%)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

4. Cancelamentos por Lead Time:
# Relacionando o tempo de antecedência da reserva com o cancelamento
ggplot(hotel_booking_clean, aes(x = lead_time, fill = factor(is_canceled))) +
geom_histogram(binwidth = 10, position = "dodge") +
labs(title = "Cancelamentos vs Lead Time",
x = "Lead Time (dias)",
fill = "Cancelamento") +
scale_fill_manual(values = c("0" = "lightblue", "1" = "red"))

5. Cancelamentos por Segmento de Mercado:
# Calculando a taxa de cancelamento por segmento de mercado
cancel_by_segment <- hotel_booking_clean %>%
group_by(market_segment) %>%
summarise(taxa_cancelamento = mean(is_canceled) * 100)
# Visualizando com gráfico de barras
ggplot(cancel_by_segment, aes(x = market_segment, y = taxa_cancelamento, fill = market_segment)) +
geom_bar(stat = "identity") +
labs(title = "Taxa de Cancelamento por Segmento de Mercado",
x = "Segmento de Mercado",
y = "Taxa de Cancelamento (%)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set3")

Padrões de Sazonalidade
1. Reservas por Mês:
# Agrupando por mês e contando o número de reservas
reservas_por_mes <- hotel_booking_clean %>%
group_by(arrival_date_month, hotel) %>%
summarise(reservas = n(), .groups = "drop")
# Ordenando os meses corretamente
reservas_por_mes$arrival_date_month <- factor(reservas_por_mes$arrival_date_month,
levels = month.name)
# Gráfico de linha mostrando a quantidade de reservas por mês
ggplot(reservas_por_mes, aes(x = arrival_date_month, y = reservas, group = 1)) +
geom_line(color = "blue") +
geom_point() +
labs(title = "Número de Reservas por Mês",
x = "Mês",
y = "Número de Reservas") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

2. Reservas por Mês e Tipo de Hotel:
# Agrupando por mês e tipo de hotel
reservas_por_mes_hotel <- hotel_booking_clean %>%
group_by(arrival_date_month, hotel) %>%
summarise(reservas = n())
## `summarise()` has grouped output by 'arrival_date_month'. You can override
## using the `.groups` argument.
# Ordenando os meses corretamente
reservas_por_mes_hotel$arrival_date_month <- factor(reservas_por_mes_hotel$arrival_date_month,
levels = month.name)
# Gráfico de linha mostrando a quantidade de reservas por mês para cada tipo de hotel
ggplot(reservas_por_mes_hotel, aes(x = arrival_date_month, y = reservas, color = hotel, group = hotel)) +
geom_line() +
geom_point() +
labs(title = "Número de Reservas por Mês e Tipo de Hotel",
x = "Mês",
y = "Número de Reservas") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_color_manual(values = c("City Hotel" = "blue", "Resort Hotel" = "green"))

Duração Média de Estadia
1. Duração Média de Estadia por Tipo de Hotel:
# Calculando a duração média de estadia (fins de semana + dias de semana) por tipo de hotel
duracao_media_estadia <- hotel_booking_clean %>%
group_by(hotel) %>%
summarise(
duracao_media = mean(stays_in_weekend_nights + stays_in_week_nights),
duracao_median = median(stays_in_weekend_nights + stays_in_week_nights)
)
# Visualizando a duração média de estadia
duracao_media_estadia
## # A tibble: 2 × 3
## hotel duracao_media duracao_median
## <chr> <dbl> <dbl>
## 1 City Hotel 2.89 2
## 2 Resort Hotel 7.11 7
2. Gráfico de Boxplot para Duração de Estadia:
# Gráfico de boxplot mostrando a distribuição da duração de estadia por tipo de hotel
ggplot(hotel_booking_clean, aes(x = hotel, y = stays_in_weekend_nights + stays_in_week_nights, fill = hotel)) +
geom_boxplot() +
labs(title = "Distribuição da Duração de Estadia por Tipo de Hotel",
x = "Tipo de Hotel",
y = "Duração da Estadia (Noites)") +
scale_fill_manual(values = c("City Hotel" = "lightblue", "Resort Hotel" = "lightgreen"))

3. Duração de Estadia ao Longo do Ano:
# Agrupando por mês e calculando a duração média de estadia
duracao_por_mes <- hotel_booking_clean %>%
group_by(arrival_date_month) %>%
summarise(duracao_media = mean(stays_in_weekend_nights + stays_in_week_nights))
# Ordenando os meses corretamente
duracao_por_mes$arrival_date_month <- factor(duracao_por_mes$arrival_date_month, levels = month.name)
# Visualizando a duração média de estadia por mês
ggplot(duracao_por_mes, aes(x = arrival_date_month, y = duracao_media, group = 1)) +
geom_line(color = "blue") +
geom_point() +
labs(title = "Duração Média de Estadia por Mês",
x = "Mês",
y = "Duração Média de Estadia (Noites)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Preferências dos Hóspedes
1. Preferências por Tipo de Quarto:
# Contando o número de reservas por tipo de quarto
preferencia_quarto <- hotel_booking_clean %>%
group_by(reserved_room_type) %>%
summarise(num_reservas = n())
# Visualizando a distribuição das preferências de quartos
ggplot(preferencia_quarto, aes(x = reserved_room_type, y = num_reservas, fill = reserved_room_type)) +
geom_bar(stat = "identity") +
labs(title = "Preferências de Tipos de Quarto Reservados",
x = "Tipo de Quarto",
y = "Número de Reservas") +
scale_fill_brewer(palette = "Set3")

2. Preferências por Tipo de Refeição (Meal
Plan):
# Contando o número de reservas por tipo de plano de refeição
preferencia_refeicao <- hotel_booking_clean %>%
group_by(meal) %>%
summarise(num_reservas = n())
# Visualizando a distribuição dos planos de refeição escolhidos
ggplot(preferencia_refeicao, aes(x = meal, y = num_reservas, fill = meal)) +
geom_bar(stat = "identity") +
labs(title = "Preferências de Planos de Refeição",
x = "Plano de Refeição",
y = "Número de Reservas") +
scale_fill_brewer(palette = "Pastel1")

3. Pedidos Especiais (Total de Pedidos
Especiais):
# Contando o número de reservas por número de pedidos especiais
pedidos_especiais <- hotel_booking_clean %>%
group_by(total_of_special_requests) %>%
summarise(num_reservas = n())
# Visualizando a distribuição de pedidos especiais
ggplot(pedidos_especiais, aes(x = factor(total_of_special_requests), y = num_reservas, fill = factor(total_of_special_requests))) +
geom_bar(stat = "identity") +
labs(title = "Total de Pedidos Especiais por Reserva",
x = "Número de Pedidos Especiais",
y = "Número de Reservas") +
scale_fill_brewer(palette = "Blues")

4. Estacionamento:
# Contando o número de reservas com e sem espaço de estacionamento
estacionamento <- hotel_booking_clean %>%
group_by(required_car_parking_spaces) %>%
summarise(num_reservas = n())
# Visualizando a distribuição de solicitações de estacionamento
ggplot(estacionamento, aes(x = factor(required_car_parking_spaces), y = num_reservas, fill = factor(required_car_parking_spaces))) +
geom_bar(stat = "identity") +
labs(title = "Solicitações de Estacionamento",
x = "Número de Espaços de Estacionamento Solicitados",
y = "Número de Reservas") +
scale_fill_brewer(palette = "Greens")

Conclusões e Recomendações
Conclusões
# Conclusões
# 1. Cancelamentos: Observamos uma taxa de cancelamento relativamente alta, principalmente para o City Hotel. Fatores como o "lead time" e a sazonalidade têm um papel significativo no comportamento de cancelamento. Reservas feitas com muita antecedência ou durante meses de baixa ocupação estão mais sujeitas a serem canceladas.
# 2. Padrões Sazonais: As reservas têm picos distintos durante o verão para os Resort Hotels, indicando uma alta demanda sazonal. Já os City Hotels têm uma distribuição de reservas mais estável ao longo do ano, com algumas flutuações menores.
# 3. Duração da Estadia: A duração da estadia média no Resort Hotel é maior do que no City Hotel, especialmente durante os meses de verão. Isso reflete a natureza mais relaxante e prolongada das estadias em resorts.
# 4. Preferências dos Hóspedes: A maioria dos hóspedes prefere tipos de quartos básicos, e o plano de refeição mais popular é o que não inclui refeição ("SC"). Pedidos especiais são comuns, mas a maioria dos hóspedes faz poucos ou nenhum pedido especial. Solicitações de estacionamento são mais comuns em Resort Hotels do que em City Hotels.
# Esses insights ajudam a entender o comportamento dos hóspedes e os padrões de reserva, permitindo que os hotéis ajustem suas operações e estratégias de marketing para melhor atender à demanda.
Recomendações
# Recomendações
# 1. Revisar Políticas de Cancelamento: Dado que os cancelamentos são mais prováveis com antecedência maior e em certos períodos, os hotéis poderiam adotar políticas de cancelamento mais rigorosas para reservas feitas com muita antecedência, oferecendo incentivos para que os clientes mantenham suas reservas.
# 2. Ajustar Preços Sazonais: Com a sazonalidade clara, principalmente para Resort Hotels, é recomendável ajustar os preços e as promoções de acordo com as variações de demanda, maximizando a receita nos meses de pico e atraindo mais hóspedes durante a baixa temporada.
# 3. Personalização de Serviços: As preferências por tipos de quartos e refeições variam, o que sugere uma oportunidade para personalizar as ofertas de pacotes. Oferecer promoções personalizadas para diferentes perfis de clientes (com ou sem refeição, por exemplo) pode aumentar a satisfação dos hóspedes.
# 4. Preparação para Pedidos Especiais: Como muitos hóspedes fazem pedidos especiais, é importante que o hotel tenha uma infraestrutura adequada para atender a essas solicitações, especialmente durante os períodos de alta ocupação.
# 5. Gestão de Estacionamento: Dado que a solicitação de estacionamento é mais comum nos Resort Hotels, é recomendável revisar a alocação de vagas de estacionamento para esses hotéis, garantindo que a demanda seja atendida, especialmente em períodos de alta ocupação.
# Ao implementar essas mudanças, os hotéis podem não apenas reduzir cancelamentos e aumentar a receita, mas também melhorar a experiência geral dos hóspedes, tornando seus serviços mais eficientes e personalizados.