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

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

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

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

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

Перекрестные продажи и дополнительные продажи — маркетинговые термины, которые звучат знакомо, но чем они отличаются друг от друга?

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

Хотя эти методы продаж относительно устарели, их практика изменилась с появлением системы управления взаимоотношениями с клиентами (CRM) и использованием информационных технологий. Я предлагаю прочитать статью Каматуры для более подробной информации о кросс-продажах.

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

Я продолжаю смотреть на набор данных, полученный с платформы Kaggle: он состоит из 12 переменных (включая результат и идентификатор) и 381 109 строк. Вы можете следовать коду из нотбука.

Цель этой работы относится к задаче классификации, а результат представляет собой бинарную переменную с классом «1» для страхователей, заинтересованных в приобретении страховки транспортного средства, вместо класса «0» для страхователей, которые не заинтересованы в этом. .

def catcharts(data, col1, col2):
    plt.rcParams['figure.figsize']=(15,5)

    plt.subplot(1,2,1)
    data.groupby(col1).count()[col2].plot(kind='pie',autopct='%.0f%%').set_title("Pie {} Variable Distribution".format(col1))
    
    plt.subplot(1,2,2)
    sns.countplot(x=data[col1], data=data).set_title("Barplot {} Variable Distribution".format(col1))
    
    plt.show()

Целевая переменная показывает несбалансированные классы, где только 12% страхователей купили бы страхование транспортных средств.

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

def numcharts(data, var):
    plt.rcParams['figure.figsize']=(15,5)

    plt.subplot(1,3,1)
    x=data[var]
    plt.hist(x,color='green',edgecolor='black')
    plt.title('{} histogram'.format(var))
    plt.xticks(rotation=45)
    
    
    plt.subplot(1,3,2)
    x=data[var]
    sns.boxplot(x, color="orange")
    plt.title('{} boxplot'.format(var))
    plt.xticks(rotation=45)
    
    
    plt.subplot(1,3,3)
    res = stats.probplot(data[var], plot=plt)
    plt.title('{} Q-Q plot'.format(var))
    plt.xticks(rotation=45)
    
    
    plt.show()

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

Кроме того, есть семь категориальных характеристик: пол, водительские права, ранее застрахованные, возраст автомобиля, повреждения автомобиля, канал продажи полиса и код региона. Последние два отбрасываются, потому что они бесполезны при моделировании, учитывая, что данные распределены по многим классам. В канале продаж политики более или менее 70% данных покрываются 3 каналами, в то время как в коде региона более или менее 40% данных распределяются по 2 регионам, а остальные - по другим многим другим нерелевантным кодам регионов. Глядя на другие переменные, гендерная переменная показывает преобладание мужчин среди страхователей: 54% мужчин против 46% женщин. Почти у всех страхователей есть водительские права, и они владеют молодым транспортным средством: 53% автомобилей имеют возраст от 1 до 2 лет. Большинство страхователей ранее не страховались в Компании: 54% не страховались в Компании против 46% ранее застрахованных. По последним характеристикам в портфеле поровну распределены автомобили с повреждениями и без повреждений.

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

-этап подготовки данных

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

-Моделирование и оценка

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

Для этой работы Логистическая регрессия (LR) сравнивалась с Гауссовой наивной байесовской моделью (GNB) и Машиной повышения градиента на основе гистограмм (HGBM).

Выбор алгоритма Gradient Boosting обусловлен тем, что это одна из лучших моделей производительности, обычно более конкурентоспособная, чем нейронные сети с табличными данными. Вместо этого выбор Наивного Байеса обусловлен тем, что это еще одна распространенная модель, используемая в машинном обучении с другими предположениями, чем логистическая регрессия.

Для этого соревнования использовалась площадь под кривой ROC (AUC) в качестве показателя для оценки производительности. Он принимает значения от 0 до 1 с ориентацией на то, что более высокие значения лучше, но, как и индекс Джини, это не калибровка — чувствителен, поскольку он игнорирует предельное распределение результата, что может привести к неверным решениям. По этой причине необходимо иметь калиброванную модель, когда вы смотрите на оценку. Итак, что такое калибровка? Вообще говоря, калибровка — это процесс, используемый для повышения надежности модели оценки вероятностей. Модель считается хорошо откалиброванной, когда ее предсказанные вероятности близки к истинным вероятностям событий, которые она предсказывает. Логистическая регрессия считается откалиброванной моделью, поскольку она напрямую предсказывает вероятности результата, а не предсказывает метки классов на основе порога. Каждая модель была оценена с точки зрения калибровки, а не производительности, и, в конечном итоге, была применена шкала Платта для выполнения хорошо откалиброванного классификатора. Метод Platt Scaling преобразует результаты модели классификации в распределение вероятностей по классам, предполагая, что оценочные вероятности следуют сигмовидной функции, и подгоняет модель логистической регрессии для сопоставления прогнозируемых вероятностей с истинными вероятностями.

