精华内容
下载资源
问答
  • python实现用户画像

    2020-07-13 19:31:23
    利用python相关技术搭建的用户画像web轻量级应用 利用python相关技术搭建的用户画像web轻量级应用
  • 作为案例来进行一个讲解,比如我现在电商,我们希望能够针对这个北京地区的女大学生和女生节来做这么一次,这个市场活动就是运营部门的一个需求,那么这个时候问题就来了哈,我们要对这批用户去宣传这个东西,那我们...

    女生节活动,给北京地区女大学生推荐口红作为案例来进行探讨。比如我作为电商,运营部门的需求是希望能够针对北京地区的女大学生在女生节来做一次口红活动营销。那么这个时候问题就来了,我们要对用户宣传这个东西,那我们怎么搞呢?首先就是我们要区分出来男女,第二个呢,我们要知道是不是在北京,第三,验证一下她的消费能力。
    那如何做这件事情呢,我们可以用它自己有的特征去推标签,比如说虽然这个用户从来没有填过他的性别,但因为是电商网站,但通过他买过男士剃须泡沫可以推导出来,当然你可能说可能是给男朋友买的,我是女孩子。那没什么吧,我们把这个条件设置的再苛刻一些,比如说买过两次或者买过男士别的用品,我就认为他是男性。针对女性买过类似像卫生巾去推导,但你可能说体贴的男朋友也会买,同样跟上面的一样的,我们可以把这个条件设置的苛刻一些,买卫生巾的同时也买过别的女性用品的,我们认为它是女性用户。反正就是基于他的一些已有的一些行为特征来推断他的性别标签。
    那如何推断地址是北京?这个其实很简单,只要收货地址填的是北京的。假设大部分人买东西是给自己买,那我认为说这种收货地址选在北京的,它是一个北京用户。另外一方面,消费能力这一块儿可能说比较难确定,用历史消费的总金额好像不太合理,因为这个消费能力、消费欲望有时候不一定是按照总金额,但总金额也能验证一些事情。我们可能会有其他的一些想法,如果消费能力不强的话,用户在一些很细节的生活支出上比较常规化,比方说,买一支牙膏,我相信很多人可能是不会花五六十七八十块钱去买一支进口牙膏的。那如果说,我们发现有的人在这种细节的消费上也买很贵的东西。那我们可以认为他的消费能力是比较强的。这就是通过用户的特征去做推断。
    看到这里我相信你可能也发现了,这里面有些问题,我们不管通过用户的行为,收货地址,买过什么商品的他其实都是基于他过往发生的一些行为,但是我整个大盘的用户里面,我相信不可能所有的用户都发生过以上类似的行为,你按照这些行为进行筛选之后呢,你可能能够给部分用户打上标签。但还有些用户还是没有标签,所以这个时候不够。所以还要做进一步的推衍,首先针对地理位置我需要推出在北京,除了收货地址以外,还有什么样的手段呢?其实可以通过常用IP是不是在北京,那如果你十次访问九次IP都在北京,那我可以推断出你大部分时候是在北京的。
    这个消费能力又怎么进一步推断呢?可以用你的现在用的这个手机型号是不是新款的手机,最贵的手机推出来一两个月就用上了,那你的消费能力还是比较强的。或者说你用的手机当前的价值在多少钱以上?那我认为你的消费能力可能是比较强的。又或者是说像一些特别的手机,比如说美图手机这种专门对女孩子自拍用的手机,那用这个手机的用户,多半是女孩子。这是通过有的特征去推导。
    还有就是职业,我需要对象是大学生,大学生是一个很模糊用户,不会有人买东西的时候去嚷着说我是学生。这个时候我该怎么推荐给大学生呢,其实核心还是收货地址,如果这个收货地址是在大学的各个校区里面或者就直接填大学的,我可以推断出他的职业更有可能大学生。这个时候可能会有一个疑惑,你会说哎呀,万一我是学校的员工呢,我是老师呢,那这个不是推断错了吗?当然确实有可能推断错,但是你想啊,在一个学校的领域里面啊,学生和教职工的比值,肯定学生还占大多数的,而且更多的时候不用太去计较一两个用户的这个判断精准度。而是要回归我们整个事情一开始的初衷是什么?我们是希望能够给在校的大学生去推荐我们这个活动,我们最后这个推广信息要推给这批人。那如果说这个标签,我打到这些老师身上,但是没有什么,他肯定离这些学生也很近,你去做这种推广,其实她一定也会把影响辐射到周边的人,所以这个事情还是比较合理的。
    除了前面两种基于行为特征和属性特征以外。我们还有另外一种推广方法,这个会大胆猜测的性质更强一些,但有时候我们走投无路的时候,比如你发现你通过前面的手段,只给70%的用户打造了标签,还有30%的用户,一直没有任何一个行为和属性,那这个时候怎么办呢?一般有两种方法,一种呢,就是通过这个距离相近的,我们认为就是人与群聚,物以类分。那聚在一起的,我们多半认为可能他是一个比较相似的,另外一个呢,就是说他的这个行为本身是比较相似的,那这个距离相近的那就是说,比如基于某些属性,他周围的人都具备。那说其他的用户大概率其实也具备这个属性,那比如说我们发现,我们通过前面打标签,已经给很多的70%的用户都打上了学生这个标签,当我们发现,就是从那个地理位置的角度来看,有另外一拨人虽然没打学生的标签,但是呢,他们跟我们这帮学生离得特别近,都混在一起的,那我们就会用一种叫lookalike相似算法,就会把周边这些人当做学生,也把它打上标签。

    另外,我们从行为的角度去判断,我们通过这个协同过滤。就打个比方说,我们一开始通过打标签儿给那些买了剃须泡沫,又买了剃须刀的用户打上了一个男性用户的标签,但是这种方法它有个局限性,就是我们认为男性用户好像都要去买剃须刀和剃须泡沫一样,其实不一定,可能有的人他不在你这个平台上买剃须刀和剃须泡沫,他自己有一个电动剃须刀,他从来都不需要。但是,这些男性用户除了在我们想到这个剃须刀和剃须泡沫以外,他们可能还有很多其他的一些行为,比如说他可能都会买一个男士洗面奶,一个去屑的洗发香波,但这个可能是我们前面在打标签的时候,没有想到的,那这个时候呢,我们可以这么干,我们通过买那个剃须刀和剃须泡沫的那些用户,我们已经给他打上了。然后呢,我们再去把他其他的购物行为也给提取出来,看他还买过什么其他的东西。再通过他买的其他东西去找到跟他买过相似的这类东西的用户,我们也给这种用户打上男性用户的标签,最后我们通过这种距离的相近行为的相似,就可以把那些前面通过各种方法都没能打上标签的用户通过这种半猜半推衍的形式也给打上标签。可能这种的精确度是最低的,但有时候我们在很多的应用场景里面。往往是不需要精度那么高,我们只需要把用户先把群体先分开来,通过后续的一些行为,我们也能够再继续去迭代这些标签,但至少我们通过这种方法能够把所有用户都给分完群。
    总结起来呢,其实用户画像的这个方法,就是通过对用户的各类特征进行一个标识,从而给这些用户贴上各种各样的标签,然后我们拿这些标签去把用户分成不同的群体,最后再对这些不同的群体分别去进行不同的产品和运营的动作,这就是我们用户画像的运作原理和它的作用价值。

    展开全文
  • 淘宝用户行为分析——用户画像

    千次阅读 2020-08-02 11:12:38
    数据介绍 ...另外,由于数据集的局限,此项目的画像标签只是庞大用户画像的一部分,基于已有的数据集进行制作。 #导入库 %matplotlib inline import numpy as np import pandas as pd from matplotli

    一、数据介绍

    数据集是淘宝一个月的用户行为数据,数据包括user_id,item_id,behavior_type,user_geohash,item_category,time六个字段,共有100多万条记录,考虑数据集太大,为了提高运行效率,只随机抽取20%的数据;另外,由于数据集的局限,此项目的画像标签只是庞大用户画像的一部分,基于已有的数据集进行制作。

    #导入库
    %matplotlib inline
    import numpy as np
    import pandas as pd
    from matplotlib import pyplot as plt
    import gc
    import warnings
    warnings.filterwarnings('ignore')
    from datetime import datetime
    
    #导入数据集
    df_orginal = pd.read_csv('/home/kesci/input/mydata9388/taobao_persona.csv')
    

    二、数据预处理

    2.1 数据抽样

    #数据集太大,为了提高运行效率,只随机抽取20%的数据
    df = df_orginal.sample(frac=0.2,random_state=None)
    
    #回收内存
    del df_orginal
    gc.collect()
    

    2.2 缺失值处理

    df.info()
    

    <class ‘pandas.core.frame.DataFrame’>
    Int64Index: 4658205 entries, 13077081 to 21758719
    Data columns (total 6 columns):
    user_id int64
    item_id int64
    behavior_type int64
    user_geohash object
    item_category int64
    time object
    dtypes: int64(4), object(2)
    memory usage: 248.8+ MB

    df.shape
    

    (4658205, 6)

    #查看各字段的缺失值数量
    df.isnull().sum()
    

    user_id 0
    item_id 0
    behavior_type 0
    user_geohash 3183516
    item_category 0
    time 0
    dtype: int64

    • 只有user_geohash有缺失值,且缺失的比例很高,无统计分析的意义,将此列删除
    df.drop('user_geohash',axis=1,inplace=True)
    

    2.3 日期与时段处理

    #将time字段拆分为日期和时段
    df['date'] = df['time'].str[0:10]
    df['date'] = pd.to_datetime(df['date'],format='%Y-%m-%d')
    df['time'] = df['time'].str[11:]
    df['time'] = df['time'].astype(int)
    #将时段分为'凌晨'、'上午'、'中午'、'下午'、'晚上'
    df['hour'] = pd.cut(df['time'],bins=[-1,5,10,13,18,24],labels=['凌晨','上午','中午','下午','晚上'])
    

    2.4 制作用户标签表

    #生成用户标签表,制作好的标签都加入这个表中
    users = df['user_id'].unique()
    labels = pd.DataFrame(users,columns=['user_id'])
    

    三、用户行为标签

    3.1 用户浏览活跃时间段

    #对用户和时段分组,统计浏览次数
    time_browse = df[df['behavior_type']==1].groupby(['user_id','hour']).item_id.count().reset_index()
    
    time_browse.rename(columns={'item_id':'hour_counts'},inplace=True)
    
    #统计每个用户浏览次数最多的时段
    time_browse_max = time_browse.groupby('user_id').hour_counts.max().reset_index()
    time_browse_max.rename(columns={'hour_counts':'read_counts_max'},inplace=True)
    time_browse = pd.merge(time_browse,time_browse_max,how='left',on='user_id')
    #选取各用户浏览次数最多的时段,如有并列最多的时段,用逗号连接
    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()
    
    time_browse_hour.head()
    
    user_idhour
    0492晚上
    13726晚上
    219137晚上
    336465下午
    437101下午
    #将用户浏览活跃时间段加入到用户标签表中
    labels = pd.merge(labels,time_browse_hour,how='left',on='user_id')
    labels.rename(columns={'hour':'time_browse'},inplace=True)
    

    3.2 用户购买活跃时间段

    #生成逻辑与浏览活跃时间段相同
    time_buy = df[df['behavior_type']==4].groupby(['user_id','hour']).item_id.count().reset_index()
    time_buy.rename(columns={'item_id':'hour_counts'},inplace=True)
    time_buy_max = time_buy.groupby('user_id').hour_counts.max().reset_index()
    time_buy_max.rename(columns={'hour_counts':'buy_counts_max'},inplace=True)
    time_buy = pd.merge(time_buy,time_buy_max,how='left',on='user_id')
    time_buy_hour = time_buy.loc[time_buy['hour_counts']==time_buy['buy_counts_max'],'hour'].groupby(time_buy['user_id']).aggregate(lambda x:','.join(x)).reset_index()
    
    time_buy_hour.head()
    
    user_idhour
    038745中午
    145561上午,中午
    253394晚上
    359436晚上
    4100605凌晨
    #将用户购买活跃时间段加入到用户标签表中
    labels = pd.merge(labels,time_buy_hour,how='left',on='user_id')
    labels.rename(columns={'hour':'time_buy'},inplace=True)
    
    del time_browse
    del time_buy
    del time_browse_hour
    del time_browse_max
    del time_buy_hour
    del time_buy_max
    gc.collect()
    

    168

    3.3 关于类目的用户行为

    df_browse = df.loc[df['behavior_type']==1,['user_id','item_id','item_category']]
    df_collect = df.loc[df['behavior_type']==2,['user_id','item_id','item_category']]
    df_cart = df.loc[df['behavior_type']==3,['user_id','item_id','item_category']]
    df_buy = df.loc[df['behavior_type']==4,['user_id','item_id','item_category']]
    

    3.3.1 浏览最多的类目

    #对用户与类目进行分组,统计浏览次数
    df_cate_most_browse = df_browse.groupby(['user_id','item_category']).item_id.count().reset_index()
    
    df_cate_most_browse.rename(columns={'item_id':'item_category_counts'},inplace=True)
    
    #统计每个用户浏览次数最多的类目
    df_cate_most_browse_max = df_cate_most_browse.groupby('user_id').item_category_counts.max().reset_index()
    df_cate_most_browse_max.rename(columns={'item_category_counts':'item_category_counts_max'},inplace=True)
    df_cate_most_browse = pd.merge(df_cate_most_browse,df_cate_most_browse_max,how='left',on='user_id')
    df_cate_most_browse['item_category'] = df_cate_most_browse['item_category'].astype(str)
    
    #选取各用户浏览次数最多的类目,如有并列最多的类目,用逗号连接
    df_cate_browse = df_cate_most_browse.loc[df_cate_most_browse['item_category_counts']==df_cate_most_browse['item_category_counts_max'],'item_category'].groupby(df_cate_most_browse['user_id']).aggregate(lambda x:','.join(x)).reset_index()
    df_cate_browse.head()
    
    user_iditem_category
    04926344
    137265027
    2191373695,3942
    33646512997
    4371011863
    #将用户浏览最多的类目加入到用户标签表中
    labels = pd.merge(labels,df_cate_browse,how='left',on='user_id')
    labels.rename(columns={'item_category':'cate_most_browse'},inplace=True)
    

    3.3.2 收藏最多的类目

    #生成逻辑与浏览最多的类目相同
    df_cate_most_collect = df_collect.groupby(['user_id','item_category']).item_id.count().reset_index()
    df_cate_most_collect.rename(columns={'item_id':'item_category_counts'},inplace=True)
    df_cate_most_collect_max = df_cate_most_collect.groupby('user_id').item_category_counts.max().reset_index()
    df_cate_most_collect_max.rename(columns={'item_category_counts':'item_category_counts_max'},inplace=True)
    df_cate_most_collect = pd.merge(df_cate_most_collect,df_cate_most_collect_max,how='left',on='user_id')
    df_cate_most_collect['item_category'] = df_cate_most_collect['item_category'].astype(str)
    df_cate_collect = df_cate_most_collect.loc[df_cate_most_collect['item_category_counts']==df_cate_most_collect['item_category_counts_max'],'item_category'].groupby(df_cate_most_collect['user_id']).aggregate(lambda x:','.join(x)).reset_index()
    
    df_cate_collect.head()
    
    user_iditem_category
    03646512997
    13874510523
    2455613783
    35943611159
    460723354,2939,6900,8270,8665,10242,11304,11991
    labels = pd.merge(labels,df_cate_collect,how='left',on='user_id')
    labels.rename(columns={'item_category':'cate_most_collect'},inplace=True)
    

    3.3.3 加购最多的类目

    #生成逻辑与浏览最多的类目相同
    df_cate_most_cart = df_cart.groupby(['user_id','item_category']).item_id.count().reset_index()
    df_cate_most_cart = df_cart.groupby(['user_id','item_category']).item_id.count().reset_index()
    df_cate_most_cart.rename(columns={'item_id':'item_category_counts'},inplace=True)
    df_cate_most_cart_max = df_cate_most_cart.groupby('user_id').item_category_counts.max().reset_index()
    df_cate_most_cart_max.rename(columns={'item_category_counts':'item_category_counts_max'},inplace=True)
    df_cate_most_cart = pd.merge(df_cate_most_cart,df_cate_most_cart_max,how='left',on='user_id')
    df_cate_most_cart['item_category'] = df_cate_most_cart['item_category'].astype(str)
    df_cate_cart = df_cate_most_cart.loc[df_cate_most_cart['item_category_counts']==df_cate_most_cart['item_category_counts_max'],'item_category'].groupby(df_cate_most_cart['user_id']).aggregate(lambda x:','.join(x)).reset_index()
    
    df_cate_cart.head()
    
    user_iditem_category
    037266000
    1371016344
    2455611863,6648
    3594362754
    46179713230
    labels = pd.merge(labels,df_cate_cart,how='left',on='user_id')
    labels.rename(columns={'item_category':'cate_most_cart'},inplace=True)
    

    3.3.4 购买最多的类目

    #生成逻辑与浏览最多的类目相同
    df_cate_most_buy = df_buy.groupby(['user_id','item_category']).item_id.count().reset_index()
    df_cate_most_buy = df_buy.groupby(['user_id','item_category']).item_id.count().reset_index()
    df_cate_most_buy.rename(columns={'item_id':'item_category_counts'},inplace=True)
    df_cate_most_buy_max = df_cate_most_buy.groupby('user_id').item_category_counts.max().reset_index()
    df_cate_most_buy_max.rename(columns={'item_category_counts':'item_category_counts_max'},inplace=True)
    df_cate_most_buy = pd.merge(df_cate_most_buy,df_cate_most_buy_max,how='left',on='user_id')
    df_cate_most_buy['item_category'] = df_cate_most_buy['item_category'].astype(str)
    df_cate_buy = df_cate_most_buy.loc[df_cate_most_buy['item_category_counts']==df_cate_most_buy['item_category_counts_max'],'item_category'].groupby(df_cate_most_buy['user_id']).aggregate(lambda x:','.join(x)).reset_index()
    
    df_cate_buy.head()
    
    user_iditem_category
    03874510556
    1455616717,10559
    25339413500
    3594364370
    4100605930,3783,11455
    labels = pd.merge(labels,df_cate_buy,how='left',on='user_id')
    labels.rename(columns={'item_category':'cate_most_buy'},inplace=True)
    
    del df_browse
    del df_collect
    del df_cart
    del df_buy
    del df_cate_most_browse
    del df_cate_most_collect
    del df_cate_most_buy
    del df_cate_most_cart
    del df_cate_most_browse_max
    del df_cate_most_collect_max
    del df_cate_most_cart_max
    del df_cate_most_buy_max
    del df_cate_browse
    del df_cate_collect
    del df_cate_cart
    del df_cate_buy
    gc.collect(0)
    

    112

    3.4 30天用户行为

    • 数据集中的数据正好是一个月,30天的数据即整个数据集的数据

    3.4.1 近30天购买次数

    #将购买行为按用户进行分组,统计次数
    df_counts_30_buy = df[df['behavior_type']==4].groupby('user_id').item_id.count().reset_index()
    
    df_counts_30_buy.head()
    
    user_iditem_id
    0387452
    1455612
    2533941
    3594364
    41006053
    labels = pd.merge(labels,df_counts_30_buy,how='left',on='user_id')
    labels.rename(columns={'item_id':'counts_30_buy'},inplace=True)
    

    3.4.2 近30天加购次数

    #将加购行为按用户进行分组,统计次数
    df_counts_30_cart = df[df['behavior_type']==3].groupby('user_id').item_id.count().reset_index()
    
    df_counts_30_cart.head()
    
    user_iditem_id
    037261
    1371011
    24556122
    3594369
    4617975
    labels = pd.merge(labels,df_counts_30_cart,how='left',on='user_id')
    labels.rename(columns={'item_id':'counts_30_cart'},inplace=True)
    

    3.4.3 近30天活跃天数

    #对用户进行分组,统计活跃的天数,包括浏览、收藏、加购、购买
    counts_30_active = df.groupby('user_id')['date'].nunique()
    
    counts_30_active.head()
    

    user_id
    492 11
    3726 15
    19137 6
    36465 7
    37101 19
    Name: date, dtype: int64

    labels = pd.merge(labels,counts_30_active,how='left',on='user_id')
    labels.rename(columns={'date':'counts_30_active'},inplace=True)
    
    del df_counts_30_buy
    del df_counts_30_cart
    del counts_30_active
    gc.collect()
    

    238

    3.5 7天用户行为

    #数据集中的最后日期是12月18号,统计11号之后的用户行为
    df_near_7 = df[df['date']>datetime.strptime('2014-12-11', '%Y-%m-%d')]
    

    3.5.1 近7天购买次数

    df_counts_7_buy = df_near_7[df_near_7['behavior_type']==4].groupby('user_id').item_id.count().reset_index()
    
    df_counts_7_buy.head()
    
    user_iditem_id
    0455612
    1594361
    21006052
    31008901
    41316942
    labels = pd.merge(labels,df_counts_7_buy,how='left',on='user_id')
    labels.rename(columns={'item_id':'counts_7_buy'},inplace=True)
    

    3.5.2 近7天加购次数

    df_counts_7_cart = df_near_7[df_near_7['behavior_type']==3].groupby('user_id').item_id.count().reset_index()
    
    df_counts_7_cart.head()
    
    user_iditem_id
    037261
    1455619
    2594367
    31006052
    41316943
    labels = pd.merge(labels,df_counts_7_cart,how='left',on='user_id')
    labels.rename(columns={'item_id':'counts_7_cart'},inplace=True)
    

    3.5.3 近7天活跃天数

    counts_7_active = df_near_7.groupby('user_id')['date'].nunique()
    
    counts_7_active.head()
    

    user_id
    492 4
    3726 5
    19137 1
    36465 2
    37101 5
    Name: date, dtype: int64

    labels = pd.merge(labels,counts_7_active,how='left',on='user_id')
    labels.rename(columns={'date':'counts_7_active'},inplace=True)
    
    del df_counts_7_buy
    del df_counts_7_cart
    del counts_7_active
    gc.collect()
    

    112

    3.6 最后一次行为距今天数

    3.6.1 上次浏览距今天数

    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)
    
    days_browse.head()
    

    user_id
    492 1
    3726 1
    19137 7
    36465 3
    37101 3
    Name: date, dtype: int64

    labels = pd.merge(labels,days_browse,how='left',on='user_id')
    
    labels.rename(columns={'date':'days_browse'},inplace=True)
    

    3.6.2 上次加购距今天数

    days_cart = df[df['behavior_type']==3].groupby('user_id')['date'].max().apply(lambda x:(datetime.strptime('2014-12-19','%Y-%m-%d')-x).days)
    
    days_cart.head()
    

    user_id
    3726 1
    37101 8
    45561 1
    59436 4
    61797 18
    Name: date, dtype: int64

    labels = pd.merge(labels,days_cart,how='left',on='user_id')
    labels.rename(columns={'date':'days_cart'},inplace=True)
    

    3.6.3上次购买距今天数

    days_buy = df[df['behavior_type']==4].groupby('user_id')['date'].max().apply(lambda x:(datetime.strptime('2014-12-19','%Y-%m-%d')-x).days)
    
    days_buy.head()
    

    user_id
    38745 23
    45561 6
    53394 22
    59436 7
    100605 7
    Name: date, dtype: int64

    labels = pd.merge(labels,days_buy,how='left',on='user_id')
    labels.rename(columns={'date':'days_buy'},inplace=True)
    
    del days_browse
    del days_buy
    del days_cart
    gc.collect()
    

    42

    3.7 最近两次购买间隔天数

    df_interval_buy = df[df['behavior_type']==4].groupby(['user_id','date']).item_id.count().reset_index()
    
    interval_buy = df_interval_buy.groupby('user_id')['date'].apply(lambda x:x.sort_values().diff(1).dropna().head(1)).reset_index()
    
    interval_buy['date'] = interval_buy['date'].apply(lambda x : x.days)
    
    interval_buy.drop('level_1',axis=1,inplace=True)
    
    interval_buy.rename(columns={'date':'interval_buy'},inplace=True)
    
    interval_buy.head()
    
    user_idinterval_buy
    0594362
    11006053
    21063622
    31316943
    41379079
    labels = pd.merge(labels,interval_buy,how='left',on='user_id')
    
    del df_interval_buy
    gc.collect()
    

    70

    3.8是否浏览未下单

    df_browse_buy = df.loc[(df['behavior_type']==1) | (df['behavior_type']==4),['user_id','item_id','behavior_type','time']]
    
    browse_not_buy = pd.pivot_table(df_browse_buy,index=['user_id','item_id'],columns=['behavior_type'],values=['time'],aggfunc=['count'])
    
    browse_not_buy.columns = ['browse','buy']
    
    browse_not_buy.fillna(0,inplace=True)
    
    browse_not_buy['browse_not_buy'] = 0
    
    browse_not_buy.loc[(browse_not_buy['browse']>0) & (browse_not_buy['buy']==0),'browse_not_buy'] = 1
    
    browse_not_buy = browse_not_buy.groupby('user_id')['browse_not_buy'].sum().reset_index()
    
    browse_not_buy.head()
    
    user_idbrowse_not_buy
    049234
    1372668
    21913710
    33646512
    437101118
    labels = pd.merge(labels,browse_not_buy,how='left',on='user_id')
    
    labels['browse_not_buy'] = labels['browse_not_buy'].apply(lambda x: '是' if x>0 else '否')
    

    3.9 是否加购未下单

    df_cart_buy = df.loc[(df['behavior_type']==3) | (df['behavior_type']==4),['user_id','item_id','behavior_type','time']]
    cart_not_buy = pd.pivot_table(df_cart_buy,index=['user_id','item_id'],columns=['behavior_type'],values=['time'],aggfunc=['count'])
    cart_not_buy.columns = ['cart','buy']
    cart_not_buy.fillna(0,inplace=True)
    cart_not_buy['cart_not_buy'] = 0
    cart_not_buy.loc[(cart_not_buy['cart']>0) & (cart_not_buy['buy']==0),'cart_not_buy'] = 1
    cart_not_buy = cart_not_buy.groupby('user_id')['cart_not_buy'].sum().reset_index()
    
    cart_not_buy.head()
    
    user_idcart_not_buy
    037261
    1371011
    2387450
    34556122
    4533940
    labels = pd.merge(labels,cart_not_buy,how='left',on='user_id')
    labels['cart_not_buy'] = labels['cart_not_buy'].apply(lambda x: '是' if x>0 else '否')
    

    四、 用户属性标签

    4.1 是否复购用户

    buy_again = df[df['behavior_type']==4].groupby('user_id')['item_id'].count().reset_index()
    
    buy_again.rename(columns={'item_id':'buy_again'},inplace=True)
    
    buy_again.head()
    
    user_idbuy_again
    0387452
    1455612
    2533941
    3594364
    41006053
    labels = pd.merge(labels,buy_again,how='left',on='user_id')
    
    labels['buy_again'].fillna(-1,inplace=True)
    #未购买的用户标记为‘未购买’,有购买未复购的用户标记为‘否’,有复购的用户标记为‘是’
    labels['buy_again'] = labels['buy_again'].apply(lambda x: '是' if x>1 else  '否' if x==1 else '未购买')
    

    4.2 访问活跃度

    user_active_level = labels['counts_30_active'].value_counts().sort_index(ascending=False)
    
    plt.figure(figsize=(16,9))
    user_active_level.plot(title='30天内访问次数与访问人数的关系',fontsize=18)
    plt.ylabel('访问人数',fontsize=14)
    plt.xlabel('访问次数',fontsize=14)
    

    Text(0.5, 0, ‘访问次数’)
    在这里插入图片描述
    **分析:**14次左右是个拐点,因此定义购买次数小于等于14次为低活跃,大于14次为高活跃,此定义只是从用户的分布角度出发,工作中当从业务出发定义是否活跃。

    labels['buy_active_level'] = '高'
    labels.loc[labels['counts_30_buy']<=14,'buy_active_level'] = '低'
    

    4.3 购买的品类是否单一

    buy_single = df[df['behavior_type']==4].groupby('user_id').item_category.nunique().reset_index()
    
    buy_single.rename(columns={'item_category':'buy_single'},inplace=True)
    
    labels = pd.merge(labels,buy_single,how='left',on='user_id')
    labels['buy_single'].fillna(-1,inplace=True)
    labels['buy_single'] = labels['buy_single'].apply(lambda x: '是' if x>1 else  '否' if x==1 else '未购买' )
    

    4.4 用户价值分组(RFM)

    last_buy_days = labels['days_buy'].value_counts().sort_index()
    
    plt.figure(figsize=(16,9))
    last_buy_days.plot(title='最后一次购买距今天数与购买人数的关系',fontsize=18)
    plt.ylabel('购买人数',fontsize=14)
    plt.xlabel('距今天数',fontsize=14)
    

    Text(0.5, 0, ‘距今天数’)
    在这里插入图片描述
    注:访问异常的那天为双12

    labels['buy_days_level'] = '高'
    labels.loc[labels['days_buy']>8,'buy_days_level'] = '低'
    
    labels['rfm_value'] = labels['buy_active_level'].str.cat(labels['buy_days_level'])
    
    def trans_value(x):
        if x == '高高':
            return '重要价值客户'
        elif x == '低高':
            return '重要深耕客户'
        elif x == '高低':
            return '重要唤回客户'
        else: 
            return '即将流失客户'
    
    labels['rfm'] = labels['rfm_value'].apply(trans_value)
    labels.drop(['buy_days_level','rfm_value'],axis=1,inplace=True)
    labels['rfm'].value_counts()
    

    重要深耕客户 7167
    重要价值客户 7142
    即将流失客户 5631
    重要唤回客户 16
    Name: rfm, dtype: int64

    user_idtime_browsetime_buycate_most_browsecate_most_collectcate_most_cartcate_most_buycounts_30_buycounts_30_cartcounts_30_activedays_cartdays_buyinterval_buybrowse_not_buycart_not_buybuy_againuser_active_levelbuy_active_levelbuy_singlerfm
    034517089中午上午11241118246036031.03.02418.018.0NaN即将流失客户
    1136592808下午下午70981087979577957,9772,127533.05.0216.02.01.0重要深耕客户
    2117599174上午凌晨,上午,下午,晚上589460546936,8291,91022949,5550,10258,129824.03.0252.07.04.0重要深耕客户
    338516732晚上下午969337839397,139261050011.041.0292.02.03.0重要深耕客户
    429120381晚上NaN6513NaN3944NaNNaN4.0132.0NaNNaN未购买未购买重要价值客户

    接下来是对用户画像的详细分析,包括用户个性化标签、用户偏好标签、群体偏好标签,涉及到TF-IDF算法、余弦相似度算法

    • 首先,对数据进行预处理
    #提取日期
    df_orginal['time'] = df_orginal['time'].str[0:10]
    #填充字段'user_geohash',作为下一步groupby的计数字段
    df_orginal['user_geohash'].fillna('1',inplace=True)
    #对所有数据按'user_id','item_id','behavior_type','item_category','time'进行分组
    df = df_orginal.groupby(['user_id','item_id','behavior_type','item_category','time'])['user_geohash'].count().reset_index()
    df.rename(columns={'user_geohash':'behavior_count'},inplace=True)
    df.head()
    
    user_iditem_idbehavior_typeitem_categorytimebehavior_count
    0492254885163442014-12-079
    1492254885363442014-12-071
    2492254885463442014-12-071
    34922316002162472014-12-093
    44923473697124132014-12-122
    #回收内存
    del df_orginal
    gc.collect()
    df['time'] = pd.to_datetime(df['time'])
    

    五、用户个性化标签

    5.1 应用TF-IDF算法计算标签权重

    # 计算每个用户身上每个标签的个数
    df_tag_weight_tfidf_01_01 = df.groupby(['user_id','item_id'])['time'].count().reset_index()
    df_tag_weight_tfidf_01_01.rename(columns={'time':'weight_m_p'},inplace=True)
    
    # 计算每个用户身上的标签总数
    df_tag_weight_tfidf_01_02 = df.groupby(['user_id'])['time'].count().reset_index()
    df_tag_weight_tfidf_01_02.rename(columns={'time':'weight_m_s'},inplace=True)
    df_tag_weight_tfidf_01 = pd.merge(df_tag_weight_tfidf_01_01,df_tag_weight_tfidf_01_02,how='left',on='user_id')
    # 每个标签的行为数
    df_tag_weight_tfidf_02 = df_tag_weight_tfidf_01.groupby(['item_id']).weight_m_p.sum().reset_index()
    df_tag_weight_tfidf_02.rename(columns={'weight_m_p':'weight_w_p'},inplace=True)
    # 所有标签的总和
    df_tag_weight_tfidf_02['weight_w_s'] = df_tag_weight_tfidf_01['weight_m_p'].sum()
    df_tag_weight_tfidf_03 = pd.merge(df_tag_weight_tfidf_01,df_tag_weight_tfidf_02,how='left',on='item_id')
    
    # 应用TF-IDF计算标签权重
    df_tag_weight_tfidf_03['tfidf_ratio'] = (df_tag_weight_tfidf_03['weight_m_p']/df_tag_weight_tfidf_03['weight_m_s'])*(np.log10(df_tag_weight_tfidf_03['weight_w_s']/df_tag_weight_tfidf_03['weight_w_p']))
    df = pd.merge(df,df_tag_weight_tfidf_03[['user_id','item_id','tfidf_ratio']],how='left',on=['user_id','item_id']).reset_index(drop=True)
    
    del df_tag_weight_tfidf_01_01
    del df_tag_weight_tfidf_01_02
    del df_tag_weight_tfidf_01
    del df_tag_weight_tfidf_02
    del df_tag_weight_tfidf_03
    gc.collect()
    

    101

    5.2 建立行为类型权重维表

    浏览行为,权重0.3
    收藏行为,权重0.5
    加购行为,权重1
    购买行为,权重1.5

    df['act_weight_plan'] = 0.3
    df.loc[df['behavior_type']==2,'act_weight_plan']=0.5
    df.loc[df['behavior_type']==3,'act_weight_plan']=1
    df.loc[df['behavior_type']==4,'act_weight_plan']=1.5
    

    5.3 计算用户标签权重

    #标签权重衰减函数
    #本项目中,加购行为的权重不随着时间的增长而衰减,而购买、浏览、收藏随着时间的推移,其对当前的参考性越来越弱,因此权重会随着时间的推移越来越低
    def weight_time_reduce(act_date):
        date_interval = datetime.strptime('2014-12-19', '%Y-%m-%d') - act_date
        date_interval = date_interval.days
        time_reduce_ratio = np.exp(date_interval*(-0.1556))
        return time_reduce_ratio
    df['time_reduce_ratio'] = 1
    df.loc[df['behavior_type']!=3,'time_reduce_ratio'] = df.loc[df['time_reduce_ratio']!=3,'time'].apply(lambda x:weight_time_reduce(x))
    
    # 标签总权重 = 行为类型权重*衰减系数*行为数*TFIDF标签权重
    df['act_weight'] = df['act_weight_plan']*df['time_reduce_ratio']*df['behavior_count']*df['tfidf_ratio']
    df.head(5)
    
    user_iditem_idbehavior_typeitem_categorytimebehavior_counttfidf_ratioact_weight_plantime_reduce_ratioact_weight
    0492254885163442014-12-0790.1493190.30.1545560.062311
    1492254885363442014-12-0710.1493191.01.0000000.149319
    2492254885463442014-12-0710.1493191.50.1545560.034617
    34922316002162472014-12-0930.0629620.30.2109780.011955
    44923473697124132014-12-1220.0602740.30.3364860.012169

    六、用户偏好标签

    # 要计算两两标签的相似性,计算量太大,服务器性能有限,在此只选取有过购买的标签
    user_tag_public = df[df['behavior_type']==4]
    user_tag_01 = user_tag_public[['user_id','item_id']]
    #user_tag_02 = df.loc[df['behavior_type']==4,['user_id','item_id']]
    

    6.1 计算两两标签共同对应的用户数

    # 将两表正交,得到每个用户下,其所有标签的的两两组合
    user_tag_02 = pd.merge(user_tag_01,user_tag_01,on='user_id')
    
    # 删除重复值,即同一用户由上述正交得到的数据表中,两个标签为同一标签的数据
    user_tag_03 = user_tag_02.drop(labels=user_tag_02[user_tag_02['item_id_x']==user_tag_02['item_id_y']].index,axis=0)
    # 用两个标签分组,计算用户数,即每两个标签同时出现在不同的用户中的个数
    user_tag = user_tag_03.groupby(['item_id_x','item_id_y'])['user_id'].count().reset_index()
    user_tag.rename(columns={'user_id':'counts_common'},inplace=True)
    

    6.2 计算每个标签对应的用户数

    # 计算每一个标签对应的不同的用户数,即每个标签出现在不同的用户中的个数
    user_tag_05 = user_tag_01.groupby(['item_id'])['user_id'].nunique().reset_index()
    user_tag_05.rename(columns={'user_id':'counts_item_user'},inplace=True)
    # 计算标签1有关的用户数
    user_tag = pd.merge(user_tag,user_tag_05,how='left',left_on='item_id_x',right_on='item_id').drop('item_id_x',axis=1)
    user_tag.rename(columns={'counts_item_user':'counts_item_x','item_id':'item_id_x'},inplace=True)
    # 计算标签2有关的用户数
    user_tag = pd.merge(user_tag,user_tag_05,how='left',left_on='item_id_y',right_on='item_id').drop('item_id_y',axis=1)
    user_tag.rename(columns={'counts_item_user':'counts_item_y','item_id':'item_id_y'},inplace=True)
    

    6.3 计算两两标签之间的相似性

    # 余弦相似度计算两两标签的相关性
    user_tag['power'] = user_tag['counts_common'] / np.sqrt(user_tag['counts_item_x']*user_tag['counts_item_y'])
    

    6.4 对每个用户的历史标签权重加总

    # 对用户、标签进行分组,计算每个用户每个标签的权重和
    user_tag_06 = user_tag_public.groupby(['user_id','item_id'])['act_weight'].sum().reset_index()
    

    6.5 计算推荐给用户的相关标签

    # 将用户与所有与其有关的标签作对应
    user_peasona_tag = pd.merge(user_tag_06,user_tag,how='left',left_on='item_id',right_on='item_id_x').drop('item_id',axis=1)
    
    del user_tag_01
    del user_tag_02
    del user_tag_03
    del user_tag_05
    del user_tag_06
    gc.collect()
    

    77

    # 计算推荐得分值  得分值 = 行为权重*相关性
    user_peasona_tag['recommend'] = user_peasona_tag['act_weight']*user_peasona_tag['power']
    
    # 对所有数据按得分值排序,再按’user_id'分组,得到每个用户有关的得分值最高的10个标签
    user_peasona_tag_total = user_peasona_tag.sort_values('recommend', ascending=False).groupby(['user_id']).head(10)
    user_peasona_tag_total.head(10)
    
    user_idact_weightcounts_commonitem_id_xcounts_item_xitem_id_ycounts_item_ypowerrecommend
    941565166805026.132241176.0354309086.01.0337331963.02.0124.450793763.162218
    941547166805022.591208176.0337331963.02.0354309086.01.0124.450793322.477880
    941558166805026.13224122.0354309086.01.0177149139.01.022.000000134.909295
    4517695615456561.39303688.0131284675.01.0250218619.01.088.000000122.587185
    4517697615456561.39303677.0131284675.01.0270996967.01.077.000000107.263787
    4517934615456560.89071488.0250218619.01.0131284675.01.088.00000078.382824
    4517685615456561.39303655.0131284675.01.036667020.01.055.00000076.616990
    529309112799645.63994719.0168681351.02.0395358462.01.013.43502975.772847
    529307112799645.63994719.0168681351.02.0379008813.01.013.43502975.772847
    529306112799645.63994719.0168681351.02.0375010017.01.013.43502975.772847
    del user_peasona_tag
    del user_peasona_tag_total
    gc.collect()
    

    7

    七、群体用户画像标签

    需要先对用户人群进行分类,为了降低复杂性并实现群体用户画像标签的设计,暂时先随机对用户进行指定性别,以后有时间将对上部划分出来的用户群体进行画像标签设计

    7.1 随机指定性别并划分群体

    user = pd.DataFrame(df['user_id'].unique(),columns=['user_id'])
    
    user['sex'] = np.random.randint(0,2,(20000))
    user.loc[user['sex']==1,'sex'] = '男'
    user.loc[user['sex']==0,'sex'] = '女'
    df_group = pd.merge(df[['user_id','item_id','act_weight']],user,how='left',on='user_id')
    
    del df
    gc.collect()
    

    36

    df_group.head(5)
    
    user_iditem_idact_weightsex
    04922548850.062311
    14922548850.149319
    24922548850.034617
    349223160020.011955
    449234736970.012169

    7.2 使用TF-IDF计算不同人群的标签偏好

    # 计算每个性别、每个标签的权重加总
    df_group_weight_tfidf_01_01 = df_group.groupby(['sex','item_id'])['act_weight'].sum().reset_index()
    
    df_group_weight_tfidf_01_01.head(5)
    
    sexitem_idact_weight
    0640.008926
    12700.000093
    23910.000333
    36680.000369
    48690.000324
    df_group_weight_tfidf_01_01.rename(columns={'act_weight':'weight_m_p'},inplace=True)
    # 计算每个性别的所有标签的权重加总
    df_group_weight_tfidf_01_02 = df_group.groupby(['sex'])['act_weight'].sum().reset_index()
    df_group_weight_tfidf_01_02.rename(columns={'act_weight':'weight_m_s'},inplace=True)
    df_group_weight_tfidf_01 = pd.merge(df_group_weight_tfidf_01_01,df_group_weight_tfidf_01_02,how='left',on='sex')
    df_group_weight_tfidf_01.head(5)
    
    sexitem_idweight_m_pweight_m_s
    0640.00892626497.333993
    12700.00009326497.333993
    23910.00033326497.333993
    36680.00036926497.333993
    48690.00032426497.333993
    # 计算每个标签的权重加总
    df_group_weight_tfidf_02 = df_group_weight_tfidf_01.groupby(['item_id'])['weight_m_p'].sum().reset_index()
    df_group_weight_tfidf_02.rename(columns={'weight_m_p':'weight_w_p'},inplace=True)
    # 计算所有标签的权重加总
    df_group_weight_tfidf_02['weight_w_s'] = df_group_weight_tfidf_01['weight_m_p'].sum()
    df_group_weight_tfidf_02.head(5)
    
    item_idweight_w_pweight_w_s
    0370.00698153319.602753
    1640.00918053319.602753
    21770.00002853319.602753
    32700.00009353319.602753
    43680.00035853319.602753
    df_group_weight_tfidf_03 = pd.merge(df_group_weight_tfidf_01,df_group_weight_tfidf_02,how='left',on='item_id')
    # 使用TF-IDF算法计算每个性别对每个标签的偏好权重值
    df_group_weight_tfidf_03['tfidf_ratio'] = (df_group_weight_tfidf_03['weight_m_p']/df_group_weight_tfidf_03['weight_m_s'])*(df_group_weight_tfidf_03['weight_w_s']/df_group_weight_tfidf_03['weight_w_p'])
    
    del df_group
    del df_group_weight_tfidf_01_01
    del df_group_weight_tfidf_01_02
    del df_group_weight_tfidf_01
    del df_group_weight_tfidf_02
    gc.collect()
    

    34

    # 对所有数据按得分值排序,再按性别分组,得到每个性别得分值最高的10个标签
    df_group_weight = df_group_weight_tfidf_03.sort_values('tfidf_ratio', ascending=False).groupby(['sex']).head(10)
    df_group_weight.head(15)
    
    sex item_idweight_m_pweight_m_sweight_w_pweight_w_stfidf_ratio
    19490402855314250.00184926497.3339930.00184953319.602753
    8394821230927220.01312426497.3339930.01312453319.602753
    8394601230890140.00058826497.3339930.00058853319.602753
    19765912895704260.00045126497.3339930.00045153319.602753
    8394631230897700.00000226497.3339930.000002
    19765882895701300.00014326497.3339930.00014353319.602753
    19765872895700630.00019626497.3339930.00019653319.602753
    19765862895698450.00001026497.3339930.00001053319.602753
    19765852895696470.00078226497.3339930.00078253319.602753
    19765812895691880.08979926497.3339930.08979953319.602753
    35215791115620940.00004626822.2687610.00004653319.602753
    52920533717659330.00001226822.2687610.00001253319.602753
    43717782363986240.00020626822.2687610.00020653319.602753
    44371792460074420.00715126822.2687610.00715153319.602753
    51746633545266340.00020926822.2687610.00020953319.602753
    展开全文
  • 用户画像行为分析流程

    千次阅读 2016-12-27 10:47:37
    什么是用户画像? 简而言之,用户画像是根据用户社会属性、生活习惯和消费行为等信息而抽象出的一个标签化的用户模型。构建用户画像的核心工作即是给用户贴“标签”,而标签是通过对用户信息分析而来的高度精炼的...
    什么是用户画像?

    简而言之,用户画像是根据用户社会属性、生活习惯和消费行为等信息而抽象出的一个标签化的用户模型。构建用户画像的核心工作即是给用户贴“标签”,而标签是通过对用户信息分析而来的高度精炼的特征标识。


    举例来说,如果你经常购买一些玩偶玩具,那么电商网站即可根据玩具购买的情况替你打上标签“有孩子”,甚至还可以判断出你孩子大概的年龄,贴上“有5-10岁的孩子”这样更为具体的标签,而这些所有给你贴的标签统在一次,就成了你的用户画像,因此,也可以说用户画像就是判断一个人是什么样的人。


    除去“标签化”,用户画像还具有的特点是“低交叉率”,当两组画像除了权重较小的标签外其余标签几乎一致,那就可以将二者合并,弱化低权重标签的差异。

    用户画像的作用

    罗振宇在《时间的朋友》跨年演讲上举了这样一个例子:当一个坏商家掌握了你的购买数据,他就可以根据你平常购买商品的偏好来决定是给你发正品还是假货以提高利润。且不说是否存在这情况,但这也说明了利用用户画像可以做到“精准销售”,当然了,这是极其错误的用法。

    其作用大体不离以下几个方面:


    精准营销,分析产品潜在用户,针对特定群体利用短信邮件等方式进行营销;
    用户统计,比如中国大学购买书籍人数 TOP10,全国分城市奶爸指数;
    数据挖掘,构建智能推荐系统,利用关联规则计算,喜欢红酒的人通常喜欢什么运动品牌,利用聚类算法分析,喜欢红酒的人年龄段分布情况;
    进行效果评估,完善产品运营,提升服务质量,其实这也就相当于市场调研、用户调研,迅速下定位服务群体,提供高水平的服务;
    对服务或产品进行私人定制,即个性化的服务某类群体甚至每一位用户(个人认为这是目前的发展趋势,未来的消费主流)。比如,某公司想推出一款面向5-10岁儿童的玩具,通过用户画像进行分析,发现形象=“喜羊羊”、价格区间=“中等”的偏好比重最大,那么就给新产品提供类非常客观有效的决策依据。
    业务经营分析以及竞争分析,影响企业发展战略
    构建流程
    数据收集

    数据收集大致分为网络行为数据、服务内行为数据、用户内容偏好数据、用户交易数据这四类。


    网络行为数据:活跃人数、页面浏览量、访问时长、激活率、外部触点、社交数据等
    服务内行为数据:浏览路径、页面停留时间、访问深度、唯一页面浏览次数等
    用户内容便好数据:浏览/收藏内容、评论内容、互动内容、生活形态偏好、品牌偏好等
    用户交易数据(交易类服务):贡献率、客单价、连带率、回头率、流失率等
    当然,收集到的数据不会是100%准确的,都具有不确定性,这就需要在后面的阶段中建模来再判断,比如某用户在性别一栏填的男,但通过其行为偏好可判断其性别为“女”的概率为80%。

    还得一提的是,储存用户行为数据时最好同时储存下发生该行为的场景,以便更好地进行数据分析。

    行为建模

    该阶段是对上阶段收集到数据的处理,进行行为建模,以抽象出用户的标签,这个阶段注重的应是大概率事件,通过数学算法模型尽可能地排除用户的偶然行为。

    这时也要用到机器学习,对用户的行为、偏好进行猜测,好比一个 y=kx+b 的算法,X 代表已知信息,Y 是用户偏好,通过不断的精确k和b来精确Y。

    在这个阶段,需要用到很多模型来给用户贴标签。


    用户汽车模型
    根据用户对“汽车”话题的关注或购买相关产品的情况来判断用户是否有车、是否准备买车
    用户忠诚度模型
    通过判断+聚类算法判断用户的忠诚度
    身高体型模型
    根据用户购买服装鞋帽等用品判断
    文艺青年模型
    根据用户发言、评论等行为判断用户是否为文艺青年
    用户价值模型
    判断用户对于网站的价值,对于提高用户留存率非常有用(电商网站一般使用RFM 实现)
    还有消费能力、违约概率、流失概率等等诸多模型。
    用户画像基本成型

    该阶段可以说是二阶段的一个深入,要把用户的基本属性(年龄、性别、地域)、购买能力、行为特征、兴趣爱好、心理特征、社交网络大致地标签化。

    为什么说是基本成型?因为用户画像永远也无法100%地描述一个人,只能做到不断地去逼近一个人,因此,用户画像既应根据变化的基础数据不断修正,又要根据已知数据来抽象出新的标签使用户画像越来越立体。

    关于“标签化”,一般采用多级标签、多级分类,比如第一级标签是基本信息(姓名、性别),第二级是消费习惯、用户行为;第一级分类有人口属性,人口属性又有基本信息、地理位置等二级分类,地理位置又分工作地址和家庭地址的三级分类。

    数据可视化分析

    这是把用户画像真正利用起来的一步,在此步骤中一般是针对群体的分析,比如可以根据用户价值来细分出核心用户、评估某一群体的潜在价值空间,以作出针对性的运营。
    如图:

    展开全文
  • 随着供给和消费人群的多样化,如何在供给和用户之间做一个对接,就是用户画像的一个基础工作。所谓千人千面,画像需要刻画不同人群的消费习惯和消费偏好。外卖O2O和传统的电商存在一些差异。可以简单总结为如下几点...
  • 用户画像解析

    万次阅读 多人点赞 2019-02-28 22:26:05
    用户画像是大数据行业言必及之的时髦概念。现在我们运营谈及用户画像,它也是和精准营销、精细化运营直接钩挂的。这篇文章主要讲产品和运营角度的用户画像。 一、什么是用户画像 用户画像一点也不神秘,它是根据...

     

          用户画像是大数据行业言必及之的时髦概念。现在我们运营谈及用户画像,它也是和精准营销、精细化运营直接钩挂的。这篇文章主要讲产品和运营角度的用户画像。

      一、什么是用户画像

    用户画像一点也不神秘,它是根据用户在互联网留下的种种数据,主动或被动地收集,最后加工成一系列的标签。比如猜用户是男是女,哪里人,工资多少,有没有谈恋爱,喜欢什么,准备剁手购物吗?

    我们常把用户标签和用户画像对等。但凡用户画像的文章,类似上文图片都会出现,有用烂的趋势。标签化是最直观的解释,但它不等于用户画像。

    用户画像的正式名称是User Profile,大家往往把它和User Persona混淆,后者更恰当的名字是用户角色。是产品设计和用户调研的一种方式方法。当我们讨论产品、需求、场景、用户体验的时候,往往需要将焦点聚集在某类人群上,用户角色便是一种抽象的方法,是目标用户的集合。

    用户角色不指代具体的谁。「她是一位25岁的白领,211大学毕业,现在从事于互联网行业的设计工作,居住在北京。单身,平时喜爱摇滚乐」,这段话语,常用来描述产品的典型用户。

    本文谈的User Profile,更多是运营和数据息息相关的平台级应用,本质是对任何一个用户都能用标签和数据描述。

    二、用户画像的应用

    它在企业迈大迈强的过程中有举足轻重的作用。以下是主要的应用。

    精准营销:这是运营最熟悉的玩法,从粗放式到精细化,将用户群体切割成更细的粒度,辅以短信、推送、邮件、活动等手段,驱以关怀、挽回、激励等策略。

    数据应用:用户画像是很多数据产品的基础,诸如耳熟能详的推荐系统广告系统。操作过各大广告投放系统的同学想必都清楚,广告投放基于一系列人口统计相关的标签,性别、年龄、学历、兴趣偏好、手机等等。

    用户分析:虽然和Persona不一样,用户画像也是了解用户的必要补充。产品早期,PM们通过用户调研和访谈的形式了解用户。在产品用户量扩大后,调研的效用降低,这时候会辅以用户画像配合研究。新增的用户有什么特征,核心用户的属性是否变化等等。

    数据分析:这个就不用多提了,用户画像可以理解为业务层面的数据仓库,各类标签是多维分析的天然要素。数据查询平台会和这些数据打通。

    对大部分产品,用户画像用不到推荐系统,个性化推荐也提高不了几个利润,毕竟它需要大量的用户和数据作支撑。所以这些产品,更适合以用户画像为基础去驱动业务。

    提了那么多好处,但是据我了解,不少公司,花了一大笔钱招了不少人建设用户画像系统,结果用不起来。或者做了一份用户画像的报告,性别用户地理位置用户消费金额,看上去挺高大上的,看完也就看完了。

    归根结底,难以用好。

    很多用户画像初衷是好的,但是沦为了形式主义。

    举身边的例子,朋友在公司建立用户画像划分了百来个维度。用户消费、属性、行为无所不包。本来这不错啊,但是上线后运营看着这个干瞪眼。

    问题包含但不限于,用户有那么多维度,怎么合理地选择标签?我想定义用户的层级,VIP用户应该累积消费金额超过多少?是在什么时间窗口内?为什么选择这几个标准?后续应该怎么维护和监控?业务发生变化了这个标签要不要改?

    设立好标签,怎么验证用户画像的有效性?我怎么知道这套系统成功了呢?效果不佳怎么办?它有没有更多的应用场景?

    策略的执行也是一个纠结的问题。从岗位的执行看,运营背负着KPI。当月底KPI完不成时,你觉得他们更喜欢选择全量运营,还是精细化呢?

    我想不少公司都存在这样类似情况:使用过用户画像一段时间后,发现也就那么一回事,也就渐渐不再使用。

    这是用户画像在业务层面遇到老大难的问题。虽然企业自称建立用户画像,应用还是挺粗糙的。

    三、怎样深入理解用户画像

    画虎不全反类汪,想要用好它,首先得深入理解用户画像。

    现在运营按用户生命周期设立了几个标签,比如新用户、活跃用户、流失用户,这些标签当然够细分。但它真的是一个好标签么?不是。

    因为这些都是滞后性的。按流失用户的一般定义,往往是用户很长一段时间没有回应和行动,但是都几个月没有响应了,哪怕知道是流失用户也于事无补。它有价值,但太滞后。

    聪明的运营会设立一个新的标签,最近一次活跃距今天数,用户有六个月没有活跃,那么天数就是180天。这个比单纯的流失用户标签好,能凭此划分不同的距今天数,设立30天,90天,180天的时间节点。

    距今天数也不是最好的。用户有差异,同样两个用户A和B,哪怕不活跃天数相同,我也不能认为它们的流失可能性相等。该问题在低频场景更凸显,旅游APP,半年没有活跃也是正常的,此时距今天数力有未逮。

    回过头看流失用户,我们定义它,不是为了设立一个高大上的系统。任何企业,肯定一开始就希望流失用户越少越好,其次才是如何挽回。这种业务前提下,预防性的减少流失用户比已经流失的标签更重要。

    所以最好的标签的标签是用户流失概率,流失概率>距今消费天数>流失标签。

    不要想当然的归纳一个齐全完备的体系,却忽略了画像的核心价值。用户画像首先得是商业目的下的用户标签集合。

    猜用户是男是女,哪里人,工资多少,有没有谈恋爱,喜欢什么,准备剁手购物吗?探讨这些是没有意义的。是男是女如何影响消费决策,工资多少影响消费能力,有没有谈恋爱会否带来新的营销场景,剁手购物怎么精准推荐,这些才是用户画像背后的逻辑。

    不是我有了用户画像,便能驱动和提高业务。而是为了驱动和提高业务,才需要用户画像。这是很容易犯的错误。

    用户画像的标签一般通过两种形式获得,基于已有数据或者一定规则加工,流失标签和距今天数皆是。另外一种是基于已有的数据计算概率模型,会用到机器学习和数据挖掘。

    概率是介于0~1之间的数值。拿性别举例,除非能直接获取用户的身份证信息,用户很少会填写性别,填写的性别也不一定准确,网游中性别为女的扣脚大汉一抓一大把呢。

    这里就要增加一层推断用户真实性别的算法。中国人的性别和名字是强相关,建国建军,翠花翠兰,很容易判断。算法中常用贝叶斯,通过已有的姓名性别库预测新加入的用户性别。

    特殊情况下,不少姓名是中性,男女不辩。像晓晶,可男可女。更特殊的情况,看上去是男性的名字,也有可能是女性,我的初中老师就叫建军,然而是个和蔼可亲的小姐姐。

    特殊情况意味着特殊的概率,所以不能用非此即彼的二分法。所谓概率,它更习惯告诉你,通过模型推断,建军有95%的可能是男性姓名,表示为0.95;晓晶有55%的可能是男性,表示为0.55。

    虽然为了方便,模型会设立阈值,将50%以上的概率默认为男性,以下默认为女性。但业务部门的同学要清楚,用户标签的本质往往是0~1之间的概率。

    概率型的标签很难验证。某位用户被标上学生标签,要么真的哄他上传学籍证明,否则很难知道他是不是真的学生。这种黑箱情况下,针对学生用户进行营销活动,效果好与不好,都受标签准确率的影响。广告、推荐、精准营销都会遇到这个问题。

    概率肯定有多有少。90%流失概率的用户,和30%流失概率的用户,虽然是模型建立出的预测值,非真实,我们还是会认为前者更有离开的可能性,凭此设立运营策略。

    这带来一个新的问题,如何选择概率的阈值?

    我们想要挽回流失用户,选择80%以上概率的人群,还是60%呢?答案已经说过了,要考虑业务,挽回流失用户是手段不是目的,实际目的是通过挽回流失用户提高利润,那么阈值的选择迎刃而解。计算不同阈值下,挽回用户的收入和成本,选择最优解。

    推而广之,推荐系统也好,广告系统也罢,它们有更复杂的维度、标签、特征,本质也是找出用户最近想不想买车,用户最近想不想旅游。把最合适的信息在最恰当时机推给用户,获取最大的利益。

    我列举的案例,是简化过的。像姓名,在电商和消费行业,除了生理上的性别,还会建立消费模型上的性别标签,有些人虽然是男性,但购物行为是女性,这是要区分的。

    看到这里别怕,想要建好用户画像,说简单不简单,说难也不难。

    四、如何建立正确的用户画像

    用户画像首先是基于业务模型的。业务部门连业务模型都没有想好,数据部门只能巧妇难为无米之炊。数据部门也别关门造车,这和做产品一样,连用户需求都没有理解透彻,匆匆忙忙上线一个APP,结果无人问津。

    理解消费者的决策,考虑业务场景,考虑业务形态,考虑业务部门的需求…这些概念说得很虚,但是一个好的用户画像离不开它们。本文没有说数据、模型和算法,是我认为,它们比技术层面更重要。

    我们从一个故事开始设立用户画像吧。

    老王是一家互联网创业公司的核心人员,产品主营绿色健康沙拉,老王和绿色比较搭嘛。这家公司推出了APP专卖各式各样的沙拉,现在需要建立用户画像指导运营。

    公司现阶段在业务层面,更关注营销和销售:如何将沙拉卖得更好。下图是老王简单梳理的运营流程。

    老王将顾客按是否购买过沙拉,划分成潜在用户和新客。潜在用户是注册过APP但还没有下单,新客是只购买过一次沙拉的用户,除此以外还有老客,即消费了两次及以上的人群。

    为了便于大家理解,我用JSON格式表示一个简易的用户画像。

    为什么独立出新客标签?因为老王的沙拉针对未消费用户会有新人红包引导消费,万事开头难。这也带来新客一次后不再消费的问题,所以需要潜在、新客、老客的划分。

    作为一个有追求的运营人员,划分老客也是不够,这里继续用户分层。

    传统的分层用RFM三个维度衡量,沙拉的客单价比较固定,F和M取一个就够用了。老王现在计算不同消费档次的用户留存度差异,譬如某时间段内消费达XX元的用户,在未来时间段是否依旧消费。

    沙拉这类餐饮是高频消费,XX应该选择一个较窄的时间窗口,统计365天内的消费意义不大。还有一点需要注意的是,沙拉不同季节的销量是有差异的,冬天沙拉肯定卖的不如夏天,要综合考虑消费分布。

    这里姑且定义,30天内消费200元以上为VIP用户。老王的生意如果特别好,也可以继续划分超级VIP。这种标签往往配合业务,譬如VIP有赠送饮料,优先配送的权益。非VIP人群,也需要激励往VIP发展。

    画像的人口统计属性,老王靠用户填写订单上的收货人姓名搞定。籍贯年龄这几个,对沙拉生意没有特别大的帮助,难道为四川籍用户提高麻辣沙拉?

    用户地址,可以通过收货地设立规则判断,比如某个地址出现X次,可以将其认为常用地地址。再依据送货地在写字楼还是学校,推算用户是白领还是学生。

    老王针对不同属性的人群,采取了特殊的运营策略。像学生群体,因为7,8月份是暑假,所以老王提前预估到校园地区的销售额下降。当9月开学季,又能对返校学生进行召回。

    白领相关的群体,更关注消费体验,对价格敏感是次要的。如果平台女用户的消费占比高,老王就主打减肥功能的沙拉,并且以包月套餐的形式提高销量。

    以一家沙拉店来看,老王的用户画像已经不错了,但他还是焦头烂额,因为用户流失率开始上升。用户流失有各种各样的原因:对手老李沙拉的竞争、沙拉的口味、用户觉得性价比不高、老王不够帅等。

    流失是一个老大难的预测问题。老王对流失用户的定义是30天没有消费。想要准确预测,这里得尝试用机器学习建模,技术方面先这里略过。所谓建模,最好要找到用户开始不消费的时间点之前的关键因素,可是是行为,可以是属性。

    用户历史窗口内消费金额少,有可能流失;用户历史窗口内消费频次低,有可能流失;用户历史窗口内打开APP次数少,有可能流失;用户给过差评,有可能流失;用户等餐时间长,有可能流失;用户的性别差异,有可能流失;餐饮的季度因素,有可能流失…

    老王依据业务,挑选了可能影响业务的特征,提交给数据组尝试预测流失。需要注意的是,这些用户行为不能反应真实的情况。大家不妨想一下,流失用户的行为,是不是一个动态的变化过程?

    我曾经消费过很多次,但是突然吃腻了,于是减少消费次数,再之后不怎么消费,最终流失。单位时间段内的消费忠诚度是梯度下降的,为了更好的描述变化过程,将时间窗口细分成多个等距段。前30~20天、前20~10天、前10天内,这种切分比前30天内可以更好地表达下降趋势,也更好的预测流失。

    从老王的思路看,所谓流失,可以通过用户行为的细节预判。机器学习的建模虽然依赖统计手段,也离不开业务洞察。这里再次证明,用户画像建立在业务模型上。

    流失概率解决了老王的心头之患,通过提前发现降低流失用户。挽回流失推行一段时间后,老王发现虽然流失用户减少了,但是成本提高了,因为挽回用户也是要花钱的呀。亏本可不行,老王心头又生一计,他只挽回有价值的,那种拿了红包才消费的用户老王他不要了!老王要的是真爱粉。于是他配合消费档次区别对待,虽然流失用户的数量没有控制好,但是利润提高了。

    上述的用户画像,没有一个标签脱离于业务之外。基于业务场景,我们还能想象很多用户画像的玩法。沙拉有不同的口味,蔬果鸡肉海鲜。用户的口味偏好,可以用矩阵分解、模糊聚类或者多分类的问题计算,也以0~1之间的数字表示喜好程度,相似的,还有价格偏好,即价格敏感度。

    再深入想一下业务场景,如果某个办公地点,每天都有五六笔的订单,分属不同的客户不同的时间段,外卖小哥得送个五六次,对人力成本是多大的浪费呀。运营可以在后台分析相关的数据,以团购或拼单的形式,促成订单合并,或许销售额的利润会下降,但是外卖的人力成本也节约了。这也是用画像作为数据分析的依据。

    老王的运营故事说完了,现在对用户画像的建立有一套想法了吧。

    五、用户画像的架构

    不同业务的画像标签体系并不一致,这需要数据和运营目的性的提炼。

    用户画像一般按业务属性划分多个类别模块。除了常见的人口统计,社会属性外。还有用户消费画像,用户行为画像,用户兴趣画像等。具体的画像得看产品形态,像金融领域,还会有风险画像,包括征信、违约、洗钱、还款能力、保险黑名单等。电商领域会有商品的类目偏好、品类偏好、品牌偏好,不一而足。

    上图是随手画的的例子,画一个架构不难,难得是了解每个标签背后的业务逻辑和落地方式,至于算法,又能单独扯很多文章了。

    从数据流向和加工看,用户画像包含上下级递进关系。

    以上文的流失系数举例,它通过建模,其依赖于用户早期的历史行为。而用户早期的历史行为,即10天内的消费金额、消费次数、登录次数等,本身也是一个标签,它们是通过原始的明细数据获得。

    上图列举了标签加工和计算的过程,很好理解。最上层的策略标签,是针对业务的落地,运营人员通过多个标签的组合形成一个用户群组,方便执行。

    公司越大,用户画像越复杂。某家主打内容分发的公司进入了全新的视频领域,现在有两款APP,那么用户画像的结构也需要改变。既有内容相关的标签,也有视频相关的标签,两者是并行且关联的。

    比如A用户在内容标签下是重度使用,而在视频标签下是轻度。比如B用户很久没打开内容APP有流失风险,但在视频APP的使用时长上看很忠诚。如此种种,看的是灵活应用。当然,姓名性别这类人口统计标签,是通用的。

    用户画像作为平台级的应用,很多运营策略及工具,都是在其基础上构建的。

    基于营销和消费相关的标签,新客、老客、用户的流失和忠诚、用户的消费水平和频率等,都是构成CRM(客户关系管理)的基础,可能大家更习惯叫它用户/会员管理运营平台。

    它的作用在于,将数据化的标签,转换成产品运营策略。不同的标签对应不同的用户群体,也对应不同的营销手段。CRM的结构中会包含各类触达用户的常用渠道比如短信、邮件、推送等。也包含CMS(内容管理系统),执行人员通过其快速配置活动页、活动通道、优惠券等,靠营销活动拉动数据。

    老王的沙拉业务要是做大,那么运营平台就会以图中的结构搭建。老王在CRM中组合标签,新客老客流失客的数据借助BI监控,然后通过CMS系统配置红包啊优惠券啊等等,再通过短或Push触达。

    好的用户画像系统,既是数据生态体系,也是业务和运营的生态体系,它是一门复杂的交叉领域。因为篇幅有限,算法,数据产品没有更多的涉及,以后有机会再讲吧。核心思想希望大家能吃透。若有吐槽和疑问欢迎留言。

    万千用法,存乎一心。

    —— 转自秦璐

     

    展开全文
  • 什么是用户画像 用户画像这个理念是交互设计之父阿兰·库珀提出来的。他说用户画像是真实用户的虚拟代表,是建立在一系列真实数据之上的目标用户模型。是根据用户的属性及行为特征,抽象出相应的标签,拟合而成的...
  • 用户画像常用算法

    千次阅读 2020-06-17 10:55:12
    而λ 是一个用户定义的数值。在这种情况下,回归系数的计算公式将变成: w^=(XTX+λI)−1XTy 岭回归最先用来处理特征数多余样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里通过引入 λ来限制了...
  • 框架搭建环境 - 编译器:IDEA 2019.1 - Maven:3.6.0 - JDK:1.8.0_191 - 系统:Win 10 数据库 MySQL - 版本:mysql-installer-community-8.0.15.0.msi ...- 端口:3306 - 数据库名:jhy_portrait ...
  • 用户画像建模可以分为三步:1.统一化;2.标签化;3.业务化。 统一化 统一用户的唯一标识。用唯一标识是整个用户画像的核心。设计唯一标识可以从这些项中选择:用户名、注册手机号、邮箱、设备号、CookieID等。 标签...
  • 利用Python搭建用户画像系统

    千次阅读 2018-07-20 15:20:37
    用户画像是当下很多企业都会提及的概念,多数情况下会和大数据以及营销挂钩。本文将对用户画像的相关知识进行进行简单的介绍,并利用Python去实现一个简单的用户画像系统。 1.什么是用户画像 用户画像可以理解成是...
  • 近日,创客学院联合创始人小美老师受邀做客凤凰教育【华人教育家-大咖论教】在线节目,与11万网友一起深度畅聊人工智能与物联网。专访中,小美老师与大家详谈了物联网和嵌入式技术未来的发展趋势、物联网相关人才的...
  • 一文让你彻底明白,到底什么是用户画像?

    千次阅读 多人点赞 2020-05-29 20:35:00
    如果之前没听过也没有关系,相信看了本篇博客对于用户画像概念的一个介绍,你也一定能收获“奇怪的知识” 文章目录 1、用户画像 1.1、概念 1.2 、分类及方向 用户画像方向 用户画像分类(技术) 1.3、应用场景 1.3.1...
  • python期末作业 学生画像管理系统 花了两天做了一个学生管理系统,其实先去网上借鉴了网友的项目,在这个基础上改了改,有需要的人,可以直接拿去用 系统展示 框架采用了flask+bootstrap+mysql+python3.6 数据库设计...
  • 常见信息流平台用户画像分析

    千次阅读 2020-12-22 22:34:07
    NO.1 |趣头条性别:女性占比更高,预估6成以上年龄:用户年龄分布在30-39、40-49之间。这部分人群大部分为中年人(已婚年龄居多);其次最为集中在36-45岁,女性占比较高,36岁及以上用户占比超6成,女性用户占比近6...
  • 推荐系统——用户画像

    千次阅读 多人点赞 2018-10-15 22:21:39
    写在最开始,本人不是专业做推荐系统的,本文只是整理最近培训的所见...目前推荐系统的用户画像都是对用户的向量化表示,推荐系统的用户画像是给计算机用的,而不是给人看的。用户画像不是推荐系统的目的,而是在构...
  • 运营包含三个方向:内容运营、活动运营、用户运营。互联网产品的核心价值,就体现在用户上。小红书这个apo躺在我的手机里已经很久了,终于要拿出来看看是啥情况,那么火。以下是我不成熟的分析。一、产品介绍产品...
  • JD电商用户画像总结

    千次阅读 2019-03-04 17:01:35
    https://blog.csdn.net/tswisdom/article/details/79871265 course_link:https://www.imooc.com/learn/460
  • 这一切都是精准化营销的常见套路。...以庞大的用户数据为依托,构建出一整套完善的用户画像,借助其标签化、信息化、可视化的属性,是企业实现个性化推荐、精准营销强有力的前提基础。 可见,深入了...
  • 用户画像技术简介

    千次阅读 2020-09-01 08:35:12
    导读:用户画像将产品设计的焦点放在目标用户的动机和行为上,从而避免产品设计人员草率地代表用户。产品设计人员经常不自觉的把自己当作用户代表,根据自己的需求设计产品,导致无法抓住实际用户的需求。往往对产品...
  • 用户画像之概念知识!

    千次阅读 2018-11-30 17:36:35
    用户画像是一个挺新颖的词,最初它是大数据行业言必及之的时髦概念。现在我们运营谈及用户画像,它也是和精准营销、精细化运营直接钩挂的。这篇文章主要讲产品和运营角度的用户画像。 希望看完后,解决你一切关于...
  • 用户画像标签体系及实现方法

    千次阅读 2019-09-17 17:43:03
    用户画像,简单的从字面意思上理解通过画画的形式来描述用户的外在形象,用户的外在形象表现在画面上是一种直观的信息,能够通过图画来一眼看出用户是大眼睛小眼睛,高鼻梁矮鼻梁,乃至判断用户的年龄、性别、职业、...
  • 例如,主打线上健身课程的运动健康类APP使用个推用户画像,就能根据女性白领、女大学生、宝妈等细分标签,针对不同女性群体,为她们个性化推荐定制课程: 针对女性白领群体,可推荐类似“每天3分钟练出天鹅颈”等能...
  • 用户画像

    2019-08-08 23:21:35
    这里不包含算法、技术、架构内容,因为相对来说,用户画像落地比较简单,难的是用户画像的价值落地。 用户画像是一个挺新颖的词,最初它是大数据行业言必及之的时髦概念。现在我们谈及用户画像,它也是和精准营销、...
  • 常见用户画像标签

    2021-02-21 12:37:13
    常见用户画像标签
  • 智慧方案

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,571
精华内容 1,428
关键字:

学生的用户画像