Как предсказать, когда будет назначена встреча?

Вопрос или проблема

У меня есть набор данных с десятками тысяч записей. Записи имеют дату создания и запланированную дату. Что-то вроде этого:

ID   Создано      Запланировано
1    01/08/2020    05/08/2020
2    01/08/2020    07/08/2020
3    02/08/2020    04/08/2020
...

Я пытаюсь предсказать вероятность всех возможных запланированных дат на основе даты создания в будущем. В общем, если клиент создаст запись завтра (20 августа), какова вероятность того, что он запланирует свою запись на 21 августа, 22 августа, 23 августа и так далее. Теоретически клиенты могут создавать записи на неограниченный срок, но на практике никто не назначает запись более чем за ~2 месяца вперед.

Некоторые наблюдения, которые я сделал:

  • Клиенты предпочитают записываться на выходные
  • Клиенты предпочитают записываться в последние или первые дни месяца
  • Большинство записей запланировано в течение 2 недель с момента создания записи клиентом

Я испытываю трудности с этой проблемой. Сначала я пробовал просто посмотреть, на сколько дней вперед клиент назначает свою запись. Примерно 10% случаев – это следующий день, 15% случаев – это запись за 2 дня и так далее. Но это не учитывало предпочтение клиентов записываться на выходные и в начале/конце месяца. Поэтому это было невероятно неточно.

Честно говоря, я в тупике, как подойти к этой проблеме. Я был бы признателен, если у людей есть идеи, как мне это сделать. Спасибо! Пожалуйста, дайте знать, если что-то здесь непонятно.

Создайте новые функции, указывая дни недели.

df['Создано'] = pd.to_datetime(df['Создано'])
df['Запланировано'] = pd.to_datetime(df['Запланировано'])
df['Запланированный_день_недели'] = df['Запланировано'].dt.day_name()
df['Созданный_день_недели'] = df['Создано'].dt.day_name()

Создайте новый столбец разницы дней, который будет разницей между двумя днями.

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

Этот процесс называется инжинирингом функций.

Просто представьте, когда и почему клиент хотел бы записаться на прием в определенный день.
Существует много причин:

  1. Какой день недели: Клиенты обычно свободны по выходным.
  2. *Цена*: Предположим, что цены обычно низкие в конце месяца.
  3. Время между созданием и запланированием записи.

Вы должны учитывать это, чтобы модель была точной и эффективной.

Нейронная сеть может быть обучена с x как датой создания и y как датой запланированной записи.

Это сложный набор данных, поэтому рекомендуется регрессионная нейронная сеть. Преобразуйте все даты в числовые значения в днях от общего эталонного источника, например, 1/1/1970 или той даты, когда начала работать ваша клиника.

Выходные логиты нейронной сети будут предсказывать вероятную дату запланированной записи.

Ответ или решение

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

Шаг 1: Подготовка данных

Первым шагом является подготовка вашего набора данных. Убедитесь, что ваши даты корректно распознаны в формате datetime. Используйте библиотеку pandas для преобразования ваших данных:

import pandas as pd

# Загрузка данных
df = pd.read_csv('appointments.csv')

# Преобразование строковых дат в формат datetime
df['Created'] = pd.to_datetime(df['Created'], format='%m/%d/%Y')
df['Scheduled'] = pd.to_datetime(df['Scheduled'], format='%m/%d/%Y')

Шаг 2: Исследование данных

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

import matplotlib.pyplot as plt

# Визуализация распределения
plt.hist(df['Scheduled'].dt.day, bins=30)
plt.title('Распределение дней запланированных записей')
plt.xlabel('День месяца')
plt.ylabel('Количество записей')
plt.show()

Шаг 3: Создание новых признаков (Feature Engineering)

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

df['Scheduled_day_of_week'] = df['Scheduled'].dt.day_name()
df['Created_day_of_week'] = df['Created'].dt.day_name()
df['day_difference'] = (df['Scheduled'] - df['Created']).dt.days

Шаг 4: Моделирование

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

# Преобразование дат в числовые индексы
df['Created_numeric'] = (df['Created'] - pd.Timestamp('1970-01-01')).dt.days
df['Scheduled_numeric'] = (df['Scheduled'] - pd.Timestamp('1970-01-01')).dt.days

Используйте библиотеку Keras для построения нейронной сети:

from keras.models import Sequential
from keras.layers import Dense

# Создание модели
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=1))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')

# Обучение модели
model.fit(df['Created_numeric'], df['Scheduled_numeric'], epochs=100, batch_size=32)

Шаг 5: Прогнозирование

Теперь, когда вы обучили модель, вы можете использовать её для прогнозирования дат записи на прием, основываясь на датах создания. Например, если клиент создал запись 20 августа, вы можете выполнить следующий код:

import numpy as np

created_date = pd.Timestamp('2021-08-20')
created_numeric = (created_date - pd.Timestamp('1970-01-01')).days

# Прогнозирование
predicted_scheduled_numeric = model.predict(np.array([created_numeric]).reshape(-1, 1))

# Преобразование обратно в дату
predicted_scheduled_date = pd.Timestamp('1970-01-01') + pd.to_timedelta(predicted_scheduled_numeric[0][0], unit='d')
print(predicted_scheduled_date)

Итог

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

Оцените материал
Добавить комментарий

Капча загружается...