Проект Udacity Capstone от Data Scientice Nano Degree

Обзор проекта

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

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

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

Наконец, я также протестировал модель на конкурсе через kaggle, где конкуренция здесь, и все обсуждаемое содержимое основано на записной книжке jupyter, загруженной в репозиторий Github здесь.

Заявление о проблеме

Цель состоит из четырех частей:

  1. Предварительная обработка данных: очистка и перекодирование данных.
  2. Сегментация: используйте методы обучения без учителя, чтобы создать кластеры клиентов и населения в целом, а затем выявить разницу.
  3. Прогноз: используйте демографические характеристики, чтобы предсказать, станет ли человек клиентом после рассылки.
  4. Используйте тот же алгоритм, чтобы предсказать и подать заявку на участие в конкурсе Kaggle, чтобы получить оценку.

Метрики

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

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

Анализ и методология - исследование, визуализация и предварительная обработка данных

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

  • Udacity_AZDIAS_052018.csv: демографические данные по населению Германии в целом; 891211 человек (ряды) x 366 элементов (столбцы)
  • Udacity_CUSTOMERS_052018.csv: демографические данные для клиентов компании, занимающейся доставкой по почте; 191652 человека (ряды) x 369 элементов (столбцы)
  • Udacity_MAILOUT_052018_TRAIN.csv: демографические данные по лицам, которые были целями маркетинговой кампании; 42 982 лиц (ряды) х 367 (столбики).
  • Udacity_MAILOUT_052018_TEST.csv: демографические данные по лицам, которые были целями маркетинговой кампании; 42 833 лиц (ряды) х 366 (столбцы).

Помимо приведенных выше данных, есть два дополнительных метаданных:

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

Кроме того, я создал файл под названием DIAS_Attributes_Values_2017_details.csv на основе файла Атрибуты DIAS - значения 2017.xlsx, так что я могу сопоставить каждый атрибут с его типом или кодированием отсутствующего значения.

Работа с отсутствующей / неизвестной ценностью

Во время процесса предварительной обработки данных я перекодирую отсутствующее или неизвестное значение как Nan, чтобы убедиться, что все значения закодированы согласованно. Например, значение «-1» в атрибуте AGER_TYP означает «неизвестно», я заменяю его на np.nan.

Оцените недостающие данные в каждом атрибуте

По каждому атрибуту рассчитывается доля пропущенного значения. Если посмотреть на распределение отсутствующих коэффициентов, большинство атрибутов имеют значение ниже 20%. Поэтому я удалил выбросы по этому критерию. (Рисунок 1)

Оценить недостающие данные в каждой строке

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

Сравнивая распределение значений по крайней мере для пяти атрибутов между двумя подмножествами: данные, которые не включают удаленные строки, и данные, которые включают только удаленные строки, между ними нет большой разницы. (Рис. 3) Поэтому я сохраню этот критерий при работе с отсутствующим значением в строках.

Перекодировать и забрать функции

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

Что касается категориальных переменных, например, функция OST_WEST_KZ включает значения «W» и «O», которые являются двоичными. Я перекодирую его как числовую двоичную переменную 0 и 1. С другой стороны, функция CAMEO_DEUG_2015 включает значение «X», которое не описано в подробных документах, поэтому я перекодировал его как Nan. Для остальных категориальных переменных я построил график корреляции, чтобы понять, имеют ли функции общие характеристики. (Рис.4)

Судя по приведенному выше графику, LP_FAMILIE_FEIN и LP_FAMILIE_GROB сильно коррелированы, а LP_STATUS_FEIN и LP_STATUS_GROB также сильно коррелированы. Поскольку LP_FAMILIE_FEIN и LP_STATUS_FEIN слишком подробны, я отбросил эти два здесь. Кроме того, хотя CAMEO_DEUG_2015 и CAMEO_DEU_2015 не показаны на графике выше, на основе файла описания они оба очень похожи. Поэтому я отказался от CAMEO_DEU_2015 для упрощения. Наконец, есть еще одна функция EINGEFUEGT_AM, которая не описана в документе, я ее тоже отбросил. После перекодирования и выбора категориальных переменных я использовал метод get_dummies в Pandas для преобразования в фиктивное значение.

