先来看该电商用户画像用到的实战案例标签。 数据内容包括user_id(用户身份)、手把手教item_id(商品)、构建IDbehavior_type(用户行为类型,电商包含点击、用户收藏、画像加购物车、实战案例支付四种行为,手把手教分别用数字1、构建2、电商3、用户4表示)、画像user_geohash(地理位置)、实战案例item_category(品类ID,手把手教即商品所属的构建品类)、Time(用户行为发生的时间),其中user_id和item_id因为涉及隐私,做了脱敏处理,显示的是数字编号。 下面是具体的代码实现过程。 本示例除了用到numpy、pandas、matplotlib,还用到其他一些模块。 1# 导入所需的库 2 3%matplotlib inline 4 5import numpy as np 6 7import pandas as pd 8 9from matplotlib import pyplot as plt 10 参数说明如下。 1# 导入数据集 2 3df_orginal = pd.read_csv(./taobao_persona.csv) 4 5# 抽取部分数据 6 此处使用Pandas的read_csv方法读取数据文件,由于数据集太大,为了提高运行效率,使用sample函数随机抽取20%的数据。 DataFrame.sample()是Pandas中的函数,DataFrame是一种数据格式,代指df_orginal。frac(fraction)是抽取多少数据,random_state是随机数种子,目的是保证每次随机抽取的数据一样,防止执行命令时使用不一样的数据。 1# 查看其中是否有缺失值,统计各字段缺失值 2 3df.isnull().any().sum() 4 5# 发现只有user_geohash有缺失值,且缺失的站群服务器比例很高,无统计分析的意义,将此列删除 6 7df.drop(user_geohash,axis=1,inplace=True) 8 9# 将time字段拆分为日期和时段 10 11df[date] = df[time].str[0:10] 12 13df[time] = df[time].str[11:] 14 15df[time] = df[time].astype(int) 16 17# date用str方法取0-9位的字符,time取11位到最后一位,将time转化成int类型。 18 19# 将时段分为凌晨,上午,中午,下午,晚上 20 21df[hour] = pd.cut(df[time],bins=[-1,5,10,13,18,24],labels=[凌晨,上午, 22 结果如图1所示。 图1 数据预处理结果 1# 生成用户标签表,制作好的标签都加入这个表中 2 3users = df[user_id].unique() 4 结果如图2所示。 图2 制作好的用户ID 之后分析后的内容都会放置在此表中,相当于建立了一个空白表,将自己分析后的结论一一加入。 选取出各用户浏览次数最多的时段,看看用户到底在什么时间浏览商品比较多。 1# 对用户和时段分组,统计浏览次数 2 3time_browse = df[df[behavior_type]==1].groupby([user_id,hour]).item_ 4 5 id.count().reset_index() 6 7time_browse.rename(columns={ item_id:hour_counts},inplace=True) 8 9# 统计每个用户浏览次数最多的时段 10 11time_browse_max = time_browse.groupby(user_id).hour_counts.max().reset_index() 12 13time_browse_max.rename(columns={ hour_counts:read_counts_max},inplace=True) 14 15time_browse = pd.merge(time_browse,time_browse_max,how=left,on=user_id) 16 17# 之前已经按照user_id和hour进行了浏览物品次数的计数统计,现在借用浏览次数统计user_id在 18 19# 哪个时间段浏览次数最多,并将其作为该用户的浏览时间标签的代表。 20 21# 选取各用户浏览次数最多的源码库时段,如有并列最多的时段,用逗号连接 22 23time_browse_hour=time_browse.loc[time_browse[hour_counts]==time_browse[read_ 24 25 counts_max],hour].groupby(time_browse[user_id]).aggregate(lambda 26 27 x:,.join(x)).reset_index() 28 29time_browse_hour.head() 30 31# 将用户浏览活跃时间段加入用户标签表中 32 33labels = pd.merge(labels,time_browse_hour,how=left,on=user_id) 34 35labels.rename(columns={ hour:time_browse},inplace=True) 36 结果如图3所示。 图3 用户浏览时间段 1df_browse = df.loc[df[behavior_type]==1,[user_id,item_id,item_category]] 2 3df_collect = df.loc[df[behavior_type]==2,[user_id,item_id,item_category]] 4 5df_cart = df.loc[df[behavior_type]==3,[user_id,item_id,item_category]] 6 根据不同的用户行为,如浏览、收藏等,分别导出数据进行分析。 1# 对用户与类目进行分组,统计浏览次数 2 3df_cate_most_browse = df_browse.groupby([user_id,item_category]).item_id.count(). 4 5 reset_index() 6 7df_cate_most_browse.rename(columns={ item_id:item_category_counts},inplace= 8 9 True) 10 11# 统计每个用户浏览次数最多的类目 12 13df_cate_most_browse_max=df_cate_most_browse.groupby(user_id).item_category_ 14 15 counts.max().reset_index() 16 17df_cate_most_browse_max.rename(columns={ item_category_counts:item_category_ 18 19 counts_max},inplace=True) 20 21df_cate_most_browse = pd.merge(df_cate_most_browse,df_cate_most_browse_max, 22 23 how=left,on=user_id) 24 25# 将item_category的数字类型改为字符串型 26 27df_cate_most_browse[item_category] = df_cate_most_browse[item_category]. 28 29 astype(str) 30 31# 选取各用户浏览次数最多的类目,如有并列最多的类目,用逗号连接 32 33df_cate_browse=df_cate_most_browse.loc[df_cate_most_browse[item_category_ 34 35 counts]== 36 37df_cate_most_browse[item_category_counts_max],item_category].groupby(df_ 38 39 cate_most_browse[user_id]).aggregate(lambda x:,.join(x)).reset_index() 40 41# 将用户浏览最多的类目加入用户标签表中 42 43labels = pd.merge(labels,df_cate_browse,how=left,on=user_id) 44 45labels.rename(columns={ item_category:cate_most_browse},inplace=True) 46 用户浏览最多的类目如图4所示。 图4 浏览最多的类目 收藏、加购和购买最多的类目生成逻辑相同,重复操作后结果如图5所示。 图5 关于类目的用户行为 从整理的数据中可以看出,浏览、加购物车、收藏、购买之前其实不一定存在明显的必然关系,我们还需要进一步分析得到一些规律。 近30天购买次数: 1# 将购买行为按用户进行分组,统计次数 2 3df_counts_30_buy = df[df[behavior_type]==4].groupby(user_id).item_id. 4 5 count().reset_index() 6 7labels = pd.merge(labels,df_counts_30_buy,how=left,on=user_id) 8 近30天加购次数: 1# 将加购行为按用户进行分组,统计次数 2 3df_counts_30_cart = df[df[behavior_type]==3].groupby(user_id).item_id. 4 5 count().reset_index() 6 7labels = pd.merge(labels,df_counts_30_cart,how=left,on=user_id) 8 近30天活跃天数: 1# 对用户进行分组,统计活跃的天数,包括浏览、收藏、加购、购买 2 3counts_30_active = df.groupby(user_id)[date].nunique() 4 5labels = pd.merge(labels,counts_30_active,how=left,on=user_id) 6 7labels.rename(columns={ date:counts_30_active},inplace=True) 8 结果如图6所示。 图6 近30天用户行为 近30天用户行为分析属于中长期的用户行为,我们可以依此判断是否需要调整营销策略,类似可以得到短期的7天用户行为分析,观察中短期或一个小周期内,用户的行为是何种情况。 分析上次和本次用户行为的时间差值可以实现精确推荐分析,下面我们来看看具体如何实现。 上次浏览距今天数: 1days_browse = df[df[behavior_type]==1].groupby(user_id)[date].max().apply 2 3(lambda x:(datetime.strptime(2014-12-19,%Y-%m-%d)-x).days) 4 5labels = pd.merge(labels,days_browse,how=left,on=user_id) 6 类似可以生成上次加购、购买距今天数,分析得到用户的活跃情况,如图7所示,如果长时间没有活跃,则需要推送一些内容,或者发放优惠券刺激用户。 图7 最后一次行为距今天情况统计 1df_interval_buy = df[df[behavior_type]==4].groupby([user_id,date]).item_ 2 3 id.count().reset_index() 4 5interval_buy = df_interval_buy.groupby(user_id)[date].apply 6 7(lambda x:x.sort_values().diff(1).dropna().head(1)).reset_index() 8 9interval_buy[date] = interval_buy[date].apply(lambda x : x.days) 10 11interval_buy.drop(level_1,axis=1,inplace=True) 12 13interval_buy.rename(columns={ date:interval_buy},inplace=True) 14 用购买间隔数分析用户的购买频率,方便确定用户的消费活跃等级,精准制定营销方式。结果如图8所示。 图8 最近两次购买间隔天数统计 1df_browse_buy=df.loc[(df[behavior_type]==1)|(df[behavior_type]==4), 2 3[user_id,item_id,behavior_type,time]] 4 5browse_not_buy=pd.pivot_table(df_browse_buy,index=[user_id,item_id], 6 7columns=[behavior_type],values=[time],aggfunc=[count]) 8 9browse_not_buy.columns = [browse,buy] 10 11browse_not_buy.fillna(0,inplace=True) 12 13# 添加了一列browse_not_buy,初始值为0。 14 15browse_not_buy[browse_not_buy] = 0 16 17# 浏览数>0,购买数=0的数据输出1. 18 19browse_not_buy.loc[(browse_not_buy[browse]>0) & (browse_not_buy[buy]==0), 20 21 browse_not_buy] = 1 22 23browse_not_buy=browse_not_buy.groupby(user_id)[browse_not_buy].sum().reset_ 24 25 index() 26 27labels = pd.merge(labels,browse_not_buy,how=left,on=user_id) 28 29labels[browse_not_buy] = labels[browse_not_buy].apply(lambda x: 是 if x>0 30 结果如图9所示。 图9 是否浏览未下单情况统计 针对浏览未下单的用户要加大推广力度,可以增加优惠券的发放次数,促进购物。 1df_cart_buy=df.loc[(df[behavior_type]==3)|(df[behavior_type]==4),[user_ 2 3 id,item_id,behavior_type,time]] 4 5cart_not_buy=pd.pivot_table(df_cart_buy,index=[user_id,item_id],columns= 6 7 [behavior_type],values=[time],aggfunc=[count]) 8 9cart_not_buy.columns = [cart,buy] 10 11cart_not_buy.fillna(0,inplace=True) 12 13cart_not_buy[cart_not_buy] = 0 14 15cart_not_buy.loc[(cart_not_buy[cart]>0) & (cart_not_buy[buy]==0),cart_not_ 16 17 buy] = 1 18 19cart_not_buy = cart_not_buy.groupby(user_id)[cart_not_buy].sum().reset_index() 20 21labels = pd.merge(labels,cart_not_buy,how=left,on=user_id) 22 23labels[cart_not_buy] = labels[cart_not_buy].apply(lambda x: 是 if x>0 24 结果如图10所示。 图10 是否加购未下单情况统计 制定营销策略时,要重点注意这部分人群,因为加购未下单的购买转化率是最大的,有成功下单、最大潜力的客户就在这里。 1buy_again = df[df[behavior_type]==4].groupby(user_id)[item_id].count(). 2 3 reset_index() 4 5buy_again.rename(columns={ item_id:buy_again},inplace=True) 6 7labels = pd.merge(labels,buy_again,how=left,on=user_id) 8 9labels[buy_again].fillna(-1,inplace=True) 10 11# 未购买的用户标记为未购买,有购买未复购的用户标记为否,有复购的用户标记为是 12 13labels[buy_again] = labels[buy_again].apply(lambda x: 是 if x>1 else 14 结果如图11所示。 图11 是否复购用户统计 1user_active_level = labels[counts_30_active].value_counts().sort_index(ascending= 2 3 False) 4 5plt.figure(figsize=(16,9)) 6 7user_active_level.plot(title=30天内访问次数与访问人数的关系,fontsize=18) 8 9plt.ylabel(访问人数,fontsize=14) 10 11plt.xlabel(访问次数,fontsize=14) 12 13# 用于显示中文 14 15plt.rcParams["font.sans-serif"] = [SimHei] 16 17plt.rcParams[axes.unicode_minus] = False 18 19# 先将user_active_level全部设置成高,再搜索数值<16的部分,设置成低 20 21labels[user_active_level] = 高 22 结果如图12所示。 图12 30天内访问次数与访问人数的关系 plt.xlabel:设置x轴。 通过图12可以看出,访问次数多的用户比访问次数少的用户数量多,且以15次左右为拐点,因此定义访问次数小于等于16次的用户为低活跃用户,访问次数大于16次的用户定义为高活跃用户,此定义只是从用户的角度出发,工作中当从业务角度定义。访问次数多的访客比访问次数少的访客数量多,与绝大多数的产品访问规律相反,从侧面反映了用户黏性之强。 1buy_active_level = labels[counts_30_buy].value_counts().sort_index(ascending= 2 3 False) 4 5plt.figure(figsize=(16,9)) 6 7buy_active_level.plot(title=30天内购买次数与购买人数的关系,fontsize=18) 8 9plt.ylabel(购买人数,fontsize=14) 10 11plt.xlabel(购买次数,fontsize=14) 12 13labels[buy_active_level] = 高 14 结果如图13所示。 图13 30天内购买次数与购买人数的关系 由图13可知,14次左右是个拐点,因此定义购买次数小于等于14次的用户为低活跃用户,大于14次的用户为高活跃用户。 1buy_single=df[df[behavior_type]==4].groupby(user_id).item_category.nunique() 2 3.reset_index() 4 5buy_single.rename(columns={ item_category:buy_single},inplace=True) 6 7labels = pd.merge(labels,buy_single,how=left,on=user_id) 8 9labels[buy_single].fillna(-1,inplace=True) 10 11labels[buy_single] = labels[buy_single].apply(lambda x: 是 if x>1 else 12 结果如图14所示。 图14 购买品类单一情况统计 了解用户购买的品类有利于构建用户群体行为,比如该群体统一对化妆品消费占比巨大,则该用户群体的主要特征标签之一就是化妆品。 1last_buy_days = labels[days_buy].value_counts().sort_index() 2 3plt.figure(figsize=(16,9)) 4 5last_buy_days.plot(title=最后一次购买距今天数与购买人数的关系,fontsize=18) 6 7plt.ylabel(购买人数,fontsize=14) 8 结果如图15所示。 图15 最后购买行为距今天数与购买人数的关系 使用RFM模型分析: 1labels[buy_days_level] = 高 2 3labels.loc[labels[days_buy]>8,buy_days_level] = 低 4 5labels[rfm_value] = labels[buy_active_level].str.cat(labels[buy_days_level]) 6 7def trans_value(x): 8 9 if x == 高高: 10 11 return 重要价值客户 12 13 elif x == 低高: 14 15 return 重要深耕客户 16 17 elif x == 高低: 18 19 return 重要唤回客户 20 21 else: 22 23 return 即将流失客户 24 25labels[rfm] = labels[rfm_value].apply(trans_value) 26 27# 此处的apply()调用了一个自己定义(def)的函数 28 29labels.drop([buy_days_level,rfm_value],axis=1,inplace=True) 30 结果如图16所示。 图16 RFM模型分析结果 str.cat()是指将两个独立的字符串拼接,此处将 buy_active_level‘和buy_days_level拼接。如果要在两个合并的列中间加一个分隔符号,可在cat括号内加:sep=-,用-连接合并内容。 将buy_active_level和buy_days_level组合,形成“高高”或者“高低”等。将两个重要指标合并后,每个user_id进入不同的分类组。RFM模型是衡量客户价值和客户创利能力的重要工具和手段,其中,R(recently):最近一次消费;F(Frequently):消费频率;M(Monetary):消费金额。 对最后输出的用户群体制定不同的营销策略。针对重要价值客户要予以关注并维护;针对重要深耕用户,予以相应的价格刺激,如折扣和捆绑销售等增加用户的购买频率,提高黏性;针对重要唤回用户,要在特定时间点进行刺激,比如进行产品卖点刺激、品牌灌输等,不断加强他们对品牌的认可,提高忠诚度;针对流失客户,在此例中,因其数量占三分之一左右,需进一步分析得出流失原因。 关于作者:刘鹏,教授,清华大学博士,云计算、大数据和人工智能领域的知名专家,南京云创大数据科技股份有限公司总裁、中国大数据应用联盟人工智能专家委员会主任。中国电子学会云计算专家委员会云存储组组长、工业和信息化部云计算研究中心专家。 高中强,人工智能与大数据领域技术专家,有非常深厚的积累,擅长机器学习和自然语言处理,尤其是深度学习,熟悉Tensorflow、PyTorch等深度学习开发框架。曾获“2019年全国大学生数学建模优秀命题人奖”。参与钟南山院士指导新型冠状病毒人工智能预测系统研发项目,与钟南山院士团队共同发表学术论文。 本文摘编自《Python金融数据挖掘与分析实战》,经出版方授权发布。(ISBN:9787111696506)01导入库
02数据准备
03数据预处理
04数构建用户行为标签
1)对用户浏览时间段进行分析
2)关于类目的用户行为。
3)近30天用户行为分析。
4)最后一次行为距今天数。
5)最近两次购买间隔天数。
6)是否浏览未下单。
7)是否加购未下单。
05构建用户属性标签
1)是否复购用户:
2)访问活跃度:
3)购买活跃度:
4)购买的品类是否单一:
5)用户价值分组(RFM模型):