在实际操作中,用户转化状态分析是最复杂也是最难操作的,它比常规的留存分析更细致,并且用户存在多种状态的流转,因此使用Python实现用户生命周期的用户状态分层和可视化也是数据分析的重要一环。以用户的订单数据为例,见表3-4。
表3-4 用户的订单数据
第1步:数据导入和预处理,代码如下:
//第3章/用户生命周期分层.数据导入和预处理 Import time Import pandas as pd Import numpy as np #导入原始数据 dtypes={'ORDERDATE':object,'AMOUNTINFO':np.float32}#设置每列数据类型 raw_data=pa.read.csv('sales.csv,dtype=dtypes,index_col='USERID')#读取数据文件 #缺失值审查 Na_cols=raw_data.isnull().any(axis=0)#查看每列是否有缺失值 Na_lines=raw_data.isnull().any(axis=1)#查看每行是否有缺失值 #异常值处理 sales_data=raw_data.dropna()#丢失带有缺失值的行记录 sales_data=sales_data[sales_data['AMOUNTINFO']>1]#丢弃订单金额≤1的记录 #日期格式转换 sales_data['ORDERDATE']=pd.to_datetime(sales_data['ORDERDATE'],format='%Y-%m-%d') #将字符串转换为日期格式 #数值转换 df=sales_data.reset_index().copy() df['month']=df['ORDERDATE'].astype(datetime64[m]') Grouped_month=df.groupby('month')
输出结果见表3-5。
表3-5 用户订单数据明细
第2步,将用户与消费时间进行数据透视,代码如下:
pivoted_counts=df.pivot_table(index='userid',columns='month',values='orderdate',aggfunc= 'count').fillna(0) pivoted_counts.head()
输出结果见表3-6。
表3-6 用户订单数据明细-数据透视
第3步,将用户对消费行为按月进行编排,只要用户消费次数不为0,都视为有消费行为,代码如下:
df_purchase=pivoted_counts,applymap(lambda x:!if x>0 else 0) df_purchase.head()
输出结果见表3-7。
表3-7 用户订单数据明细-消费行为
第4步,自定义函数,对消费状况打标签,代码如下:
//第3章/用户生命周期分层.消费状况打标签 #对消费状况打标签 Def active_status(date): Status=[] For i in range(12): #若本月无消费 If data[i]==0: If len(status)>0: If status[i-1]=='unreg':#未注册 Status.append('unreg') Else: Status.append('unreg') #若本月有消费 Else: If len(status)>0: If status[i-1]=='unreg': Status.append('new')#新用户 Elif status[i-1]=='unactive': Status.append('return')#回流用户 Else: Status.append('active')#活跃用户 Else: Status.append('new') Return pd.Series(status) Purchase_status=df_purchase.apply(active_status,axis=1) Purchase_status.columns=df_purchase.columns Purchase_status.head()
输出结果见表3-8。
表3-8 用户订单数据明细-消费行为打标
步骤5:将未注册替换成NaN,并计算各状态的值,代码如下:
Purchase_status_ct=purchase_status.replace('unreg',np.NaN).apply(lambda x:pd.value_counts(x)) Purchase_status_ct.head()
输出结果见表3-9。
表3-9 用户订单数据明细-未注册替换
步骤6:将空值填充为0,并画出面积图,代码如下:
Purchase_status_ct.T.plot.area(fontsize=12,figsize=(10,6)) Plt.title("Status of Users by month",fontsize=18)
输出结果如图3-3所示。
图3-3 用户消费行为分布图
切换成百分比图,代码如下:
Purchase_status_ct.fillna(0).T.apply(lambda x:x/x.sum(),axis=1).plot.area(figsiz=(10, 6),fontsize=12) Plt.title("Proportion of Users'Status by month",fontsize=18)
输出结果如图3-4所示。
图3-4 用户消费行为分布百分比图
观察图片可知,活跃用户(持续消费的用户)2月份占比最高,后面的月份呈下降趋势;新用户(首购用户)每月下降趋势明显;回流用户(一段时间未消费,本月才消费)有明显的提升,这恰恰说明用户召回运营效果明显,但在拉新上面做得不够好。