В дополнение к категориальным переменным существует шесть следующих смешанных характеристик:

  1. CAMEO_INTL_2015
  2. LP_LEBENSPHASE_FEIN
  3. LP_LEBENSPHASE_GROB
  4. PLZ8_BAUMAX
  5. PRAEGENDE_JUGENDJAHRE
  6. WOHNLAGE

При просмотре атрибута CAMEO_INTL_2015 показалось, что атрибут можно разделить на две интервальные переменные: одна связана с богатством, а другая - с возрастом, поэтому я использовал метод карты, чтобы перекодировать эту функцию. Что касается LP_LEBENSPHASE_FEIN и LP_LEBENSPHASE_GROB, поскольку оба они описывают жизненный этап человека, который имеет схожие черты с CAMEO_INTL_2015, я опустил здесь два атрибута. С другой стороны, атрибуты PLZ8_BAUMAX и WOHNLAGE можно в какой-то степени рассматривать как интервальные переменные, я их здесь сохранил. Наконец, если посмотреть на функцию PRAEGENDE_JUGENDJAHRE, кажется, что ее также можно разделить на две части: десятилетия и движение. Поэтому я создал две функции для обработки этой переменной.

После всей предварительной обработки и перекодирования Udacity_AZDIAS_052018.csv очищается и преобразуется в объект daframe pandas azdias_informative_dummy. Я также создаю функцию clean_data , который включает в себя весь процесс, упомянутый выше, так что для всех демографических данных процесс очистки гарантирован и остается неизменным.

Наконец, некоторые функции получили Nans в процессе перекодирования, поэтому я использовал Imputer для замены средствами. Затем я использовал StandardScaler для масштабирования всех особенности. Чтобы проверить окончательный результат, я подсчитал количество нан (недостающее отношение) в каждом атрибуте. (Рис.5)

Реализация и уточнение

Часть отчета по сегментации клиентов

Из почти 425 функций я провел PCA для извлечения импортируемых функций из общей популяции. Зная основную объясненную дисперсию для каждого атрибута, я решил использовать первые 6 компонентов, так как после 6-го компонента накопленная дисперсия медленно увеличивается. (Рис.6 и Рис.7)

После выбора основных компонентов PCA я использовал метод KMeans для применения кластеризации. Чтобы решить, сколько кластеров мне следует использовать, я исследую количество кластеров по шкале KMeans. Показано, что когда количество кластеризаций увеличивается примерно до 30, ошибка (оценка) становится достаточно низкой и не меняется быстро. Поэтому я выбрал 30 как количество кластеров. (Рис.8)

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

Здесь, в таблице, где gp_portion означает долю кластеризации в генеральной совокупности, а cs_portion означает долю кластеризации в совокупности клиентов, показало, что разница между клиентами и генеральной совокупностью является наибольшей в кластерах 21 и 28 и наименьшей в кластерах 6. и 20.

Модель контролируемого обучения

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

Независимые переменные - это исходные очищенные функции, 6 компонентов PCA и метка кластеризации. Зависимой переменной является столбец RESPONSE в наборе данных. Чтобы предсказать значение ОТВЕТА, которое представляет собой двоичное значение 0 или 1, я использовал три модели: логистическую регрессию, случайный лес и k-NN для прогнозирования. GridSearch также проводится для получения наилучших параметров.

Результаты

Интерпретация, оценка модели и проверка

Часть отчета по сегментации клиентов

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

Для каждого компонента PCA я показал основные сведения о функциях, чтобы познакомиться с характеристиками. (Рис. 11 и Рис. 12) В первом столбце показана важность каждой функции.

Вот сводка, основанная на деталях каждого компонента. Для удобства я назову каждый компонент и объясню ниже.

