Или как научиться создавать красивые и информативные графики с помощью Python - пошаговое руководство

В рассказе на прошлой неделе «Извлечение данных из разных листов с помощью Python» вы узнали, как извлекать и объединять данные из разных источников (Google Таблицы, CSV и Excel). Обе истории работают как отдельные истории, поэтому не беспокойтесь, если вы пропустили статью на прошлой неделе.



Из сегодняшней истории вы узнаете:

  • как объединить и обработать данные,
  • как исследовать и анализировать данные,
  • как создавать красивые графики для визуализации ваших результатов

Для кого предназначена эта статья:

  • Люди, которые много работают с данными
  • Люди, имеющие базовые представления о Python и Pandas

Резюме ситуации:

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

Для анализа у вас есть доступ к следующим трем источникам данных:

  • order_leads (содержит всю информацию о потенциальных клиентах и ​​конверсиях)
  • sales_team (включает компании и ответственных торговых представителей)
  • счета-фактуры (содержит информацию о счетах-фактурах и участниках)

Импорт и настройки:

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

!pip install seaborn

Загрузите данные:

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

Приступим к изучению:

Общая динамика конверсии:

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

  1. Мы используем нижнее подчеркивание _ как временную переменную. Обычно я делаю это для одноразовых переменных, которые я больше не буду использовать позже.
  2. Мы использовали pd.DateTimeIndex на order_leads.Date и установили результат как индекс, это позволяет нам
  3. используйте pd.Grouped(freq='D') для группировки наших данных по дням. Кроме того, вы можете изменить частоту на W, M, Q или Y (для недели, месяца, квартала или года)
  4. Мы рассчитываем среднее значение «Конвертировано» для каждого дня, что дает нам коэффициент конверсии для заказов в этот день.
  5. Мы использовали .rolling(60) с .mean(), чтобы получить скользящее среднее за 60 дней.
  6. Затем мы форматируем yticklables так, чтобы они отображали знак процента.

Коэффициент конверсии торговых представителей:

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

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

Если мы вспомним данные sales_team, мы вспомним, что не все торговые представители имеют одинаковое количество учетных записей, это, безусловно, может иметь влияние! Давайте проверим.

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

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

Эффект от приема пищи:

Похоже, у нас есть дата и время приема пищи, давайте быстро посмотрим на распределение времени:

out:
07:00:00    5536
08:00:00    5613
09:00:00    5473
12:00:00    5614
13:00:00    5412
14:00:00    5633
20:00:00    5528
21:00:00    5534
22:00:00    5647

Похоже, мы можем резюмировать это:

Обратите внимание, как мы используем здесь pd.cut для присвоения категорий нашим числовым данным, что имеет смысл, потому что в конце концов, вероятно, не имеет значения, начинается ли завтрак в 8 или 9 часов.
Кроме того, обратите внимание, как мы используем .dt.hour, мы можем это сделать только потому, что раньше мы преобразовали invoices['Date of Meal'] в datetime. .dt - это так называемый аксессор, их всего три cat, str, dt. Если ваши данные имеют правильный тип, вы можете использовать эти средства доступа и их методы для непосредственной обработки (вычислительно эффективные и краткие).

invoices['Participants'], к сожалению, это строка, которую мы должны сначала преобразовать в допустимый JSON, чтобы мы могли извлечь количество участников.

Теперь давайте объединим данные. Для этого мы сначала соединяем все счета-фактуры до Company Id на order_leads. Однако объединение данных приводит к тому, что все блюда присоединяются ко всем заказам. Также древние блюда по более поздним заказам. Чтобы избежать этого, мы вычисляем разницу во времени между приемом пищи и заказом и учитываем только те блюда, которые были на пять дней после заказа.
Еще есть заказы, которым назначено несколько приемов пищи. Это может произойти, когда было два заказа в одно и то же время, а также два приема пищи. Тогда оба приема пищи будут назначены обоим потенциальным клиентам. Чтобы удалить эти дубликаты, мы сохраняем еду ближе всего к этому заказу.

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

Влияние типа еды:

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

Влияние времени (то есть было ли еда до или после заказа):

Отрицательное число для 'Days of meal before order' означает, что прием пищи был произведен после того, как поступил интерес к заказу. Мы видим, что, похоже, есть положительный эффект на коэффициент конверсии, если прием пищи происходит до того, как поступил потенциальный клиент заказа. Похоже, что предварительное знание заказ дает нашим торговым представителям преимущество.

Объединяя все это:

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

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

После выполнения следующего фрагмента будет создана многомерная тепловая карта.

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

  • Время приема пищи: после заказа, до заказа, до заказа (внешние строки)
  • Тип питания: завтрак, ужин, обед (внешние столбцы)
  • Значения цены на питание / заказа: наименее дорогое, менее дорогое, пропорциональное, более дорогое, наиболее дорогое (внутренние ряды)
  • Количество участников: 1,2,3,4,5 (внутренние столбцы)

Кажется, что цвета темнее / выше в нижней части диаграммы, что указывает на то, что

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

Выводы:

  1. Не давайте своим торговым представителям более 9 аккаунтов (так как коэффициент конверсии быстро падает)
  2. Убедитесь, что каждый заказ сопровождается встречей / обедом (так как это более чем вдвое увеличивает коэффициент конверсии
  3. Ужины наиболее эффективны, когда от заказчика работает всего один сотрудник.
  4. Ваши торговые представители должны оплачивать обеды в размере примерно от 8% до 10% от стоимости заказа.
  5. Ключевым моментом является своевременность, в идеале ваши торговые представители как можно раньше знают, что сделка приближается.

Щелкните здесь, чтобы увидеть код: GitHub Repo / Jupyter Notebook

Примечание к тепловой карте:

Чтобы устранить потенциально нестабильное форматирование, вы можете понизить версию matplotlib до версии 3.1.0, сначала удалив (вам нужно будет сделать это в терминале), а затем запустить:

!pip install matplotlib==3.1.0

Сообщите мне, если у вас возникнут проблемы с этим