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

    2020-02-25 21:53:56
    利用python相关技术搭建的用户画像web轻量级应用
  • 大数据之用户画像的原理、应用与实现

    什么是用户画像

    用户画像:通过各个维度对用户或者产品特征属性的刻画,并对这些特征分析统计挖掘潜在价值信息。完美地抽象出一个用户的信息全貌,可以看作企业应用大数据的根基。用户画像使用标签来量化用户特征属性,达到描述用户的目的。用户画像是对现实世界中的用户进行建模。用户画像是描述用户的数据, 是符合特定业务需求的对用户的形式化描述。
    用户画像,即用户信息标签化。企业通过收集与分析消费者个人属性、社会属性、生活习惯、消费行为等主要信息的数据之后,完美地抽象出一个用户的商业全貌。
    用户画像为企业提供了足够的信息基础,能够帮助企业快速找到精准用户群体以及精准用户需求等更为广泛的反馈信息,来进行各种精准营销。
    分析的维度:可以按照人口属性和产品行为属性进行综合分析。

    • 人口属性:地域、年龄、性别、文化、职业、收入、生活习惯、消费习惯等;
    • 产品行为属性:产品类别、活跃频率、产品喜好、产品驱动、使用习惯、产品消费等。

    用户画像的本质

    专业术语:人物角色
    企业使用术语:用户画像
    技术原理:数据清理、分析、统计、打标签、用户信息标签化

    为什么使用用户画像

    在互联网进入大数据时代后,给企业及消费者行为带来一系列改变,其中最大的变化,是消费者的一切行为在企业面前是“可视化”的。随着大数据技术的迅速发展、深入研究和广泛应用,企业的专注点日益聚焦于怎样利用大数据来进行精准营销等服务,以及进一步深入挖掘潜在的商业价值,“用户画像”的概念也因此应运而生。
    用户画像的核心工作是为用户打标签,打标签的重要目的之一是为了让人能够理解并且方便计算机处理,如,可以做分类统计:喜欢红酒的用户有多少?喜欢红酒的人群中,男、女比例是多少?也可以做数据挖掘工作:利用关联规则计算,喜欢红酒的人通常喜欢什么运动品牌?利用聚类算法分析,喜欢红酒的人年龄段分布情况?
    大数据处理,离不开计算机的运算,标签提供了一种便捷的方式,使得计算机能够程序化处理与人相关的信息,甚至通过算法、模型能够“理解” 人。当计算机具备这样的能力后,无论是搜索引擎、推荐引擎、广告投放等各种应用领域,都将能进一步提升精准度,提高信息获取的效率。

    用户画像打标签

    一个标签通常是人为规定的高度精炼的特征标识:

    • 年龄段标签:25~35岁
    • 地域标签:北京

    标签特性:

    • 语义化:能很方便的理解每个标签的含义
    • 短文本:每个标签只代表一种含义

    如何创建用户画像

    • 数据收集
      基础用户注册信息:性别,年龄,地区
      用户行为数据:浏览,关注,活跃度
      用户评价:喜好,期望
      历史数据:日志
    • 亲和图、确定类型
      把大量收集到的事实、意见或构思等定性资料,按其相近性进行归纳整理的一种方法。手动列出大标签,品类或者数据聚类的过程。例如:屌丝、IT男、java、hadoop、技术宅。

    用户画像分类

    精确用户属性标签画像:

    • 用户基础属性画像
    • 用户的喜好偏向
    • 用户拓展信息画像
    • 单个信息的集合

    概况画像

    • 用户来源画像:我们需要有一个来源分类,并对不同分类打标签,例如:直接访问、搜索引擎、广告营销、移动APP
    • 用户浏览行为画像:行为标签,分析用户热点区域连接
    • 实时订单画像:不同来源用户的订单画像
    • 订单转化率画像:各个来源客户的访问和最终购买的比例
    • 访客画像群体画像
    • 实时打标签
    • 实时订单种类

    流量趋势画像

    • 访客趋势(访客每日的访问量)
    • 浏览趋势(浏览量每日趋势)
    • 新访客趋势(新访客每日访问趋势)
    • 活跃访客趋势(活跃访客每日访问趋势)
    • 访问量(每日、每周、每月)

    页面画像

    • 受访画像(各品类页面访问量统计)
    • 进入画像(访客从哪些页面进入网站)
    • 离开画像(访客从哪些页面离开网站)
    • 页面热点图(优化网页设计)
    • 访问标记(访客在页面上点击哪些内容或者id元素)
    • 主机域名(网站子域名访问量)
    • 访问目录(网站子目录访问量)
    • 外链网站(访客点击哪些站外链接离开网站)

    行为分析画像

    • 跳出率(访问行为评估)
    • 忠诚度(访问质量评估)
    • 活跃度(活跃度、流失分析)
    • 用户关联度聚类画像(用户与用户之间的关系)
    • 新用户画像(吸引新用户注册因素画像)
    • 访客浏览路径热点画像(用户浏览习惯调研)

    访客画像

    • 地域分析(访客地域位置的分布)
    • 速度分析(访客访问网站的速度分析)
    • 客户端环境(访问客户端分析)
    • 设备属性画像(使用硬件信息)
    • 移动终端(访客上网设备分析)
    • 网络连接画像(不同网络的连接方式运营商)

    会员画像

    • 性别画像(性格的占比)
    • 年龄分布画像(按标准年龄段的正态分布)
    • 教育背景画像(教育背景)
    • 职业分布画像(职业背景)
    • 特征分布画像(多标签特征库,购物狂,游戏迷)
    • 会员游客画像(详细信息画像)
    • 匿名用户画像(会员不详细用户画像)

    用户来源画像

    • 来源分类(直接输入、搜索引擎、本域来路、外域来路)
    • 来源网站(网站统计)
    • 来源页面(网站链接)
    • 直接访问(浏览器直接进去)
    • 搜索引擎(具体的搜索引擎画像)
    • 搜索关键词(热点关键词画像)
    • 广告营销(通过广告进入)
    • 移动APP(移动数据入口)

    广告营销画像

    • 广告分析(普通广告来源分析)
    • SEM分析(竞价搜索来源分析)
    • EDM分析(邮件来源分析)
    • 有效性价值画像(有效广告,转化率)
    • 免费搜索(SEO 关键词优化)
    • 付费搜索(SEO 关键词优化)
    • 推荐链接(友情链接)
    • 微博类媒介(浏览量传播效果评估)
    • 论坛评论、软文画像(浏览量)
    • 用户点击区域分布画像(地理区域分布)

    APP 画像

    • 应用属性画像(名字、版本、设备信息、(核心软件、系统))
    • 基础指标(累积启动次数、启动用户、新增用户、人均启动次数、平均使用时长)
    • 在线分析(流量消耗、活跃用户)
    • 内容分析(页面,菜单使用热度)
    • 使用时段画像(均匀负载)
    • 使用间隔画像(用户使用频率)
    • 错误画像(程序错误自动报告系统)

    商品画像

    • 商品的品类数量画像(不同品类数量及占比)
    • 单品关联度画像(同类热门产品)
    • 点击量、收藏量
    • 购买量、退货量
    • 品牌以及活动组画像(活动产品的浏览购买)
    • 品类热门产品画像(品类的topN)

    订单画像

    • 订单趋势(订单每日、每星期、每月)
    • 订单集中度(支付方式、价格区间、退单率)
    • 商家占比折扣
    • 单价比
    • 利润值

    用户画像应用场景

    网站指标画像

    • 网站的指标画像,对网站性能负载进行综合调整、评估、优化
    • PV(Page View,浏览量)
    • UV(unique visitor,独立访客)
    • IP(独立ip)
    • PR(即Page Rank),网页的级别重要程度
    • 响应时间、各级页面平均停留时间
    • 浏览量、跳出率、跳转次数、回头率

    社交用户画像

    • 有很多社交的注册用户,为了增加用户之间的社交文化,对每一个用户进行画像,根据画像做好友推荐
    • 所在地
    • 故乡
    • 性别
    • 年龄
    • 在线
    • 附近距离

    用户群体画像

    • 对不同职业,不同技术的不同背景的用户群体分析画像
    • 所在地
    • 年龄阶段分类
    • 职业岗位分类
    • 消费群体分类
    • 薪资分类
    • 目标客户细分

    广告推荐

    • 广告推荐核心技术是推荐引擎,角色(用户)画像是广告推荐引擎的一部分
    • 物品信息画像(对于内容的识别、关键字)
    • 用户对物品的偏好(评分、查看、购买等)
    • 协同过滤相似度推荐(画像标签相似度推荐)
    • 总量性指标(包括广告的费用与频次)
    • 趋势性指标(企业投放力度的变化情况)
    • 转化率指标(消费者对广告的投放点击率)
    • 访问者成本(总的广告费用除以独立访问者数量)
    • 进入页面的跳出率(进入广告直接退出)

    电商类推荐

    • 根据用户喜好推荐相关用户喜欢的产品
    • 关键字(根据关键字匹配用户想找的物品)
    • 浏览量(关键词品类浏览热点)
    • 销量(关键词品类销量画像)
    • 价格(关键词商品的价格排序)
    • 用户购买喜好(用户购买聚类画像)
    • 活动推广商品画像(广告指标画像)

    资讯类推荐

    • 根据用户主动订阅或者浏览次数频率,对用户喜欢画像,进行资讯推荐
    • 订阅
    • 热门推荐
    • 最新推荐
    • 浏览品类次数统计
    • 浏览的频率推荐
    • 关键词推荐

    视频类推荐

    • 视频网站有大量的视频,怎样让用户找到用户感兴趣的视频,需要对用户喜欢做精确的画像,提高用户的体验
    • 基础画像(对用户注册信息画像)
    • 用户播放历史画像(用户关键词,影片画像)
    • 播放指标画像(最新的,最热的,播放量)
    • 视频质量画像(用户观看质量,观看时间)
    • 视频相关度画像(每个视频相关视频TOP N)
    • 推荐营销视频画像
    • 用户热点画像

    用户金融信誉等级画像

    • 互联网金融大数据,需要对用户信用等级做评估,就需要对用户信用画像
    • 恶意贷款负债画像
    • 用户固有资产画像(车、房产、企业信誉)
    • 用户经济能力画像(工资、纳税额)
    • 用户消费能力画像(购买消费)
    • 用户关系圈画像(职称、朋友信用等级)
    • 用户互联网画像(微博、微信)
    • 标准用户画像(用户信用区间等级评定)

    移动电信集中监管系统画像

    • 移动电信集中监管系统画像是对用户的通信数据等各种指标进行画像分析

    供销存画像

    传感器数据分析画像

    用户画像实现

    建日全量表

    CREATE TABLE dw.userprofile_tag_userid (
    	tagid STRING COMMENT 'tagid',
    	userid STRING COMMENT 'userid',
    	tagweight STRING COMMENT 'tagweight',
    	reserve STRING COMMENT '预留')
    	PARTITIONED BY (data_date STRING COMMENT '数据日期', tagtype STRING COMMENT '标签主题分类')
    

    建日增量表

    CREATE TABLE dw.userprofile_useract_tag (
    	tagid STRING COMMENT '标签id',
    	userid STRING COMMENT '用户id',
    	act_cnt int COMMENT '行为次数',
    	tag_type_id int COMMENT '标签类型编码',
    	act_type_id int COMMENT '行为类型编码')
    	COMMENT '用户画像-用户行为标签表'
    	PARTITIONED BY (data_date STRING COMMENT '数据日期')
    

    标签元数据

    标签分类

    • 统计类标签:最为基础也最为常见的标签类型
    • 规则类标签:基于用户行为及确定的规则产生
    • 机器学习挖掘类标签:通过数据挖掘产生,应用在对用户的某些属性或某些行为进行预测判断

    集群架构

    服务名称子服务服务器1服务器2服务器3
    HDFSNameNode
    DataNode
    SecondaryNameNode
    YarnResourceManager
    NodeManager
    ZookeeperZookeeper Server
    Flume(采集日志)Flume
    KafkaKafka
    Flume(消费Kafka)Flume
    HiveHive
    MySQLMySQL
    SqoopSqoop
    SparkSpark



    用户画像标签存储

    • MySQL 存储画像标签相关的元数据
    • Hive存储标签相关数据的计算结果

    数据库建表

    • 创建用户标签表
    CREATE TABLE dw.profile_tag_userid (
    	tagid STRING COMMENT 'tagid',
    	userid STRING COMMENT 'userid',
    	tagweight STRING COMMENT 'tagweight',
    	reserve1 STRING COMMENT '预留1',
    	reserve2 STRING COMMENT '预留2',
    	reserve3 STRING COMMENT '预留3')
    	PARTITIONED BY (data_date STRING COMMENT '数据日期', tagtype STRING COMMENT '标签主题分类')
    
    • 向用户标签表添加记录
    insert into table dw.profile_tag_userid partition(data_date='20180421', tagtype='user_install_days') values ('A220U029_001', '25083679', '282', '', '', '');
    insert into table dw.profile_tag_userid partition(data_date='20180421', tagtype='user_install_days') values ('A220U029_001', '7306783', '166', '', '', '');
    insert into table dw.profile_tag_userid partition(data_date='20180421', tagtype='user_install_days') values ('A220U029_001', '4212236', '458', '', '', '');
    insert into table dw.profile_tag_userid partition(data_date='20180421', tagtype='user_install_days') values ('A220U029_001', '39730187', '22', '', '', '');
    
    • 创建聚合表
    CREATE TABLE `dw.profile_user_map_userid` (
    	`userid` string COMMENT 'userid',
    	`tagsmap` map<string, string> COMMENT 'tagsmap',
    	`reserve1` string COMMENT '预留1',
    	`reserve2` string COMMENT '预留2')
    	COMMENT 'userid 用户画像数据'
    	PARTITIONED BY (`data_date` string COMMENT '数据日期')
    
    insert overwrite table dw.profile_user_map_userid partition(data_date='20180910')
    select userid, str_to_map(concat_ws(','collect_set(concat(tagid, ':', tagweight)))) as tagsmap, '', ''
    	from dw.profile_tag_userid
    	where data_date='20180910'
    	group by userid
    
    CREATE TABLE `dw.profile_user_map_cookieid` (
    	`cookieid` string COMMENT 'tagid',
    	`tagsmap` map<string, string> COMMENT 'cookieid',
    	`reserve1` string COMMENT '预留1',
    	`reserve2` string COMMENT '预留2')
    	COMMENT 'cookie 用户画像数据'
    	PARTITIONED BY (`data_date` string COMMENT '数据日期')
    
    • 创建用户人群表
    CREATE TABLE `dw.profile_usergroup_tag` (
    	`userid` string,
    	`tagsmap` map<string, string>,
    	`reserve1` string,
    	`reserve2` string)
    	COMMENT 'cookie 用户画像数据'
    	PARTITIONED BY (`data_date` string, `target` string)
    
    select t1.userid, t2.order_sn, t3.tel
    	from ${tablename} t1
    	inner join dw.paid_order_fact t2
    	on t1.userid = t2.user_id
    	inner join dw.order_user_info t3
    	on t2.order_id = t3.order_id
    	where t1.data_date = '${data_date}'
    	and t1.target = '100000207486'
    	group by t1.userid, t3.tel
    	having t3.tel <> ''
    
    • 标签监控

    统计标签的开发:用户退货率标签开发

    • 计算出近30天内的订单量
    • 计算出近30天内的退货量
    • 近30天内的退货率=订单量/退货量
    ## userprofile_userid_return_goods_rate.py
    
        # 用户近30日订单量
        user_paid_30_orders = "select t1.user_id, count(distinct t1.order_id) as paid_orders
                                  	from dw.dw_order_fact t1   
                                  	where t1.pay_status in (1,3)
                                   	and concat(substr(t1.pay_time,1,4),substr(t1.pay_time,6,2),substr(t1.pay_time,9,2)) >= "+"'"+month_day_ago_1+"'"+"   \
                                   	and concat(substr(t1.pay_time,1,4),substr(t1.pay_time,6,2),substr(t1.pay_time,9,2)) <= "+"'"+start_date_str+"'"+"    \
                              		group by t1.user_id "
    
        # 用户近30日订单退货量
        user_paid_30_return="select t1.user_id, count(distinct t1.returned_order_id) as returned_orders
                                   	from who_wms_returned_order_info  t1
                             		inner join dw.dw_order_fact t2
                                    on (t1.user_id = t2.user_id and t1.returned_order_id = t2.order_id)                               
                                  	where t1.return_status in (0,1,2,3,4,5,6,7,8)
                                    and t1.site_id in (0,1)
                                    and from_unixtime(t1.returned_time,'yyyyMMdd') >= "+"'"+month_day_ago_1+"'"+"                     
                                    and from_unixtime(t1.returned_time,'yyyyMMdd') <= "+"'"+start_date_str+"'"+"                      
                                    and t2.pay_status in (1,3)
                                    and concat(substr(t2.pay_time,1,4),substr(t2.pay_time,6,2),substr(t2.pay_time,9,2)) >= "+"'"+month_day_ago_1+"'"+" 
                                    and concat(substr(t2.pay_time,1,4),substr(t2.pay_time,6,2),substr(t2.pay_time,9,2)) <= "+"'"+start_date_str+"'"+"  
                               		group by t1.user_id "
    
        user_paid_30_rate = "insert overwrite table " +target_table+" partition(data_date ="+"'"+start_date_str+"'"+",tagtype='return_goods_rate') 
                              		select 'B220U071_001' as tagid,                                
                                     	t.user_id as userid,                                    
                                     	round(t.returned_orders/t.paid_orders, 2) as tagweight,  
                                     	'' as tagranking,                                        
                                     	'' as reserve,                                            
                                     	'' as reserve1                                           
                                	from (                                                        
                                      	select nvl(t2.user_id,t1.user_id) as user_id,            
                                             nvl(t2.returned_orders, 0) as returned_orders,    
                                             t1.paid_orders                                    
                                        from user_paid_30_orders t1                            
                             			full outer join user_paid_30_return t2                            
                                        on t1.user_id = t2.user_id                           
                                      ) t                                                      
                             		group by 'B220U071_001',                                          
                                       t.user_id,                                              
                                       round(t.returned_orders/t.paid_orders, 2),              
                                       '','',''     "
    
    spark = SparkSession.builder.appName("userid_return_goods_rate").enableHiveSupport().getOrCreate()
    
    returned_df1 = spark.sql(user_paid_30_orders).cache()
    returned_df1.createTempView("user_paid_30_orders")
    returned_df2 = spark.sql(user_paid_30_return).cache()
    returned_df2.createTempView("user_paid_30_return")
    spark.sql(user_paid_30_rate)
    

    规则类标签开发:RFM模型标签开发

    • 计算出消费的最近时间、频率、金额
    • 根据消费的最近时间、频率、金额,综合得到用户的价值、保持、发展、挽留的程度,如“一般”还是“重要”
    ## userprofile_userid_RFM_value.py
    
    # A111U008_001    重要价值用户
    # A111U008_002    重要保持用户
    # A111U008_003    重要发展用户
    # A111U008_004    重要挽留用户
    # A111U008_005    一般价值用户
    # A111U008_006    一般保持用户
    # A111U008_007    一般发展用户
    # A111U008_008    一般挽留用户
    
        # 用户RFM维度数据 (用户最后一次购买时间非空)
        user_rfm_info =  "select  。。。 "
       
       	// date_str:昨天的日期
        user_rfm = "   select user_id,                                                                 \
        // 计算出Recency:最近一次消费
                              case when datediff("+"'"+date_str+"'"+",last_pay_date)<90 then '近'      \
                              else '远' end as date_diff,
    
        // 计算出Frequency:消费的频率,忠诚度
                              \
                              case when last_1y_paid_orders <3 then '低频'                             \
                              else '高频' end as sum_orders,
    
        // 计算出Monetary:消费金额
                              \
                              case when last_1y_paid_order_amount <50 then '低额'                      \
                              else '高额' end as sum_amount                                            \
                         from user_rfm_info                                                            \
                        where country = 'ID'                                                           \
                    union all                                                                          \
                        select user_id,                                                                \
                              case when datediff("+"'"+date_str+"'"+",last_pay_date)<90 then '近'      \
                              else '远' end as date_diff,                                              \
                              case when last_1y_paid_orders <3 then '低频'                             \
                              else '高频' end as sum_orders,                                           \
                              case when last_1y_paid_order_amount <300 then '低额'                     \
                              else '高额' end as sum_amount                                            \
                         from user_rfm_info                                                            \
                        where country <> 'ID'    "
    
    
        insert_table = "insert overwrite table " + target_table + " partition(data_date="+"'"+start_date_str+"'"+",tagtype='rfm_model')    \
                                select case when date_diff = '近' and sum_orders = '高频' and sum_amount = '高额' then 'A111U008_001'    \
                                            when date_diff = '远' and sum_orders = '高频' and sum_amount = '高额' then 'A111U008_002'    \
                                            when date_diff = '近' and sum_orders = '低频' and sum_amount = '高额' then 'A111U008_003'    \
                                            when date_diff = '远' and sum_orders = '低频' and sum_amount = '高额' then 'A111U008_004'    \
                                            when date_diff = '近' and sum_orders = '高频' and sum_amount = '低额' then 'A111U008_005'    \
                                            when date_diff = '远' and sum_orders = '高频' and sum_amount = '低额' then 'A111U008_006'    \
                                            when date_diff = '近' and sum_orders = '低频' and sum_amount = '低额' then 'A111U008_007'    \
                                            else 'A111U008_008' end as tagid,                                                             \
                                       user_id as userid,           \
                                       '' as tagweight,             \
                                       '' as tagranking,            \
                                       '' as reserve,               \
                                       '' as reserve1               \
                                  from user_rfm "
                                              
        spark = SparkSession.builder.appName("user_rfm_model").enableHiveSupport().getOrCreate()
        // 执行sql,放到缓存,可以快速获取缓存的数据
        returned_df1 = spark.sql(user_rfm_info).cache()
        // 生成一个临时表,这个临时表就可以在后面的sql语句中直接使用
        returned_df1.createTempView("user_rfm_info")
        returned_df2 = spark.sql(user_rfm).cache()
        returned_df2.createTempView("user_rfm")
        
        spark.sql(insert_table)
          
    if __name__ == '__main__':
        main()
    

    用户画像处理流程

    展开全文
  • 用户画像系统中有一个很重要的功能点: 基于标签圈人。这里有个很核心的概念,什么是标签? 标签是简化用户表示的一种思维方式。 刻画用户的标签越多,用户画像就越立体。 比如: 90后,码农,宅男 3个标签就刻画了...

    用户画像系统中有一个很重要的功能点: 基于标签圈人。这里有个很核心的概念,什么是标签?

    标签是简化用户表示的一种思维方式。 刻画用户的标签越多,用户画像就越立体。 比如:
    90后,码农,宅男 3个标签就刻画了一类人。标签类似于戏曲中的脸谱来表现人物的性格和特征。

    标签有哪些类型呢?

    枚举类标签: 描述性别,地理位置。这类标签取值通常是可枚举出来的。
    时间类标签: 描述业务触达和流失时间信息。 注: 时间类标签可存储成数值。
    数值类标签: 比如账户金额,积分数量等。

    所以本质上,标签只有两种: 离散枚举和连续数值。

    有了标签后,如何在计算机中建模存储呢?

    最简单最直观的方式就是设置大宽表,即每个标签一个字段。 通常一个小型的画像系统,有几百个标签足够。所以对于大部分场景宽表足够简单可依赖。

    宽表一般存储在Hive中,出于性能考虑,会存储到Impala中。当数据量较大时,Impala也一般无法满足查询的性能需求。这是因为Impala没有索引,每次查询都是扫表。所以,为了能够利用索引提升性能,大宽表一般会从Impala转存到Elasticsearch中。

    当一个用户Id附着成百上千个标签,按ES存储方式,会相当耗费存储资源,导入数据到ES也会成为性能瓶颈。 所以变通的方案是将所有的标签存储到ES的一个array字段中。但本质上,还是大宽表的方案。

    大宽表的方案最大的问题: 新增标签时间成本太大,所以画像系统基本是T+1的实效性。 如果对响应时间没有苛刻的要求,基于Hadoop生态的ad hoc查询引擎构建宽表,比如Impala或presto是可以使用多张宽表来解决新曾标签T+0生效问题,毕竟大数据系统,存储资源还是很充足的。

    可惜的是业务对系统的需求是: 更高,更快,更强,像体育运动一样。

    我们用ES存储标签,查询速度快的原因是ES构建了倒排索引。我们构建标签时,标签数据的主体是用户ID, 而在ES的世界,站在倒排索引的角度,标签数据的主体是标签,这完全是两个对立面。

    我们使用标签圈人,本质上是集合的交并补运算。 所以,我们可以干脆再往前迈一步: 直接构建标签-用户ID的映射关系,而非原始的用户ID-标签

    这样,整个数据结构就变成类似如下的样式:

    男: 张三,李四,王五...

    由于一个标签可以圈定上亿的用户,如何存储这样的结构? RoaringBitmap 。这样存储后,标签圈人就脱离了SQL和ES语法,还原到最本质的集合运算:A and B or (C and D)

    使用标签-用户ID这种数据建模方式,有个很大的问题: 数值类标签的处理。比如用户积分。 通常有一种解决方法就是分段,然而这样做损失了数据精度。变得不灵活了。还有一种解决方法是为每个值建立一个bitmap。 这样做一则耗费空间,二则无法很好处理区间查询的问题。

    使用标签-用户ID这种方式, bitmap存储数据关系是标签值等于XXX的用户ID, 提取核心点bitmap存储的是等于关系。 那么bitmap存储大于或者小于关系也是可以的。

    对于数值型标签,我们重新定义存储关系: bitmap(2) 表示value值大于2的所有用户ID。 同理, bitmap(5) 表示value值大于5的所有用户ID。这样的话,计算value=(3,1000)之间的用户,使用bitmap(3) andNot bitmap(999)就可以了。很好地解决了区间查询的问题。 依然遗留了一个问题: 需要为每个值准备一个bitmap。

    这个问题的解决思路很巧妙: 多个bitmap组合表示一个数值。例如200, 拆分成个位,十位,百位3个部分,每一部分用10个bitmap存储。这样就能够把bitmap的数量控制在有限的数量里面。比如对于int整型,最多需要100个bitmap。

    优化是没有止尽的,我们还能走得更远。如果数值采用二进制表示,那么每一位只需要2个bitmap, 一个Int类型最多需要64个bitmap。 采用二进制,存储的规则可以如下设置:

    bitmap(0)表示该位为0的用户ID集合。
    bitmap(1)表示该位为0或1的用户ID集合。

    由于对于二进制的某一位,取值只有0和1两种可能,所以对于二进制,每一位只需要bitmap(0), 所以最多需要32+1=33个bitmap存储。

    综上, 我们解决bitmap数量的问题,也解决了区间查询的问题。但是多位二进制组合处理区间查询,又引出了新的问题: 多个bitmap如何组合表示一个区间?

    我们把问题再简化一下,多个bitmap如何表示一个小于等于的区间。 比如i&lt;7 如何用bitmap表示? 再回顾bitmap的存储规则:

    bitmap(0)表示该位为0的用户ID集合。
    bitmap(1)表示该位为0或1的用户ID集合。

    我们按从右到左的顺序给bitmap位取名字,下标从1开始。 例如01,有两位,分别是b2,b1。

    这样的话: i&lt;7 = i&lt;0111, 用bitmap表示就是b4。 再举几个例子:

    i<5 = i < 0101, 用bitmap表示就是 (b4 and b2) or (b4 and b3) 

    为了理解这个过程,我自己画了如下的横向树形图:

          1
       1
          0
    0
          1
       0  
          0

    来观察这个规律,最后实现的代码如下:

    import lombok.Data;
    import org.roaringbitmap.RoaringBitmap;
    
    import java.util.*;
    
    public class RangeBitmapDemo2 {
    
        @Data
        private static class QueryCond{
    
            private List<String> base = new ArrayList<>();
    
            private List<List<String>> lowerRange = new ArrayList();
    
            public void addBase(String val){
                this.base.add(val);
            }
    
            public void addLowerRange(String val){
                List<String> list = new ArrayList();
                list.addAll(base);
                list.add(val);
                this.lowerRange.add(list);
            }
        }
    
        public static void query(int upper, int binaryLength){
            String val =String.format("%"+binaryLength+"s", Integer.toBinaryString(upper)).replaceAll(" ","0"); //这里可以补空格
            System.out.println("query: upper is "+val);
    
            QueryCond cond = new QueryCond();
    
            char cur = val.charAt(0);
    
            if(cur=='0'){
                cond.addBase("b"+binaryLength);
            }
    
            for(int i=1;i<val.length();i++){
                cur = val.charAt(i);
                if(cur == '0'){
    
                    int back = i-1;
                    while(back>=0 && val.charAt(back)=='1'){
                        cond.addLowerRange("b"+(binaryLength-back));
                        back -=1;
                    }
                    cond.addBase("b"+(binaryLength-i));
                }
            }
    
            System.out.println("query cond: "+cond);
    
        }
    
        public static void main(String[] args) {
    
            for(int i=0;i<32;i++){
                query(i, 6);
            }
        }
    }
    

    打印的结果

    query: upper is 000110
    RangeBitmapDemo2.QueryCond(base=[b6, b5, b4, b1], lowerRange=[[b6, b5, b4, b2], [b6, b5, b4, b3]])

    表示000110的组合关系为(b6 & b5 & b4 & b3 & b2 & b1) or (b6 & b5 & b4 & b2) or (b6 & b5 & b4 & b3) 即整个结果由3个部分组合而成。

    展开全文
  • 用户画像原理、技术选型及架构实现

    万次阅读 多人点赞 2018-10-18 22:29:33
    这篇文章在宏观上很好地描述了用户画像的主要内容。(文章内的图片来源于不同帖子,侵删) 一、&amp;nbsp;什么是用户画像 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;...

    这篇文章在宏观上很好地描述了用户画像的主要内容。(文章内的图片来源于不同帖子,侵删)

    一、 什么是用户画像

            用户画像是指根据用户的属性、偏好、生活习惯、行为等信息,抽象出来的标签化用户模型。通俗说就是给用户打标签,而标签是通过对用户信息分析而来的高度精炼的特征标识。通过打标签可以利用一些高度概括、容易理解的特征来描述用户,可以让人更容易理解用户,并且可以方便计算机处理。

    用户画像是对现实世界中用户的建模,用户画像包含目标,方式,组织,标准,验证这5个方面。

    目标:指的是描述人,认识人,了解人,理解人。

    方式:分为非形式化手段,如使用文字、语言、图像、视频等方式描述人;形式化手段,即使用数据的方式来刻画人物的画像。

    组织:指的是结构化、非结构化的组织形式。

    标准:指的是使用常识、共识、知识体系的渐进过程来刻画人物,认识了解用户。

    验证:依据侧重说明了用户画像应该来源事实、经得起推理和检验。

            在产品早期和发展期,会较多地借助用户画像,帮助产品人员理解用户的需求,想象用户使用的场景,产品设计从为所有人做产品变成为三四个人做产品,间接的降低复杂度。

    二、 用户画像的作用

    在互联网、电商领域用户画像常用来作为精准营销、推荐系统的基础性工作,其作用总体包括:

    (1)精准营销:根据历史用户特征,分析产品的潜在用户和用户的潜在需求,针对特定群体,利用短信、邮件等方式进行营销。

    (2)用户统计:根据用户的属性、行为特征对用户进行分类后,统计不同特征下的用户数量、分布;分析不同用户画像群体的分布特征。

    (3)数据挖掘:以用户画像为基础构建推荐系统、搜索引擎、广告投放系统,提升服务精准度。

    (4)服务产品:对产品进行用户画像,对产品进行受众分析,更透彻地理解用户使用产品的心理动机和行为习惯,完善产品运营,提升服务质量。

    (5)行业报告&用户研究:通过用户画像分析可以了解行业动态,比如人群消费习惯、消费偏好分析、不同地域品类消费差异分析

            根据用户画像的作用可以看出,用户画像的使用场景较多,用户画像可以用来挖掘用户兴趣、偏好、人口统计学特征,主要目的是提升营销精准度、推荐匹配度,终极目的是提升产品服务,起到提升企业利润。用户画像适合于各个产品周期:从新用户的引流到潜在用户的挖掘、从老用户的培养到流失用户的回流等。

            总结来说,用户画像必须从实际业务场景出发,解决实际的业务问题,之所以进行用户画像,要么是获取新用户,要么是提升用户体验、或者挽回流失用户等具有明确的业务目标。

            另外关于用户画像数据维度的问题,并不是说数据维度越丰富越好,总之,画像维度的设计同样需要紧跟业务实际情况进行开展。

     三、 用户画像的分类

            从画像方法来说,可以分为定性画像、定性+定量画像、定量画像

            从应用角度来看,可以分为行为画像、健康画像、企业信用画像、个人信用画像、静态产品画像、旋转设备画像、社会画像和经济画像等。

    四、 用户画像需要用到哪些数据

            一般来说,根据具体的业务内容,会有不同的数据,不同的业务目标,也会使用不同的数据。在互联网领域,用户画像数据可以包括以下内容:

    (1)人口属性:包括性别、年龄等人的基本信息

    (2)兴趣特征:浏览内容、收藏内容、阅读咨询、购买物品偏好等

    (3)消费特征:与消费相关的特征

    (4)位置特征:用户所处城市、所处居住区域、用户移动轨迹等

    (5)设备属性:使用的终端特征等

    (6)行为数据:访问时间、浏览路径等用户在网站的行为日志数据

    (7)社交数据:用户社交相关数据

            用户画像数据来源广泛,这些数据是全方位了解用户的基础,这里以Qunar的画像为例,其画像数据主要维度如下所示,包括用户RFM信息、航线信息等。

            Qunar的画像数据仓库构建都是基于Qunar基础数据仓库构建,然后按照维度进行划分。

    五、 用户画像主要应用场景

    a)用户属性

    b)用户标签画像

    c)用户偏好画像

    d)用户流失

    e)用户行为

    f)产品设计

    g) 个性化推荐、广告系统、活动营销、内容推荐、兴趣偏好

    六、 用户画像使用的技术方法

    七、 用户画像标签体系的建立

    1、什么是标签体系

            用户画像是对现实用户做的一个数学模型,在整个数学模型中,核心是怎么描述业务知识体系,而这个业务知识体系就是本体论,本体论很复杂,我们找到一个特别朴素的实现,就是标签。

            标签是某一种用户特征的符号表示。是一种内容组织方式,是一种关联性很强的关键字,能方便的帮助我们找到合适的内容及内容分类。(注:简单说,就是你把用户分到多少个类别里面去,这些类是什么,彼此之间有什么关系,就构成了标签体系

            标签解决的是描述(或命名)问题,但在实际应用中,还需要解决数据之间的关联,所以通常将标签作为一个体系来设计,以解决数据之间的关联问题。

            一般来说,将能关联到具体用户数据的标签,称为叶子标签。对叶子标签进行分类汇总的标签,称为父标签。父标签和叶子标签共同构成标签体系,但两者是相对概念。例如:下表中,地市、型号在标签体系中相对于省份、品牌,是叶子标签。

    一级标签

    二级标签

    三级标签

    四级标签

     

    		<p>移动属性</p>
    		</td>
    		<td>
    		<p>用户所在地</p>
    		</td>
    		<td>
    		<p>省份</p>
    		</td>
    		<td>
    		<p>地市</p>
    		</td>
    	</tr><tr><td>
    		<p>手机品牌</p>
    		</td>
    		<td>
    		<p>品牌</p>
    		</td>
    		<td>
    		<p>型号</p>
    		</td>
    	</tr><tr><td rowspan="4">
    		<p>&nbsp;</p>
    
    		<p>&nbsp;</p>
    
    		<p>业务属性</p>
    		</td>
    		<td rowspan="4">
    		<p>&nbsp;</p>
    
    		<p>&nbsp;</p>
    
    		<p>用户等级</p>
    		</td>
    		<td>
    		<p>普通</p>
    		</td>
    	</tr><tr><td>
    		<p>音乐普通会员</p>
    		</td>
    	</tr><tr><td>
    		<p>音乐高级会员</p>
    		</td>
    	</tr><tr><td>
    		<p>音乐VIP会员</p>
    		</td>
    	</tr></tbody></table><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户画像标签体系创建后一般要包含以下几个方面的内容</p>
    

    (1)标签分类

            用户画像标签可以分为基础属性标签和行为属性标签。

            由于基于一个目标的画像,其标签是在动态扩展的,所以其标签体系也没有统一的模板,在大分类上,与自身的业务特征有很大的关联,在整体思路上可以从横纵两个维度展开思考:横向是产品内数据和产品外数据,纵向是线上数据和线下数据。而正中间则是永恒不变的“人物基础属性”。

            如果说其他的分类因企业特征而定,那么只有人物特征属性(至于名字叫什么不重要,关键是内涵)是各家企业不能缺失的板块。

            所谓人物基础属性指的是:用户客观的属性而非用户自我表达的属性,也就是描述用户真实人口属性的标签。所谓非“自我表达”,举例来说,某产品内个人信息有性别一项,用户填写为“女”,而通过用户上传的身份证号,以及用户照片,用户购买的产品,甚至用户打来的客服电话,都发现该用户性别是“男性”。那么在人物基础属性中的性别,应该标识的是“男性”,但是用户信息标签部分,自我描述的性别则可能标注为女性。

    (2)标签级别(标签的体系结构)

            分级有两个层面的含义,其一是:指标到最低层级的涵盖的层级;其二是指:指标的运算层级。其一非常好理解,这里重点说运算层级。

            标签从运算层级角度可以分为三层:事实标签、模型标签、预测标签。

            事实标签:是通过对于原始数据库的数据进行统计分析而来的,比如用户投诉次数,是基于用户一段时间内实际投诉的行为做的统计。

            模型标签:模型标签是以事实标签为基础,通过构建事实标签与业务问题之间的模型,进行模型分析得到。比如,结合用户实际投诉次数、用户购买品类、用户支付的金额等,进行用户投诉倾向类型的识别,方便客服进行分类处理。

            预测标签:则是在模型的基础上做预测,比如针对投诉倾向类型结构的变化,预测平台舆情风险指数。

    (3)标签命名&赋值

            我们用一张图来说明一下命名和赋值的差别,只要在构建用户标签的过程种,有意识的区别标签命名和赋值足矣,不再赘述。

    (4)标签属性

            标签属性可以理解为针对标签进行的再标注,这一环节的工作主要目的是帮助内部理解标签赋值的来源,进而理解指标的含义。如图所示,可以总结为5种来源:

    1、固有属性:是指这些指标的赋值体现的是用户生而有之或者事实存在的,不以外界条件或者自身认知的改变而改变的属性。比如:性别、年龄、是否生育等。

    2、推导属性:由其他属性推导而来的属性,比如星座,我们可以通过用户的生日推导,比如用户的品类偏好,则可以通过日常购买来推导。

    3、行为属性:产品内外实际发生的行为被记录后形成的赋值,比如用户的登陆时间,页面停留时长等。

    4、态度属性:用户自我表达的态度和意愿。比如说我们通过一份问卷向用户询问一些问题,并形成标签,如询问用户:是否愿意结婚,是否喜欢某个品牌等。当然在大数据的需求背景下,利用问卷收集用户标签的方法效率显得过低,更多的是利用产品中相关的模块做了用户态度信息收集。

    5、测试属性:测试属性是指来自用户的态度表达,但并不是用户直接表达的内容,而是通过分析用户的表达,结构化处理后,得出的测试结论。比如,用户填答了一系列的态度问卷,推导出用户的价值观类型等。

            值得注意的是,一种标签的属性可以是多重的,比如:个人星座这个标签,既是固有属性,也是推导属性,它首先不以个人的意志为转移,同时可以通过身份证号推导而来。

            即便你成功了建立用户画像的标签体系,也不意味着你就开启了用户画像的成功之路,因为有很大的可能是这些标签根本无法获得,或者说无法赋值。

            标签无法赋值的原因有:数据无法采集(没有有效的渠道和方法采集到准确的数据,比如用户身份证号)、数据库不能打通、建模失败(预测指标无法获得赋值)等等。

     2、标签体系结构

            标签体系可以归纳出如下的层级结构。

    (1)原始输入层

            主要指用户的历史数据信息,如会员信息、消费信息、网络行为信息。经过数据的清洗,从而达到用户标签体系的事实层。

    (2)事实层

            事实层是用户信息的准确描述层,其最重要的特点是,可以从用户身上得到确定与肯定的验证。如用户的人口属性、性别、年龄、籍贯、会员信息等。

    (3)模型预测层

            通过利用统计建模,数据挖掘、机器学习的思想,对事实层的数据进行分析利用,从而得到描述用户更为深刻的信息。如通过建模分析,可以对用户的性别偏好进行预测,从而能对没有收集到性别数据的新用户进行预测。还可以通过建模与数据挖掘,使用聚类、关联思想,发现人群的聚集特征。

    (4)营销模型预测

            利用模型预测层结果,对不同用户群体,相同需求的客户,通过打标签,建立营销模型,从而分析用户的活跃度、忠诚度、流失度、影响力等可以用来进行营销的数据。

    (5)业务层

            业务层可以是展现层。它是业务逻辑的直接体现,如图中所表示的,有车一族、有房一族等。

    3、标签体系结构分类

            一般来说,设计一个标签体系有3种思路,分别是:(1)结构化标签体系;(2)半结构化标签体系;(3)非结构化标签体系。

    (1)结构化标签体系

            简单地说,就是标签组织成比较规整的树或森林,有明确的层级划分和父子关系。结构化标签体系看起来整洁,又比较好解释,在面向品牌广告井喷时比较好用。性别、年龄这类人口属性标签,是最典型的结构化体系。下图就是Yahoo!受众定向广告平台采用的结构化标签体系。

    (2)半结构化标签体系

            在用于效果广告时,标签设计的灵活性大大提高了。标签体系是不是规整,就不那么重要了,只要有效果就行。在这种思路下,用户标签往往是在行业上呈现出一定的并列体系,而各行业内的标签设计则以“逮住老鼠就是好猫”为最高指导原则,切不可拘泥于形式。下图是Bluekai聚合多家数据形成的半结构化标签体系。

    (3)非结构化标签体系

            非结构化,就是各个标签就事论事,各自反应各自的用户兴趣,彼此之间并无层级关系,也很难组织成规整的树状结构。非结构化标签的典型例子,是搜索广告里用的关键词。还有Facebook用的用户兴趣词。

     4、用户画像标签层级的建模方法

            用户画像的核心是标签的建立,用户画像标签建立的各个阶段使用的模型和算法如下图所示。

    原始数据层。对原始数据,我们主要使用文本挖掘的算法进行分析如常见的TF-IDF、TopicModel主题模型、LDA 等算法,主要是对原始数据的预处理和清洗,对用户数据的匹配和标识。

    事实标签层。通过文本挖掘的方法,我们从数据中尽可能多的提取事实数据信息,如人口属性信息,用户行为信息,消费信息等。其主要使用的算法是分类和聚类。分类主要用于预测新用户,信息不全的用户的信息,对用户进行预测分类。聚类主要用于分析挖掘出具有相同特征的群体信息,进行受众细分,市场细分。对于文本的特征数据,其主要使用相似度计算,如余弦夹角,欧式距离等。

    模型标签层。使用机器学习的方法,结合推荐算法。模型标签层完成对用户的标签建模与用户标识。其主要可以采用的算法有回归,决策树,支持向量机等。通过建模分析,我们可以进一步挖掘出用户的群体特征和个性权重特征,从而完善用户的价值衡量,服务满意度衡量等。

    预测层。也是标签体系中的营销模型预测层。这一层级利用预测算法,如机器学习中的监督学习,计量经济学中的回归预测,数学中的线性规划等方法。实习对用户的流失预测,忠实度预测,兴趣程度预测等等,从而实现精准营销,个性化和定制化服务。

    不同的标签层级会考虑使用对其适用的建模方法,对一些具体的问题,有专门的文章对其进行研究。

    八、 用户画像基本步骤[F2] 

            根据具体业务规则确定用户画像方向后,开展用户画像分析,总体来说,一个用户画像流程包括以下三步。(1)用户画像的基本方向;(2)用户数据收集;(3)用户标签建模。

            另外,需要注意的是用户画像的时效性,构建画像的数据多为历史数据,但用户的行为、偏好等特征多会随着时间的推移而发生变化。

    九、 用户画像验证

    十、 用户画像的实际例子

            注:此处涉及到工作中的项目内容,由于保密,就不能分享了

    十一、    用户画像平台&架构

    用户画像平台需要实现的功能。

            用户画像系统技术架构

    (1)    数据处理

    a、数据指标的梳理来源于各个系统日常积累的日志记录系统,通过sqoop导入hdfs,也可以用代码来实现,比如spark的jdbc连接传统数据库进行数据的cache。还有一种方式,可以通过将数据写入本地文件,然后通过sparksql的load或者hive的export等方式导入HDFS。

    b、通过hive编写UDF 或者hiveql根据业务逻辑拼接ETL,使用户对应上不同的用户标签数据(这里的指标可以理解为每个用户打上了相应的标签),生成相应的源表数据,以便于后续用户画像系统,通过不同的规则进行标签宽表的生成。

    (2)    数据平台

    a、数据平台应用的分布式文件系统为Hadoop的HDFS,因为Hadoop2.0以后,任何的大数据应用都可以通过ResoureManager申请资源,注册服务。比如(sparksubmit、hive)等等。而基于内存的计算框架的出现,就并不选用Hadoop的MapReduce了。当然很多离线处理的业务,很多人还是倾向于使用Hadoop,但是Hadoop封装的函数只有map和Reduce太过单一,而不像spark一类的计算框架有更多封装的函数(可参考博客spark专栏)。可以大大提升开发效率。

    b、计算的框架选用Spark以及RHadoop,这里Spark的主要用途有两种,一种是对于数据处理与上层应用所指定的规则的数据筛选过滤,(通过Scala编写spark代码提交至sparksubmit)。一种是服务于上层应用的SparkSQL(通过启动spark thriftserver与前台应用进行连接)。 RHadoop的应用主要在于对于标签数据的打分,比如利用协同过滤算法等各种推荐算法对数据进行各方面评分。

    c、MongoDB内存数据的应用主要在于对于单个用户的实时的查询,也是通过对spark数据梳理后的标签宽表进行数据格式转换(json格式)导入mongodb,前台应用可通过连接mongodb进行数据转换,从而进行单个标签的展现。(当然也可将数据转换为Redis中的key value形式,导入Redis集群)

    d、mysql的作用在于针对上层应用标签规则的存储,以及页面信息的展现。后台的数据宽表是与spark相关联,通过连接mysql随后cache元数据进行filter、select、map、reduce等对元数据信息的整理,再与真实存在于Hdfs的数据进行处理。

    (3)    面向应用

    从刚才的数据整理、数据平台的计算,都已经将服务于上层应用的标签大宽表生成。(用户所对应的各类标签信息)。那么前台根据业务逻辑,勾选不同的标签进行求和、剔除等操作,比如本月流量大于200M用户(标签)+本月消费超过100元用户(标签)进行和的操作,通过前台代码实现sql的拼接,进行客户数目的探索。这里就是通过jdbc的方式连接spark的thriftserver,通过集群进行HDFS上的大宽表的运算求count。(这里要注意一点,很多sql聚合函数以及多表关联join 相当于hadoop的mapreduce的shuffle,很容易造成内存溢出,相关参数调整可参考本博客spark栏目中的配置信息)这样便可以定位相应的客户数量,从而进行客户群、标签的分析,产品的策略匹配从而精准营销。

    十二、用户画像困难点、用户画像瓶颈

    用户画像困难点主要表现为以下4个方面

    资料搜集和数据挖掘

           在画像之前需要知道产品的用户特征和用户使用产品的行为等因素,从而从总体上掌握对用户需求需求

             创建用户画像不是抽离出典型进行单独标签化的过程,而是要融合边缘环境的相关信息来进行讨论

    定量调研分析

    用户标签画像

    我们的用户标签包含基本特征、社会身份、顾客用户生命周期、类目偏好等等。比如说你怎么判断一个人是不是对女装感兴趣,假设我们有一个类目就是女装,那很好办,如果你购买都是女装,那会认为你这个人对女装比较感兴趣。

    挑战

    我们期间遇到了两方面的挑战:

    亿级画像系统实践和应用

    记录和存储亿级用户的画像,支持和扩展不断增加的维度和偏好,毫秒级的更新,支撑个公司性化推荐、广告投放和精细化营销等产品。

    转自网络,感谢原作者

     

    这里讲解下用户画像的技术架构和整体实现,那么就从数据整理、数据平台、面向应用三个方面来讨论一个架构的实现(个人见解)。

    数据整理:

    1、数据指标的的梳理来源于各个系统日常积累的日志记录系统,通过sqoop导入hdfs,也可以用代码来实现,比如spark的jdbc连接传统数据库进行数据的cache。还有一种方式,可以通过将数据写入本地文件,然后通过sparksql的load或者hive的export等方式导入HDFS。

    2、通过hive编写UDF 或者hiveql 根据业务逻辑拼接ETL,使用户对应上不同的用户标签数据(这里的指标可以理解为为每个用户打上了相应的标签),生成相应的源表数据,以便于后续用户画像系统,通过不同的规则进行标签宽表的生成。

    数据平台

    1、数据平台应用的分布式文件系统为Hadoop的HDFS,因为Hadoop2.0以后,任何的大数据应用都可以通过ResoureManager申请资源,注册服务。比如(sparksubmit、hive)等等。而基于内存的计算框架的出现,就并不选用hadoop的MapReduce了。当然很多离线处理的业务,很多人还是倾向于使用Hadoop,但是hadoop的封装的函数只有map和Reduce太过单一,而不像spark一类的计算框架有更多封装的函数(可参考博客spark专栏)。可以大大提升开发效率。

    2、计算的框架选用Spark以及RHadoop,这里Spark的主要用途有两种,一种是对于数据处理与上层应用所指定的规则的数据筛选过滤,(通过Scala编写spark代码提交至sparksubmit)。一种是服务于上层应用的SparkSQL(通过启动spark thriftserver与前台应用进行连接)。 RHadoop的应用主要在于对于标签数据的打分,比如利用协同过滤算法等各种推荐算法对数据进行各方面评分。

    3、MongoDB内存数据的应用主要在于对于单个用户的实时的查询,也是通过对spark数据梳理后的标签宽表进行数据格式转换(json格式)导入mongodb,前台应用可通过连接mongodb进行数据转换,从而进行单个标签的展现。(当然也可将数据转换为Redis中的key value形式,导入Redis集群)

    4、mysql的作用在于针对上层应用标签规则的存储,以及页面信息的展现。后台的数据宽表是与spark相关联,通过连接mysql随后cache元数据进行filter,select,map,reduce等对元数据信息的整理,再与真实存在于Hdfs的数据进行处理。

    面向应用

    1、从刚才的数据整理、数据平台的计算,都已经将服务于上层应用的标签大宽表生成。(用户所对应的各类标签信息)。那么前台根据业务逻辑,勾选不同的标签进行求和、剔除等操作,比如本月流量大于200M用户(标签)+本月消费超过100元用户(标签)进行和的操作,通过前台代码实现sql的拼接,进行客户数目的探索。这里就是通过jdbc的方式连接spark的thriftserver,通过集群进行HDFS上的大宽表的运算求count。(这里要注意一点,很多sql聚合函数以及多表关联join 相当于hadoop的mapreduce的shuffle,很容易造成内存溢出,相关参数调整可参考本博客spark栏目中的配置信息) 这样便可以定位相应的客户数量,从而进行客户群、标签的分析,产品的策略匹配从而精准营销。

    展开全文
  • 用户画像标签体系及实现方法

    千次阅读 2019-09-17 17:43:03
    用户画像,简单的从字面意思上理解通过画画的形式来描述用户的外在形象,用户的外在形象表现在画面上是一种直观的信息,能够通过图画来一眼看出用户是大眼睛小眼睛,高鼻梁矮鼻梁,乃至判断用户的年龄、性别、职业、...

    用户画像,简单的从字面意思上理解通过画画的形式来描述用户的外在形象,用户的外在形象表现在画面上是一种直观的信息,能够通过图画来一眼看出用户是大眼睛小眼睛,高鼻梁矮鼻梁,乃至判断用户的年龄、性别、职业、情感等等一系列状态,在推荐系统中,用户画像也是同样的道理,根据用户人口特征、网页浏览、社交活动、消费行为等信息为勾勒出用户的画像,这种画像是通过标签化的方式呈现,构建用户画像的核心工作就是利用海量数据分析挖掘用户的属性,给用户贴上标签,这个标签就是用户在某一个属性中的状态标识,通过标签能够直观的知道用户的某些属性的标签。
    在这里插入图片描述
    上图即为推荐系统中所要进行设计标签,当然标签的设计需要结合业务场景、需求、数据等等各方面因素
    标签体系的设计首先要对数据的有足够深入的理解,其次在对数据理解深入的基础上,对数据使用的场景进行设计,基于这些设计和对数据的认识,然后提出相应的实现方案,这是基础的一个画像的设计步骤,下面是小编所完成的标签体系中的一部分,标签设计共包含了18个一级标签,约254个二级标签,覆盖的用户超过8亿
    在这里插入图片描述
    针对标签体系的设计,对标签的实现方法也有了新的更加深入的认识,当下的数据几乎没有什么养的数据源能够覆盖这上面所有的标签,而在这样的情况下,我们训练样本的数据如何获取呢?就是样本应该怎么获取,既然是基于对数据的理解设计的标签,那我们就已经基于这些数据设想过我们应该在通过什么样子的数据来表征某个标签,在生成相对应的样本时,我们可以通过一些统计学的方法去获取一部分数据样本,当然采用这种方法会出现一部分错样本,然后可以通过一些侧面的方法去验证这些样本的准确性。

    展开全文
  • 上篇博客说到绘制用户画像时根据用户行为计算标签权重很重要,计算标签权重最常用的算法是TF-IDF标签权重算法,但是如何计算并没有详细介绍,那么这篇博客咱们就来详细说说基于TF-IDF算法计算用户标签权重。...
  • 用户画像

    2019-04-26 01:23:24
    NULL 博文链接:https://kavy.iteye.com/blog/2371184
  • 用户画像是当下很多企业都会提及的概念,多数情况下会和大数据以及营销挂钩,其应用诸如某宝、某团之类的个性化推荐,都用到了用户画像。本文将对用户画像的相关知识进行简单的介绍,作者本人也是刚接触到用户画像...
  • 我们一般可能会在数据仓库或者数据中台中构建画像相关的数据表,例如用户画像。 我们构建画像的时候很简单,可以通过事实表和维表来构建画像表。 思路-相关表如下 事实表(明细表)t_1 维...
  • 简介通过处理数仓中的业务数据和埋点数据,生成用户对应的标签,运营人员通过标签筛选出人群,然后发送营销短信。此文主要描述标签筛选人群2.架构图 数据来源:业务数据库和埋点数据 标签生成:运营人员定义好标签元...
  • 五步帮你实现用户画像的数据加工

    千次阅读 2018-02-01 14:45:23
    企业最终的数据往往都隐藏在日志背后,如果从日志背后挖掘出有价值的信息,勾画出平台或网站的用户画像对精准化运营有着重要的帮助。阿里云技术专家祎休带来阿里在处理日志、构建数仓上的最佳实践分享。主要从数仓...
  • 利用大数据来分析用户的行为与消费习惯,可以预测商品的发展趋势,提高产品质量。本书基于大型电商公司的真实用户画像,主要培养学员了解用户画像的内容,掌握构建用户画像的方法。
  • 其次对基于“用户画像”的商品推送系统从需求、设计和实现的三个方面进行详细的说明,本系统主要构成为以下两个部分:(1)用户画像系统,首先以用户的个人历史行为为基础,通过评分矩阵模型构建用户兴趣模型,然后基于标签...
  • 而达成这一目标需要对用户市场进行细分实现精细化营销,应用数据挖掘技术对用户进行画像,实现用户细分,其研究和发展在实现运营商精确营销、提高工作效率、减少经营成本方面具有重要的指导意义和实用价值。本文以移动...
  • 用户画像 实战

    2017-09-01 11:25:19
    各公司 用户画像 实现 详细介绍,包括设计 过程,基础架构 等详细内容的介绍。 如何使用方法论来建设用户画像系统
  • 文章目录1 用户画像 本文主要围绕以下问题展开相应的数据研发相关知识的梳理与总结: 用户画像是什么?用于解决什么场景下什么问题?如果让你设计一套用户画像,你的设计思路是什么? 1 用户画像 ...
  • 文章在对用户画像技术进行基 本 介绍的 基础上,从 目标客户 识别、目标 客户描绘、消费异动准确把握和精准化推 送四个方面阐明了用户画像技术的作用, 帮助企 业更好的 认识大数 据相关 工 具 尤 其 是用户画 像...
  • 用户画像2种数据存储的方式

    万次阅读 2018-04-08 14:32:08
    目前,越来越多的企业,在大数据应用上,都会选择用户画像这一主题,为什么呢?因为用户画像相对于做推荐以及机器学习等简单容易的多,做画像,更多是就是对用户数据的整合,然后做一些用户聚类、用推荐算法,比如...
  • 用户画像场景与技术实现方案

    千次阅读 2021-11-05 22:29:35
    今天赵宏田分享的主题是用户画像场景与技术实现方案,主要分 3 部分: 一是常见应用场景; 二是画像产品一些常见的功能; 三是技术实现方案。 01常见应用场景 1.1画像常见的应用场景 不同行业业务属性不同能...
  • pyspark dataframe实现行循环,调用Python 实现大批量小文件处理,对大批量用户实现用户画像 适合应用场景 集群处理大批量的小文件,如需要对1000万用户构建用户画像,每个用户的数据不大有几百M(单机Python能...
  • 用户画像技术及方法论

    千次阅读 2020-06-01 16:42:03
    导读:用户画像也是近几年比较热的一个词,不过很多小伙伴对于画像的认知还只是标签化的层面,或者只是利用其做一些简单的分群分析;如何全面地认知并做系统性地尝试,背后有非常多的点需要我们深思挖掘。今天就根据...
  • 在销售过程中,你一定会用到客户分类和客户标签,那么用户画像又是什么呢?这三者又是如何助力转化,提高成单率的呢?什么是客户分类、客户标签和用户画像? 在转化之前,我们先把客户分类、客户标签、用户画像这几...
  • 利用Python搭建用户画像系统

    万次阅读 多人点赞 2017-08-30 16:32:50
    本文将对用户画像的相关知识进行进行简单的介绍,并利用Python去实现一个简单的用户画像系统。 1.什么是用户画像 用户画像可以理解成是海量数据的标签,根据用户的目标、行为和观点的差异,将他们区分为不同的类型...
  • MapReduce实现用户画像遇到的一些问题及解决方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,501
精华内容 10,600
关键字:

如何实现用户画像