Привет! Продолжем изучать Pandas. В прошлый раз я рассказал о возможностях библиотеки, а сегодня покажу, как с её помощью делать когортный анализ.
Прежде всего, вспомним, что такое когорты и как их анализировать.
Когорта — это группа людей, которая совершила нужное действие в определенный промежуток времени.
Когортный анализ — это наблюдение за когортами. Выбираем одну или несколько метрик, измеряем их и делаем выводы.
Например, социологи могут отслеживать, сколько людей, родившихся в 1980 году, получили высшее образование. Когорта здесь — те, кто родились в 1980 году. Метрика — доля людей с высшим образованием.
Еще пример: маркетологи хотят узнать, сколько заказов и выручки принесли пользователи, совершившие свой первый заказ год назад. Теперь когорта — это прошлогодние покупатели, а метрики — количество заказов и выручка.
Получается, когортный анализ состоит из трех шагов: определения нужного действия и временного промежутка когорты и выбора метрик для отслеживания:
Действие | Время | Метрика |
---|---|---|
Родились | В 1980 году | % людей с высшим образованием |
Впервые |
Год назад | Количество заказов и выручка |
Установили приложение | Неделю назад | % пользователей, открывших приложение еще раз |
Когорты можно сравнивать между собой. Например, маркетологи измеряют, сколько заказов обычно делают пользователи в течение месяца после первой покупки и смотрят динамику:
Месяц | Клиенты | Покупок в 1й месяц | Покупок на клиента |
---|---|---|---|
Январь 2018 | 134 | 161 | 1.20 |
Февраль 2018 | 164 | 194 | 1.18 |
Март 2018 | 193 | 200 | 1.03 |
Общее количество клиентов и покупок выросло — приятно. Но, сравнив когорты, видим, что в среднем клиенты стали покупать реже — тревожный знак.
Ок, теперь мы готовы к тому, чтобы научиться делать когортный анализ с помощью Pandas. Для наглядности решим задачу.
Задача
Допустим, мы работаем в
Каждая строка таблицы orders
— это покупка. Мы знаем, когда она произошла, кто её сделал и сколько денег она принесла в магазин. Дата заказа лежит в поле order_date
, номер покупателя — в customer_id
, а выручка — в sales
.
Часто бывает, что даты загружаются в виде текста. Преобразим колонку order_date
из текста в дату:
Данные перед нами, теперь можно с ними работать. Начнем с простого: выясним, сколько всего в магазине было покупок и выручки.
Считаем покупки и выручку
Чтобы посчитать общую выручку, просуммируем колонку sales
:
Количество заказов можно посчитать с помощью этой же колонки, но вместо суммы используем метод count()
:
Теперь посчитаем обе метрики для каждого пользователя. Сгруппируем датафрейм по полю customer_id
:
Видим, например, что пользователь AA-10315 сделал 5 заказов и принес $5563 выручки.
Идём дальше. Чтобы построить когорты, нам нужно сгруппировать клиентов по дате их первой покупки. В данных нет такого поля, значит, нужно его посчитать.
Считаем дату первой покупки
Чтобы вычислить дату первой покупки каждого пользователя, сгруппируем данные по customer_id
и найдем минимальное значение поля order_date
. Результат сохраним в переменную first_orders
:
Видим, что пользовать AA-10315 впервые что-то купил 31 марта 2014 года, а пользователь AA-10375 — 21 апреля того же года.
Зная даты первых покупок, можем строить когорты.
Строим когорты
Итак, когортами будем считать людей, сделавших первую покупку в тот или иной день. Метрики для отслеживания — количество заказов и выручка.
План такой: сначала добавим дату первой покупки пользователей в таблицу с заказами, затем сгруппируем по датам первой покупки и заказа и, наконец, посчитаем выручку и количество заказов каждой когорты.
Приступим. Добавим дату первой покупки с помощью метода merge()
и сохраним получившийся датафрейм в переменную orders_merged
:
В строках получившегося датафрейма всё еще покупки, но теперь в таблице появилась новая колонка: дата первой покупки пользователя.
Агрегируем по дате первой покупки и посчитаем нужные показатели:
Видим, что клиенты от 3 января 2014 года, всего сделали 9 заказов на $1050.6. Посмотрим, когда были эти заказы. Для этого добавим к группировке колонку order_date
:
Ага, первый заказ этой когорты был 3 января на $16. В следующий раз клиент вернулся почти год спустя и купил что-то ещё, в этот раз на $153. Следующая покупка была уже в апреле 2015 и так далее.
Когорты готовы, теперь решим задачу.
Решаем задачу
Напомню, что мы хотим посчитать, сколько в среднем заказов и выручки приносят клиенты в течение года, после первой покупки.
Мы знаем, сколько магазин заработал с каждой когорты за всё время. Уточним метрику: посчитаем показатели за первый год жизни когорты.
Сначала узнаем, сколько дней прошло между первой покупкой и последующим заказом, и удалим те, которые случились позже 365 дней. Чтобы посчитать количество дней между заказами, вычтем из колонки order_date
столбец first_order
:
Вуаля. Видим, что, например, заказ 131884
случился 455 дней спустя первой покупки. 455 days
— это тип данных под названием «Timedelta», его специально придумали, чтобы показывать временные промежутки.
Чтобы удалить поздние заказы, добавим условие <= '365 days'
:
Сохраним результат в переменную year_1_filter
, отфильтруем ненужные заказы из когортного отчета и сохраним результат в переменную year_1_orders
:
В датафрейме остались только заказы, сделанные когортами в первый год после первой покупки. Теперь сгруппируем заказы по дате первой покупки и посчитаем нужные метрики. Результат сохраним в переменную cohorts
:
Последний шаг: посчитаем, сколько в среднем заказов и приносят клиенты в течение первого года. Для этого сначала просуммируем показатели каждой когорты, а затем усредним значения методом mean()
:
Готово! В среднем за первый год когорты делают по 4 заказа и приносят по $1949 долларов.
Есть много способов улучшить решение, например сгруппировать дневные когорты в недельные или месячные, визуализировать отчет в таблице или на графике. Наконец, интересно разбить когорты по каким-то признакам, например, отделить частных покупателей от компаний — наверняка их показатели существенно отличаются.
Обо всем этом в следующих сериях. Подписывайтесь на канал, чтобы не пропустить.
Адиос!