Введение

В гостиничной, туристической и туристической отраслях отмена заказов сильно влияет на руководство отрасли при принятии управленческих решений и может привести к снижению доходов в сфере услуг. Этот вопрос продолжает оставаться предметом дискуссий и разговоров в гостиничном бизнесе.

Отмена бронирования отелей повлияла и на другие отрасли. Например, отмена деловых поездок затронула авиакомпании, компании по аренде автомобилей и рестораны, обслуживающие путешественников.

Существует несколько причин, по которым гость может отменить бронирование отеля, в том числе:

  1. Изменение планов. Некоторым гостям может потребоваться отменить бронирование отеля из-за внезапных изменений в планах, таких как проблемы со здоровьем, чрезвычайные ситуации или внезапные задания. Это изменение планов может помешать гостям путешествовать в запланированные даты.
  2. Финансовые проблемы. Некоторые гости могут отменить бронирование отеля из-за финансовых проблем, таких как потеря работы или неожиданный счет, который необходимо оплатить немедленно. Это может вынудить их отложить или отменить поездку.
  3. Изменения в правилах поездок. Во время пандемии COVID-19 некоторым гостям, возможно, пришлось отменить бронирование отелей из-за изменений в правилах поездок или ограничений на поездки, введенных правительством или авиакомпаниями.
  4. Ошибки в процессе бронирования. Иногда гости могут совершать ошибки в процессе бронирования, например, выбирая неправильную дату или вводя неверную личную информацию. Это может вызвать трудности при путешествии по плану.
  5. Лучшая альтернатива. Некоторые гости могут найти лучшую альтернативу и решить отменить бронирование в предыдущем отеле. Они могут найти отель с лучшими удобствами или по более низкой цене в другом месте. Отмены заказов в последнюю минуту возникают в связи с развитием информационных технологий. Заказ можно сделать легко, и людям будет легко отменять заказы через онлайн-каналы. «Потребители легко меняют свое мнение после сравнения вариантов», — говорит Бьорн Хэнсон, аналитик гостиничного бизнеса из Нью-Йоркского университета.

Я узнал о статье, которую я написал, из источника Kaggle, в которой обсуждается отмена бронирования отелей.

Итак, я делюсь своим письмом, цель состоит только в том, чтобы поделиться своим опытом обучения и понимания учебных ресурсов, которые есть у Kaggle.

Набор данных Объяснение

Набор данных, который будет использоваться, — это набор данных, взятый из данных Kaggle. Набор данных содержит 36275 строк и 19 столбцов. Ниже приводится объяснение функций набора данных:

  1. Booking_ID: уникальный идентификатор каждого бронирования.
  2. no_of_adults:количество взрослых
  3. no_of_children:количество детей
  4. no_of_weekend_nights: количество ночей в выходные дни (суббота или воскресенье), в течение которых гость останавливался или забронировал проживание в отеле.
  5. no_of_week_nights: количество дней недели (с понедельника по пятницу), в течение которых гость останавливался или забронировал проживание в отеле.
  6. type_of_meal_plan: тип плана питания, забронированного клиентом:
  7. required_car_parking_space: требуется ли клиенту парковочное место? (0 — нет, 1 — да)
  8. room_type_reserved:тип комнаты, забронированной клиентом. Значения шифруются (кодируются) INN Hotels.
  9. lead_time: количество дней между датой бронирования и датой прибытия.
  10. arrival_year: год прибытия.
  11. arrival_month: месяц даты прибытия.
  12. arrival_date: число месяца.
  13. market_segment_type: обозначение сегмента рынка.
  14. repeated_guest. Является ли клиент постоянным гостем? (0 — нет, 1 — да)
  15. no_of_previous_cancellations: количество предыдущих бронирований, которые были отменены клиентом до текущего бронирования.
  16. no_of_previous_bookings_not_canceled: количество предыдущих бронирований, не отмененных клиентом до текущего бронирования.
  17. avg_price_per_room: средняя цена за сутки бронирования; цены на номера динамичны. (в евро)
  18. no_of_special_requests:общее количество особых запросов, сделанных клиентом (например, верхний этаж, вид из комнаты и т. д.)
  19. статус_бронирования: флаг, указывающий, было ли бронирование отменено или нет.

Затем определите целевой столбец и столбец функций. В этом случае мы можем разделить столбец функций на три раздела: раздел числовых переменных, раздел категориальных переменных и раздел переменных цели/класса. Чтобы нам было проще управлять данными.

# The division of the column into 3 sections
numerical_column = ['no_of_adults','no_of_children','lead_time','arrival_date',
                    'avg_price_per_room','no_of_previous_cancellations','no_of_previous_bookings_not_canceled']

