import pandas as pd from sklearn.model_selection import train_test_split import datetime as dt import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import LabelEncoder import sklearn.cluster as cluster # Чтение данных датасета df = pd.read_csv('hotel_bookings.csv') # Удаление строк, содержащих отсутствующие значения df = df[df['children'].notna()] df = df[df['country'].notna()] # Объединение столбцов 'arrival_date_year', 'arrival_date_month', 'arrival date day_of_month' в столбец # 'arrival_date', содержащий день, месяц и год приезда клиента в формате datetime df["arrival_date_month"] = pd.to_datetime(df['arrival_date_month'], format='%B').dt.month df["arrival_date"] = pd.to_datetime({"year": df["arrival_date_year"].values, "month": df["arrival_date_month"].values, "day": df["arrival_date_day_of_month"].values}) df = df.drop(columns=['arrival_date_year', 'arrival_date_month', 'arrival_date_day_of_month']) # Преобразование типа столбца reservation_status_date в datetime df["reservation_status_date"] = pd.to_datetime(df["reservation_status_date"], format='%Y-%m-%d') # Заполнение нулевых значений в столбцах средним значением каждого столбца for column in ['agent', 'company', 'arrival_date']: df[column] = df[column].fillna(df[column].mean()) # Удаляем повторяющиеся значения df.drop_duplicates(inplace=True) # Преобразование категориальных переменных в числовые переменные для того, чтобы модель могла с ними работать categoricalV = ["hotel", "meal", "country", "market_segment", "distribution_channel", "reserved_room_type", "assigned_room_type", "deposit_type", "customer_type"] df[categoricalV[1:11]] = df[categoricalV[1:11]].astype('category') df[categoricalV[1:11]] = df[categoricalV[1:11]].apply(lambda x: LabelEncoder().fit_transform(x)) df['hotel_Num'] = LabelEncoder().fit_transform(df['hotel']) df['numerical_larrival_date'] = df['arrival_date'].map(dt.datetime.toordinal) df['numerical_reservation_status_date'] = df['reservation_status_date'].map(dt.datetime.toordinal) df["is_canceled"].replace({'not canceled': 0, 'canceled': 1}, inplace=True) df["reservation_status"].replace({'Canceled': 0, 'Check-Out': 1, 'No-Show': 2}, inplace=True) # Определение входных и выходных значений usefull_columns = df.columns.difference(['hotel', 'hotel_Num', 'arrival_date', 'reservation_status_date']) X = df[usefull_columns] Y = df["hotel_Num"].astype(int) # Деление данных на тестовую и обучающую выборки X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=150) # Определение оптимального количества кластеров df_Short = df[['lead_time', 'adr']] K = range(1, 12) wss = [] for k in K: kmeans = cluster.KMeans(n_clusters=k, init="k-means++") kmeans = kmeans.fit(df_Short) wss_iter = kmeans.inertia_ wss.append(wss_iter) mycenters = pd.DataFrame({'Clusters': K, 'WSS': wss}) sns.scatterplot(x='Clusters', y='WSS', data=mycenters, marker="+") # Решение задачи кластеризации с использованием K-Means kmeans = cluster.KMeans(n_clusters=4, init="k-means++") kmeans = kmeans.fit(df[['lead_time', 'adr']]) df['Clusters'] = kmeans.labels_ # Визуализируем кластеры sns.lmplot(x="lead_time", y="adr", hue='Clusters', data=df) plt.ylim(0, 600) plt.xlim(0, 800) plt.show()