Анализ боевой группы Python Когортный анализ

анализ данных
Анализ боевой группы Python Когортный анализ

Когортный анализ

Всем привет, меня зовут Питер~

Оригинальный адрес:Групповой анализ на Python на практике

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

https://www.philosophicalhacker.com/post/better-cohort-analysis/

Адрес загрузки набора данных этой статьи:Уууууууууууууууууууууу.Карта реформированная.com/Meng Shame Nov/Oh...

Что такое когортный анализ

Когортный анализКогортный анализ фокусируется на группах/группах.Это метод, использующий стратификацию пользователей и моделирование пользователей.В основном он анализирует изменения и развитие одной и той же группы пользователей с течением времени. Нам нужно разделить всех набранных пользователей на группы или кластеры, которые можно разделить по дате, каналу или другим конкретным пользователям. Короче говоря, мы можем стратифицировать пользователей в соответствии с фактическими потребностями и размерами.

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

В настоящее время многие инструменты BI на рынке могут строить графики и кривые удержания группового анализа, такие как GrowingIO, Sensors Big Data System, PowerBI и т. д. Однако, если вы хотите настроить некоторые параметры группировки или группировки, лучше всего использовать Python.

Сценарии использования когортного анализа

  1. Анализ удержания пользователей
  2. Анализ оттока пользователей
  3. Анализ конверсии пользователей
  4. Анализ коэффициента конверсии рекламы

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

Удержание пользователей

Удержание пользователей относится к существованию пользователей в определенный период времени. Зачем смотреть на удержание?

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

Удержание делится на удержание на следующий день, удержание на 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 дней по-прежнему очень красивая (более светлый цвет, относительно высокий уровень удержания).

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