Отчет о сегментации клиентов и прогноз отклика клиентов

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

В этом проекте применяются алгоритмы машинного обучения, чтобы получить информацию о потенциальных клиентах из демографических данных. Это главный проект программы Udacity Machine Learning Engineer Nanodegree, которую реализует Arvato Financial Solutions, дочерняя компания Bertelsmann. Я выбрал этот проект в основном потому, что предоставленные данные являются реальными и почти не очищались. В дополнение к этому, мне очень нравится понимать потребности бизнеса и клиентов, чтобы обеспечить лучший опыт как для компании, так и для тех, кто использует бизнес-продукт или услугу.

Первая часть проекта состоит из построения отчета по сегментации клиентов на основе существующих клиентов Arvato Financial Solutions и населения Германии в целом. Для этого я использовал методы обучения без учителя, чтобы определить те слои населения, которые лучше всего описывают основную клиентскую базу компании.

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

Вы можете проверить весь код, который я разрабатываю, на моей странице Github.

Данные:

Как упоминалось выше, данные для этого проекта были предоставлены Arvato Financial Solutions, дочерней компанией Bertelsmann в Германии. С этим проектом связано шесть файлов данных, а именно:

Часть I) Сегментация клиентов

  • Udacity_AZDIAS_052018.csv: демографические данные по населению Германии в целом.
  • Udacity_CUSTOMERS_052018.csv: демографические данные для клиентов компании, занимающейся доставкой по почте.
  • Уровни информации DIAS - Атрибуты 2017.xlsx: список атрибутов и описаний верхнего уровня, упорядоченный по информационным категориям.
  • Атрибуты DIAS - значения 2017.xlsx: значения данных для каждой переменной в алфавитном порядке.

Часть II) Прогноз отклика маркетинговой кампании

  • Udacity_MAILOUT_052018_TRAIN.csv: демографические данные по лицам, которые были целями маркетинговой кампании.
  • Udacity_MAILOUT_052018_TEST.csv: демографические данные для лиц, которые были целями маркетинговой кампании.

Примечание. Уровни информации DIAS и файлы атрибутов DIAS xlsx были переведены в файл data_info.csv, который содержит информацию о функциях и их соответствующих возможных значениях. .

Предварительная обработка данных:

Чтобы запустить алгоритм машинного обучения, необходимо выполнить несколько этапов очистки и предварительной обработки. В частности, предоставленные данные должны были пройти 8 этапов предварительной обработки и проектирования функций. Вы знаете правило 80–20? Что ж, многие люди говорят, что около 80% времени проекта по науке о данных тратится на подготовку данных (предварительная обработка), а 20% - на анализ данных и подходы к машинному обучению. Именно это и произошло в этом конкретном проекте. Я создал функцию, которая выполняет весь необходимый процесс, как вы можете видеть ниже:

Шаг 1 - Отбросьте функции

Функция очистки удаляет 35 функций (столбцов) из-за количества пропущенных значений. Эти столбцы содержат более 40% наноданных. Этот недостаток информации может негативно повлиять на модель, и поэтому я решил от них избавиться. Кроме того, для набора данных клиентов I функция также удаляет три дополнительных столбца («CUSTOMER_GROUP», «ONLINE_PURCHASE», «PRODUCT_GROUP»).

Шаг 2 - Преобразование отсутствующего кода

Я создал файл data_info.csv, который суммирует информацию из файлов Уровни информации DIAS - Атрибуты 2017.xlsx и Атрибуты DIAS - Значения 2017.xlsx с. В дополнение к этому я также включил код отсутствующего значения для каждой функции, чтобы я мог идентифицировать все отсутствующие значения для каждой функции и преобразовать их в NAN.

Вот как выглядит фреймворк data_indo:

Шаг 3. Отбросьте строки и условное исчисление данных

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

Часть 4 - Расчет данных

Хотя большинство характеристик являются либо категориальными, либо порядковыми, я принял все переменные как категориальные. Зная это, я заменил все отсутствующие значения (переменные nan) наиболее частым значением функции, чтобы компенсировать отсутствующие значения в наборе данных.

Часть 5 - Разработка функций

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

