El sector hotelero es un componente clave en la economía global, impulsado por la alta demanda de servicios de alojamiento en diversas regiones, desde destinos turísticos hasta áreas de negocios. Para los hoteles, maximizar la ocupación de habitaciones es crucial para garantizar la rentabilidad, y lograr esto implica gestionar eficientemente las reservas. Sin embargo, uno de los desafíos más comunes en esta industria son las cancelaciones de reservas, que pueden afectar gravemente tanto los ingresos como la operativa diaria de los establecimientos.
Las cancelaciones, sobre todo las de última hora, generan incertidumbre operativa. Si bien es normal que haya algunas cancelaciones, aquellas que ocurren cerca de la fecha de llegada afectan significativamente la capacidad de un hotel para llenar sus habitaciones, especialmente cuando la demanda es elevada o la capacidad del hotel es limitada. Este tipo de cancelaciones, además, obstaculiza la planificación de recursos como el personal de limpieza, recepción y mantenimiento, lo que puede generar ineficiencias operativas y costos adicionales.
El conjunto de datos está compuesto por:
## Número de filas (observaciones): 119390
## Número de columnas (variables): 32
Estas variables se dividen según su tipo de dato en:
## Cantidad de variables numéricas: 16
Que incluyen información como el número de noches reservadas, el número de acompañantes, el tiempo de antelación con el que se realizó la reserva, la tarifa diaria promedio, entre otras.
## Cantidad de variables categóricas: 16
Que representan atributos como el tipo de hotel, el país de procedencia del cliente, el canal de distribución, el estado de la reserva y el tipo de cliente.
A continuación se listan las variables incluidas en el dataset:
## Variables del dataset:
## [1] "hotel" "is_canceled"
## [3] "lead_time" "arrival_date_year"
## [5] "arrival_date_month" "arrival_date_week_number"
## [7] "arrival_date_day_of_month" "stays_in_weekend_nights"
## [9] "stays_in_week_nights" "adults"
## [11] "children" "babies"
## [13] "meal" "country"
## [15] "market_segment" "distribution_channel"
## [17] "is_repeated_guest" "previous_cancellations"
## [19] "previous_bookings_not_canceled" "reserved_room_type"
## [21] "assigned_room_type" "booking_changes"
## [23] "deposit_type" "agent"
## [25] "company" "days_in_waiting_list"
## [27] "customer_type" "adr"
## [29] "required_car_parking_spaces" "total_of_special_requests"
## [31] "reservation_status" "reservation_status_date"
La variable que se desea predecir es is_canceled
, la
cual toma el valor:
1 si la reserva fue cancelada.
0 si la reserva se concretó.
Esta variable será tratada como una variable binaria, lo que justifica el uso de un modelo de regresión logística en el desarrollo posterior del proyecto.
A continuación, se presenta una tabla con la descripción de las principales variables del conjunto de datos, su tipo y su significado en el contexto del análisis de cancelaciones:
variable | tipo | faltantes | estadisticas | descripcion |
---|---|---|---|---|
is_canceled | numeric | 0 | Min: 0 Max: 1 Media: 0.370416282770751 SD: 0.482918226592599 | Indica si la reserva fue cancelada (1 = cancelada, 0 = no cancelada) |
lead_time | numeric | 0 | Min: 0 Max: 737 Media: 104.01141636653 SD: 106.863097047988 | Días entre la reserva y la fecha de llegada |
arrival_date_year | numeric | 0 | Min: 2015 Max: 2017 Media: 2016.15655415026 SD: 0.707475944520355 | Año de llegada del cliente |
stays_in_weekend_nights | numeric | 0 | Min: 0 Max: 19 Media: 0.927598626350616 SD: 0.998613494597877 | Número de noches de fin de semana reservadas |
stays_in_week_nights | numeric | 0 | Min: 0 Max: 50 Media: 2.50030153279169 SD: 1.90828561504791 | Número de noches de la semana reservadas |
adults | numeric | 0 | Min: 0 Max: 55 Media: 1.856403383868 SD: 0.579260998832755 | Número de adultos en la reserva |
children | numeric | 4 | Min: 0 Max: 10 Media: 0.10388990333875 SD: 0.398561444786442 | Número de niños en la reserva |
babies | numeric | 0 | Min: 0 Max: 10 Media: 0.00794873942541252 SD: 0.0974361913012644 | Número de bebés en la reserva |
is_repeated_guest | numeric | 0 | Min: 0 Max: 1 Media: 0.0319122204539744 SD: 0.175767145410657 | Indica si el cliente es un huésped repetido (1 = sí, 0 = no) |
previous_cancellations | numeric | 0 | Min: 0 Max: 26 Media: 0.0871178490660859 SD: 0.844336384154511 | Número de cancelaciones anteriores realizadas por el cliente |
previous_bookings_not_canceled | numeric | 0 | Min: 0 Max: 72 Media: 0.137096909288885 SD: 1.49743684770768 | Número de reservas previas no canceladas realizadas por el cliente |
booking_changes | numeric | 0 | Min: 0 Max: 21 Media: 0.221124047240137 SD: 0.652305572674772 | Número de cambios de reserva realizados |
days_in_waiting_list | numeric | 0 | Min: 0 Max: 391 Media: 2.32114917497278 SD: 17.5947208787762 | Número de días en la lista de espera |
adr | numeric | 0 | Min: -6.38 Max: 5400 Media: 101.831121534467 SD: 50.5357902855487 | Tarifa diaria promedio por habitación |
required_car_parking_spaces | numeric | 0 | Min: 0 Max: 8 Media: 0.0625177988106206 SD: 0.245291147467494 | Número de espacios de estacionamiento requeridos |
total_of_special_requests | numeric | 0 | Min: 0 Max: 5 Media: 0.571362760700226 SD: 0.792798422809411 | Número total de solicitudes especiales realizadas por el cliente |
hotel | character | 0 | City Hotel : 79330, Resort Hotel : 40060 | Tipo de hotel (Resort o City Hotel) |
arrival_date_month | character | 0 | April : 11089, August : 13877, December : 6780, February : 8068, January : 5929, July : 12661, June : 10939, March : 9794, May : 11791, November : 6794, October : 11160, September : 10508 | Mes de llegada del cliente |
arrival_date_week_number | factor | 0 | 1 : 1047, 2 : 1218, 3 : 1319, 4 : 1487, 5 : 1387, 6 : 1508, 7 : 2109, 8 : 2216, 9 : 2117, 10 : 2149, 11 : 2070, 12 : 2083, 13 : 2416, 14 : 2264, 15 : 2689, 16 : 2405, 17 : 2805, 18 : 2926, 19 : 2402, 20 : 2785, 21 : 2854, 22 : 2546, 23 : 2621, 24 : 2498, 25 : 2663, 26 : 2391, 27 : 2664, 28 : 2853, 29 : 2763, 30 : 3087, 31 : 2741, 32 : 3045, 33 : 3580, 34 : 3040, 35 : 2593, 36 : 2167, 37 : 2229, 38 : 2661, 39 : 2581, 40 : 2397, 41 : 2699, 42 : 2756, 43 : 2352, 44 : 2272, 45 : 1941, 46 : 1574, 47 : 1685, 48 : 1504, 49 : 1782, 50 : 1505, 51 : 933, 52 : 1195, 53 : 1816 | Número de la semana del año en que se hace la llegada |
arrival_date_day_of_month | factor | 0 | 1 : 3626, 2 : 4055, 3 : 3855, 4 : 3763, 5 : 4317, 6 : 3833, 7 : 3665, 8 : 3921, 9 : 4096, 10 : 3575, 11 : 3599, 12 : 4087, 13 : 3745, 14 : 3819, 15 : 4196, 16 : 4078, 17 : 4406, 18 : 4002, 19 : 4052, 20 : 4032, 21 : 3767, 22 : 3596, 23 : 3616, 24 : 3993, 25 : 4160, 26 : 4147, 27 : 3802, 28 : 3946, 29 : 3580, 30 : 3853, 31 : 2208 | Día del mes en que se realiza la llegada |
meal | character | 0 | BB : 92310, FB : 798, HB : 14463, SC : 10650, Undefined : 1169 | Tipo de comida reservada (por ejemplo, BB, HB, etc.) |
country | character | 0 | N/A | País de origen del cliente |
market_segment | character | 0 | Aviation : 237, Complementary : 743, Corporate : 5295, Direct : 12606, Groups : 19811, Offline TA/TO : 24219, Online TA : 56477, Undefined : 2 | Segmento de mercado de la reserva (por ejemplo, agencia, corporativo, etc.) |
distribution_channel | character | 0 | Corporate : 6677, Direct : 14645, GDS : 193, TA/TO : 97870, Undefined : 5 | Canal de distribución (por ejemplo, web, agencia de viajes, etc.) |
reserved_room_type | character | 0 | A : 85994, B : 1118, C : 932, D : 19201, E : 6535, F : 2897, G : 2094, H : 601, L : 6, P : 12 | Tipo de habitación reservada |
assigned_room_type | character | 0 | A : 74053, B : 2163, C : 2375, D : 25322, E : 7806, F : 3751, G : 2553, H : 712, I : 363, K : 279, L : 1, P : 12 | Tipo de habitación asignada |
deposit_type | character | 0 | No Deposit : 104641, Non Refund : 14587, Refundable : 162 | Tipo de depósito (sin depósito, con depósito, etc.) |
agent | character | 0 | N/A | Número de agente que realizó la reserva |
company | character | 0 | N/A | Número de compañía que realizó la reserva |
customer_type | character | 0 | Contract : 4076, Group : 577, Transient : 89613, Transient-Party : 25124 | Tipo de cliente (nuevo o recurrente) |
reservation_status | character | 0 | Canceled : 43017, Check-Out : 75166, No-Show : 1207 | Estado final de la reserva (por ejemplo, completada, cancelada, etc.) |
is_canceled
(Cancelación de reserva):
lead_time
(Anticipación de la
reserva):
La media de 104 días sugiere que, en promedio, las reservas se hacen con alrededor de tres meses de anticipación. Sin embargo, el valor máximo de 737 días (aproximadamente 2 años) es un valor atípico, lo que sugiere que algunas reservas son realizadas con una anticipación extremadamente larga. Podría ser interesante investigar si estos casos corresponden a reservas corporativas o a eventos especiales con mucho tiempo de antelación.
La desviación estándar alta de 106.86 indica que hay una gran variabilidad en cuanto a la anticipación de las reservas, lo que podría ser un indicio de que los clientes toman decisiones muy diferentes en cuanto a la planificación de sus viajes.
arrival_date_year
(Año de llegada):
stays_in_weekend_nights
y
stays_in_week_nights
(Noches de fin de semana y noches
entre semana):
stays_in_weekend_nights
tiene una media baja de 0.93, lo que indica que la mayoría de las
reservas no incluyen noches de fin de semana. Esto puede reflejar que
los clientes prefieren reservar para estancias más cortas, tal vez por
motivos laborales o de negocio. También se observa una alta desviación
estándar en esta variable, lo que sugiere que hay algunos clientes que
reservan estancias largas durante los fines de semana, mientras que
otros no se quedan en fin de semana.stays_in_week_nights
tiene
una media de 2.5, lo que muestra que, en promedio, las reservas son para
estancias de 2 a 3 noches durante la semana. Esto tiene
sentido en el contexto de reservas de corta duración, pero el rango de 0
a 50 noches (con una desviación estándar de 1.91) sugiere que hay
algunas reservas excepcionales con una duración mucho mayor de lo
esperado. Esto puede indicar reservas para grupos grandes o estancias
prolongadas, pero vale la pena investigar si estos valores extremos
corresponden a clientes corporativos o eventos especiales.adults
(Número de adultos en la
reserva):
children
(Número de niños en la
reserva):
babies
(Número de bebés en la
reserva):
adr
(Tarifa diaria promedio por
habitación):
hotel
arrival_date_month
deposit_type
market_segment
meal
arrival_date_week_number
(Semana del año de
llegada):
arrival_date_day_of_month
(Día del mes de
llegada):
En esta etapa se analiza cada variable de forma individual con el objetivo de entender su distribución, identificar valores atípicos y detectar posibles problemas en los datos. Esto es esencial para preparar correctamente las variables antes de evaluar su relación con la cancelación de reservas y construir modelos predictivos más robustos.
En esta sección se exploran las variables categóricas más relevantes,
visualizando su distribución y su relación con la variable objetivo
(is_canceled
). Esto permite identificar patrones y
asociaciones útiles para el modelado y la toma de decisiones.
Informe de análisis de cancelaciones según variables categóricas
A continuación se presenta un análisis detallado de la relación entre
la variable objetivo (is_canceled
) y las principales
variables categóricas del dataset hotelero, basado en las tablas
cruzadas obtenidas.
Conclusiones: - El segmento de mercado, el tipo de
hotel y la estacionalidad son los factores categóricos más asociados a
la cancelación. - Las reservas sin depósito y las realizadas a través de
agencias online o para grupos presentan mayor riesgo de cancelación. -
Se recomienda revisar la calidad de los datos en la variable
deposit_type
, ya que la tasa de cancelación en “Non Refund”
es inusualmente alta. - Este análisis aporta información clave para
definir políticas de depósito, estrategias de segmentación y gestión de
reservas en el sector hotelero.
En esta etapa se analiza la relación entre las variables y la
variable objetivo is_canceled
. Esto ayuda
a identificar patrones significativos que puedan influir en la
cancelación de reservas, lo que es crucial para mejorar la precisión de
los modelos predictivos y tomar decisiones informadas en la gestión de
reservas.
Uno de los hallazgos más relevantes es la correlación
positiva moderada entre el lead_time
(tiempo de
anticipación) y la variable de cancelación. Con una correlación
de 0.29, esto sugiere que a medida que aumenta el
tiempo de anticipación de una reserva, también lo hace la probabilidad
de que sea cancelada. Es probable que los clientes que realizan reservas
con muchos meses de antelación cambien sus planes, lo que incrementa el
riesgo de cancelación. Este dato es clave, ya que permite a los hoteles
tomar medidas proactivas para gestionar esas reservas con mayor
antelación, ofreciendo incentivos para mantener la reserva o hacer
ajustes en la política de cancelación.
Otra variable con correlación moderada es
previous_cancellations
(cancelaciones
previas), con una correlación de 0.11. Este
valor indica que los clientes que han cancelado reservas en el pasado
tienen más probabilidades de cancelar nuevamente. Esta es una
observación importante, ya que sugiere que un comportamiento repetitivo
de cancelación puede ser un predictor confiable de futuras
cancelaciones. A través de este análisis, los hoteles pueden identificar
y monitorear a estos clientes, implementando estrategias de fidelización
o condiciones más estrictas en sus reservas.
La variable required_car_parking_spaces
(espacios de estacionamiento requeridos) muestra una
correlación negativa moderada de -0.20 con la
cancelación. Esto implica que los clientes que requieren espacio de
estacionamiento tienen menos probabilidades de cancelar. Este hallazgo
podría reflejar que los clientes que buscan estos servicios adicionales
están más comprometidos con su estancia y, por lo tanto, menos
inclinados a cancelar sus reservas. Los hoteles que ofrecen
estacionamiento pueden usar este dato para crear paquetes o incentivos
que promuevan la permanencia de los clientes.
Adicionalmente, total_of_special_requests
(solicitudes especiales) presenta una correlación negativa de
-0.23. A mayor número de solicitudes especiales, menor
es la probabilidad de cancelación. Esto sugiere que los clientes que
hacen solicitudes especiales, como habitaciones específicas o servicios
adicionales, tienden a estar más comprometidos con su reserva y, por lo
tanto, tienen menos probabilidades de cancelarla. Este es un dato útil
para los hoteles, ya que las solicitudes especiales pueden ser una
indicación de un cliente más comprometido.
Aunque algunas variables cumplen con las expectativas, hay algunas
que resultan sorprendentes. Por ejemplo, adr
(tarifa diaria promedio) tiene una correlación muy baja de
0.05 con la cancelación, lo que indica que la relación
entre la tarifa y la probabilidad de cancelación no es significativa.
Esto desafía la intuición, ya que se podría suponer que los clientes que
pagan tarifas más altas tendrían menos incentivos para cancelar. Sin
embargo, los datos sugieren que factores como la flexibilidad de la
reserva o las políticas de cancelación podrían tener un impacto más
significativo que la tarifa misma.
Además, las variables relacionadas con la duración de la
estancia, como
stays_in_weekend_nights
y
stays_in_week_nights
, tienen correlaciones
muy bajas, cerca de cero (-0.00 y
0.02, respectivamente), lo que sugiere que la duración
de la estancia no es un factor relevante a la hora de predecir
cancelaciones. Este hallazgo es contrario a la expectativa común de que
los clientes que reservan estancias más largas puedan estar más
comprometidos con sus planes. Sin embargo, los datos no muestran una
relación significativa entre la duración de la estancia y la
cancelación.
El análisis de las correlaciones ha permitido identificar varios factores clave que influyen en la probabilidad de cancelación de una reserva. Variables como el tiempo de anticipación de la reserva, el historial de cancelaciones previas, y las solicitudes especiales son importantes para predecir la cancelación de una reserva. Por otro lado, algunos factores que comúnmente se asumirían relevantes, como la tarifa diaria o la duración de la estancia, tienen una correlación casi nula con las cancelaciones.
Estos hallazgos permiten a los hoteles tomar decisiones informadas sobre cómo gestionar las reservas y reducir las cancelaciones. Las políticas de cancelación podrían adaptarse para aquellos con un historial de cancelaciones, o bien, ofrecer incentivos para mantener las reservas de aquellos que las hagan con mucha antelación. Además, los hoteles podrían beneficiarse de identificar a los clientes que hacen solicitudes especiales, ya que estos tienden a ser más comprometidos con sus reservas.
En esta sección, se detalla el proceso de preparación de los datos, basado en el análisis previo de las variables. Según la Descripción y Análisis de Variables, se identificaron las siguientes acciones necesarias para preparar los datos:
Antes de la preparación final, es fundamental revisar la calidad y consistencia de los datos para evitar sesgos o errores en el modelado.
## Cantidad de filas duplicadas: 31994
## Reservas sin adultos, niños ni bebés: 180
## [1] "Cantidad de valores negativos por variable:"
## # A tibble: 1 × 6
## adults children babies stays_in_weekend_nights stays_in_week_nights adr
## <int> <int> <int> <int> <int> <int>
## 1 0 0 0 0 0 1
## Reservas con más de 20 adultos: 10
Se eliminaron variables que no aportan información relevante al modelo o que podrían introducir ruido en el análisis. En este caso, se eliminaron las siguientes variables:
reservation_status
: Representa
información redundante o derivada de la variable objetivo
is_canceled
.
reservation_status_date
:
Información redundante que no aporta valor predictivo directo.
arrival_date_year
: No se considera
relevante para el análisis, ya que las diferencias entre años no son
significativas en este contexto.
Además, para manejar los valores faltantes en las variables numéricas, se reemplazaron con el promedio de cada columna. Este enfoque asegura que no se pierda información valiosa debido a la eliminación de filas y que las distribuciones de las variables se mantengan estables.
## Número de valores faltantes después de reemplazar con el promedio:
## hotel is_canceled
## 0 0
## lead_time arrival_date_month
## 0 0
## arrival_date_week_number arrival_date_day_of_month
## 0 0
## stays_in_weekend_nights stays_in_week_nights
## 0 0
## adults children
## 0 0
## babies meal
## 0 0
## country market_segment
## 0 0
## distribution_channel is_repeated_guest
## 0 0
## previous_cancellations previous_bookings_not_canceled
## 0 0
## reserved_room_type assigned_room_type
## 0 0
## booking_changes deposit_type
## 0 0
## agent company
## 0 0
## days_in_waiting_list customer_type
## 0 0
## adr required_car_parking_spaces
## 0 0
## total_of_special_requests
## 0
Se identificaron y eliminaron valores atípicos en variables clave
como adr
(tarifa diaria promedio), babies
(número de bebés), stays_in_weekend_nights
(noches de fin
de semana) y stays_in_week_nights
(noches entre semana).
Para ello, se utilizó el rango intercuartílico (IQR), eliminando los
valores que se encontraban fuera del rango
[Q1 - 1.5 * IQR, Q3 + 1.5 * IQR]
. Este procedimiento
permite reducir el impacto de valores extremos que podrían sesgar los
resultados del modelo.
## Dimensiones después de la limpieza: 79766 filas y 29 columnas
Variable | Valores_Unicos | |
---|---|---|
hotel | hotel | 2 |
arrival_date_month | arrival_date_month | 12 |
arrival_date_week_number | arrival_date_week_number | 53 |
arrival_date_day_of_month | arrival_date_day_of_month | 31 |
meal | meal | 5 |
country | country | 176 |
market_segment | market_segment | 8 |
distribution_channel | distribution_channel | 5 |
reserved_room_type | reserved_room_type | 10 |
assigned_room_type | assigned_room_type | 12 |
deposit_type | deposit_type | 3 |
agent | agent | 324 |
company | company | 348 |
customer_type | customer_type | 4 |
Las variables categóricas con un alto número de categorías,
como country
, agent
, company, arrival_date_week_number
,
y arrival_date_day_of_month
fueron transformadas mediante
codificación binaria. Este método convierte cada categoría en una
representación binaria, lo que permite al modelo procesar estas
variables de manera eficiente.
## Número de columnas antes de la codificación: 29
## Número de columnas después de la codificación: 61
## Número de columnas nuevas generadas: 32
La preparación de los datos incluyó la eliminación de variables irrelevantes, el manejo de valores faltantes, la eliminación de datos atípicos y la transformación de variables categóricas. Estas acciones garantizaron que el conjunto de datos estuviera limpio, consistente y listo para ser utilizado en el modelo predictivo. Este proceso es fundamental para mejorar la calidad de las predicciones y minimizar el impacto de posibles sesgos en los resultados.