Компонент PCA 1: Индекс богатых людей. Из-за низкой мобильности (схемы перемещения), высокой доли 1-2 семейных домов в PLZ8, высокой доли автомобилей на семью, большого количества зданий в микроячейке и высокой финансовой заинтересованности. Это могут быть люди, которые заботятся о финансовых новостях или продуктах, живут в оживленном районе города и склонны жить одни или жить только с партнером.

Компонент 2 PCA: индекс молодости и странствий. Человек родился в основном в 90-х годах с использованием цифровых средств массовой информации, а не для экономии денег, имеет большую привязанность к Интернету, не является финансовым инвестором и не склонен к традиционным взглядам.

Компонент 3 PCA: индекс мании автомобильной марки. Из-за высокой доли BMW и Mercedes Benz, автомобилей высшего класса или спортивных автомобилей и высокой доли ведущих немецких производителей (Mercedes, BMW ).

Компонент 4 PCA: индекс онлайн-покупателей. Из-за высокой активности транзакций, высокой активности транзакций MAIL-ORDER, высокой плотности жителей на квадратный километр и большого числа 6–10 человек. семейные дома.

Компонент 5 PCA: индекс срока службы автомобилей. Из-за высокой доли автомобилей с мощностью двигателя от 61 до 120 кВт, высокой доли автомобилей без прав собственности, большого количества автомобилей. с 5 местами, высокой долей азиатских производителей и высокой долей новостроек

Компонент PCA 6: Индекс антиобщества. Из-за низкой склонности к мечтаниям, низкого семейного мышления, низкого культурного и социального мышления, но не религиозности.

Помимо компонентов PCA, я также сравнил разницу между населением в целом и клиентами. Как упоминалось в предыдущем разделе, я получил результаты, представленные ниже на рисунках 9 и 10.

  • Общее население, которое больше, вероятно, будет частью основного клиента компании, занимающейся доставкой по почте: кластеры 21 и 28.
  • Общее население, которое реже, вероятно, будет частью основного клиента компании, занимающейся доставкой по почте: кластеры 6 и 20.

Рассматривая каждый кластер, вот характеристика для каждого (для удобства возьмем критерий абсолютного значения 3):

  • кластер 21: компонент 2 PCA (индекс молодого и блуждающего) имеет отрицательную связь.
  • кластер 28: компонент 4 PCA (Online Shopper Index) имеет положительную взаимосвязь.
  • кластер 6: компонент PCA 1 (Индекс богатых людей) и 3 (Индекс мании автомобильной марки) отрицательно связаны, в то время как компонент PCA 5 (Индекс автомобильной жизни ) положительно связано
  • кластер 20: компонент PCA 1 (Индекс богатых людей) имеет отрицательную связь, а 6 (Индекс антиобщества) положительно связан

Объединив всю информацию выше, вот резюме.

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

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

Модель контролируемого обучения

Данные были разделены на данные обучения и данные тестирования. Однако результаты не были хорошими. Для трех моделей (логистическая регрессия, случайный лес и k-NN) ни одна из них не имеет хорошей точности. Я расскажу об этом в следующей части обоснования.

Обоснование

Модель контролируемого обучения

Поскольку исходные данные несбалансированы (большая часть ОТВЕТА - 0, значение 1 ниже 1%), я попробовал следующие части для решения проблемы:

  1. Используйте метод GridSearch.
  2. Установите параметр class_weight.
  3. Установите параметр стратификации в процессе train_test_split.
  4. Попробуйте использовать более 6 компонентов PCA на 20 компонентов PCA.

Однако ни один из них не повысил точность. В конце я оставлю эту часть в разделе улучшений.

Кроме того, я загрузил прогноз на основе тестовых данных в kaggle. Как уже упоминалось, производительность модели оставляет желать лучшего, поэтому и оценка тоже плохая. (Рис.13)

Заключение

Отражение

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

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

Улучшение

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

  1. Методы работы с несбалансированными данными: недостаточная или избыточная выборка.
  2. Увеличьте количество компонентов PCA.
  3. Используйте только компоненты PCA в качестве независимых переменных.