Проанализировав все эти функции, я решил сделать следующее:

  • OST_WEST_KZ - двоичный объект, который будет перекодирован в 0 и 1
  • LNR - похоже, это индекс, чтобы от него можно было избавиться.
  • CAMEO_DEU_2015 - у этой функции много строк с категорией «XX» (347 строк). Я рассмотрел эти входные данные как отсутствующие значения и заменил их числовым значением и применил одно горячее кодирование для перекодирования переменной.
  • CAMEO_DEUG_2015 - эта функция также имеет много входов «X». Я сделал то же самое, что и указанная выше функция
  • CAMEO_INTL_2015 - то же, что и вышеупомянутая функция.
  • D19_LETZTER_KAUF_BRANCHE - эта функция имеет 36 категорий (строк), и ее необходимо перекодировать.
  • EINGEFUEGT_AM - это функция формата даты, которую необходимо перекодировать (столбцы года и месяца).

Чтобы избежать проблем с разреженностью, я ограничил одно горячее кодирование до 44 и 33 наиболее часто используемых меток функций. Другими словами, я построил по одной двоичной переменной только для каждой из 44 и 33 наиболее часто встречающихся категорий функций, а остальные считал шумом. Я установлю 44 верхних категории переменных CAMEO_DEU_2015 и CAMEO_INTL_2015 и 33 верхних категории D19_LETZTER_KAUF_BRANCHE.

Я использовал 44 и 33 самые частые категории, потому что таким образом я могу гарантировать, что все основные компоненты кадра данных azdias равны основным компонентам кадра данных клиентов.

Анализ главных компонентов

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

Я использовал StandarScale, который масштабировал каждую функцию до значения 0, а стандартное отклонение равнялось 1.

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

Посмотрев на дисперсию, объясненную каждым компонентом на приведенных выше экранных графиках, я решил выбрать 215 компонентов, на которые приходится около 89% объясненной дисперсии.

К-означает кластер

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

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

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

Сравните группы населения и клиентов

После построения моделей PCA и кластеров на общих данных о населении, мы можем применить тот же процесс к данным о клиентах и ​​сравнить распределения кластеров. Идея состоит в том, чтобы выяснить, где находится самая надежная клиентская база компании. Другими словами, мы должны выяснить, какие кластеры либо перепредставлены, либо недопредставлены. Как это поможет? Что ж, давайте предположим, что 15% людей отнесены к определенному кластеру для населения в целом, а 25% клиентов также «чувствовали себя» близкими к центроиду этого кластера. Таким образом, доля потребителей будет больше, чем доля населения в целом. Это говорит о том, что эти люди из общего населения могут быть целевой аудиторией для компании.

На столбчатой ​​диаграмме ниже показано распределение людей, отнесенных к каждому из 11 кластеров. Основываясь на предыдущем предположении, мы можем заметить, что наиболее представленные и недопредставленные кластеры - это кластеры с номерами 7 и 6 соответственно.

Чтобы понять некоторые характеристики этих кластеров, я решил исследовать несколько характеристик, описывающих их «финансовые типы», и построить график их распределения.

Функции :

  • HH_EINKOMMEN_SCORE: расчетный чистый доход семьи (ниже = выше доход)
  • FINANZ_VORSORGER: индивидуальный финансовый тип для подготовленных (ниже = более высокая финансовая типология)
  • FINANZ_ANLEGER: индивидуальный финансовый тип для инвесторов (ниже = выше финансовая типология)
  • FINANZ_HAUSBAUER: индивидуальный финансовый тип для домовладельцев (ниже = выше финансовая типология)
  • FINANZ_MINIMALIST: лица с низким финансовым интересом (ниже = выше финансовая типология).
  • FINANZ_SPARER: экономия денег (ниже = выше финансовая типология)
  • LP_STATUS_GROB: социальный статус (более низкий = более низкий статус)
  • KKK: покупательная способность (ниже = выше покупательная способность).
  • ANREDE_KZ: пол (1 для мужчин и 2 для женщин)

Интерпретация:

Первое, что мы можем заметить, это то, что есть кластер, который чрезмерно представлен, и кластеры, которые недостаточно представлены населением клиентов.

мы также можем заметить, что три кластера с наибольшей степенью избыточного представления - это кластер 7, кластер 11 и кластер 3. Из-за этого это говорит о том, что эти кластеры, скорее всего, будут целевой аудиторией для компании.

