本博客以步骤一(数据分组)为主
某电商平台有一批用户消费记录,包括用户信息,订单信息,金额,订单日期等等。希望通过群组分析,查看用户留存率变化趋势,分析不同时间群组的用户在相同的周期下的行为差异,为后续针对不同用户群体制定策略起到基础性工作。
import pandas as pd
import numpy as np
import sqlalchemy
# 读取数据
engine = sqlalchemy.create_engine('mysql+pymysql://**********@localhost:3306/froghd')
sql_cmd = "select * from groups_data"
# 执行sql语句,获取数据
df = pd.read_sql(sql=sql_cmd, con=engine)
#数据展示
df.head()
# 生成一个新字段,用户订单月份
df["orderperiod"] = df.orderdate.apply(lambda x:x.strftime("%Y-%m"))
# 设置userid为索引
df.set_index("userid",inplace=True)
# 这里的level=0表示第一层索引即userid,并且每次分组之后都会形成很多个dataframe
# 按照每个用户的订单的最早时期,生成用户群组
df["cohortgroup"]=df.groupby(level=0)["orderdate"].min().apply(lambda x:x.strftime("%Y-%m"))
df.reset_index(inplace=True)
df.head()
# 根据用户群组和月份字段进行分组
grouped = df.groupby(["cohortgroup","orderperiod"])
# 求每个用户群下每一个月份的用户数量、订单数量、购买金额
cohorts = grouped.agg({"userid":pd.Series.nunique,
"orderid":pd.Series.nunique,
"totalcharges":np.sum})
# 重命名
cohorts.rename(columns={"userid":"totalusers",
"orderid":"totalorders"},inplace=True)
cohorts.head()
四
随后还可以对每一个用户群组内的数据进行标签简化
每一个用户群组进行groupby并打标签
# 把每个群组继续购买的日期字段进行改变
def cohort_period(df):
# 给首次购买日期进行编号,第二次购买为2,第三次购买为3
df["cohortperiod"] = np.arange(len(df)) + 1
return df
# 注意的是apply后面传入的是一个个dataframe
cohorts = cohorts.groupby(level=0).apply(cohort_period)
cohorts.head()
# 得到每个群组的用户量
# 重新设置索引
cohorts.reset_index(inplace=True)
cohorts.set_index(["cohortgroup","cohortperiod"],inplace=True)
cohorts.head()
# 得到每个群组的用户量,就是第一天的用户数据量,用作留存率的分母
cohort_group_size = cohorts["totalusers"].groupby(level=0).first()
cohort_group_size.head()
# 计算每个群组的留存
# unstack 是把index转化为column
#unstack()中的序号表示要展示的列名
cohorts["totalusers"].unstack(0).head()
# 计算留存
user_retention = cohorts["totalusers"].unstack(0).divide(cohort_group_size,axis=1)
user_retention.head()
#这里写法不唯一,可以使用apply搭配lambda函数
# 折线图展示
import matplotlib.pyplot as plt
import matplotlib as mpl
pd.set_option("max_columns",50)
mpl.rcParams["lines.linewidth"] = 2
%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")
# 热力图展示
import seaborn as sns
sns.set(style="white")
plt.figure(figsize=(8,4))
plt.title("co:user retention")
sns.heatmap(user_retention.T,mask=user_retention.T.isnull(),annot=True,fmt=".0%")
本次主要以理解用户群组分析方法和python代码实操为主
用户群组分析就是将用户按照一定的特征进行分组归纳,其中一部分有些类似数据分箱;但主要应用方面是对不同时期的用户进行时间序列的分析,观察留存率,新老用户行为等等
python实现时间上的用户群组分析,需要注意如下几点:
(1)落脚点是用户,需要对用户进行groupby,但是要整合每个用户的最早消费日期和每次消费日期,故需要将用户信息设置成索引从而保证数据的完整性;
(2)将每个用户的两个时间整合好后,才开始进行用户群组(相同的起始时间)分析,对其进行groupby分组;
(3)留存率的分母是每一群组的起始用户数量=两个时间相同下的用户信息
对用户群组进行分解整理后,为后续的假设检验和相关性分析打下基础。