categorical_column = ['no_of_weekend_nights','no_of_week_nights','type_of_meal_plan','room_type_reserved',
                      'market_segment_type','required_car_parking_space','arrival_year','arrival_month',
                      'repeated_guest', 'no_of_special_requests']

target_column = 'booking_status'

Исследовательский анализ данных

Чтобы узнать, какая информация содержится в этих данных, мы начнем с создания визуализации категориального столбца.

# Create Visualization of Categorical Variable
plt.figure(figsize = (20,25))
for i, feature in enumerate(categorical_column):
  plt.subplot(6,2,i+1)
  plt.gca().set_title('Variable {}'.format(feature))
  sns.countplot(x = df[feature], data = df)
  plt.subplots_adjust(wspace=0.4, hspace=0.4)
plt.show()

На основе представленной выше визуализации категориального столбца мы получаем следующую информацию:

  1. Большинство бронирований отелей делается для краткосрочного пребывания.
  2. Наиболее предпочтительным типом плана питания является План питания 1.
  3. Наиболее бронируемая категория номеров — 1.
  4. Большинство бронирований осуществляется онлайн
  5. Как правило, гостям не требуется место для парковки.
  6. Больше всего бронирований было в 2018 году.
  7. Количество бронирований отелей имеет тенденцию к увеличению с января по октябрь, а затем снижается в ноябре и декабре.
  8. Большинство гостей — новые гости, которые никогда не бронировали отель.
  9. В целом особых запросов у гостей нет.

Далее мы визуализируем числовые столбцы, чтобы узнать информацию, содержащуюся в данных.

# Create Visualization of Categorical Variable
plt.figure(figsize = (20,25))
for i, feature in enumerate(numerical_column):
  plt.subplot(6,2,i+1)
  plt.gca().set_title('Variable {}'.format(feature))
  sns.histplot(x=df[feature], kde=False)
  plt.subplots_adjust(wspace=0.4, hspace=0.4)
plt.show()

На основе визуализации числового столбца выше мы получаем следующую информацию:

  1. Большинство гостиничных номеров забронировано для двух взрослых и без детей.
  2. Большинство бронирований осуществляется без длительных задержек.
  3. Средняя стоимость номера 100 евро.
  4. Большинство гостей никогда не отменяли предварительное бронирование.

Чтобы найти больше информации, содержащейся в данных. Мы узнаем на основе этих вопросов, чтобы мы могли получить информацию в качестве ответов на поставленные нами вопросы.

Вопрос 1. С большей вероятностью отменят бронирование гостиницы гости, у которых большие сроки ожидания?

При длительном сроке могут произойти вещи, которые не зависят от гостя, например, болезнь, финансовые проблемы, которые вынуждают гостя отменить свое пребывание, или гость нашел альтернативный отель.

Основываясь на представленной выше визуализации данных, мы можем сказать, что по мере увеличения времени выполнения увеличивается вероятность отмены.

Обратите внимание, что среди гостей, которые не отменили бронирование отеля, есть много выбросов, а это означает, что, хотя у некоторых гостей были длительные сроки, они не отменили свои бронирования в отеле.

Вопрос 2. С большей вероятностью гости с высокими ценами на номера отменят бронирование в отеле?

Возможно, из-за высоких цен на отели гости склонны отменять бронирование отелей, потому что хотят сэкономить деньги или найти отели по более низким ценам.

У 50% гостей, которые не отменили бронирование в отеле, средняя стоимость номера была ниже 100 евро, а у 50% гостей, которые отменили бронирование в отеле, средняя стоимость номера превышала 100 евро. Мы можем заключить, что существует тенденция к более высокой вероятности определенных расходов для гостей, которые отменяют бронирование отеля, по сравнению с теми, кто этого не делает (это связано с тем, что количество гостей, которые отменяют бронирование отеля, ниже, чем количество тех, кто этого не делает).

Вопрос 3. С большей вероятностью отменят бронирование гости, забронировавшие отель через Интернет?

С развитием информационных технологий мы можем легко бронировать отели или отменять бронирование онлайн в любом месте и в любое время.

Мы видим больше всего отказов от отелей в сегменте онлайн-рынка. Это происходит из-за того, что большинство бронирований осуществляется онлайн, и их легче отменить онлайн. Более того, существует множество мобильных и веб-приложений, которые облегчают гостям бронирование и отмену бронирования отеля.

Вопрос 4. С большей вероятностью отменят бронирование гости, забронировавшие отель через Интернет и затянувшие сроки?

