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

skim_variable n_missing complete_rate min max empty n_unique whitespace
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

skim_variable n_missing complete_rate min max median n_unique
arrival_date 217 0 Inf -Inf NA 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
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.