С другой стороны, наиболее недопредставленными являются три кластера: кластер 1, кластер 6, кластер 8.

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

  • HH_EINKOMMEN_SCORE: расчетный чистый доход семьи (ниже = выше доход)
  • FINANZ_VORSORGER: индивидуальный финансовый тип для подготовленных (ниже = более высокая финансовая типология)
  • FINANZ_ANLEGER: индивидуальный финансовый тип для инвесторов (ниже = выше финансовая типология)
  • FINANZ_HAUSBAUER: индивидуальный финансовый тип для домовладельцев (ниже = выше финансовая типология)
  • FINANZ_MINIMALIST: лица с низким финансовым интересом (ниже = выше финансовая типология).
  • FINANZ_SPARER: экономия денег (ниже = выше финансовая типология)
  • LP_STATUS_GROB: социальный статус (более низкий = более низкий статус)
  • KKK: покупательная способность (ниже = выше покупательная способность).
  • ANREDE_KZ: пол (1 для мужчин и 2 для женщин)

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

  • иметь высокий доход
  • быть очень подготовленным
  • быть инвесторами
  • экономить деньги
  • иметь среднюю / высокую покупательную способность
  • быть мужчиной

Те, кто находится в кластере недопредставлены, с большей вероятностью:

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

Прогноз ответа клиента

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

Каждая из строк в «mailout.train» и mailout.test представляет человека, на которого была направлена ​​рассылка. Наборы данных содержат примерно 43 000 строк данных каждая, а набор данных поезда включает столбец «ОТВЕТ», в котором указано, стал ли человек клиентом компании после кампании.

Я начал с использования функции clean_df для обработки всех этих шагов из раздела предварительной обработки. После этого я заметил, что набор данных несбалансирован по классам. Фактически, 98,76% наблюдений относятся к людям, которые не ответили на кампанию. Следовательно, метрика точности не кажется хорошим выбором для оценки моделей. Я буду использовать метрику ROC AUC из-за ее способности не зависеть от дисбаланса.

Метрика ROC AUC

Поскольку вторая модель представляет собой проблему классификации, я буду использовать AUC-ROC в качестве метрики. ROC (рабочие характеристики приемника) представляет собой кривую вероятности, и она создается путем построения графика истинно положительной скорости (TPR) или отзыва против ложноположительной скорости (1 - специфичность). AUC дает нам степень отделимости. Используя AUC-ROC, мы можем узнать, как наша модель работает при классификации обоих классов. Чем выше AUC (площадь под кривой), тем лучше модель предсказывает успех кампании (в нашем случае).

Базовая модель

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

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

Построение других моделей

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

Настройка с усилением градиента

Гистограмма выше показывает, что наиболее многообещающим классификатором является gradientBoosting. Из-за этого я выбрал этот алгоритм для настройки.

Я провел исполнительную настройку методом проб и ошибок, настроив такие параметры, как n_estimators, loss, learning_rate, n_samples_split, min_samples_leaf, max_depth, max_features и subample.

В итоге я получаю модель со следующими характеристиками:

Важность функции в зависимости от модели:

Заключение

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

Первая часть состояла из построения неконтролируемых моделей, таких как PCA и кластеризация k-средних, для выполнения сегментации клиентов. Мы сделали это, используя 215 компонентов и 11 кластеров. После применения этих подходов я смог сравнить перепредставленные и недопредставленные кластеры и сделать некоторые выводы. Например, я заметил, что большинство людей из чрезмерно представленной группы (люди из общего населения могут быть целевой аудиторией для компании) имеют высокий доход, являются инвесторами и хорошо экономят деньги. С другой стороны, население в целом имеет средний доход, не вкладывает свои деньги и имеет среднюю покупательную способность.

Во второй части я построил несколько различных моделей контролируемого обучения и сравнил их. Алгоритм Gradient Boosting дал мне лучший результат ROC AUC, и поэтому он был выбран и настроен. После исчерпывающей настройки параметров я получил оценку 0,78794 по тестовым данным.

Этот проект был действительно сложным, но я многому из него научился. Я хотел бы поблагодарить Udacity за всю поддержку (особенно моего наставника Мофетолуву А.) и Bertelsmann Arvato Analytics за предоставление всех этих данных.