Когортный анализ
Всем привет, меня зовут Питер~
Оригинальный адрес:Групповой анализ на Python на практике
В этой статье представлен метод анализа данных: когортный анализ. Когортный анализ — это аналитическая идея, используемая для изучения поведения пользователей и улучшения роста. В этой статье метод анализа будет реализован в сочетании с набором данных Python.
Адрес загрузки набора данных этой статьи:Уууууууууууууууууууууу.Карта реформированная.com/Meng Shame Nov/Oh...
Что такое когортный анализ
Когортный анализКогортный анализ фокусируется на группах/группах.Это метод, использующий стратификацию пользователей и моделирование пользователей.В основном он анализирует изменения и развитие одной и той же группы пользователей с течением времени. Нам нужно разделить всех набранных пользователей на группы или кластеры, которые можно разделить по дате, каналу или другим конкретным пользователям. Короче говоря, мы можем стратифицировать пользователей в соответствии с фактическими потребностями и размерами.
С помощью когортного анализа мы можем увидеть удержание различных групп. Диаграммы когортного анализа и кривые удержания являются наиболее часто используемыми инструментами удержания. Эти диаграммы в основном показывают нам, как пользователи участвуют в наших продуктах и каков уровень удержания.В то же время они также могут анализировать, соответствует ли скорость новых пользователей нашим требованиям.
В настоящее время многие инструменты BI на рынке могут строить графики и кривые удержания группового анализа, такие как GrowingIO, Sensors Big Data System, PowerBI и т. д. Однако, если вы хотите настроить некоторые параметры группировки или группировки, лучше всего использовать Python.
Сценарии использования когортного анализа
- Анализ удержания пользователей
- Анализ оттока пользователей
- Анализ конверсии пользователей
- Анализ коэффициента конверсии рекламы
Вышеупомянутый сценарий является очень распространенным сценарием использования, и его также можно распространить на другие случаи, такие как данные о платежах по транзакциям пользователей веб-сайта электронной коммерции, сравнительный анализ частоты транзакций пользователей, цены за единицу товара для клиентов и т. д., полученные в разные периоды.
Удержание пользователей
Удержание пользователей относится к существованию пользователей в определенный период времени. Зачем смотреть на удержание?
- Поймите качество канала: обычно ежедневное удержание, которое измеряет краткосрочную активность пользователей.
- Наблюдайте за общей ситуацией: используйте еженедельное или ежемесячное удержание, чтобы измерить прилипание пользователей к платформе.
Удержание делится на удержание на следующий день, удержание на 7 дней и удержание на 14 дней. Ниже приведен пример, иллюстрирующий общие правила расчета 7-дневного удержания.
Вопрос: Как рассчитывается 7-дневное удержание продукта?
Алгоритм удержания 1-7 дней
Первый алгоритм:第7天活跃人数 / 第1天活跃人数 * 100%
Алгоритм сохраняется в течение 2-7 дней
Второй алгоритм:第2天~第7天去重后/第1天*100%
Алгоритм 3 — 7-дневное удержание с разными определениями
В приведенном выше алгоритме 1 текущий день напрямую записывается как Day1, и есть другой метод расчета, который рассматривает текущий день как Day0, а затем начинает расчет;
Приведите пример, иллюстрирующий использование Алгоритма 3. Например, DAU=10 — это именно данные, сгенерированные на 2-й неделе:
- Если используется алгоритм 1, удержание на 7-й день = данные следующей недели 1/данные этой недели 2 (10)
- Если используется алгоритм 2, удержание на 7-й день = данные следующей недели 2 / данные этой недели 2 (10)
Примечание. Алгоритм 3 может в определенной степени тонко избегать влияния уровня недели.
3 алгоритма хранения
Данные в этой статье
Импорт данных
Набор данных, используемый в этой статье, загружается с kaggle, в основном включая время возникновения события, тип (просмотр, добавление покупки, удаление корзины и покупка), идентификатор продукта, идентификатор категории, код продукта, бренд, цена, идентификатор пользователя, сеанс пользователя, всего 7 свойств
import numpy as np
import pandas as pd
import datetime as dt
import matplotlib.pyplot as plt
import seaborn as sns
#设置汉字格式:Trebuchet MS, Tahoma, Verdana, Arial, Helvetica,SimHei 中文的幼圆、隶书等等
# 解决中文无法显示问题
plt.rcParams['font.sans-serif']=['Songti SC']
# 解决保存图像中负号'-'显示为方块问题
plt.rcParams['axes.unicode_minus'] = False
исследование данных
Основное представление - это тип данных, количество строк и столбцов данных, чтобы увидеть размер, отсутствующее значение данных.
df.dtypes # 数据类型
# 结果
event_time object
event_type object
product_id int64
category_id int64
category_code object
brand object
price float64
user_id int64
user_session object
dtype: object
df.shape # 数据的行列数
# 结果
(3533286, 9)
df.isnull().sum() # 字段缺失值情况
# 结果
event_time 0
event_type 0
product_id 0
category_id 0
category_code 3474821 # 缺失值严重
brand 1510289
price 0
user_id 0
user_session 779
dtype: int64
Очистка данных
Основная операция заключается в том, чтобы выбрать в данных цену больше и удалить повторяющуюся операцию:
обработка данных
В случае этой статьи групповой анализ заключается в расчете временного интервала в зависимости от времени первого посещения и каждого посещения, чтобы рассчитать ситуацию с удержанием. Конкретные шаги заключаются в следующем:
- Рассчитайте min_day времени первого посещения каждого пользователя
- Запишите интервал day_gap между временем каждого последующего посещения и временем первого посещения.
- Поскольку это данные электронной коммерции за декабрь, мы разделим месяц на 10 частей, а период времени составит 3 дня.
Поскольку два вышеупомянутых фактора связаны со временем, необходимо импортировать мощную библиотеку даты и времени в Python, чтобы справиться с потребностями обработки времени.
1. Получить время в event_time: год месяц день
def get_time(datetime):
"""
函数作用:获取时间中的年月日
"""
event_time = datetime.strip(" UTC") # 传进来的参数去掉 UTC部分
# dt表示datetime库
event_time = dt.datetime.fromisoformat(event_time) # 生成一个YYYY-MM-DD的date对象
y = dt.date(event_time.year,event_time.month,event_time.day) # 取出年月日
return y
df2["event_day"] = df2["event_time"].apply(get_time)
df2
2. Определите самое раннее время в соответствии с user_id каждого пользователя.
# 用户本月的最早登陆时间确定
grouping = df2.groupby("user_id")["event_day"]
grouping
df2["min_day"] = grouping.transform("min")
df2.head()
3. Рассчитайте интервал между днем доступа event_day и самым ранним временем доступа
# 计算用户当日访问event_day和最早访问时间min_day之间的时间间隔
# 3为假定的用户分组访问周期
df2["day_gap"] = (((df2["event_day"] - df2["min_day"]) // 3) + dt.timedelta(days=1)).apply(lambda x:x.days)
df2
4. Подсчитайте количество пользователей по времени первого доступа и интервалу времени
# 按照首次访问时间和下一次访问的间隔,统计用户数
grouping1 = df2.groupby(["min_day","day_gap"])
# 根据用户user_id去重统计每个组的用户数
# grouping1["user_id"].apply(pd.Series.nunique):展示去重的总个数
# grouping1["user_id"].apply(pd.Series.unique): 展示去重之后的具体元素
df3 = grouping1["user_id"].apply(pd.Series.nunique).reset_index()
df3.head()
Данные в приведенной выше таблице показывают, что количество людей с текущим временным интервалом 1, 2, 3... составляет 17 519, 2 591, 2 276 и т. д.
5. Создайте сводную таблицу
С приведенной выше сгруппированной статистикой мы можем создать сводную таблицу.
# 数据透视部分
df4 = df3.pivot(index="min_day",columns="day_gap",values="user_id")
df4.head()
6. Измените форму данных: удобно использовать проценты для отображения данных в конце
В обычных обстоятельствах мы привыкли использовать проценты для представления удержания пользователей, и мы можем четко видеть коэффициент удержания пользователей. Сначала вынимаем данные первого столбца (все строки):
Разделите каждые последующие данные на первые данные соответствующей даты:
# divide 函数
table = df4.divide(size,axis=0) # 在行的方向上除以对应size中的值
table.head()
Сохраняйте 3 знака после запятой и одновременно изменяйте значение индекса таблицы данных:
# 保留3位小数并乘以100
table.round(3) * 100
# 索引重置,只取出年月日,后面的时分秒取消
table.index = table.index.date
График когортного анализа
Постройте тепловую карту удержания когортного анализа:
# 解决中文无法显示问题
plt.rcParams['font.sans-serif']=['Songti SC']
# 解决保存图像中负号'-'显示为方块问题
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(15,8))
plt.title("群组分析留存图")
sns.heatmap(data=table,
annot=True,
fmt='.0%',
vmin = 0.0,
vmax = 0.2,
cmap="BuPu_r"
)
plt.show()
Из приведенных выше данных мы видим, что ситуация с удержанием в течение первых 6 дней по-прежнему очень красивая (более светлый цвет, относительно высокий уровень удержания).
Возможная причина в том, что это полный объем данных за весь декабрь, в результате чего самые активные пользователи классифицируются как новые активные пользователи за несколько дней до начала месяца. Однако данные в целом достигают конца месяца, а доля удержания по-прежнему невелика, и ситуация с месячным удержанием не впечатляет.