淘宝电商搭建用户画像标签体系
一、项目介绍
该项目数据来源于阿里天池——淘宝应用上的用户行为数据:https://tianchi.aliyun.com/dataset/dataDetail?dataId=46
代码地址:https://github.com/LittleStarYing/taobao.git
数据集由阿里巴巴集团提供,这里我只采用了其第一部分数据集D。
其数据集详细信息如下:

二、用户画像标签体系介绍
用户画像的核心在于给用户“打标签”,每一个标签通常是人为规定的特征标识,用高度精炼的特征描述一类人,例如年龄、性别、兴趣偏好等,不同的标签通过结构化的数据体系整合,就可与组合出不同的用户画像。
梳理标签体系是实现用户画像过程中最基础、也是最核心的工作,后续的建模、数据仓库搭建都会依赖于标签体系。
为什么需要梳理标签体系,因为不同的企业做用户画像有不同的战略目的,广告公司做用户画像是为精准广告服务,电商做用户画像是为用户购买更多商品,内容平台做用户画像是推荐用户更感兴趣的内容提升流量再变现,金融行业做用户画像是为了寻找到目标客户的同时做好风险的控制。
所以第一步,我们要结合所在的行业,业务去分析我们用户画像的目的。这其实就是战略,我们要通过战略去指引我们最终的方向。

对于电商企业来说,可能最重要的两个问题就是:
现有用户- 我的现存用户是谁?为什么买我的产品?他们有什么偏好?哪些用户价值最高?
潜在客户- 我的潜在用户在哪儿?他们喜欢什么?哪些渠道能找到他们?获客成本是多少?
而对于金融企业,还要加上一条:
用户风险—用户的收入能力怎么样?他们是否有过贷款或者信用卡的逾期?他们的征信有问题吗?
我们做用户画像的目的也就是根据我们指定的战略方向最终去解决这些问题。
在梳理标签的过程还要紧密的结合我们的数据,不能脱离了数据去空想,当然如果是我们必须要的数据,我们可能需要想办法去获取这些数据,这就是数据采集的问题,我们之后会深入的讨论。
先展示两种常见的标签体系,随后我们将按步骤建立我们的标签体系。
电商类标签体系

可以看到电商类的标签体系,更关注用户的属性,行为等等信息。那么我们需要的数据也就来源于用户可提供的基本信息,以及用户的行为信息,这些我们可以通过埋点获取,而用户的订单情况也是非常的重要的标签。
金融类标签体系

对于金融行业,最明显的区别是增加了用户的价值和用户风险的信息。这些信息在用户申请贷款时一般都可以提供,还有很多信息需要通过征信获取。
最终,不管是电商还是金融或者其他领域,我们都可以通过数据对用户进行画像,最终建立标签体系,影响我们的业务,最终实现战略目的。
下面我们来具体看一下如何一步步的分析建立整体标签体系。
标签的维度与类型
在我们建立用户标签时,首先要明确基于哪种维度去建立标签。
一般除了基于用户维度(userid)建立用户标签体系外,还有基于设备维度(cookieid)建立相应的标签体系,当用户没有登录设备时,就需要这个维度。当然这两个维度还可以进行关联。
而两者的关联就是需要ID-Mapping算法来解决,这也是一个非常复杂的算法。更多的时候我们还是以用户的唯一标识来建立用户画像。
而标签也分为很多种类型,这里参照常见的分类方式,
从对用户打标签的方式来看,一般分为三种类型:1、基于统计类的标签;2、基于规则类的标签、3、基于挖掘类的标签。下面我们介绍这三种类型标签的区别:
统计类标签:这类标签是最为基础也最为常见的标签类型,例如对于某个用户来说,他的性别、年龄、城市、星座、近7日活跃时长、近7日活跃天数、近7日活跃次数等字段可以从用户注册数据、用户访问、消费类数据中统计得出。该类标签构成了用户画像的基础;
规则类标签:该类标签基于用户行为及确定的规则产生。例如对平台上“消费活跃”用户这一口径的定义为近30天交易次数>=2。在实际开发画像的过程中,由于运营人员对业务更为熟悉、而数据人员对数据的结构、分布、特征更为熟悉,因此规则类标签的规则确定由运营人员和数据人员共同协商确定;
机器学习挖掘类标签:该类标签通过数据挖掘产生,应用在对用户的某些属性或某些行为进行预测判断。例如根据一个用户的行为习惯判断该用户是男性还是女性,根据一个用户的消费习惯判断其对某商品的偏好程度。该类标签需要通过算法挖掘产生。
标签的类型是对标签的一个区分,方便我们了解标签是在数据处理的哪个阶段产生的,也更方便我们管理。
标签分级分类
标签需要进行分级分类的管理,一方面使得标签更加的清晰有条件,另一方面也方便我们对标签进行存储查询,也就是管理标签。

