一、项目背景
群组分析:用户在产品使用中都有一个用户行为流程,不同时期的用户表现情况可能不一样,群组分析的主要目的是分析相似群体随时间的变化,核心就是对比、分析不同时间群组的用户,在相同周期下的行为差异, 所以也称同期群分析。
这里通过案例,展示群组分析在留存方面的使用方法
二、分析目标
查看各月的留存情况,反映当前运营策略情况
三、分析过程
1. 准备工作:
# 准备包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
# 导入数据
dt = pd.read_csv("groups_data")
df.head()
image.png
2. 设定订单交易月与用户首次交易月
订单交易月:当前订单交易的月份
用户首次交易月:即对用户分组,选择用户最早交易的日期对应的月份。
# 设定订单交易月份
df["orderperiod"] = df.orderdate.apply(lambda x:x.strftime("%Y-%m"))
# 设定用户首次交易月
# 需要先设置userid为索引,这样方便对分组取最小月后的数据根据索引匹配到原来的数据中
df.set_index("userid",inplace=True)
df["cohortgroup"]=df.groupby(level=0)["orderdate"].min().apply(lambda x:x.strftime("%Y-%m"))
df.reset_index(inplace=True)
df.head()
image.png
3. 根据首次的月份 以及 当前订单月份分组聚合,可以获得不同月份首次购买的客户在后续的月份中的购买情况
grouped = df.groupby(["cohortgroup","orderperiod"])
# 分组后对用户,订单进行去重计数,对消费金额进行累加
cohorts = grouped.agg({"userid":pd.Series.nunique,"orderid":pd.Series.nunique,"totalcharges":"sum"})
cohorts.rename(columns = {"userid":"totalusers","orderid":"totalorders"},inplace = True)
cohorts.head()
image.png
4. 为每个首购的分组排序,获得购买后的时间顺序
def cohort_period(df):
df["cohortperiod"] = np.arange(len(df)) + 1
return df
cohorts = cohorts.groupby(level=0).apply(cohort_period)
# 重置索引
cohorts.reset_index(inplace=True)
cohorts.set_index(["cohortgroup","cohortperiod"],inplace=True)
cohorts
image.png
5. 获取首购月份的客户数量,作为计算留存的分母
cohort_group_size = cohorts.groupby(level=0)["totalusers"].first()
6. 将表的首月索引转为列索引,然后对表的每行计算留存率
user_retention = cohorts["totalusers"].unstack(0).divide(cohort_group_size,axis=1)
user_retention.head()
image.png
7. 可视化
# 魔法函数,实时展示效果
%matplotlib inline
user_retention[["2009-01","2009-02","2009-03"]].plot(figsize=(5,3))
plt.title("user tetention")
plt.xticks(np.arange(1,12.1,1))
plt.xlim(1,12)
plt.ylabel("%of cohort")
image.png
2月的留存率较1月更低,3月恢复,可能由于2月才去的策略存在问题,导致留存率降低,3月恢复,表名策略重新更改,留存回升