ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用户画像7大维度实战:从数据清洗到标签落地

用户画像7大维度实战:从数据清洗到标签落地 用户画像这几年已经被说烂了但真正能把画像做扎实、能直接支撑业务决策的大数据分析师其实并不多。尤其是旅游网站这类垂直领域用户的决策链路长、场景碎片化画像要是只停留在“性别年龄城市”的粗粒度标签那基本等于白做。这篇文章我想把用户画像的7大维度掰开揉碎讲清楚。每个维度解决什么问题、数据从哪来、标签怎么做落地以及我在旅游网站实际项目中踩过的坑和沉淀下来的清洗处理套路都会一并放出来。不管你是刚转行数据分析的新手还是已经接触过一些画像项目但觉得系统化不够的从业者这篇内容应该都能给你一套可以直接拿去用的框架。1. 用户画像的7大维度从哪来为什么是这7个1.1 画像的本质是“用结构化描述还原一个人”很多刚入行的分析师会把用户画像简单理解成“打标签”比如给用户打上“25-30岁”“爱旅游”“高消费”几个标签就觉得自己做了个画像。但真正的画像不是标签的堆砌而是一套能回答业务问题的结构化描述体系。我在实际项目里总结的经验是画像首先要还原“一个人”而不是还原“一个ID”。同一个用户他在注册时留下的性别和年龄在App里浏览过的路线在订单里实际支付的客单价在地域上从哪个城市出发在一天什么时间段访问——这些都是一个完整用户的不同切面。单独看任何一个切面都可能有偏差组合起来才接近于一个“真实的人”。所以画像的维度设计本质是在回答一组业务问题这个人是谁、他在哪、用什么方式访问、他做了什么、花了多少钱、对什么感兴趣、这个用户现在处于什么阶段、还值不值得继续投入。这7个问题的答案就对应着7大维度。为什么是7个而不是3个或10个少了覆盖不了用户的全貌多了维护成本和理解成本都会失控业务方也用不起来。1.2 每个维度都必须对应业务价值不养闲标签做画像最忌讳的事情就是分析师自嗨建了一堆好像很厉害但业务根本用不上的标签。所以我在设计每个维度时都会先问自己三个问题这个维度能回答什么业务疑问对应的指标从哪个数据表来如果业务方要用这个标签做决策他会怎么用下面这张表是我在旅游网站项目中沉淀下来的维度与业务问题映射关系供你参考维度核心回答的业务问题典型应用场景人口属性用户是谁分人群运营、内容调性、产品功能设计地理与地域用户从哪来、要去哪目的地推荐、出发地运力匹配、地域化运营设备与访问渠道用户用什么访问、什么时段活跃投放策略、页面适配、消息触达时段行为轨迹用户做了什么、怎么逛的意图识别、推荐策略、转化漏斗优化消费偏好用户花了多少钱、怎么花价格敏感度、促销策略、套餐设计内容与兴趣用户关心什么内容内容推荐、攻略推送、社区运营生命周期与价值用户处于什么阶段、值多少钱流失预警、召回策略、VIP运营维度不是越多越好关键是每个维度都要有明确的业务出口。如果某个维度建完之后业务方从来没主动用过那这个维度的标签设计就是失败的这是我在项目中最深的体会之一。2. 7大维度逐一拆解指标、数据来源与标签落地2.1 人口属性维度最基础但最容易被用错人口属性是用户画像里最传统的维度主要包括性别、年龄段、职业、学历、婚姻状态、收入水平等。这个维度的数据来源一般是三个注册信息、实名认证信息、第三方数据补充。在旅游网站场景下人口属性对业务的价值不在于“知道用户是男是女”而在于推断用户的出行场景。比如一个35-45岁、已婚有孩子的用户他的出行计划往往围绕亲子游、暑期家庭出游展开一个20-25岁的单身用户可能更关注穷游、青旅拼团、结伴旅行。如果只看性别和年龄看不出“家庭出游”和“独自旅行”这两种需求差异这时候就需要结合孩子在标签体系里做交叉推断——比如通过常订亲子酒店、儿童票等信息反推家庭结构。这里有个我踩过的坑注册信息里的年龄和职业很多用户是不填或者乱填的。尤其是职业字段缺失率常年保持在30%以上。解决思路是通过用户自填数据行为推断结合自填数据做基础行为数据做交叉验证。比如一个用户经常在工作日上午10点左右访问并且访问的页面集中在北京往返上海的高铁票查询上那他大概率是个经常出差的白领而不是纯休闲游客。2.2 地理与地域维度出发地和目的地比“家在哪个城市”更重要地理维度在一般行业的画像里就是“常驻地”一个标签但在旅游行业地理维度需要拆得更细常住地、IP归属地、出发地、目的地、近期关注的目的地。常住地可以通过注册手机号归属地、收货地址、常用IP地址来判定。出发地则看订单里的出发城市字段。这两个字段往往不一致比如一个家在西安、但常驻上海工作的用户他的常住地和常用出发地分别是西安和上海实际消费场景里出发地的参考价值更大——因为推荐上海出发的周边游、而不是西安出发的线路对他的转化率更有效。目的地偏好是这个维度里最具旅游行业特色的标签。我在做目的地偏好时会综合用户近12个月内浏览过哪些目的地的攻略、搜过哪些目的地关键词、收藏过哪些酒店、最终购买了哪些目的地产品然后按时间衰减加权算出一个目的地偏好分。这个标签直接决定了推荐系统和信息流里给用户推什么目的地内容转化率提升效果非常明显。数据来源上IP归属地通过日志解析LBS通过App定位数据获取目的地偏好则从内容埋点和订单表中提取。2.3 设备与访问渠道维度决定触达方式而不是用户身份设备与渠道维度包括用户的设备类型iOS/Android、设备型号、操作系统版本、App版本、网络环境Wi-Fi/4G/5G、访问时段、访问来源自然搜索/广告投放/社交媒体跳转等。很多分析师容易忽略这个维度觉得设备信息对业务没啥指导意义。但从我的实操经验看这个维度对两类业务尤其重要一是消息触达二是投放优化。举个例子一个用户如果用iOS设备那么App推送可以直接走APNs通道如果网络环境是Wi-Fi可以推送高清视频类的内容如果用户是用老旧的Android机型那H5页面里大量CSS动画就要做降级处理否则页面加载会有明显卡顿流失率很高。访问时段这个标签也很有价值。旅游网站的访问有明显的高峰时段工作日的午休和晚间9点到11点周末的上午10点到下午4点。通过历史日志可以给每个用户打上“午间浏览型”“夜间浏览型”“周末集中型”这样的活跃时段标签。这个标签直接决定推送和邮件的最佳发送时间。我曾经对比过同一批用户按活跃时段推送的打开率比固定时间推送高出大约25%这个提升在数据上还是很显著的。2.4 行为轨迹维度用户的每一次点击都在表达意图行为轨迹是用户画像里信息量最大的维度也是最难处理好的维度。它涵盖了用户在小程序、App、Web端的完整行为序列浏览了哪些页面、点击了哪些按钮、搜索了什么关键词、每个页面的停留时长、咨询了什么产品、是否发起了收藏、下单前经历了几个步骤、在哪个步骤流失了。我处理行为轨迹数据时会重点提取四类指标访问频次周活跃天数、月访问次数、访问深度单次访问浏览页面数、关键行为搜索、收藏、咨询、下单、转化路径从进入到下单的步骤数与时长。旅游网站的行为轨迹有个非常鲜明的特点决策周期长通常要7-15天。用户可能今天下班搜了一下“三亚自由行”什么也没买就走了过了一周再回来查攻略、比价格又走了直到第三周才最终下单。如果分析师只看单次会话会觉得这个用户逛了一圈没转化价值很低。但把行为轨迹串联起来看会发现这个用户一直在同一个目的地相关页面上反复出现这是一个明确的高意向用户。所以我建议所有做旅游画像的分析师一定要建“跨会话行为聚合”的标签——比如“近14天内对三亚相关内容的访问次数”“近30天是否搜索过酒店机票组合”这类标签比单次会话指标要有效得多。我的经验是把这类行为聚合标签加入推荐模型的特征后模型的目标转化率建模有明显提升。2.5 消费偏好维度用真实订单说话不靠用户嘴上说消费偏好维度的核心指标包括近12个月消费总金额、平均客单价、价格敏感度、产品品类偏好跟团游/自由行/机酒套餐/门票/签证、支付方式偏好支付宝/微信/银行卡、消费频次与复购周期。这里最核心的是价格敏感度的计算。我在项目中会用用户近一年的订单数据计算每个用户客单价的区间分布和中位数。有些用户虽然偶尔下过一单高价产品但绝大多数订单都在低价格带这种情况我会把用户标记为“价格敏感型”而不是“高消费型”——因为用个例判断整体消费能力很容易在促销活动里做错决策。在旅游场景下消费偏好还要关注两个特殊维度一是同行人特征比如订单里是否同时下单了多份早订优惠、是否选择了家庭房、是否包含了儿童票这些信息能推断用户的出行结构二是预订提前期也就是从下单到出发相隔多少天。提前1-2天预订的多为商务出行或临时起意的周边游提前30天以上预订的多为有规划的家庭出游和长线出行这两类用户的营销策略完全不同。这个维度的数据质量相对可靠因为全部来自真实的订单和支付数据没有用户自填的偏差。但要注意的是订单数据覆盖的只是“已经转化”的用户对于那些一直在浏览但从未下单的用户这个维度是空白的。对那些未转化用户我会用行为数据做推断——比如用他点击过的高价酒店和低价酒店的分布估算他的消费潜力区间。2.6 内容与兴趣维度画像从“静态标签”走向“动态意图”内容与兴趣维度是最近几年才被单独独立出来的维度。在旅游网站里内容指的就是目的地攻略、景点介绍、旅行视频、游记、美食推荐、避坑指南等。用户对这些内容产生的点击、阅读时长、收藏、转发、评论都是这个维度的核心数据来源。做内容兴趣标签时我会注意一个问题兴趣是有时效性的。用户三个月前关注的是“带娃去三亚”是因为他当时在规划那一次出行等他旅行结束这个兴趣标签对他的参考价值就大幅下降了。所以我给内容兴趣标签都设计了衰减周期短期兴趣近7天、中期兴趣近30天、长期偏好近180天。推荐内容时优先用短期兴趣运营活动邀请时用长期偏好。内容与兴趣维度的另一个作用是可以识别出“有出行意愿但还没锁定目的地”的用户。如果一个用户近期搜索了“热带岛屿”“海边度假”“亲子酒店”这些兴趣标签虽然还没有转化为任何订单但已经暴露了他的决策方向。对这个阶段的用户推送对应目的地的攻略和优惠转化效率要远高于推广撒网式的通用内容这也是内容兴趣标签在旅游场景里最大的业务价值。2.7 生命周期与价值维度决定你对这个用户投入多少资源生命周期与价值维度是7大维度里偏“运营视角”的一个。核心指标包括注册时间、活跃度趋势近7/30/90天活跃天数、最近一次访问时间、累计消费金额、累计消费次数、RFM分层结果。如果把用户比作一个池塘里的鱼前6个维度描述的是这条鱼长什么样、爱吃什么饵生命周期维度描述的则是这条鱼现在处于什么状态——是在快速增长期还是已经进入了沉默期值不值得你每天投喂。我在旅游网站的实践里会把用户生命周期划分为五个阶段新客期注册后30天内尚未完成首次购买成长期完成首单且近30天有活跃行为成熟期历史下单3次以上近90天活跃沉默期近90天未访问但历史有购买记录流失期近180天未访问且无任何交互行为不同的生命周期阶段运营策略完全不同。新客的激活手段是首单优惠券成熟期的重点是交叉销售和会员升级沉默期则要用爆款内容和超低价产品来唤醒。价值分层方面我推荐用RFM模型而不是单纯看累计消费金额。一个历史消费很高、但已半年没访问的用户和一个历史消费不高、但最近一个月连续下单的用户哪个在接下来一个季度更可能产生营收后者往往被低估因为RFM里的“最近一次消费时间”维度能把这个价值重新估出来。有人问为什么不用决策树、聚类之类的高级模型做价值分层我的经验是RFM简单、可解释、业务方一眼就能看懂在一个数据分析团队和业务团队协同作战的场景下可解释性比模型复杂度更重要。3. 数据从哪来抓取、清洗与预处理是画像的地基3.1 数据来源是画像是真是假的根本分水岭前面讲完维度接下来必须面对一个现实问题这些维度的数据到底从哪来。这是我在带新人时最常遇到的一个断层——很多新人知道画像有哪些维度但不知道数据是怎么进到数仓里的。在旅游网站的实战场景下数据来源主要有四块第一块是埋点日志数据。用户在App、H5、小程序里的每一次点击、页面浏览、下拉刷新都由前端埋点采集后记录在访问日志里。这块数据是行为轨迹维度的唯一来源。第二块是业务数据表包括用户注册表、订单表、支付流水表、搜索日志表。这部分数据质量相对高来自业务系统本身。第三块是第三方API数据比如通过地图API把用户IP解析成城市归属通过天气API获取目的地的天气情况用于推荐等等。第四块在某些场景下也会用到外部抓取的数据比如竞品公开的酒店价格信息、点评信息等。我特别要提醒一点外部数据抓取必须严格在合法合规的范围内进行只采集公开且授权允许使用的数据。企业内部自有的日志和业务数据才是画像建设真正的主干大部分情况下根本不需要依赖外部抓取。3.2 数据清洗是画像项目里最耗时、也最体现基本功的环节数据清洗在画像项目中的地位太容易被低估了。很多分析师热衷于调参和建模但真正落到画像项目里数据清洗往往要占到整个项目工时的一半以上。尤其在旅游网站场景下数据源多、格式杂、脏数据多清洗不到位后面所有标签都会失真。我在旅游网站数据的实际清洗中常遇到这些脏数据问题第一个是数据缺失。用户注册信息里的职业、收入等字段缺失率极高行为日志里设备型号、网络环境也可能因为SDK版本老旧而缺失。第二个是重复数据。比如用户在一次会话中由于网络重试同一行为被记录了多条或者日志系统重复导出了同一时段的日志。第三个是异常值。一个用户一天访问了1000个页面或者一个订单的金额是0.01元或者时长字段出现了负数这些明显是异常数据。如果不处理会把画像标签的分布拉歪。比如统计用户平均停留时长时一个异常会话就能把平均值拉高好几倍。第四个是格式不一致。同一个城市在订单表里叫“北京市”在行为日志里叫“北京”在搜索词里可能叫“BJ”这三个如果不统一地域维度的统计就会彻底失真。第五个是时间格式与时区问题。日志系统记录的时间可能是UTC时区而业务订单表用的本地时间。在做行为轨迹和消费记录关联时如果没统一时区就会出现“用户先下了单、但下单前没有浏览记录”这种会误导判断的错误。这些清洗工作看似琐碎但每一个都会直接影响画像标签的准确性。我的项目经验是清洗一定要在标签计算之前完成并且清洗规则要可配置、可回顾而不是每次都在代码里临时处理。3.3 concat()函数画像数据处理中最常用的合并操作聊天数据清洗就不得不提数据处理过程中用的最频繁的操作之一数据合并。在画像构建中我们经常要把多个来源、多个时段的数据合并到一起而Pandas里的concat()函数就是完成这件事的核心工具。concat()函数的核心作用是沿着一条轴axis把多个DataFrame拼接在一起axis0是纵向合并也就是把多张结构相同的表上下堆在一起常用于合并多天、多月的日志数据axis1是横向合并也就是把多张表左右拼起来常用于把用户基础信息、消费信息、行为指标拼接成一张包含所有维度的宽表我贴一段实际项目里的数据合并代码演示一下这两种用法import pandas as pd # 读取1月和2月的用户浏览日志 df_jan pd.read_csv(visit_log_2026_01.csv) df_feb pd.read_csv(visit_log_2026_02.csv) # 纵向合并两个月的日志ignore_index避免索引重复 df_visit pd.concat([df_jan, df_feb], axis0, ignore_indexTrue) # 读取用户基础信息表和订单聚合表 df_user pd.read_csv(user_base_info.csv) df_order_agg pd.read_csv(user_order_agg.csv) # 横向合并成宽表按user_id对齐 df_panel pd.concat([df_user, df_order_agg], axis1, joininner)不要小看这个函数它有一个非常坑的地方当axis1做横向合并时concat()是按索引位置对齐的而不是按某个业务主键对齐。如果左边表第3行是user_id1001的用户右边表第3行是user_id1002的用户直接横向concat会把两个不同用户的数据拼到同一行导致画像数据彻底错乱。所以在横向合并时我强烈建议先确保两侧DataFrame的索引都是同一个业务主键也就是先set_index(user_id)再concat或者直接用merge()函数按字段对齐。这也是我在很多实训项目里反复看到新人们踩坑的地方——记得在类似头歌这类实训平台上练习concat操作时一定要先搞懂axis参数和索引对齐的逻辑。4. 旅游网站场景下从脏数据到用户画像宽表的完整实战4.1 演练目标与样例数据说明这一节我给出一个可以照着跑的完整流程。假设我们现在有一份旅游网站的原始行为日志仅演示用数据做了脱敏处理以及一份用户订单表。目标是清洗并合并这些原始数据生成一张可供画像使用的用户宽表。原始数据主要包含三类行为日志表字段为user_id、log_time、page_url、city、device_type、network、duration用户基础信息表字段为user_id、register_time、gender、age、occupation订单表字段为order_id、user_id、order_time、product_type、pay_amount、city注意这里的行为日志表和订单表里都有city字段但含义不同前者是用户当时访问行为里关联的城市比如浏览的攻略所属城市后者是订单里的出发城市。如果不加区分直接合并就会把“用户看的是什么城市的内容”和“用户要从哪个城市出发”搞混。4.2 清洗与合并的完整步骤第一步读取数据并做初步探查import pandas as pd df_log pd.read_csv(visit_log_sample.csv) df_user pd.read_csv(user_base_info_sample.csv) df_order pd.read_csv(order_sample.csv) print(df_log.shape, df_user.shape, df_order.shape) print(df_log.head()) print(df_log.dtypes)先看数据规模和字段类型确认有没有读取异常。我在做这一步时一定会看每个字段的缺失率和取值分布而不是急着清洗。第二步去重# 行为日志去重 df_log df_log.drop_duplicates() # 如果同一用户同一时间同一页面出现两次视为重复日志 df_log df_log.drop_duplicates(subset[user_id, log_time, page_url]) print(去重后行数:, len(df_log))行为日志的重复问题在日志重传时特别常见。去重时建议用“用户时间页面”的组合作为重复判定的条件而不是简单地对整行去重因为一次点击可能同时被两个事件监听器各记录一次。第三步统一时间格式# 统一所有时间字段为datetime类型 df_log[log_time] pd.to_datetime(df_log[log_time], errorscoerce) df_order[order_time] pd.to_datetime(df_order[order_time], errorscoerce) df_user[register_time] pd.to_datetime(df_user[register_time], errorscoerce) # 对无法解析的时间做丢弃处理 df_log df_log.dropna(subset[log_time])时间字段是画像计算中最容易出现隐性问题的字段。字符串格式的2026-03-08 12:30:45和2026/03/08 12:30:45如果不统一转换排序和区间判断就会出问题。errorscoerce参数会把无法解析的时间变为NaT再统一丢弃这样至少不会报错。第四步城市名称归一化def normalize_city(name): if not isinstance(name, str): return 未知 name name.strip().replace(市, ).replace(省, ) if name in (BJ, beijing, 北京): return 北京 if name in (上海, SH, shanghai): return 上海 if name in (广州, GZ, guangzhou): return 广州 return name df_log[city_normalized] df_log[city].apply(normalize_city) df_order[city_normalized] df_order[city].apply(normalize_city)这一步看起来简单但在旅游网站里特别重要。搜索关键词里可能写的是“北京攻略”“北京出发”等等订单表里可能出现的是“北京市”这些都需要统一成标准的地域标签否则后面按城市聚合统计时会算出两个完全不同的“北京”。第五步处理缺失值和异常值# 年龄字段超出合理范围的置为缺失 df_user.loc[(df_user[age] 0) | (df_user[age] 100), age] None # duration字段为负数的置为缺失 df_log.loc[df_log[duration] 0, duration] None # 用中位数填充时长缺失值 median_duration df_log[duration].median() df_log[duration] df_log[duration].fillna(median_duration) # 职业字段缺失填充为未知 df_user[occupation] df_user[occupation].fillna(未知)年龄范围校验是最容易被忽略的清洗步骤。0岁和100岁以上的用户来源基本是脏数据或测试用户直接放进画像标签里会污染年龄分布。而且在实际项目中我发现很多做数据采集时年龄字段甚至会出现-1这种占位符如果不用范围校验这些占位符会直接变成一个看起来“正常”的负值后续统计年龄均值时结果惨不忍睹。第六步行为日志的维表聚合# 按用户聚合行为指标 df_user_behavior df_log.groupby(user_id).agg( visit_days(log_time, nunique), avg_duration(duration, mean), total_pages(page_url, count), last_visit_time(log_time, max) ).reset_index()把明细级的行为日志聚合成用户级的行为指标是画像建设中最常见的操作。visit_days统计的是用户活跃了多少天不是访问了多少次因为一个用户一天访问100次和每天访问1次代表了完全不同的使用习惯。这里用nunique是为了获取unique的天数。第七步订单表聚合出消费指标df_user_order df_order.groupby(user_id).agg( total_orders(order_id, count), total_amount(pay_amount, sum), avg_order_amount(pay_amount, mean), first_order_time(order_time, min), last_order_time(order_time, max) ).reset_index()订单聚合得到的是消费维度的核心指标这些指标的基本单位是用户的累计消费和平均消费。如果在这一步没有做前期的异常值清洗一个金额特别大的异常订单就会把avg_order_amount拉高直接影响用户的消费等级评估。第八步数据合并成宽表# 先把用户基础表、行为聚合表、订单聚合表统一按user_id为索引 df_user df_user.set_index(user_id) df_user_behavior df_user_behavior.set_index(user_id) df_user_order df_user_order.set_index(user_id) # 纵向合并多个月的行为日志后再聚合这里演示横向拼接宽表 df_profile pd.concat([df_user, df_user_behavior, df_user_order], axis1, joinouter) df_profile df_profile.reset_index() print(df_profile.head()) print(df_profile.shape)在concat三个DataFrame前我刻意把每个表的索引都设置成了user_id这样concat才是在每个user_id内部进行字段拼接而不是按行位置盲目拼接。这一步是我之前强调过的索引对齐关键点。合并后得到的df_profile每一行就是一个用户每一列就是一个画像维度的特征字段这就是画像宽表的雏形。4.3 数据质量校验清单宽表生成后在开始做标签之前我建议按下面的清单检查一遍确认数据没有在清洗过程中被有意无意地改出问题总行数应与用户基础表的唯一用户数一致不应出现同一用户两行的情况各字段的缺失率应处于合理范围比如行为类字段缺失率突然变高说明聚合逻辑或join方式可能有问题消费金额字段的分布应近似幂律分布不应出现负值或极端值聚簇用merge连接时检查合并前后行数变化确认没有出现一对多连接导致的爆炸式增长数据清洗和合并是整个画像环节里最不“炫技”但又最核心的部分。我在项目里看到过太多因为城市名不统一导致地域统计偏差的场景也反复遇到过直接用concat默认索引导致横向拼接错位的翻车现场。这些坑一旦踩过是真的长记性所以我强烈建议你在动手建标签之前先把清洗和合并这两个基础环节打磨好。5. 常见问题与排查技巧实录5.1 用户身份统一cookie、设备ID、注册ID怎么打通做画像时最头疼的问题莫过于识别“这个用户和那个用户其实是同一个人”。旅游网站的场景里用户可能先用微信小程序浏览了一圈之后又通过App下了订单中间还换过一次手机。如果只看单一来源的ID这三个行为会被当成三个不同的用户。我处理ID-Mapping问题的思路是建立多级用户ID体系注册登录后的user_id作为唯一主键设备ID和cookie ID作为关联的辅助ID。用户未登录时通过设备ID暂时关联行为一旦登录就将设备ID下的所有历史行为和注册user_id进行合并。这个方案不完美会存在一定误差比如同一台设备被家庭成员共用等情况但在没有更高级的跨设备识别技术手段的前提下这是可解释性最强、也最好维护的方案。5.2 数据倾斜头部用户的一己之力拉偏整个画像旅游网站用户的行为数据往往极度倾斜。全站可能有5%的头部用户贡献了30%的流量和40%的GMV。如果分析师直接用平均值来刻画用户特征经常会出现“我们用户的平均客单价是3800元”这种结论但实际有超过一半的用户客单价不到2000元——这个平均值被少数商务旅客和高端定制用户拉高了。在处理这类问题时我基本不用均值做标签而是用分位数。每个维度的取值都要同时看P25、P50、P75等多档分位数。给用户打消费等级标签时我一般采取分段方式客单价位于P25以下标记为“低价偏好”P25-P75为“中等消费”P75以上为“高消费”。用分位数而不是绝对值还能顺便避开不同时间段的物价差异问题。5.3 时间窗口对齐画像标签的“保质期”问题有个新人在项目中做过一个用户活跃等级标签用的是用户近30天的行为数据。标签上线时效果很好但两个月后业务方反馈说这个标签越来越不准了。排查下来发现画像任务一个月才重跑一次而标签的定义是“近30天活跃”一个月跑一次意味着标签用的数据和实际时间之间最长有60天的时间差当然不准。标签必须有明确的更新频率和时效性说明。我的经验是静态属性类标签性别、年龄、注册时间可以一个月更新一次行为类标签活跃度、兴趣偏好应该至少每天或每周增量更新特别是“最近一次访问时间”这种用于流失预警的标签必须天级甚至小时级更新否则拿去判断沉默用户会造成大量误判。5.4 concat()合并时最容易翻车的3个细节关于concat()的使用我在实操中遇到的翻车场景基本集中在三个地方第一个是忽略了ignore_index参数的作用。在纵向合并时如果不加ignore_indexTrue合并后的行索引会保留原来每个DataFrame的索引可能出现大量重复索引。虽然df本身还能用但在后续按索引定位或reset_index时很容易出错。第二个是在横向合并时没有对齐主键。前面提过concat默认是按索引位置对齐的两个DataFrame行顺序不一致时结果就会串行错乱。横向合并前务必确认索引是否为主键且唯一。第三个是列名冲突。横向concat时如果两张表有同名字段比如订单表和用户表里都有city字段生成的新表里会出现city和city_1两列。这个不一定是错的但如果不加区分直接用就会在后续建模时被当成两个不同的特征带来隐患。5.5 标签上线前的仔细核对比什么都重要最后分享一个我自己的习惯任何画像标签在正式上线前我都会抽样200个用户做人工核对。具体做法是随机挑出用户然后根据原始日志和订单一条条对照标签是否合理。核对的目的不是说真的要找到哪个标签算错了而是逼自己从“能跑出结果”到“验证结果是对的”。记得有次我给用户做“出行偏好”标签抽样时发现很多用户的偏好集中在“哈尔滨”但明显不合理。查下来发现源头是一个测试账号刷了大量哈尔滨冰雪节的页面这些行为被正常纳入统计还因为访问次数多权重高直接盖过了真实偏好。从那以后我养成了每个标签上线前必做抽样核对的习惯。这个习惯的投入产出比极高强烈建议照做。画像项目做到最后拼的其实不是算法多高级工具多先进而是对数据的敬畏心和对细节的把控力。7大维度是框架数据清洗和合并是地基标签准确是目标业务落地是终点。每一步都踏踏实实走完用户画像才能真正从一个概念变成一个业务方离不开的数据资产。
返回列表