用户画像体系和标签分类从两个不同角度来梳理标签,用户画像体系偏战略和应用,标签分类偏管理和技术实现侧。
把标签分成不同的层级和类别,一是方便管理数千个标签,让散乱的标签体系化;二是维度并不孤立,标签之间互有关联;三可以为标签建模提供标签子集。
梳理某类别的子分类时,尽可能的遵循MECE原则(相互独立、完全穷尽),尤其是一些有关用户分类的,要能覆盖所有用户,但又不交叉。比如:用户活跃度的划分为核心用户、活跃用户、新用户、老用户、流失用户,用户消费能力分为超强、强、中、弱,这样按照给定的规则每个用户都有分到不同的组里。
标签命名
标签的命名也是为了我们可以对标签进行统一的管理,也更好识别出是什么标签。

这是一种非常好的命名方式,解释如下:
标签主题:用于刻画属于那种类型的标签,如用户属性、用户行为、用户消费、风险控制等多种类型,可用A、B、C、D等 字母表示各标签主题;
标签类型:标签类型可划为分类型和统计型这两种类型,其中分类型用于刻画用户属于哪种类型,如是男是女、是否是会员、 是否已流失等标签,统计型标签用于刻画统计用户的某些行为次数,如历史购买金额、优惠券使用次数、近30日登陆次数等 标签,这类标签都需要对应一个用户相应行为的权重次数;
开发方式:开发方式可分为统计型开发和算法型开发两大开发方式。其中统计型开发可直接从数据仓库中各主题表建模加工 而成,算法型开发需要对数据做机器学习的算法处理得到相应的标签;
是否互斥标签:对应同一级类目下(如一级标签、二级标签),各标签之间的关系是否为互斥,可将标签划分为互斥关系和 非互斥关系。例如对于男、女标签就是互斥关系,同一个用户不是被打上男性标签就是女性标签,对于高活跃、中活跃、低 活跃标签也是互斥关系;
用户维度:用于刻画该标签是打在用户唯一标识(userid)上,还是打在用户使用的设备(cookieid)上。可用U、C等字 母分别标识userid和cookieid维度。
三、指标构建
主要从用户行为、用户属性这2个维度为每个用户构建标签画像:


搭建的用户标签如下表:

四、代码实现
代码实现流程如下图:

导入所需库,读取数据

1.数据预处理

①数据抽取

②缺失值处理


③日期与时间的处理

④制作用户标签

2.用户行为标签
这部分只做部分代码思路讲解,给出第一部分的示例。
①用户时间段分布
用户浏览活跃时间段
第一步:最用户和时段分组,统计浏览次数。使用函数:groupby 、count、reset_index

第二步:列重命名。使用函数:rename

第三步:统计每个用户浏览次数最多的时段。使用函数:groupby、max、reset_index

第四步:列重命名。使用函数:rename

第五步:拼接原表和计算表。使用函数:merge

第六步:选取各用户浏览次数最多的时段,如有并列最多的时段,用逗号连接。使用函数:loc、groupby、aggreate、reset_index
time_browse_hour = time_browse.loc[time_browse['hour_counts']==time_browse['read_counts_max'],'hour'].groupby(time_browse['user_id']).aggregate(lambda x:','.join(x)).reset_index()

第七步:将用户浏览活跃时间段加入到用户标签表中

用户购买活跃时间段
步骤同上,这里不做赘述

最后清除缓存

用户倾向周几浏览

用户倾向周几购买

②关于类目的用户行为

浏览最多的类目

这里需要注意的是,一定要先将df_most_cate_browse['item_category']转换成str类型,不然直接做join的话会拼接category类型,出现问题,得到非预期值


收藏最多的类目
代码略
加购最多的类目
代码略
购买最多的类目
代码略
③30天用户行为
数据集中的数据正好是一个月,30天的数据,即整个数据集的数据
近30天购买次数

近30天加购次数

近30天活跃天数

④7天用户行为

近7天购买次数
代码略
近7天加购次数
代码略
近7天活跃天数
代码略
⑤最后一次行为距今天数
上一次浏览距今天数
days_browse = df[df['behavior_type']==1].groupby('user_id')['date'].max().apply(lambda x:(datetime.strptime('2014-12-19','%Y-%m-%d')-x).days)

上次加购距今天数
代码略
上次购买距今天数
代码略
⑥其他
最近两次购买间隔天数

是否浏览未下单


是否加购未下单

3.用户属性标签
①是否复购用户

②访问活跃度


上图可知,访问次数多的访客比访问次数少的访客数量多,且在20次左右为拐点,因此定义访问次数小于等于18次的为低活跃度,访问次数大于18次定义为高活跃度。 该图中,访问次数多的客户比访问次数少的客户数量多,与绝大多数产品访问规律相反。从侧面反映了淘宝的用户粘性强。

③购买活跃度


14次左右是一个拐点,因此定义购买次数小于等于14次为低活跃,大于14次为高活跃。 此定义只是从用户的角度触发,工作中当从业务出发定义是否活跃

④购买的品类是否单一

⑤用户价值分组(RFM)
因为没有消费金额特征,所以这里只最近一次交易(上一次购买距今天数)和交易频率(购买活跃度)两个维度分析两个维度分析:


ps:异常点为双12


最后保存数据为csv文件