Рыночный сегмент оффлайн-типа отменяется со средним временем выполнения около 200 дней, а сегмент рынка онлайн-типа отменяется со средним временем выполнения около 100 дней.

Мы видим много выбросов в данных; тип выбросов в этих данных неестественные выбросы. Например, гости могут заказывать номера со средней ценой 500 евро, что намного выше среднего показателя avg_price_per_room, равного 100 евро.

Разница между естественными выбросами и неестественными выбросами Естественные выбросы возникают из-за ошибок измерения, неправильного сбора данных или неправильного ввода данных. В то время как неестественные выбросы можно найти в примерах мошеннических транзакций с банковскими данными и отмены бронирования отелей (Источник).

Разработка функций

Разработка признаков — это этап предварительной обработки машинного обучения, который извлекает признаки из данных. Это помогает лучше представить фундаментальные проблемы машинного обучения, что в результате повышает точность модели для невидимых данных. Прогностическая модель содержит переменные-предикторы и переменные-результаты, а процесс разработки признаков выбирает наиболее полезные переменные-предикторы для модели.

Функция объединения

Мы объединим две функции, имеющие одинаковое значение, в одну функцию, например:

  1. Объедините функции no_of_adults и no_of_children в no_of_people.
  2. Объединить no_of_weekend_nights и no_of_week_nights в no_of_week_days

Мы можем объединить две приведенные выше функции с PCA (анализ основных компонентов). PCA — это метод, который следует использовать, когда вам нужно уменьшить количество переменных, но вы не знаете, какие из них отбросить. который направлен на сокращение данных, чтобы можно было быстро интерпретировать данные.

from sklearn.decomposition import PCA

pca = PCA(n_components=1)

# Merge 'no_of_adults' and 'no_of_children' into 'no_of_people'
pca_no_of_people = pca.fit_transform(df[['no_of_adults', 'no_of_children']])
df['no_of_people'] = pca_no_of_people
# Drop 'no_of_adults' and 'no_of_children'
df.drop(columns=['no_of_adults', 'no_of_children'], inplace=True)

# Merge 'no_of_weekend_nights' and 'no_of_week_nights' into 'no_of_week_days'
pca_no_week = pca.fit_transform(df[["no_of_weekend_nights","no_of_week_nights"]])
df["no_of_week_days"] = pca_no_week
# Drop 'no_of_weekend_nights' and 'no_of_week_nights'
df.drop(columns=["no_of_weekend_nights","no_of_week_nights"],inplace=True)

Масштабирование

Масштабируя, мы гарантируем, что у нас будет одинаковый масштаб для каждого столбца или переменной, которая у нас есть. При этом масштабировании мы будем использовать RobustScaler, который использует медианы и quatiles, цель состоит в том, чтобы сделать его устойчивым к выбросам данных, имея в виду, что при визуализации данных мы сталкиваемся со многими выбросами данных.

from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df[['lead_time',
    'avg_price_per_room',
    'no_of_people',
    'no_of_week_days',
    'no_of_special_requests']] = scaler.fit_transform(df[['lead_time',
                                                          'avg_price_per_room',
                                                          'no_of_people',
                                                          'no_of_week_days',
                                                          'no_of_special_requests']])

Категориальное заключение

Модель не может обрабатывать данные типа категории, поэтому нам нужно преобразовать данные в числа. Этот процесс называется кодированием.

df = pd.get_dummies(df,columns=['type_of_meal_plan','room_type_reserved',
'market_segment_type'])

Мы изменим значение booking_status на «Not_Canceled» как 0 и «Canceled» как 1.

df.booking_status = df.booking_status.replace({"Not_Canceled":0, "Canceled":1})

Выбор функции

Мы будем выбирать функции на основе степени корреляции с целью.

Основываясь на приведенной выше тепловой карте, мы можем удалить функции, которые имеют низкую корреляцию с целью.

df.drop(columns=['market_segment_type_Offline','market_segment_type_Aviation','room_type_reserved_Room_Type 1',
                 'room_type_reserved_Room_Type 2','room_type_reserved_Room_Type 3','room_type_reserved_Room_Type 4',
                 'room_type_reserved_Room_Type 5','room_type_reserved_Room_Type 6','room_type_reserved_Room_Type 7',
                 'type_of_meal_plan_Not Selected','type_of_meal_plan_Meal Plan 3','no_of_previous_cancellations',
                 'arrival_month','arrival_date','Booking_ID','arrival_year','no_of_previous_bookings_not_canceled',
                 'market_segment_type_Complementary'],inplace=True)

Моделирование машинного обучения

