Bertelsmann Avarato: сегментация клиентов и прогнозирование потенциальных клиентов
Пошаговое руководство по проекту Bertelsmann Avarato по науке о данных — Сегментация клиентов и прогнозирование потенциальных клиентов.
Введение
Один из клиентов Bertelsmann Avarato, компания, занимающаяся доставкой по почте, расширяется из одного города Германии в другой и ищет информацию, которая поможет оптимизировать их усилия и инвестиции.
Нам даны 2 основных набора данных, Azdias и клиенты, и 2 файла Excel, которые объясняют атрибуты, наборы данных, содержащие информацию об общей популяции и информацию о предыдущих клиентах, и 2 файла Excel, объясняющие все атрибуты и возможные значения, и их значения. Наряду с этим нам также предоставляется набор данных, в котором у нас есть ответы клиентов о покупках, которые мы будем использовать для построения модели контролируемого обучения.
Udacity_AZDIAS_052018.csv
: Демографические данные для населения Германии в целом; 891 211 лиц (строк) x 366 черт (столбцов).Udacity_CUSTOMERS_052018.csv
: Демографические данные клиентов компании, занимающейся доставкой по почте; 191 652 лица (строки) х 369 признаков (столбцы).Udacity_MAILOUT_052018_TRAIN.csv
: демографические данные для лиц, ставших мишенями маркетинговой кампании; 42 982 лиц (строки) х 367 (столбцы).Udacity_MAILOUT_052018_TEST.csv
: Демографические данные для лиц, ставших мишенями маркетинговой кампании; 42 833 лиц (строки) х 366 (столбцы).
Этот набор данных недоступен для публичной загрузки, и я удалю набор данных после того, как закончу и отправлю свой проект в Udacity.
Ссылка на GitHub и код приведены внизу этой статьи.
Подход
Проект можно разделить на 2 части: первая часть будет посвящена анализу атрибутов постоянных клиентов и общей совокупности для создания клиентских сегментов, а во второй части мы используйте третий набор данных с атрибутами из целей кампании по почте, и мы будем использовать предыдущий анализ для построения модели машинного обучения, которая предсказывает, ответит ли каждый человек на кампанию.
Часть 1: Отчет о сегментации клиентов
Мы начнем проект с использования метода обучения без учителя (Kmeans) для анализа атрибутов постоянных клиентов и населения в целом для создания сегментов клиентов.
0.0 Загрузка необходимых библиотек
Мы начинаем с первого импорта необходимых библиотек, и по мере нашего прогресса мы продолжаем добавлять библиотеки здесь вверху.
0.1 Загрузка наборов данных
Затем мы используем pd.read_csv() из библиотеки pandas для загрузки наборов данных в блокнот, это может занять некоторое время, поскольку наборы данных огромны, мы можем использовать волшебную функцию под названием notify из блокнота jupyter, чтобы дайте нам знать, когда загрузка будет завершена.
1.0 Исследовательский анализ данных
Взглянув на базу данных, мы видим, что в двух базах данных много пропущенных значений и количество столбцов разное, но атрибуты почти одинаковы.
В наборе данных клиента есть 3 дополнительных столбца {‘CUSTOMER_GROUP’, ‘ONLINE_PURCHASE’, ‘PRODUCT_GROUP’}
мы видим, что самый большой набор данных — это набор данных azdias, который содержит информацию об общей популяции, за которым следует набор данных о клиентах, содержащий информацию о клиентах.
Изучение файлов Excel, чтобы увидеть, как мы можем их использовать
1.DIAS_info
2.DIAS_атрибут
Таблица DIAS_attribute содержит информацию о возможных значениях, которые может иметь столбец, мы можем использовать эту информацию для классификации выбросов.
В DIAS_attribute у нас есть столбец под названием «Значение», где мы можем найти весь диапазон возможных значений, которые может иметь атрибут, мы можем использовать эту информацию для классификации выбросов и обеспечения законности набора данных.
Использование DIAS_attribute для поиска всех отсутствующих значений и обновления их в наборах данных azdias и клиентов.
Создание словаря, в котором ключ — это имя столбца, а значение — все значения со значением «неизвестно»
Это поможет нам создать словарь, в котором все столбцы являются ключами, а все значения, означающие отсутствующие значения, — значениями.
Поскольку у нас есть словарь со структурированной информацией обо всех столбцах и всех возможных отсутствующих значениях, мы пишем функцию, которая поможет нам получить фрейм данных и преобразовать все значения в np.nan.
Как мы видим, количество значений np.nan увеличивается, поскольку мы обновили набор данных, заполнив np. nan на основе информации из DIAS_info.
Управление выбросами
Набор данных DIAS.info содержит информацию обо всех значениях, которые может иметь конкретный атрибут, на основе этой информации мы можем классифицировать допустимые значения от выбросов.
Функция «get_unique_values (df)» получает фрейм данных и создает словарь, в котором атрибуты являются ключами, а все уникальные значения, которые они содержат, — их значениями.
Затем мы пишем функцию «get_attributes_range(df)», чтобы получить фрейм данных и создать словарь, который имеет атрибуты в качестве ключей и правильные возможные значения, которые они могут хранить в качестве своих значений.
Функции get_difference() и get_validation() используются для обнаружения и классификации выбросов. Если вы проверите блокнот, вы увидите результат, напечатанный ниже.
Управление отсутствующими значениями
Колонка мудрая
missing_values() и deleting_missing_columns() — это две функции, которые мы будем использовать в этой записной книжке. три параметра, df-DataFrame, Percent- Минимальный порог, выше которого мы хотим видеть пропущенные значения, Delete- 0-не удалять столбцы, 1-удалить столбцы.
Мудрый ряд
Основываясь на анализе в блокноте, мы решили заполнить пропущенные значения средним значением для столбцов int и float и использовать bfill и ffill для других столбцов.
Как только мы заполним столбцы, формы набора данных изменятся,
Распределение
Проверка распределения столбцов в наборе данных,
Мы видим, что некоторые из распределений, которые были сильно перекошены, теперь имеют кривую распределения для распределения, некоторые все еще перекошены, но это лучше, чем раньше.
Проклятие размерности
Наш набор данных имеет более 360 функций, прежде чем мы возьмем эти наборы данных для обучения наших моделей, нам необходимо убедиться, что мы применяем PCA — анализ основных компонентов к нашему набору данных и уменьшаем их для повышения точности и производительности.
PCA: анализ основных компонентов
PCA — это очень популярный метод, который помогает нам уменьшить количество столбцов, определяя чистую совокупную дисперсию, вносимую каждым столбцом, на основе того, что мы можем отбросить столбцы, которые не дают много информации.
Чтобы начать с PCA, нам нужно масштабировать наши функции, мы сделаем это, применив min max scaler,
Хорошей практикой является сохранение наших предварительно обработанных данных в виде отдельного CSV, чтобы мы могли восстановить нашу работу с того места, где мы остановились, поэтому давайте сохраним нашу тяжелую работу,
Это функция, которая инициирует PCA, сопоставляет предоставленные данные и возвращает компоненты PCA и преобразованные данные.
Эта функция отображает кумулятивную дисперсию, объясненную атрибутами в наборе данных, запуская ее на преобразованном наборе данных, который мы получаем.
Из графика можно сделать вывод, что 150 компонентов объясняют ~90% дисперсии.
Двигаясь вперед, мы уменьшим количество измерений до 150, поскольку они в совокупности дают 95+ процентов информации.
Теперь, когда у нас есть наборы данных, готовые к обработке и анализу, мы можем приступить к использованию неконтролируемой модели, такой как кластеризация K-средних, для кластеризации набора данных в группы.
Использование Kmeans
Чтобы использовать Kmeans, нам нужно определить количество кластеров, которые мы хотим создать (значение k), для этого мы построим кривую локтя.
На кривой локтя мы ищем точку, после которой уменьшение среднего расстояния не является существенным для увеличения значения K, и из графика совершенно очевидно, что после K=7 уменьшение среднего расстояния до центроида уменьшается. , поэтому, исходя из этого, мы считаем, что значение K равно 7.
Итак, мы инициализируем нашу модель Kmean с k = 7 и подгоняем полный набор данных azdias init. После завершения обучения мы прогнозируем набор данных клиента, используя только что созданную модель, для каждой строки в наборе данных наша модель классифицирует их в кластеры, обозначенные число от 0 до 6.
Мы преобразуем выходные данные кластеризации во фрейм данных, чтобы выполнить дальнейшую обработку для нашего анализа, после преобразования мы вычисляем распределение строк в кластерах и вычисляем процент значений в каждом кластере.
Наконец, мы построили наш анализ, используя гистограмму, чтобы визуализировать и увидеть взаимосвязь. Мы видим, что кластеры «0», «1», «5» и «6» имеют больший процент клиентов, чем население в целом, что означает, что население в целом, попадающее в эти кластеры, будет очень похоже на существующих клиентов и, скорее всего, станет ими.
Теперь нам нужно определить столбцы и значения, составляющие кластер, которые помогут нам в определении потенциальных клиентов, для этого нам придется обратить KMeans и PCA для каждого кластера.
Кластер 0
Values \ D19_GESAMT_ONLINE_QUOTE_12 0.863962 KBA13_ANTG2 0.868198 D19_VERSI_DATUM 0.875192 PLZ8_ANTG2 0.880153 D19_BANKEN_ONLINE_DATUM 0.892242 ORTSGR_KLS9 0.892800 EXTSEL992 0.894953 ONLINE_AFFINITAET 0.897524 LNR 0.912753 D19_TELKO_DATUM 0.912831 FINANZ_VORSORGER 0.917689 D19_TELKO_OFFLINE_DATUM 0.963258 D19_BANKEN_OFFLINE_DATUM 0.968765 EWDICHTE 0.971143 WOHNDAUER_2008 0.971538 D19_VERSI_OFFLINE_DATUM 0.983251 DSL_FLAG 0.987458 D19_TELKO_ONLINE_DATUM 0.996606 D19_VERSI_ONLINE_DATUM 0.996735 STRUKTURTYP 1.092753 Description \ D19_GESAMT_ONLINE_QUOTE_12 amount of online transactions within all trans... KBA13_ANTG2 NaN D19_VERSI_DATUM actuality of the last transaction for the segm... PLZ8_ANTG2 number of 3-5 family houses in the PLZ8 D19_BANKEN_ONLINE_DATUM actuality of the last transaction for the segm... ORTSGR_KLS9 classified number of inhabitants EXTSEL992 NaN ONLINE_AFFINITAET online affinity LNR NaN D19_TELKO_DATUM actuality of the last transaction for the segm... FINANZ_VORSORGER financial typology: be prepared D19_TELKO_OFFLINE_DATUM actuality of the last transaction for the segm... D19_BANKEN_OFFLINE_DATUM actuality of the last transaction for the segm... EWDICHTE density of inhabitants per square kilometer WOHNDAUER_2008 length of residenca D19_VERSI_OFFLINE_DATUM actuality of the last transaction for the segm... DSL_FLAG NaN D19_TELKO_ONLINE_DATUM actuality of the last transaction for the segm... D19_VERSI_ONLINE_DATUM actuality of the last transaction for the segm... STRUKTURTYP NaN Information level D19_GESAMT_ONLINE_QUOTE_12 Household KBA13_ANTG2 NaN D19_VERSI_DATUM Household PLZ8_ANTG2 PLZ8 D19_BANKEN_ONLINE_DATUM Household ORTSGR_KLS9 Community EXTSEL992 NaN ONLINE_AFFINITAET RR1_ID LNR NaN D19_TELKO_DATUM Household FINANZ_VORSORGER Person D19_TELKO_OFFLINE_DATUM Household D19_BANKEN_OFFLINE_DATUM Household EWDICHTE Postcode WOHNDAUER_2008 Household D19_VERSI_OFFLINE_DATUM Household DSL_FLAG NaN D19_TELKO_ONLINE_DATUM Household D19_VERSI_ONLINE_DATUM Household STRUKTURTYP NaN
Кластер 1
Values \ D19_TELKO_DATUM 0.901445 KBA05_ANTG1 0.902804 LNR 0.913521 KBA05_GBZ 0.924788 ALTER_HH 0.939921 D19_TELKO_OFFLINE_DATUM 0.955828 D19_BANKEN_OFFLINE_DATUM 0.964354 LP_STATUS_GROB 0.968592 DSL_FLAG 0.972077 D19_VERSI_OFFLINE_DATUM 0.978844 FINANZ_MINIMALIST 0.980407 WOHNDAUER_2008 0.983777 D19_VERSI_ONLINE_DATUM 0.996006 D19_TELKO_ONLINE_DATUM 0.996528 ONLINE_AFFINITAET 1.011471 LP_LEBENSPHASE_FEIN 1.038416 LP_STATUS_FEIN 1.041598 LP_LEBENSPHASE_GROB 1.061164 LP_FAMILIE_FEIN 1.065723 LP_FAMILIE_GROB 1.108554 Description \ D19_TELKO_DATUM actuality of the last transaction for the segm... KBA05_ANTG1 number of 1-2 family houses in the cell LNR NaN KBA05_GBZ number of buildings in the microcell ALTER_HH main age within the household D19_TELKO_OFFLINE_DATUM actuality of the last transaction for the segm... D19_BANKEN_OFFLINE_DATUM actuality of the last transaction for the segm... LP_STATUS_GROB social status rough DSL_FLAG NaN D19_VERSI_OFFLINE_DATUM actuality of the last transaction for the segm... FINANZ_MINIMALIST financial typology: low financial interest WOHNDAUER_2008 length of residenca D19_VERSI_ONLINE_DATUM actuality of the last transaction for the segm... D19_TELKO_ONLINE_DATUM actuality of the last transaction for the segm... ONLINE_AFFINITAET online affinity LP_LEBENSPHASE_FEIN lifestage fine LP_STATUS_FEIN social status fine LP_LEBENSPHASE_GROB lifestage rough LP_FAMILIE_FEIN family type fine LP_FAMILIE_GROB family type rough Information level D19_TELKO_DATUM Household KBA05_ANTG1 Microcell (RR4_ID) LNR NaN KBA05_GBZ Microcell (RR3_ID) ALTER_HH Household D19_TELKO_OFFLINE_DATUM Household D19_BANKEN_OFFLINE_DATUM Household LP_STATUS_GROB Person DSL_FLAG NaN D19_VERSI_OFFLINE_DATUM Household FINANZ_MINIMALIST Person WOHNDAUER_2008 Household D19_VERSI_ONLINE_DATUM Household D19_TELKO_ONLINE_DATUM Household ONLINE_AFFINITAET RR1_ID LP_LEBENSPHASE_FEIN Person LP_STATUS_FEIN Person LP_LEBENSPHASE_GROB Person LP_FAMILIE_FEIN Person LP_FAMILIE_GROB Person
Кластер 5
Values \ KBA05_GBZ 0.947666 D19_BANKEN_ONLINE_DATUM 0.963115 RT_SCHNAEPPCHEN 0.963800 KBA05_ANTG1 0.970912 D19_TELKO_OFFLINE_DATUM 0.974054 D19_BANKEN_OFFLINE_DATUM 0.977057 D19_VERSI_OFFLINE_DATUM 0.987146 SEMIO_VERT 0.991396 D19_TELKO_ONLINE_DATUM 0.997941 D19_VERSI_ONLINE_DATUM 0.998505 DSL_FLAG 0.998840 WOHNDAUER_2008 1.016094 CJT_TYP_4 1.035105 LP_STATUS_GROB 1.036272 CJT_TYP_6 1.043066 CJT_TYP_3 1.043640 CJT_TYP_5 1.043770 FINANZ_VORSORGER 1.052111 LP_STATUS_FEIN 1.083459 FINANZ_MINIMALIST 1.113985 Description \ KBA05_GBZ number of buildings in the microcell D19_BANKEN_ONLINE_DATUM actuality of the last transaction for the segm... RT_SCHNAEPPCHEN NaN KBA05_ANTG1 number of 1-2 family houses in the cell D19_TELKO_OFFLINE_DATUM actuality of the last transaction for the segm... D19_BANKEN_OFFLINE_DATUM actuality of the last transaction for the segm... D19_VERSI_OFFLINE_DATUM actuality of the last transaction for the segm... SEMIO_VERT affinity indicating in what way the person is ... D19_TELKO_ONLINE_DATUM actuality of the last transaction for the segm... D19_VERSI_ONLINE_DATUM actuality of the last transaction for the segm... DSL_FLAG NaN WOHNDAUER_2008 length of residenca CJT_TYP_4 NaN LP_STATUS_GROB social status rough CJT_TYP_6 NaN CJT_TYP_3 NaN CJT_TYP_5 NaN FINANZ_VORSORGER financial typology: be prepared LP_STATUS_FEIN social status fine FINANZ_MINIMALIST financial typology: low financial interest Information level KBA05_GBZ Microcell (RR3_ID) D19_BANKEN_ONLINE_DATUM Household RT_SCHNAEPPCHEN NaN KBA05_ANTG1 Microcell (RR4_ID) D19_TELKO_OFFLINE_DATUM Household D19_BANKEN_OFFLINE_DATUM Household D19_VERSI_OFFLINE_DATUM Household SEMIO_VERT Person D19_TELKO_ONLINE_DATUM Household D19_VERSI_ONLINE_DATUM Household DSL_FLAG NaN WOHNDAUER_2008 Household CJT_TYP_4 NaN LP_STATUS_GROB Person CJT_TYP_6 NaN CJT_TYP_3 NaN CJT_TYP_5 NaN FINANZ_VORSORGER Person LP_STATUS_FEIN Person FINANZ_MINIMALIST Person
Кластер 6
Values \ D19_VERSI_DATUM 0.966979 WOHNDAUER_2008 0.984326 DSL_FLAG 0.985002 D19_BANKEN_DATUM 0.988743 D19_TELKO_DATUM 0.989619 D19_BANKEN_ONLINE_DATUM 0.993870 CJT_TYP_4 0.994601 CJT_TYP_5 0.994726 CJT_TYP_3 0.996422 D19_TELKO_OFFLINE_DATUM 0.997447 D19_VERSI_OFFLINE_DATUM 0.999335 D19_TELKO_ONLINE_DATUM 0.999689 D19_VERSI_ONLINE_DATUM 0.999875 D19_BANKEN_OFFLINE_DATUM 0.999881 FINANZ_VORSORGER 1.007278 CJT_TYP_6 1.008928 D19_VERSAND_DATUM 1.022207 CJT_KATALOGNUTZER 1.037212 D19_GESAMT_ONLINE_DATUM 1.051045 D19_VERSAND_ONLINE_DATUM 1.081430 Description \ D19_VERSI_DATUM actuality of the last transaction for the segm... WOHNDAUER_2008 length of residenca DSL_FLAG NaN D19_BANKEN_DATUM actuality of the last transaction for the segm... D19_TELKO_DATUM actuality of the last transaction for the segm... D19_BANKEN_ONLINE_DATUM actuality of the last transaction for the segm... CJT_TYP_4 NaN CJT_TYP_5 NaN CJT_TYP_3 NaN D19_TELKO_OFFLINE_DATUM actuality of the last transaction for the segm... D19_VERSI_OFFLINE_DATUM actuality of the last transaction for the segm... D19_TELKO_ONLINE_DATUM actuality of the last transaction for the segm... D19_VERSI_ONLINE_DATUM actuality of the last transaction for the segm... D19_BANKEN_OFFLINE_DATUM actuality of the last transaction for the segm... FINANZ_VORSORGER financial typology: be prepared CJT_TYP_6 NaN D19_VERSAND_DATUM actuality of the last transaction for the segm... CJT_KATALOGNUTZER NaN D19_GESAMT_ONLINE_DATUM actuality of the last transaction with the com... D19_VERSAND_ONLINE_DATUM actuality of the last transaction for the segm... Information level D19_VERSI_DATUM Household WOHNDAUER_2008 Household DSL_FLAG NaN D19_BANKEN_DATUM Household D19_TELKO_DATUM Household D19_BANKEN_ONLINE_DATUM Household CJT_TYP_4 NaN CJT_TYP_5 NaN CJT_TYP_3 NaN D19_TELKO_OFFLINE_DATUM Household D19_VERSI_OFFLINE_DATUM Household D19_TELKO_ONLINE_DATUM Household D19_VERSI_ONLINE_DATUM Household D19_BANKEN_OFFLINE_DATUM Household FINANZ_VORSORGER Person CJT_TYP_6 NaN D19_VERSAND_DATUM Household CJT_KATALOGNUTZER NaN D19_GESAMT_ONLINE_DATUM Household D19_VERSAND_ONLINE_DATUM Household
Для остальных кластеров и анализа, пожалуйста, проверьте код GitHub.
Таким образом, с помощью функции combine_info() мы можем обратить PCA и k-средних и определить столбцы, которые вносят наибольший вклад в формирование кластера, мы можем изучить это дальше, чтобы определить потенциальных клиентов. .
Теперь нам нужно перейти ко второй части проекта, где мы изучим другие наборы данных, при условии, что «mailout_train» mailout_train имеет ответы вместе с другими данными, чтобы мы могли построить контролируемую модель, которая будет предсказывать потенциального клиента.
Часть 2. Обучение с учителем для прогнозирования потенциальных клиентов
Для этого мы сначала обработаем данные mailout_train, затем применим модель логистической регрессии и предскажем вероятность того, что кандидат станет потенциальным клиентом.
Мы обрабатываем данные так же, как мы обрабатывали набор данных azdias и клиентов, поэтому я пропущу эту часть для этой статьи, вы можете найти подробное объяснение в записной книжке, единственное, что отличается, это то, что мы применяем методы кодирования для сохранения категорического категории.
Исследуя набор данных поезда mail_out, мы обнаружили, что распределение «RESPONSE» сильно несбалансировано.
Поэтому, чтобы решить эту проблему, нам нужно применить методы повышения частоты дискретизации, такие как SMOTE, чтобы сбалансировать набор данных.
Таким образом, после передискретизации наш набор данных сбалансирован до соотношения 1: 1, это поможет нам избежать переобучения модели.
Теперь, когда наш набор данных очищен, обработан и сбалансирован, мы можем начать строить нашу модель.
Я буду работать над моделью логистической регрессии, так как это бинарная классификация.
теперь мы можем протестировать нашу модель, используя тестовый сплит, который мы создали при выполнении train_test_split.
мы получаем точность 73%, что является хорошим началом, мы можем продолжить оптимизацию гиперпараметров, чтобы повысить точность модели.
Построение матрицы путаницы
Модель дает приличный ложноположительный и ложноотрицательный эталон, который мы можем еще больше снизить, используя оптимизацию параметров, а также исследуя другие модели машинного обучения.
Заключение
Таким образом, на основе всех предоставленных нам наборов данных мы смогли отфильтровать информацию и обучить модели, которые могут прогнозировать вероятность превращения кандидата в клиентов. Мы можем использовать эту информацию для оптимизации наших маркетинговых кампаний и ресурсов, а также для повышения нашей эффективности в усилий, эта записная книжка и блог — лишь верхушка айсберга. Необходимо провести гораздо больше анализа, чтобы выдать решающие идеи, над которыми компания должна работать.
Это был один из моих первых опытов работы над проектом по науке о данных, и мне было очень весело, если у кого-то есть комментарии или советы, которыми они могут поделиться, особенно о том, как мы можем дополнительно извлечь информацию из кластеризации данных, не стесняйтесь делиться.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.