【BI学习心得03-推荐系统眼中的你——用户画像】


1.背景故事

小明是2020年刚毕业的学生,谁都想不到,今年的疫情如此严重,小明的毕业答辩也是远程进行,完成毕业前的相关事项。头疼的事情来了,工作怎么找?上网搜了几篇博客,看别人怎么写简历。写了一份还不错的简历并且投递出去,犹如石沉大海,没有任何的反应,实在没有办法,把简历投到了海底捞,海底捞一看是学推荐系统的,给了小明一个机会。疫情严重,海底捞的线下店开不了,老板发了一个用户数据集,要求小明给用户做画像,做好了就可以入职上任。小明要怎么完成这个任务,从而顺利入职,开启自己工作时光。小明遇到的第一个问题就是用户画像是什么?用户画像怎么做?

2.概述

用户画像是通过分析用户的基础信息、特征偏好、社会属性等各维度的数据,刻画出用户的信息全貌,从中挖掘用户价值。这些标签集合就能抽象出一个用户的信息全貌,如下图所示是某个用户的标签集合,每个标签分别描述了该用户的一个维度,各个维度之间相互联系,共同构成对用户的一个整体描述。

在这里插入图片描述

3.用户画像流程

3.1整体流程

构建用户画像的方法进行总结归纳,发现用户画像的构建一般可以分为统一标识、给用户打标签、基于标签指导业务三步。

3.2用户为什么进行标注

统一标识,是用户的唯一ID, 是最基础常见的标签,从用户注册数据、用户访问数据中统计得出。在实际应用中,我们用userID,简称uid,统一用户标识。
在这里插入图片描述
有了统一标签,我们想给不同的用户打上独特标签,更加精准的识别和分类。用户的标签可以从不同的维度出发,从这些维度全方位的了解用户,分析客户喜欢什么,提供相应的服务。
在这里插入图片描述
在设计基于标签的个性化推荐系统之前,我们需要深入了解用户的标注行为(即打标签的行
为),知知道用户为什么要标注,用户怎么标注,只有深入了解用户的行为,我们才能基于这个行为设计出令他们满意的个性化推荐系统。

YouTube网站是对用户的标注方面算是首屈一指,用户的观看时长、在什么时间段浏览信息、收藏什么类型视频、在哪些视频下进行了评分与关注等,这些都是肉眼可见的指标。除此之外,有的UP主视频做的好,很多人关注,慢慢推出专栏视频,需要用户付费观看,为了消除广告,体验VIP会员专享,开通会员,用来分析用户消费行为。用户平时浏览的内容是科普、读书类,可能会推送相类似的,还会不定时推送其他内容,探索用户的潜在需求。

3.3用户如何打标签

在互联网中,尽管每个用户的行为看起来是随机的,但其实这些表面随机的行为背后蕴含着很多规律。这一节将通过研究Delicious数据集总结用户标注行为中的一些统计规律。

德国研究人员公布过一个很庞大的Delicious数据集,该数据集包含2003年9月到2007年12月Delicious用户4.2亿条标签行为记录。本节选用该数据集2007年一个月的数据进行分析,对该数据集的统计特性进行研究。

用户行为数据集中用户活跃度和物品流行度的分布都遵循长尾分布(Power Law分布)。因此,我们首先看一下标签流行度的分布。我们定义的一个标签被一个用户使用在一个物品上,它的流行度就加一。如下代码计算了每个标签的流行度

 # 使用训练集,初始化user_tags, tag_items, user_items
def initStat():
    records=train_data
    for u,items in records.items():
        for i,tags in items.items():
            for tag in tags:
                #print tag
                # 用户和tag的关系
                addValueToMat(user_tags, u, tag, 1)
                # tag和item的关系
                addValueToMat(tag_items, tag, i, 1)
                # 用户和item的关系
                addValueToMat(user_items, u, i, 1)
    print("user_tags, tag_items, user_items初始化完成.")
    print("user_tags大小 %d, tag_items大小 %d, user_items大小 %d" % (len(user_tags), len(tag_items), len(user_items)))

给用户“打标签”,总的来说可以分为三类:

● 统计类标签:最基础常见的标签,从用户注册数据、用户访问数据中统计得出。

● 规则类标签:基于用户行为及规则产生,通常由对业务更为熟悉的运营人员和数据人员共同协商确定。

● 机器学习挖掘类标签:通过机器学习挖掘产生,根据某些用户行为或熟悉进行预测判断。

3.3.1数据结构