# check calibration
# Generate probability predictions from your model
def calibration(model, xdata, ydata, model_name):
    plt.rcParams['figure.figsize']=(15,5)
    probabilities = model.predict_proba(X_test)
    predicted_probabilities = probabilities[:, 1]

# Get true outcome value for each test observation
    test_outcomes = y_test

# Generate the calibration curve data
    calibration_curve_data = calibration_curve(test_outcomes, predicted_probabilities, n_bins=10)

# Plot the calibration curve
    plt.plot(calibration_curve_data[1], calibration_curve_data[0], marker='.')
    plt.plot([0, 1], [0, 1], linestyle='--')
    plt.xlabel('Predicted probability')
    plt.ylabel('Observed frequency')
    plt.title('{} Calibration Curve'.format(model_name))
    
    plt.show()

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

Глядя на результаты, лучшей моделью является повышение градиента на основе гистограммы (HGBM), которую я выбрал в качестве окончательной модели для тонкой настройки как для гиперпараметров, так и для оптимизации порога.

Глядя на гистограмму, прогнозируемый класс «0» менее недооценен, в то время как прогнозируемый класс «1» переоценивается.

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

Сегментация данных

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

np.random.seed(0)
for n_cluster in range(2,10):
    clustering = KMeans(n_clusters=n_cluster, random_state=0).fit(num_sc)
    preds = clustering.predict(num_sc)
    silhouette_avg = silhouette_score(num_sc, preds)
    
    print('Silhouette Score for %i Clusters: %0.4f' % (n_cluster, silhouette_avg))

Заинтересованных Клиентов в приобретении страховки на транспортное средство можно разделить на 4 кластера в зависимости от оценки силуэта. Таким образом, стало возможным понять взаимосвязь между числовыми характеристиками, такими как Annaul Premium и Age, с другими категориальными характеристиками.

При этом годовая премия распределяется на 70% в двух первых кластерах, Возраст более или менее равномерно распределяется во всех кластерах, а не в первом, который охватывает около 30% заинтересованных в покупке покрытия транспортных средств.

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

«Ранее застраховано» — наиболее важная характеристика в прогнозе, поскольку интуитивно она связана с удовлетворенностью клиентов Компанией. Повреждение транспортного средства не имеет отношения к прогнозу, но может повлиять на следующие этапы процесса Компании. Я имею в виду, что люди, заинтересованные в приобретении дополнительной страховки, платят годовую премию за автомобиль с повреждениями, и интуитивно у них могут быть претензии, плохой стиль вождения и так далее. Учитывая, что повреждение транспортного средства может быть переменной, используемой в страховом покрытии, эта функция является фактором риска, который необходимо учитывать, требуя более тщательного анализа, поскольку он может повлиять на прибыльность страхового тарифа.

Создание приложения

На последнем шаге я развернул работу, реализованную в Jupyter Notebook, в приложении, в основном для того, чтобы поделиться результатами, поэтому страница вывода не разрабатывается. Создание приложения с помощью Streamlit и развертывание его в облаке Streamlit — несложная работа, хотя у меня были некоторые проблемы.

Я создал многостраничное приложение, для него требуется первый файл «1_Cross_Selling_App.py» в качестве домашней страницы, а затем другие файлы Python, участвующие в меню, сохраненные на складных страницах вашего репозитория, после чего вы можете подключить эти файлы (requirements. txt) с облаком, и все, начинается развертывание.

Графики визуализации потребовали лишь небольших модификаций кода, потому что библиотеки matplotlib и seaborn, которые я использовал для визуализации данных, встроены в Streamlit.

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

В последующем процессе я начал создавать приложение локально, затем я перешел в облако, и сложная задача была именно на этом этапе, потому что то, что работало локально, не работало в облаке. Это было сложно, но в конце концов пришло решение, и теперь приложение работает!!!!

Заключительные мысли

Сфера маркетинга растет благодаря деятельности в области науки о данных, а также в сфере страхования она меняется. Приветствуется использование современного машинного обучения, поскольку оно дает более точные прогнозы (см. HGBM в этой работе), что помогает лучше распределять затраты в маркетинговом бюджете. Актуарии могут играть важную роль как в прогнозировании, так и в сегментации, предоставляя свои экспертные суждения. Да, потому что в этом процессе мы увидели множество функций, которые используются в актуарной структуре для разработки продуктов. Актуарии могут дать оценку риска, глубокий анализ особенностей, используемых при построении страхового тарифа, играя роль связующего звена между актуарной структурой и маркетинговой структурой!!!
Наслаждайтесь приложением 😊

Ссылки

-"Блокнот"

-"Приложение"

-Набор данных: прогноз перекрестных продаж медицинского страхования 🏠 🏥 | Kaggle

-Перекрестные продажи

-"Логистическая регрессия"

-Гауссовский наивный байесовский

- Усиление градиента на основе гистограммы

-Калибровка

-ШАП

-K-Means кластеризация