资讯动态

用户行为分析实战:从数据清洗到漏斗、分层与留存复购

发布时间:2026/10/13 10:44:42 来源:尧图企业网站定制
做数据分析这几年我最怕接到的一种任务是领导不知道从哪里弄来一份几亿行的用户行为日志往桌上一扔“帮我看下用户每天都来逛为什么就是不买”你要是接过类似的活儿应该能体会到那种感觉——数据量大得吓人字段却少得可怜业务口径也不清不楚乍一看根本不知道从哪下手。这篇文章要聊的就是这类电商平台用户行为数据的完整分析过程。我用的是一份网上流传较广的公开数据集业内通常叫它淘宝用户行为数据集里面记录了用户在平台上产生的浏览、收藏、加购、购买四种行为。文章会从数据清洗讲到指标口径再到漏斗分析、用户分层、留存复购的拆法最后落到运营动作。适合刚接触用户行为分析的数据分析师、产品经理和运营同学参考也适合想拿真实数据练手的学习者。1. 数据长什么样一份行为日志的字段与规模1.1 五个字段每一行就是一次用户操作拿到数据之后先别急着跑数第一件事是把字段说明书读透。这份数据脱敏之后非常简单核心字段就五个字段类型业务含义user_id字符串/数值脱敏后的用户唯一标识item_id字符串/数值被操作的商品IDcategory_id字符串/数值商品所属类目IDbehavior_type枚举字符串行为类型pv、fav、cart、buytimestamp数值操作发生的Unix时间戳每一行数据都表示“某个用户在某一个时刻对某一件商品做了一次某种操作”。这个粒度非常干净但也非常原始很多分析所需的维度比如商品价格、订单金额、用户所在城市在这里都拿不到。后面你会看到这直接决定了分析方案的选型。数据规模方面常见公开版本大概是这样一个量级覆盖约一个月的天数总行数在亿级去重后的用户数在十万到百万之间去重后的商品数在百万量级。一个月时间不算长但已经足够做趋势分析、漏斗分析和留存分析。第一次打开这份数据的人十有八九会被它的体积吓到但冷静下来看其实它的结构远比想象中简单难点从来不在“能不能跑动”而在“怎么提出正确的业务问题”。1.2 四种行为值的含义不是官方文档里才有答案behavior_type这一列一共四个值这是整份数据的灵魂pv用户浏览了商品详情页也就是“看了一眼”。fav用户收藏了商品表达的是“有兴趣但还没想好”。cart用户把商品加入了购物车往往是“有购买倾向”的信号。buy用户完成了付款这是最终转化目标。很多教程会把这四个行为画成一条笔直的漏斗浏览→收藏→加购→购买。但实际上用户的真实路径要发散的。有人不加购不收藏浏览完直接下单有人收藏了三个月之后才回来买也有人反复加购再删掉最后去别的平台买了。分析的时候能按经典漏斗看整体流失但不能假设每个人都走同一条路。这里可以补充一个容易被忽略的点不同平台的埋点定义不一样。在有些产品里pv是按“页面打开次数”算的另一些则按“用户点击商品次数”算。你拿到这份数据之后可以先用一个简单的分组统计看看每个行为值的行数占比再结合业务逻辑去判断。如果buy的行数少得离谱或者pv的行数多得不正常大概率是先要确认埋点口径的。1.3 亿级行数的处理思路与工具选型说到处理工具我不推荐一上来就上大集群。亿级行数听起来吓人但字段只有五个单机也能玩得转。我自己的习惯是分两步走先用SQL做初步的探索和聚合比如总量统计、按天统计、行为分布这类轻量查询。SQL写起来快结果直观适合摸数据的底细。然后再根据分析目标把需要的数据提取出来用Python做更细的用户级处理比如行为序列拼接、特征加工、分群聚类。如果本地环境跑不动全量数据通常有两个选择一是换一个列式存储引擎比如DuckDB装起来只需要一个文件查询速度在亿级数据上也非常快对个人分析来说足够用二是做抽样这个我放到后面讲因为抽样方式直接决定后续分析靠不靠谱。总之先把“能不能跑”的问题解决掉再谈“怎么分析”。2. 动手清洗数据时绕不开的几类脏数据2.1 完全重复与短时重复去重要分场景任何一份真实的行为日志拿过来第一件事都是查重复。这里要分两种重复看。第一种是完全重复也就是同一行数据出现了两次。这种情况通常来自数据上报过程中产生了冗余或者上游做了多份拼接。处理方式很简单直接按照四个核心字段加时间戳做去重SELECT DISTINCT user_id, item_id, category_id, behavior_type, timestamp FROM raw_user_behavior;第二种是短时重复也就是同一个用户、同一件商品、同一种行为在一两秒内连续出现多次。这种要小心它背后可能是用户手滑、页面刷新、网络重试也可能是埋点本身重复上报。遇到这种情况我的建议是先统计一下“同一用户同一商品同一行为在1秒内重复出现”的行数占比如果整体比例不高可以直接按分钟级别聚合后再做分析如果比例很高就要检查埋点问题而不是在分析层反复清洗。但千万别把所有重复都当作脏数据。一个用户反复浏览同一件商品、收藏之后取消再收藏、加购之后又删掉这些行为本身携带强烈的兴趣和犹豫信号是有业务价值的。清洗的目的是去掉“无意义的重复噪声”而不是把用户真实操作的痕迹抹平。2.2 异常用户、异常时间与极端行为接下来是异常值检查我通常从四个维度过一遍用户ID是否有效。拿出数据后先看user_id有没有为0、为负、为空的情况。如果有直接过滤掉的合理性是很高的因为后续所有分析都需要关联用户身份。商品ID是否能对上商品维度。如果有一大批商品ID在商品表里根本查不到那要么是商品下架后被清理了要么是发数的时候两边口径不一致。时间戳是否在数据范围内。数据声称覆盖一个月但里面可能混入明天的时间也可能是两年前的老数据这类数据会污染趋势分析直接按业务限定的日期范围过滤。极端行为频率。一小时内产生上千次浏览的用户或者一天内疯狂加购数百件商品的用户大概率是爬虫、竞对采集脚本或测试账号。对于这种用户我一般会做分位数分析观察用户日均行为次数的长尾分布把顶层极少数的用户单独拎出来看确认后再决定是否剔除。这里有一个重要的经验异常值处理不要一上来就一句“删除”。一定要先统计每类问题占多少比例如果比例很低比如千分之一以内直接剔除对整体结论影响不大如果比例很高说明数据链路可能出了大问题这时候过滤得越“干净”结果越失真。我的做法是先把异常行打标记分别跑一遍“含异常”和“剔除异常”的版本对比核心指标差异差异在可接受范围内再动手清理。2.3 抽样策略按用户抽别按行抽很多初学者拿到亿级数据的第一反应是跑不动就随机抽1%的行吧。这个操作错得很隐蔽后果却非常严重。用户行为数据是一个时序序列同一用户的浏览、加购、购买分散在不同时间点。如果按行随机抽样一个用户可能在样本里只剩一次浏览他的完整行为链被切断了后面无论做漏斗、做留存、做复购算出来的结论都会偏掉。正确的做法是对用户ID做哈希取模按用户粒度抽样。比如想抽10%的用户SELECT * FROM user_behavior WHERE abs(hash(user_id)) % 100 10;这样抽出来的样本里一旦选中了某个用户他全时间窗口内的所有行为都会被保留。抽样之后也别直接开跑先核对三件事抽样用户数是否接近预期的10%、行为总行数占比是否合理、pv/fav/cart/buy四种行为的分布和全量是否大体一致。如果对得上再放心往下做。3. 核心指标口径PV、UV、转化率先统一再分析3.1 基础流量指标怎么算不管分析目标多复杂起步都要先回答三个基础问题有多少人来了、来了多少次、平均每个人看了多少东西。PV也就是页面浏览数在行为数据里就是behavior_typepv的行数SELECT COUNT(*) AS pv_cnt FROM user_behavior WHERE behavior_type pv;UV是独立访问用户数就是出现过的去重用户数SELECT COUNT(DISTINCT user_id) AS uv_cnt FROM user_behavior;这两个数相除得到人均浏览数也就是每个用户平均看了多少个商品详情页。别小看这个数它是衡量“逛”的深浅的关键指标。如果数据正常的话你会发现总有些人一天浏览几百个商品也有些人一天只看一两个就下单了。把这两个人群分开看行为模式差异会非常明显。3.2 四类行为之间的转化率口径用户行为分析里最怕的就是口径不统一。同一个转化率有人用行为次数算有人用去重用户数算结果能差出好几倍。我自己的习惯是凡涉及转化率默认都用去重用户数做分子和分母因为它回答的是“有多少用户走到了下一步”而不是“有多少次行为发生了转化”。行为次数容易受极端用户影响一个疯狂点击的用户能把整体比率拉得很难看。核心的几个口径可以这么定义指标计算方法业务含义浏览→收藏率收藏用户数 / 浏览用户数商品对用户的吸引力浏览→加购率加购用户数 / 浏览用户数用户的购买意向强度浏览→支付率支付用户数 / 浏览用户数最终成交转化能力加购→支付率支付用户数 / 加购用户数购物车转成交的能力对应的SQL可以这样写SELECT COUNT(DISTINCT CASE WHEN behavior_type pv THEN user_id END) AS uv_pv, COUNT(DISTINCT CASE WHEN behavior_type fav THEN user_id END) AS uv_fav, COUNT(DISTINCT CASE WHEN behavior_type cart THEN user_id END) AS uv_cart, COUNT(DISTINCT CASE WHEN behavior_type buy THEN user_id END) AS uv_buy, COUNT(DISTINCT CASE WHEN behavior_type buy THEN user_id END) * 1.0 / NULLIF(COUNT(DISTINCT CASE WHEN behavior_type pv THEN user_id END), 0) AS pv_buy_rate, COUNT(DISTINCT CASE WHEN behavior_type buy THEN user_id END) * 1.0 / NULLIF(COUNT(DISTINCT CASE WHEN behavior_type cart THEN user_id END), 0) AS cart_buy_rate FROM user_behavior;跑出来之后先不要急着对比行业均值。不同平台、不同品类、不同活动周期转化率的差异都非常大。最健康的对比方式是自己跟自己比——不同月份比、不同类目比、不同用户群比形成纵向和横向的参照系之后指标才有决策价值。3.3 时间粒度日、小时、周期性的影响同样的指标换了时间粒度看结论可能完全不同。按天看你能发现整体流量的季节性。比如工作日的浏览和周末的浏览明显不一样促销日前后会有尖峰。按小时看你能找出用户活跃时段晚上和午休是两个典型高峰。按周看又能观察到稳定的周期节奏。做分析的时候这三个粒度最好都拆一遍因为运营动作的节奏和它们强相关。有一个容易被忽略的细节是转化率的时间稀释效应。在流量尖峰时段浏览量大增但如果增量用户都是随便逛逛的泛用户整体转化率反而会被稀释。所以看到一个时间段的转化率下降先别下“业务变差”的结论很可能只是流量结构变了。要拆开看新增用户与老用户的比例变化再判断问题出在哪。4. 从浏览到成交流失到底发生在哪一环4.1 先拆一个整体漏斗分析用户流失最经典的手段就是行为漏斗。把用户从第一次浏览到最后一次购买按行为节点拆成几步每步算出去重用户数就能看到每个环节流失了多少人。具体做法是分别筛选出有浏览行为、有收藏行为、有加购行为、有支付行为的用户然后看它们之间的包含关系。这里要注意漏斗的多个步骤之间不是严格的“必须经历过上一步才能进入下一步”有些人可能是直接购买没有加购的。所以经典漏斗更准确的叫法是“行为覆盖漏斗”它回答的问题是这些行为的用户规模是怎么步步收窄的。跑出来的结果通常会让业务方惊讶浏览用户基数巨大但收藏和加购的用户明显减少最后完成支付的用户只剩一个零头。关键的流失点往往不在“购买”这一步而是“从浏览到加购”或“从加购到支付”之间。不同数据表现不同但只要你把漏斗拆出来就能快速锁定需要重点关注的环节。4.2 分品类看漏斗结论完全不同整体漏斗看完一定要按类目拆开再看一遍否则会被平均值掩盖真相。高频低价类目比如食品、日用品用户决策轻浏览到加购的转化会明显更高加购到支付的链路也相对顺畅。低频高价类目比如家电、家具用户要反复比较收藏和加购大量发生但从加购到支付的转化会低很多因为客户需要攒钱、比价、等促销。这说明什么说明不能用同一个标准去考核所有类目。如果只看整体漏斗而制定一个“加购转支付率不能低于某个值”的硬指标那么高价类目的运营会怎么努力都达不成低价类目又早早超标无处优化。正确的做法是把漏斗拆到类目层级甚至拆到品类层级为不同价格带、不同决策周期的商品设置差异化的健康水位。4.3 购买用户与非购买用户的行为差异漏斗告诉我们“在哪里流失”而要回答“为什么流失”得进一步对比购买用户和非购买用户的行为模式。我常用的一个对比维度是购买用户在成交之前平均浏览过多少个商品、收藏过多少个商品、加购过多少个商品非购买用户在观察窗口内这些数字又是多少。通常情况下购买用户在成交前会有更深的浏览深度收藏和加购的触发次数也明显更多。这不是说浏览多就一定买但它说明用户在下单之前有一个“信息搜集和比较”的过程。还有一个维度是时间跨度。有些用户第一次浏览之后就很快购买有些用户断断续续逛了一周甚至一个月之后才下单。把这两个人群拆开看你会发现运营触达的时机需要跟着决策周期走。对快速决策用户接续的推荐和促销要及时对慢决策用户持续的内容触达和价格提醒比一次性优惠更有用。5. 用户价值分层RFM之外的另一套拆法5.1 为什么这套数据没法直接用RFM在电商用户分析里RFM是再经典不过的分层方法用最近一次购买时间Recency、购买频率Frequency、购买金额Monetary三个维度给用户打分。但这份数据里没有订单金额字段M这个维度直接失效。更重要的是行为日志的价值恰恰在于那些“还没买”的意向信号。一个用户今天收藏了十件商品但什么都没买RFM会把他归为低价值用户但从行为强度看他可能是典型的“高意向待转化”人群。所以只盯着成交做价值评估会漏掉大量业务机会。在这种情况下我更喜欢用行为加权分来做分层底层再结合购买行为做交叉验证。5.2 用行为评分代替金额维度思路很简单给四种行为赋予不同的权重然后按用户汇总出一个“行为价值分”。权重没有标准答案要根据业务对每种行为的重视程度来定。我常用的一组权重是行为权重理由浏览1基础兴趣信号收藏3有明确兴趣但暂无紧迫性加购5强购买意向购买10完成转化比如一个用户在一个观察窗口内浏览了50个商品、收藏了5件、加购了2件、购买了1件他的行为价值分就是50×1 5×3 2×5 1×10 85分。这个分数可以按整个观察窗口算也可以按每天或每周归一化看哪种更能反映活跃强度。有了分数之后再叠加两个辅助维度购买次数和最近活跃时间。行为分解决“有多想要”购买次数解决“已经买过几次”最近活跃时间解决“现在还来不来”。三个维度交叉就能形成比RFM更适合同类型数据的分层框架。5.3 四类用户群的特征与运营侧重基于行为价值分和购买次数我通常会先把用户切成四类用户群特征运营侧重核心买家行为分高、购买次数多维护和激励优先服务逛客行为分高、购买次数少种草转化推荐和促销引导潜水买家行为分低、但买过唤醒激活防止彻底流失沉睡用户行为分低、购买少低优先级大促批量触达这里需要着重聊一下“逛客”这个群体。他们在数据里非常显眼收藏加购一大堆浏览深度高但就是不付款。这类用户不是没需求往往卡在价格、信任或者时机上。对于他们定向推送降价提醒、限时券、同类商品推荐转化潜力通常比沉睡用户高得多。把逛客从整体用户里分出来单独运营是行为分层最有价值的应用之一。6. 留存与复购用户来了之后还来不来6.1 用同期群分析看留存拉新固然重要但用户来了之后留不留得住才是健康度的真正标尺。留存分析的标准做法是同期群分析也就是把用户按照“首次产生行为的时间”分成不同批次然后观察每个批次在后续第1天、第7天、第30天还有多少比例的人回来。这里有个口径要先定清楚什么叫“回来”浏览算不算活跃还是必须有点击、加购、购买才算我通常定义“活跃”为“当天产生了任意行为”另外再单独定义一个“高意向活跃”为“当天产生了收藏或加购”。前者看整体粘性后者看购买意愿的持续程度。实际操作时可以先给每个用户打上首次行为日期SELECT user_id, MIN(DATE(from_unixtime(timestamp))) AS first_date, DATE(from_unixtime(timestamp)) AS active_date FROM user_behavior GROUP BY user_id, DATE(from_unixtime(timestamp));有了这张表再按首次日期分桶把每天的活跃用户数和首日用户数对比就能画出留存活跃率矩阵。如果你发现次日留存很低大概率是拉新渠道来的用户质量不行如果次日留存不错但7日留存大幅下滑说明产品缺少持续回访的理由需要靠内容和权益来补。6.2 复购率与回购周期怎么算复购分析的第一个问题是时间窗口。观察窗口太短高价商品用户还没来得及做第二次购买复购率天然很难看观察窗口太长又容易把不同决策周期的商品混在一起。我的经验是分窗口看7天复购率、30天复购率、90天复购率都算出来然后按类目对比。复购率的计算口径也要统一。常用的定义是在某时间窗口内购买次数大于等于2次的用户数除以购买用户数SELECT COUNT(DISTINCT CASE WHEN buy_cnt 2 THEN user_id END) * 1.0 / COUNT(DISTINCT user_id) AS repeat_rate FROM ( SELECT user_id, COUNT(*) AS buy_cnt FROM user_behavior WHERE behavior_type buy GROUP BY user_id ) t;还有一个值得算的指标是平均回购周期也就是用户在第一次购买之后平均隔几天会买第二次。这个指标能直接帮你设计召回节奏。比如平均回购周期是15天你第十天发优惠券、第十四天再提醒一次就比用户已经忘记产品之后再做活动有效得多。6.3 活跃不买和买后沉睡是两批人有一个误区需要纠正很多团队把“不活跃的用户”和“不买的用户”混为一谈然后用一套召回话术去触达所有人。实际上从行为数据看这是两类完全不同的人。活跃但不买的用户天天在逛、在收藏、在加购只是没有下单。他们不缺触达渠道缺的是临门一脚的理由。买后沉睡的用户已经证明过自己的付费意愿只是最近没有回来。前者的重点是促进首购或二次转化后者的重点是激活回访两者需要的权益、内容和触达频率都不应该一样。可以用一个简单的四象限把用户分出来横轴是最近一次购买的远近纵轴是最近一次浏览的远近。落在“最近有浏览、最近没购买”象限的是逛客型召回池落在“最近没浏览、最近有购买”象限的是沉默回访池。分别运营比混在一起发同一批短信要有效得多。7. 从分析结果到运营动作落地策略与踩坑记录7.1 不同断点对应的改进方向漏斗分析指出了问题但“指出问题”不等于“解决问题”。针对不同流失环节可以初步设定不同的改进方向。需要强调的是这些只是分析给出的假设方向真正的因果关系要靠AB实验去验证。如果是浏览到收藏的转化低大概率是商品信息本身不够打动用户。可以优化详情页的描述、图片、评价内容也可以做导购类的专题内容让用户从“看”变成“认可”。如果是收藏到加购的转化低往往差在一根导火索上比如价格波动、库存紧张提示、限时优惠的力度不够。如果是加购到支付的转化低问题多半出在结算环节和优惠门槛比如满减规则太复杂、运费过高、支付链路受阻。我自己踩过最深的坑是拿着分析结果直接给业务下结论“加购到支付流失严重所以应该降低满减门槛。”后来AB实验跑完发现门槛根本不是主要因素用户卡在结算流程的支付方式上。从那以后我养成了一个习惯给策略之前先标注这句话的风险等级是实验结果还是推测方向别把假设当结论。7.2 分群运营的动作清单分层结果如果只停留在报表里等于白做。落地上我会把分群和具体运营动作对应起来核心买家给专属客服、免邮券、会员积分目标是维护忠诚度、提升客单价。逛客把人放入推荐算法的“高意向未购人群”推送相似商品、降价提醒、站内信优惠目标是促成第一次购买。潜水买家用限时回归福利加短信或Push做召回目标是把买过的人重新激活。沉睡用户在大促节点做批量触达不频繁打扰控制营销成本。这里有一个合规和经验层面的提醒基于用户行为做触达时一定要遵守平台规则和个人信息保护要求。分析能做的是“找出哪些人更容易被转化”但“能不能触达、怎么触达”是另一套规则体系。7.3 给刚开始做用户行为分析的人三条建议第一先定义清楚业务问题再写SQL。很多人拿到数据先跑一通分布跑完也不知道下一步干什么。正确的方式是想清楚“要优化的是什么”然后让数据围绕这个目标展开。第二不要一上来就上机器学习模型。行为日志分析里漏斗、分群、留存这些基础方法能解决80%的问题而且解释成本低。模型再复杂如果业务方听不懂、不信任、不落地价值也是零。第三指标口径必须留档。同一个转化率用UV算和用PV算是两个数用全量算和用抽样算又是两个数。把口径、代码、处理逻辑记录下来等两周后业务方来问你“上次那个数怎么出来的”的时候你会感谢当初多写的那几行说明。这份数据我前前后后用不同方法跑过好几轮每次都会发现一些新的东西。用户行为分析就是这样数据不会直接告诉你答案但它会告诉你该往哪看。把基础动作做到位比追求花哨算法更值钱。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