画像系统的基础设施包括Spark、Hive、HBase、Airflow、Redis、Elasticsearch。
下图是《用户画像》中的数据仓库架构。
在这里插入图片描述
(1)数据仓库ETL加工流程是对每日的业务数据、日志数据、埋点数据等数据经过ETL过程,加工到对应的原始数据层(ODS)、数据仓库(DW)、数据集市层(DM)中。

(2)用户画像不是产生数据的源头,是经过ODS层、DW层、DM层中的数据与用户相关数据的二次建模加工得到的数据。

在ETL过程将用户标签写入Hive,根据不同数据对应不同数据库的应用场景,再将数据同步到MySQL、HBase、Elasticsearch等数据库中。

Hive:存储用户标签、用户人群及用户特征库的计算结果

MySQL:存储标签元数据,监控相关数据,导出到业务系统的数据

HBase:存储线上实时数据

Elasticsearch:支持海量数据的实时查询分析

(3)用户标签在Hive中加工完成后,部分标签通过Sqoop同步到MySQL数据库,提供用于BI报表展示的数据、多为透视分析数据、圈人服务数据;另一部分标签同步到HBase数据库用于产品的线上个性化推荐。

3.3.2用户画像模块

搭建用户画像方案整体考虑以下8个模块
在这里插入图片描述
● 用户画像基础

了解和明确用户画像包含的模块,设计数据仓库架构、开发流程、表结构,及ETL的设计。主要就是明确大方向的规划。

● 数据指标体系

建立数据指标体系,根据业务线梳理,包括用户属性、用户行为、用户消费、风险控制等维度的指标体系。

● 标签数据存储

设计好数据指标体系后,考虑不同应用场景使用哪种存储方式。

● 标签数据开发

重点模块。标签数据开发包含统计类、规则雷、挖掘类、流式计算类标签的开发,以及人群计算功能的开发。

重点内容:数据调研、和业务方确认数据口径、标签开发上线。打通画像数据和各业务系统之间的路,提供接口服务

● 开发性能调优

标签数据开发上线后,为了缩短调度时间、保证数据稳定性,需要对标签脚本、调度脚本进行迭代重构、调优。梳理现有标签开发、调度、校验告警、同步到服务层等相关脚本、明确可以优化的地方,迭代优化。

重点内容:减少ETL调度时间,降低调度时的资源消耗。

● 作业流程调度

标签加工、人群计算、同步数据和业务系统、数据监控预警脚本开发完成后,需要调度工具把整套流程调度起来。

重点内容:满足定式调度、监控预警、失败重试,各调度任务之家的复杂依赖关系。

● 用户画像产品化

产品化的模块包括包括标签视图、用户标签查询、用户分群、透视分析等。

重点内容:满足业务方对用户精准营销的需求。

● 用户画像应用

应用场景包括用户特征分析、短信邮件、站内信、Push消息的精准推送,客户针对不同用户的话术、针对高价值用户的极速退款等高级服务应用等。

重点内容:帮助业务方理解和应用用户画像数据,提高用户活跃度和GMV。

3.3.3数据指标体系

数据指标体系是建立用户画像的基础,也是在进入开发前的关键环节,是需要结合业务场景制定的数据指标。

建立用户画像一般从2个维度:

用户维度(userid):基于当前用户账号相关数据推送内容。

设备维度(cookie):当用户没有登陆账户而访问设备时,基于用户在设备的行为对该设备推送相关内容。

  1. 用户标签从标签类型可分为:统计类、规则类、机器学习挖掘类。

  2. 从建立的维度来看,可分为:用户属性类、用户行为类、用户消费类、风险控制类。
    至于标签如何分类,没有严格的规定,符合业务场景和使用者使用即可。

建立数据指标体系,从而知道用户画像建立的基本维度。但现实往往很复杂,数据的处理也是一个难题,只有把数据清洗干净,得到合适的特征,才能更好地给用户打标签。好的数据质量,要满足“完全合一”,即四个重要标准:

  • 完整性:数据是否存在空值,字段是否完善,是否有漏掉
  • 全面性:观察某一列的全部数值及特征值,是否存在单位、字段名与数值不匹配
  • 合法性:数据的类型、内容、大小的合法性。
  • 唯一性:数据是否存在重复记录
3.3.4常见的数据清洗问题
问题1:缺失值

在数据中有些年龄、体重数值是缺失的,这往往是因为数据量较大,在过程中,有些数值没有采集到。通常我们可以采用以下三种方法:

  • 删除:删除数据缺失的记录;
  • 均值:使用当前列的均值;
  • 高频:使用当前列出现频率最高的数据。

创建一个包含NaN(not a number)的数据。

import pandas as pd
import numpy as np
 
dates = pd.date_range('20201121', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水花

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值