简介:这是一份面向产品经理和业务分析师的高阶用户画像体系规划资料,解决从业务需求到产品落地如何搭建画像体系的常见难题。资源包内包含1个docx文档,约99KB,体量紧凑,便于按章节精读。目前已有142人学习浏览,适合用于产品规划、用户运营、精准营销及推荐系统等场景。内容以“一个中心、一条主线”为总体框架,详细拆解需求阶段的ID体系、标签体系、画像系统三大模块,介绍产品规划阶段的业务架构与产品架构,并给出六层次业务架构梳理方法,以及数据采集、ETL预处理、标签建模等底层支撑。同时结合实际案例覆盖精准广告投放、智能运营、个性化推荐等典型应用,并以对话场景切入降低理解门槛,最后总结团队协作、流程规范化与灵活应变的成功关键因素,能帮助读者从整体蓝图到落地执行建立清晰路径。
1. 用户画像体系规划,先于画的其实是“不画什么”
做画像最常见的失败不是没标签,而是标签太多。我见过一个团队花了三个月从几十个系统里抽了一千多个标签,等项目发布那天,业务方一句“这些我都能直接在报表里看”就把画像打回了原型。用户画像体系规划这件事,本质不是把用户数据堆成一张大宽表,而是先确定哪些标签值得进入体系、以什么粒度存储、谁来消费、多久更新一次。这四个问题不回答,画像是活不过三个月的。这篇文章按我自己的落地经验,从数据地基、标签分级、权重计算、储仓实现到验证调参,顺着一条可执行的路径拆给你,适合产品、数据分析和后端开发一起看,也希望你看完后能直接对着自己团队的数据现状开工。
2. 用户画像体系规划的三层地基:业务目标、数据源、ID 打通
用户画像体系规划和写一张报表最大的差别在于,报表回答“过去发生了什么”,画像要回答“下一步对谁做什么”。因此在动手建标签之前,得先花一周左右把三个地基问题问清楚,这一周越慢,后面一年越快。
2.1 先让业务目标限制边界:画像不是越大越好
每次做用户画像体系规划,业务方都会说“所有标签我都要”。但画像标签是有成本的,每多一个标签,就要多一个调度任务、多一份存储、多一套校验规则。所以规划的第一件事不是拍照,而是做减法。常见做法是让业务方回答三个问题:这个标签直接影响哪个决策?不用它,决策会损失多少?它是单次决策用的,还是持续评估用的?只有第三个回答“持续”的标签才值得进体系。一次性的分析需求给数据提取就行,别进画像。
2.2 数据源盘点表:把能用的字段全部列出来
第二层地基是盘点数据源。这个环节不要凭记忆,我会按下面的盘点表格式逐个系统过一遍,把字段名、更新频率、主键和可信任级别标清楚。这张表也是后面建标签宽表字段的直接依据。
| 数据源系统 | 涉及核心字段 | 更新频率 | 唯一主键 | 数据质量 | 备注 |
|---|---|---|---|---|---|
| 用户注册库 | uid, 手机号, 注册时间, 来源渠道 | 实时 | uid | 高 | 事实标签主源 |
| 订单系统 | uid, 订单金额, 下单时间, 商品类目 | 实时 | order_id | 高 | 消费力标签主源 |
| 埋点日志 | uid, 页面, 事件, 停留时长 | T+1 离线 | 无 | 中 | 活跃度标签用 |
| 客服工单 | uid, 投诉类型, 处理时长 | T+1 | ticket_id | 低 | 需清洗后入标签 |
这张盘点表的额外作用,是让你提前发现数据主键不一致。订单系统的 uid 是用户 ID,但客服工单里可能存的是手机号,埋点日志里又是带平台的拼接 ID,如果不提前标出来,后面 ID 统一要比对很久。写规划文档时,把这张表附在数据调研章节里,能替团队挡掉大量“字段对不上”的返工。
2.3 ID 打通:决定画像能覆盖多少真实用户
用户画像体系规划里,ID 打通是决定成败的一步。它不做,画像覆盖率就只能停留在登录用户这一层,未登录用户在 Web 端和 App 端的浏览轨迹对不上,标签再精细也属于半盲区。常见做法是做一张 id_mapping 表,把 uid 作为统一主键,其他 ID 都作为别名,按其可信度排序回填。我一般用这样一张简化结构来让团队成员对齐思路:
CREATE TABLE dim_user_id_mapping ( uid STRING COMMENT '统一用户主键', mobile_hash STRING COMMENT '手机号哈希,用于关联未登录行为', device_id_hash STRING COMMENT '设备ID哈希,用于App端关联', openid_hash STRING COMMENT '微信OpenID哈希,用于小程序关联', merge_time TIMESTAMP COMMENT '本次关联发生时间', is_primary BOOLEAN COMMENT '是否为主身份记录', PRIMARY KEY(uid) );把手机号、设备号都做哈希后再入表,是为了规避明文手机号在数据仓库里多次落地带来的合规成本。字段 mobile_hash 和 device_id_hash 是关联键,不是展示键;is_primary 用来标记这条关联是最新计算还是历史追溯。ID 打通不能只做一次,用户换设备、换手机号后必须持续更新这张表,否则画像会把同一个人拆成两三个人。
3. 核心设计:用户画像标签的分类、分层与权重落地
三层地基打完后,正式进入用户画像体系规划的核心环节,也就是标签体系本身。这一步最容易出现的误区是一上来就画标签树,然后对着树去填数据。正确做法是先明确每个标签的“生产方式”,再看它能进哪一层,最后才轮到权重和分值计算。
3.1 标签分类:事实标签、规则标签、模型标签
画像标签从生产方式上可以分成三类,这个分法决定字段怎么存、计算任务怎么写、以及后续准确性怎么评估。
3.1.1 每一类标签的适用场景与示例
事实标签是直接从业务库或埋点明细里抽出来、不需要加工的字段,比如“注册时间”“最近一次下单时间”“用户性别”。这类标签的特点是可直接追溯,适合做人群筛选的固定维度。
规则标签是基于原子数据按业务逻辑划分的,比如“近 30 天下单次数≥3 次”得到“高频用户”,“累计消费金额>5000 元”得到“高客单用户”。规则标签适合描述用户当前所处的业务分层,但有一个隐患,业务一变规则就要跟着变,因此规则条件要集中写在配置表里,不要散落在 SQL 里。
模型标签则依赖机器学习或统计模型输出,比如“流失概率 0.72”“支付意愿高”。模型标签的粒度不是一条条规则,而是模型打分结果。它适合做精细化运营的前排队列,但维护成本最高,也是后面权重设计最需要关心的部分。
3.2 标签分层:从原子标签到画像分值
分类是最底层的切分逻辑,分层决定标签输出给业务时的结构。我常给团队定的结构是:一级类目、二级标签、原子标签,再加一层画像分值。一级类目例如“人口属性”“消费行为”“活跃特征”“兴趣偏好”,二级标签是类目下面的分组比如“消费能力”“价格敏感度”,原子标签是最终落到库里的单个字段比如“近90天客单价”。
画像分值是原子标签按权重加权后的汇总数,它不是给用户贴死标签,而是为了做排序。运营在后台筛选“高消费力人群”时,直接按画像分值排序比按单标签筛选更稳定,因为单标签总有覆盖不到的边缘用户,分值可以平滑处理这个问题。
3.3 权重体系:用统计基尼系数反推重要性
权重怎么定,是用户画像体系规划里比较难讲清的部分,因为拍脑袋给权重,后面很难说服业务方。常见做法有两种:一种是让业务方按对营收的影响打分做层次分析,另一种是我更常用的,从数据分布中反推。
举个例子,如果想计算“消费能力”“活跃度”“近度”三个方向对留存用户贡献的权重分布,可以先取一批用户样本,把每个方向的指标和“未来 30 天是否活跃”做关联分析,然后看信息增益率。下面给一个用 Python 算权重的简化思路:
import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier # 假设 df 里有三类标签分值: consumption, activeness, recency # target 表示用户是否在下一周期活跃(1/0) feature_cols = ["consumption", "activeness", "recency"] X = df[feature_cols] y = df["target"] model = RandomForestClassifier(n_estimators=100, random_state=42) model.fit(X, y) # 输出每个特征的重要性,归一化成权重 importance = model.feature_importances_ weights = importance / importance.sum() for col, w in zip(feature_cols, weights): print(f"{col}: {w:.3f}")这里用随机森林的feature_importances_作为权重初值,是因为它能直接给出每个输入特征对预测目标的贡献比例。注意,这里喂给模型的应当是标签分值而不是原始字段,因为你的目标是确定画像分层的权重,模型只在这条链路里当一把量尺。计算出来的权重需要做两点修正:一是要将与业务强绑定的指标按风险打折,比如“投诉率”虽然区分度高,但不能给太高权重,否则后面活动都在避开投诉用户;二是每一季度用新样本重算一次,避免业务变化后权重失效。
权重定好后,画像分值的计算就是简单的加权求和再归一化到 0~100 分。举一个最小的实现逻辑:对每个用户,取三类原子标签值,按各自量纲做完 min-max 归一化,再按权重加权,套一个ceil得到整分值即可。这里不建议用过于复杂的算法,因为业务方要能看懂分数构成才有信任感,黑盒分值大概率会被闲置。
4. 用户画像体系规划落库:从数据仓库到标签宽表的实现
规划文档做得再漂亮,最后还是要落到仓库里才算数。这一步最见功夫的不是建几张大表,而是把标签的生命周期管起来。用户画像体系规划如果在这里少做一层考虑,后面几乎每天都要为字段口径扯皮。
4.1 标签宽表的结构设计与 SQL 示例
标签宽表是什么?就是一张用户一行的宽表,每列一个标签。宽表看起来笨重,但查询性能好,适合运营前台筛选人群。下面是一个我常用的设计:
CREATE TABLE dws_user_profile_daily ( uid STRING COMMENT '用户主键', tag_gender STRING COMMENT '事实标签-性别', tag_reg_date STRING COMMENT '事实标签-注册日期', tag_order_cnt_30d INT COMMENT '规则标签-近30天下单次数', tag_consume_level STRING COMMENT '规则标签-消费等级 L1-L5', tag_active_days_7d INT COMMENT '行为标签-近7天活跃天数', score_consumption DOUBLE COMMENT '消费能力分值 0-100', score_recency DOUBLE COMMENT '活跃近度分值 0-100', score_overall DOUBLE COMMENT '画像综合分值', etl_time STRING COMMENT 'ETL处理时间', biz_date STRING COMMENT '业务日期分区', PRIMARY KEY(uid, biz_date) );设计里有意的几点:带tag_前缀的字段都保留了原始值,带score_前缀的字段才是加权计算出来的画像分值。为什么要把两类分开?因为业务方在筛选人群时,有时候就是想用“近 30 天下单次数大于 10”这样的业务口径直接筛,画像综合分值只适合拿来排序,不适合拿来反查业务原因。biz_date分区把不同日期的画像隔离开,方便回溯用户画像体系在某一时刻的版本。
4.2 每日全量/增量更新的调度逻辑
标签宽表的更新策略,建议优先做“分层混合更新”。事实标签和规则标签每天全量刷新也可以接受,但模型标签特别是接入机器学习预测结果的标签,只更新有变化的增量即可。这里给一个调度伪代码,说明任务依赖关系:
# 每日调度顺序:ODS 抽取 -> DWD 清洗 -> DWS 画像宽表 # 步骤1: 同步注册表、订单表、埋点日志到ODS层 python sync_ods.py --date $(date +%F) # 步骤2: 对ODS层做清洗,生成DWD层明细表 python clean_dwd.py --date $(date +%F) # 步骤3: 计算事实标签和规则标签,写入画像宽表 python compute_profile_tags.py --date $(date +%F) # 步骤4: 跑模型标签任务,只更新发生行为变化的用户 python compute_model_scores.py --date $(date +%F) --mode incremental # 步骤5: 计算综合画像分值,并生成标签质量报表 python compute_overall_score.py --date $(date +%F) python generate_profile_report.py --date $(date +%F)参数说明:--date是跑数的业务日期,整条链路所有任务都要传,不然分区会乱;--mode incremental是增量模式,只处理有新增行为的 uid,能省大量计算资源。调度上最重要的一点是,模型打分任务必须排在标签计算任务之后,因为模型特征里可能会引用画像标签本身,一旦顺序反了,会把昨天的旧值带进今天的模型输入里,脏数据也就从这里开始了。
4.3 面向应用:画像服务 API 的查询参数
画像宽表建好后,业务系统不能直接连库查,需要封装一层查询接口。这层接口做得好不好,直接影响画像被调用频率。一个简化的查询服务参数可以这样设计:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| uid | string | 是 | 用户ID |
| biz_date | string | 否 | 查询指定日期的画像,不传则取最新 |
| tags | string | 否 | 指定返回哪些标签,逗号分隔 |
| score_only | boolean | 否 | 只返回画像分值,不返回明细标签 |
| output_format | string | 否 | json 或 parquet 流式输出 |
接口层最关键的一点是控制返回量。允许外部传 tags 参数,就是为了防止有人把整张宽表拉走。画像服务不是数据分析平台,它只服务高时效场景,比如营销活动选人、App 首页个性化推荐。凡是超过 10 秒的查询,都建议让它直接走离线宽表,别在 API 里等。
5. 不讲下沉的规划都是废纸:三个必调参数与验证模型
用户画像体系规划的最后一步,也是最容易糊弄的一步,是验证与调参。很多团队把宽表一上线就开始用,三个月后才发现标签不准,再返工成本极高。所以上线前,必须把下面三组参数当成标签质量红线来调。
第一个必调参数是覆盖率。覆盖率指“每个标签的非空用户数 ÷ 全体活跃用户数”。新老用户、已登录和未登录用户,覆盖率差异会非常大。比如“性别”这个标签,在未登录用户里大概率是空值,覆盖率不到 40%,如果直接用这个标签筛选做推送,等于直接把一半用户放弃了。验证方法是对着一张新增用户明细表,按日统计每个标签的覆盖率曲线,低于 60% 的标签要回查数据源,确认是采集不到,还是口径过滤太严。
第二个必调参数是准确率。准确率的验证要靠抽样:每天从画像用户里随机抽 100 人,人工核对规则标签是否和原始订单、埋点记录一致。实践里可以先用一个简单查询来自动兜底,核对“近30天购买次数”标签和订单表直接 count 的结果是否一致:
-- 抽样100个画像用户的标签值,和订单明细核对 SELECT t.uid, t.tag_order_cnt_30d AS profile_value, o.real_cnt AS order_real_cnt, CASE WHEN t.tag_order_cnt_30d = o.real_cnt THEN 1 ELSE 0 END AS is_match FROM dws_user_profile_daily t JOIN ( SELECT uid, COUNT(*) AS real_cnt FROM dwd_order_detail WHERE order_time >= date_sub(current_date(), 30) GROUP BY uid ) o ON t.uid = o.uid WHERE t.biz_date = current_date() LIMIT 100;这条 SQL 的逻辑是直接把画像标签值和订单明细统计结果做逐一对账。is_match等于 1 的占比就是规则标签的准确率。对于低于 95% 的规则标签,排查点基本集中在三个地方:订单是否被退款、下单统计口径是否包含取消订单、时区是否统一。这三个问题不调掉,准确率很难上去。
第三个必调参数是标签新鲜度。画像标签不能一次算完一劳永逸,不同标签的保鲜期是不同的。通常“性别”“年龄段”这类事实标签 3 个月更新一次就够;“消费等级”是按月更新的;“近 7 天活跃天数”必须日更。我会给每类标签在宽表旁边建一张tag_freshness_config配置表,记录每个标签的最后更新时间和阈值,超时标签自动进入告警列表。这个表本身比大多数标签都值钱。
最后补充一个被很多人忽略的反直觉判断:标签的覆盖率低不全是坏事。在画像服务里,空标签本身就是一种信号。比如用户没有购买行为,系统可以判断他处于冷启动阶段,运营策略就应该走新手引导而非老客召回。因此验证模型时,不要只盯着整体覆盖率,还要对不同用户生命周期分组单独看覆盖率,这样画像体系才能从“能数出用户是谁”变成“能判断他现在处于什么状态”。一个成熟的用户画像体系规划,最后出来的产品形态不是一个标签树,而是一套报表,一套告警,一个能自证可信度的机制。能用报表证明标签是准的,运营才会敢用;运营敢用了,画像体系才算真正站住了。
本文还有配套的精品资源,点击获取