Здесь мы будем использовать метод машинного обучения, а именно KNeighborsClassifiers, логистическую регрессию, SVM, случайный лес, Adaboost и классификатор XGB, чтобы проверить, какой из четырех обеспечивает наилучшую производительность при прогнозировании целей класса.

Поезд-тестовый сплит

Мы разделим набор данных на 30% данных тестирования и 70% данных обучения.

Создайте точность функции, точность, оценку F1 и отзыв

Ранее будут созданы функции для расчета точности, точности, f1_score и отзыва.

# This function is used to determine the accuracy value of the ML model predictions
def accuracy(conf_matrix):
  # Define variables
  true_positive = conf_matrix[0][0]
  false_negative = conf_matrix[0][1]
  false_positive = conf_matrix[1][0]
  true_negative = conf_matrix[1][1]

  # Calculate accuracy score
  accuracy = (true_positive + true_negative) / (true_positive + true_negative + false_positive + false_negative)
  return accuracy

# This function is used to determine the precision value of the ML model predictions
def precision(conf_matrix):
   # Define variables 
  true_positive = conf_matrix[0][0]
  false_negative = conf_matrix[0][1]
  false_positive = conf_matrix[1][0]
  true_negative = conf_matrix[1][1]

  # Calculate precision score
  precision = (true_positive)/(true_positive + false_positive)
  return precision

# This function is used to determine the recall value of the ML model predictions
def recall(conf_matrix):
  # Definisikan variabel 
  true_positive = conf_matrix[0][0]
  false_negative = conf_matrix[0][1]
  false_positive = conf_matrix[1][0]
  true_negative = conf_matrix[1][1]

  # Calculate recall score
  recall = (true_positive)/(true_positive + false_negative)
  return recall

# This function is used to determine the f1-score value of the ML model predictions
def f1(conf_matrix):
  # Calculate f1 score
  f1 = 2 * ((precision(conf_matrix)*recall(conf_matrix))/(precision(conf_matrix) + recall(conf_matrix)))
  return f1

Результаты модельного алгоритма

Чтобы было легче понять результаты построенной модели, я запишу значение каждого столбца в таблице ниже.

  • Модель : Используемая модель алгоритма
  • Точность обучения: значение расчета точности набора обучающих данных.
  • Точность тестирования: значение расчета точности набора данных тестирования.
  • Оценка точности: отношение истинных прогнозов (положительных и отрицательных) ко всем данным.
  • Оценка точности: отношение положительных верных прогнозов к общему положительному прогнозируемому результату.
  • Оценка отзыва: отношение правильных положительных прогнозов по сравнению со всеми положительными правильными данными.
  • Оценка F1: сравнение средней точности и отзыва, которые взвешиваются.

Заключение

  • Мы провели исследовательский анализ данных (EDA), сделав это, мы можем узнать больше об информации, содержащейся в данных, и поддержать бизнес-решения.
  • Мы используем модель алгоритма, включающую в себя: K-ближайших соседей (KNN), метод опорных векторов (SVM), логистическую регрессию, случайный лес, адаптивное повышение (Adaboost) и экстремальное повышение градиента (XGB).
  • Мы получаем хорошие результаты точности; среди шести моделей, которые мы используем, модель случайного леса имеет самую высокую точность 88,8%. Но данные, которые мы используем, являются несбалансированными, поэтому мне любопытно реализовать балансировку данных.
  • Во-первых, мы используем Under-Sampling для балансировки данных. Среди шести моделей модель случайного леса имеет самую высокую точность 87%, что немного меньше, чем при использовании метода балансировки данных. Но я считаю полезным, когда у нас уже есть сбалансированные данные для работы.
  • Затем мы используем SVM-SMOTE (Over-Sampling) и получаем модель случайного леса, которая по-прежнему имеет самую высокую точность 87%.
  • Когда мы используем метод балансировки данных, мы получаем то же значение точности 87% (хотя, если мы присмотримся, небольшая разница все же есть). Но мы взвесим оценку точности, чтобы предложить лучшую модель. Если мы посмотрим, модель случайного леса с недостаточной выборкой имеет самый высокий показатель точности 92%.
  • Показатели точности используются, когда мы предпочитаем истинные положительные результаты и действительно не хотим, чтобы возникали ложные положительные результаты. В этом случае нам нужны гости, которые фактически отменят бронирование, а не гости, которые, по нашим прогнозам, не будут отменять бронирование, потому что тогда персонал отеля подготовится ко всем потребностям гостей в отеле, даже если гость позже отменит бронирование или нет.

Спасибо, на этот раз мы наконец закончили создание модели для нашего корпуса. Если у вас есть предложения и вы хотите обсудить, пожалуйста, свяжитесь со мной.