Этот проект является частью программы Udacity Data Science Nano Degree. Код этого проекта можно найти на GitHub. Данные были предоставлены Bertelsmann Arvato Analytics и не могут быть обнародованы.

Обзор проекта и постановка задачи

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

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

Исследование данных

Демографические данные для населения Германии в целом содержат 891 211 человек и 366 характеристик, в то время как демографические данные для клиентов компании, занимающейся доставкой по почте, содержат 191 652 человека и 369 характеристик.

Подробные характеристики охватывают широкий спектр параметров, таких как:

  1. Здание (напр. количество обладателей ученого звания в здании)
  2. Автомобили (за исключением доли автомобилей с мощностью двигателя от 61 до 120 кВт)
  3. Транзакционная деятельность (например, транзакционная деятельность на основе группы продуктов МЕСТНЫЕ БАНКИ)
  4. Личность (например, близость, указывающая, насколько человек культурен)

И многое другое!

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

Для предварительной обработки данных были выполнены следующие шаги:

  • Кодировать отсутствующие значения как NaN
  • Удалить столбцы, содержащие › 200 000 пропущенных значений
  • Удалить строки, содержащие ›10 пропущенных значений
  • Если категориальная переменная имеет более 10 уровней, отбросить для простоты.
  • Перекодируйте категориальные переменные, создав фиктивные переменные.
  • Создайте функцию очистки, которая выполняет все вышеперечисленные шаги, чтобы ее можно было запустить и в наборе данных клиентов.
  • Вмените пропущенные значения, используя среднее значение
  • Выполнение масштабирования функций с помощью StandardScaler

Сегментация клиентов с помощью неконтролируемого машинного обучения

Сначала я применил PCA и создал график осыпи ниже.

Не существует четкого способа выбрать количество компонентов, которые необходимо сохранить при выполнении PCA. Было предложено сохранить количество компонентов, которое охватывает не менее 85% изменчивости данных. Кроме того, еще один способ определить количество компонентов — посмотреть на локоть или на то место, где линия графика осыпи изгибается так, что вы начинаете получать убывающую отдачу от величины дисперсии, объясненной добавлением дополнительного компонента. Поэтому я решил продолжить анализ с использованием 200 компонентов.

Затем я выполнил кластеризацию методом k-средних. Чтобы определить количество используемых кластеров, я создал график колена ниже. На графике нет явного изгиба, это может быть где-то между 5 и 11 кластерами; Я выбрал 7 кластеров, чтобы продолжить анализ.

После запуска k-средних с 7 кластерами для набора данных о населении и клиентах я рассчитал пропорции каждого кластера, как показано ниже. Данные, которые изначально были удалены из-за слишком большого количества NaN, были включены как кластер -1.

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

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

Для кластера 5, наиболее недопредставленного кластера в клиентских данных (и, следовательно, за пределами целевого рынка компании), компоненты с наибольшим положительным и отрицательным весом равны 5 и 3 соответственно. Это люди с длинными, мощными автомобилями, которые экономят деньги.

Прогнозирование конверсии клиентов с помощью контролируемого машинного обучения

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

Набор обучающих данных включает 42 982 строки с 367 функциями (включая 1 строку «ответ» с 0 или 1 в зависимости от того, стал ли человек клиентом компании) и тестовый набор данных с 42 833 людьми. Поскольку набор данных довольно несбалансирован (конверсия составляет всего около 1 %), в качестве показателя для выбора лучшей модели и оценки конкурса Kaggle использовалась ROC AUC.

Выполнив аналогичную предварительную обработку наборов данных, как указано выше, я протестировал 5 базовых моделей машинного обучения, рассчитывая ROC AUC, а также время, необходимое для запуска. Как показано в таблице ниже, у GradientBoostingClassifier самый высокий показатель ROC AUC, равный 0,70, за которым следует AdaBoostClassifier с показателем ROC AUC, равным 0,69. В то время как GradientBoostingClassifier был немного лучше, AdaBoostClassifier был в 3,4 раза быстрее. Я выбрал AdaBoostClassifier в качестве модели для оптимизации с помощью GridSearchCV, так как это было более практично — показатель ROC AUC увеличился только с 0,69 до 0,71.

После запуска тестовых данных через оптимизированную модель и отправки результатов на Kaggle мы видим, что модель работает так же, как и в наборе обучающих данных, с ROC AUC, равным 0,69. Многие люди выше меня смогли набрать 0,8 балла, поэтому есть возможности для улучшения, которые обсуждаются ниже.

Выводы

Отражение

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

  • KBA13_KMH_140_210 — доля автомобилей с максимальной скоростью от 140 до 210 км/ч в PLZ8__

И как-то отрицательно коррелирует с:

  • KBA13_KMH_180 — доля автомобилей с максимальной скоростью от 110 км/ч до 180 км/ч в PLZ8__

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

Области для улучшения

Есть много областей для улучшения:

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

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

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

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