用户画像及项目实例
所谓用户画像就是标签的汇总,从用户不同方面信息中提取有价值特征来构建标签库,并从标签库中探索信息,从而构建用户画像。
用户画像建模:
-
第一步:统一用户唯一标识
- 用户唯一标识是整个用户画像的核心,方便跟踪和分析一个用户的特征。
- 设计唯一标识的选择:用户名、注册手机号、联系人手机号、邮箱、设备号、CookieID等。
-
第二步:给用户打标签,即用户画像
用户消费行为分析,可从4个维度来进行标签划分。
- 用户标签:用户基本属性,包括性别、年龄、地域、收入、学历、职业等。
- 消费标签:消费习惯、购买意向、是否对促销敏感等。
- 行为标签:分析用户行为,包括时间段、频次、时长、访问路径等。
- 内容分析:对用户平时浏览的内容,尤其是停留时间长、浏览次数多的内容进行分析,分析出用户对哪些内容感兴趣,如金融、娱乐、教育、体育、时尚、科技等。
-
第三步:将用户画像与业务关联
从用户生命周期的三个阶段来对业务进行划分:获客、粘客和留客
- 获客:通过精准营销获取客户。
- 粘客:个性化推荐,搜索排序,场景运营等。
- 留客:流失率预测,分析关键节点降低流失率。
从数据流处理阶段划分用户画像建模过程,可分为数据层、算法层和业务层
- 数据层:用户消费行为里的标签,可以打上事实标签,作为数据客观的记录
- 算法层:透过行为算出的用户建模,可以打上模型标签,作为用户画像的分类标识。
- 业务层:获客、粘客、留客的手段,可以打上预测标签,作为业务关联的结果。
流程:通过数据层的“事实标签”,在算法层进行计算,打上“模型标签”的分类结果,最后指导业务层,得出“预测标签”。
例:美团外卖的用户画像设计
第一步:统一用户唯一标识
- 手机号作为用户唯一标识
第二步:给用户打标签,即用户画像
- 按照用户消费行为分析的准则来进行设计
- 用户标签:性别、年龄、家乡、居住地、收货地址、婚姻、子女、通过何种渠道进行的注册等。
- 消费标签:餐饮口味、消费均价、团购等级、预定使用等级、排队使用等级、外卖等级等。
- 行为标签:点外卖时间段、使用频次、平均点餐用时、访问路径等。
- 内容分析:基于用户平时浏览的内容进行统计,包括餐饮口味、优惠敏感度等。
第三步:将用户画像与业务关联
- 在获客上,可以找到优势宣传渠道,如何通过个性化宣传手段,吸引具有潜在需求的用户,并刺激转化。
- 在粘客上,如何提升用户的单价和消费频次,方法可以包括购买后的个性化推荐、针对优质用户进行优质高价商品的推荐、以及重复购买,比如通过红包、优惠等方式激励对优惠敏感的人群,提升购买频次。
- 在留客上,预测用户是否可能会从平台上流失。用户流失可能由用户体验,竞争对手,需求变化等因素导致,通过预测用户流失率可大幅降低用户留存的运营成本。
项目实例:电商用户画像及行为分析
一,数据背景
以淘宝APP数据为原始数据集,通过行业常见行业指标对淘宝用户行为进行分析,从而构建用户画像。
二,数据来源
三,数据解释
数据集共计2300多万数据量,时间范围为2014-11-18~2014-12-18,共计6个字段,字段释义如下:
字段名 | 释义 |
---|---|
user_id | 用户ID |
item_id | 商品ID |
behavior_type | 用户行为类型(1:点击,2:收藏,3:加购物车,4:购买 |
user_geohash | 地理位置信息 |
item_category | 商品类别 |
time | 用户行为发生时间 |
四,分析过程
1.数据预处理
#导入所需库
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
from datetime import datetime
%matplotlib inline
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
# 导入数据集,查看数据量
df = pd.read_csv('taobao_persona.csv')
df.shape
可以看到数据量总计2300多万,因此抽样选取部分样本进行后续分析
# 数据抽样,并预览数据结构
df = df.sample(frac=0.3,random_state=None).reset_index()
df.head()
查看字段缺失情况
# 查看是否存在缺失值
df.isnull().sum()
地理信息字段存在大量缺失,且对后续分析无用,因此我们删除此字段
# 删除缺失字段
df.drop('user_geohash',axis=1,inplace=True)
同时在数据预览中可以看到time字段是由日期和小时组成,为了后续分析,在此将其拆分为两个字段
# 将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.head()
为了后续的用户标签,在此基于time字段构造面板数据
# 构造面板数据,按时间分为凌晨,上午,中午,下午,晚上
df['hour'] = pd.cut(df['time'],bins=[-1,5,10,13,18,24],
labels=['凌晨','上午','中午','下午','晚上'])
df.head()
生成用户标签
# 生成用户标签列表
users = df['user_id'].unique()
labels = pd.DataFrame(users,columns=['user_id'])
2.1 用户行为标签
2.1.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.head()
# 统计每个用户浏览次数最多的时间段
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.head()
# 选取每个用户浏览次数最多的时间段
time_browse_hour = time_browse.loc[time_browse['hour_counts']==time_browse['read_counts_max'],'hour']
# 存在并列多个时用逗号连接,得到用户活跃时间段标签
time_browse_hour = time_browse_hour.groupby(time_browse['user_id']).aggregate(lambda x:','.join(x)).reset_index()
time_browse_hour.head()
# 将用户浏览活跃时间加入用户标签中
labels = pd.merge(labels,time_browse_hour,how='left',on='user_id')
labels.rename(columns={
'hour':'time_browse'},inplace=True)
labels.head()
2.1.2 用户购买活跃时间段标签
time_buy = df[df['behavior_type']==4].groupby(['user_id','hour']).item_id.count().reset_index().rename(columns={
'item_id':'hour_counts'})
time_buy_max = time_buy.groupby('user_id').hour_counts.max().reset_index().rename(columns={
'hour_counts':'buy_counts_max'})
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']
time_buy_hour