☰
直播电商用户流失分析实战:从RFM分层到XGBoost预警模型
2026/10/3 11:32:10 网站建设 项目流程

做了快三年数据分析,我一直觉得流失分析是最容易做也最难做出价值的方向。说容易,是因为流失分析思路相对固定:定义流失、圈用户、看特征、给策略。说难,是因为在实际业务里,尤其是直播电商这种强实时、强互动、强主播绑定的场景里,流失的定义和分析框架,跟传统货架电商几乎不是一回事。

我之前在一个直播电商团队做用户增长分析,当时业务处于快速扩张期,运营最关心的不是拉新,而是“进来的人为什么留不住”。大盘GMV一有波动,老板就问是不是老用户走了。但问到“老用户”是谁、怎么定义流失、流失之前做了什么,运营侧答不上来,数据侧也没有现成的口径。于是我做了一整套“直播电商用户流失分析”项目,从埋点梳理、数据清洗,到RFM分层、流失预警模型,再到可视化看板和运营干预策略,基本完整走了一遍。

这篇文章就把这个项目完整拆开讲,包括我踩过的坑、走过的弯路,以及最后沉淀下来可复用的方法和代码。内容会比较长,适合正在做用户增长分析、电商数据分析,或者想入门数据分析和用户流失分析的朋友,你可以直接把它当成一份带注释的实操笔记来用。

1. 整体设计思路:先想清楚直播电商的“流失”到底是什么

1.1 直播电商用户流失的特殊性

传统电商的用户路径是“搜索-浏览-加购-下单”,用户跟平台之间的连接点是商品和搜索算法。用户今天不买,可能只是没有需求,不能说流失。但直播电商不一样,用户进来的核心触发点是“主播”,消费行为高度依赖直播场次的时间窗口。晚上8点开播,用户来了,主播下播,这个场次的流量就断了。

所以直播电商的流失,天然带着两个特征:一是强时间窗口,用户错过几场直播、连续几天不来,可能就被别的主播抢走了;二是强主播绑定,用户可能不是离开平台,而是离开某个主播或某个品类,但这在业务上依然算流失,因为平台没有承接住他的注意力。

这个差异直接影响了流失的定义。你在货架电商里可以用“90天未下单”作为流失口径,但在直播电商,90天太长了。直播的运营节奏是按周甚至按天走的,一般超过14天没有观看行为,用户基本已经从心智里抹掉了这个直播间。更合理的做法是分层定义:7天未访问算沉默,14天未访问算预流失,30天未访问算流失。后面我会详细讲这个口径怎么确定。

1.2 分析框架:从“问题树”倒推指标体系

开始动手清洗数据之前,我先把业务问题拆成了一棵问题树。流失分析的核心问题不是“流失率是多少”,而是三个递进的问题:

  • 谁流失了?——流失用户的规模和画像
  • 为什么流失?——流失前有哪些行为信号
  • 怎么干预?——针对不同人群做哪些策略

围绕这三个问题,我建了一套指标体系,分为三层:

第一层是结果指标,包括流失率、留存率、用户生命周期时长。这一层是给管理层看的,回答“情况有多严重”。

第二层是行为指标,包括观看频次、观看时长、互动次数、下单频次、客单价、优惠券使用率。这一层是给运营看的,用来定位流失前的行为拐点。

第三层是前置预警指标,包括最近一次观看距今间隔、连续未访问天数、直播间停留时长下滑幅度、加购未支付次数。这一层是给策略做的,提前识别风险用户。

这个框架的好处是,它把数据分析从一个“统计报告”变成了一套“诊断工具”。我后面所有的建模和可视化,都是围绕这三层指标展开的,避免陷入“为了分析而分析”的陷阱。

1.3 数据源梳理与技术选型

做用户流失分析,基础数据跑不掉这几类:

  • 用户注册信息:用户ID、注册时间、性别、年龄、地域
  • 直播场次数据:直播间ID、主播ID、开播时间、下播时间、场次时长
  • 直播间行为数据:用户进入/离开直播间、观看时长、点赞、评论、关注、分享
  • 订单数据:订单ID、用户ID、商品ID、实付金额、下单时间、支付状态
  • 营销数据:优惠券领取与核销记录、站内消息触达记录

从数据形态来看,行为数据和场次数据是典型的事件日志,量级最大,订单和用户信息则是结构化表。做这类项目,MyBatis、Hive或SparkSQL这类工具都能处理日志,但因为我这边核心数据量是千万级,用Pandas直接处理也扛得住,所以我用Python做主分析语言,数据加工以Pandas为主,抽样和聚合查询放在SQL层面完成。

这里给你一个忠告:不要在Python里做全量数据的复杂join,会很痛苦。正确做法是先让SQL把数据聚合到用户粒度或事件粒度,再用Python做特征工程和建模。数据量再大一些,用Spark跑同样的逻辑也顺畅,思路迁移成本不高。

2. 数据清洗与特征工程:流失分析最耗时也最关键的环节

2.1 用户ID的一致性处理

我在项目初期踩过最大的坑,是用户身份ID不一致。直播业务里,用户可能在小程序里用open_id,在App里用user_id,在H5页面用游客ID。同一个用户,在不同端登录,后台可能存成多个身份。如果不做用户ID映射,直接做用户级聚合,数据会严重失真。

处理方案是建立一张用户身份映射宽表,把同一用户的open_id、user_id、设备ID通过登录日志和手机号绑定关系关联起来,确定一个主ID。实际操作中,我用的是用户手机号+设备指纹的匹配逻辑,做成一个标准化的UID。这个映射关系不只这次分析能用,后续所有用户级分析都能复用,值得仔细设计。

代码逻辑类似于:

import pandas as pd # 读取登录日志和用户绑定信息 login_log = pd.read_sql("SELECT user_id, open_id, device_id, login_time FROM dwd_login_log", conn) user_bind = pd.read_sql("SELECT user_id, phone_no, register_time FROM dim_user_bind", conn) # 以手机号为关联键,合并出主UID user_mapping = user_bind.merge(login_log, on="user_id", how="left") user_mapping["main_uid"] = user_mapping.groupby("phone_no")["user_id"].transform("first")

这一步做完,后续的留存计算、RFM分层、建模特征,都统一用main_uid来跑。如果你所在公司有成熟的CDP平台,这批活通常是平台工具帮你完成的,但如果你所在的团队数据基础薄弱,这个映射逻辑就得自己扛过来。

2.2 时间窗口对齐与流失标签构造

流失分析绕不开一个时间基准点。看历史数据时,每个用户的观察窗口长度不一样。有人注册了300天,有人才注册20天,如果一刀切统计“是否流失”,对新人极不公平。

我当时的处理是引入“观察期+表现期”的时间窗结构。以某个参考日期(例如统计截止日)为基准:向前取90天作为观察期,用来计算用户的行为特征;向后取14天作为表现期,用来标记是否流失。这样每个用户在观察期起点都必须已经注册超过90天,且观察期内有至少一次有效进入直播间的行为。

流失标签的定义也很关键。结合直播电商的运营节奏,我采取了14天口径,具体定义是:用户在观察期结束后,连续14天没有任何进入直播间的行为,且无下单记录,标记为流失。这里特意把“进入直播间”作为第一判定条件,而不是订单。因为直播电商里,用户来看但没有买,依然有召回价值;如果连来都不来了,才是真正的流失信号。

2.3 特征工程:让流失信号浮出水面

有了标签,后面就是造特征。特征工程这个环节直接决定了模型效果的天花板。我这边大概做了四组特征:

第一组是频次与近度特征,主要包括观察期内总观看天数、观看天数占比、平均每周观看场次、最近一次观看距观察期结束的天数。近度特征尤其重要,它反映的是用户当下的活跃状态。任何时候,最近一次互动距今越近,流失概率越低。

第二组是消费特征,包括总支付金额、支付订单数、客单价、最大单笔金额、退款率、优惠券核销占比。这一组回答的是“用户花了多少钱、怎么花的”,用来衡量用户价值。

第三组是互动深度特征,包括场均观看时长、场均评论数、点赞数、关注主播数、加入粉丝团数。这一组反映的是用户与主播之间的情感连接。直播电商里情感连接强的人,即使不买东西也会来看,流失概率相对低。

第四组是主播绑定特征,包括用户是否只观看单一主播、关注主播开播的平均观看及时率、取关行为次数。这一组是我觉得直播电商区别于其他电商最有特色的特征。很多用户流失不是对平台失望,而是对某个头部主播失去兴趣,但平台没有做主播分流承接,导致用户直接离开。

我记得当时做了一个很有意思的发现:观察期内只观看一个主播的用户,流失率比观看3个以上主播的用户高出将近一倍。直觉上会觉得“只粉一个主播”应该忠诚度更高,但实际数据告诉我,这种单点依赖极度脆弱,一旦这个主播状态下滑或者转平台,用户就跟着走了。这个发现后来直接变成了运营策略里“新人关注多个同类型主播”的推荐逻辑。

特征工程的代码大概长这样:

def build_features(behavior, order, live_room): # 行为特征:观看频次和近度 feat = behavior.groupby("main_uid").agg( watch_days=("log_date", "nunique"), watch_sessions=("session_id", "nunique"), avg_watch_duration=("duration_seconds", "mean"), last_watch_gap=("log_date", lambda x: (ref_date - x.max()).days) ).reset_index() # 消费特征 order_feat = order.groupby("main_uid").agg( total_pay=("pay_amount", "sum"), order_cnt=("order_id", "count"), avg_order_value=("pay_amount", "mean") ).reset_index() # 主播绑定特征:统计用户看过的主播数量 bind_feat = live_room.groupby("main_uid").agg( anchor_cnt=("anchor_id", "nunique"), ).reset_index() # 合并 df = feat.merge(order_feat, on="main_uid", how="left") df = df.merge(bind_feat, on="main_uid", how="left") return df

这一步做完,特征表基本成型,大概几十个字段。建议不要贪多,每个特征都要能讲清楚业务含义,否则后面做特征解释性分析时会很痛苦。

3. 用户分层与流失预警模型:从统计描述到可预测

3.1 用RFM模型做用户分层

很多做用户分析的文章一上来就讲RFM,但容易忽略一个前提:RFM的分位数阈值应该基于业务周期来定,不是死用所谓的通用标准(例如R<=30天算高近度)。

我在直播电商里,R(最近一次观看时间)阈值用的是7天、14天、30天三档,对应高近度、中近度、低近度;F(观看频次)用观察期90天内的观看天数,分档是1-3天低、4-10天中、10天以上高;M(消费金额)按支付总金额的P33和P67分位切三档。为什么不用等宽分位?因为消费金额长尾严重,等宽切会让高价值用户集中在一档,没有区分度。

RFM打标代码:

def rfm_label(df): # R:最近一次观看距离统计截止日天数 df["R_score"] = pd.cut(df["last_watch_gap"], bins=[0, 7, 14, 30, 999], labels=[4, 3, 2, 1]) # F:观看活跃天数 df["F_score"] = pd.cut(df["watch_days"], bins=[0, 3, 10, 999], labels=[1, 2, 3]) # M:支付金额 df["M_score"] = pd.cut(df["total_pay"], bins=[-1, 0, df["total_pay"].quantile(0.67), 999999], labels=[1, 2, 3]) return df

分层之后,重点人群出来了:

  • 高价值活跃用户(R高、F高、M高):核心用户,要重点维护,关注主播开播提醒、专属福利
  • 高价值沉默用户(R低、F高、M高):这类是上一阶段活跃但最近没来的人,是最值得挽回的群体,他们只是被某件事打断了习惯,召回性价比极高
  • 低价值活跃用户(R高、F高、M低):廉价观众,看热闹但不下单,需要靠商品策略去转化,不投入召回成本
  • 低价值沉默用户(R低、F低、M低):基本凉透,可以放弃或极低成本触达

RFM的价值不在于模型多高级,而是给你一个统一的语言去描述用户。运营说“感觉最近老用户不来了”,你直接把“高价值沉默用户占比连续两周上升”这个数据拍出来,事情立刻变得可讨论。

3.2 XGBoost流失预警模型

RFM分层解决的是“谁有价值、谁流失了”的问题,但它是静态的,没法回答“谁正在走向流失”。要提前干预,就需要一个预警模型。

我选用了XGBoost,原因很直接:表格数据、几万到百万级样本量、特征多但有缺失,XGBoost稳健、可解释性也好。逻辑回归我也跑过对比,但特征间非线性关系比较明显,逻辑回归的AUC偏低,XGBoost明显更优。

建模流程大概是:

  • 正样本:在表现期内被标记为流失的用户
  • 负样本:表现期内仍有观看或下单行为的用户
  • 特征:前面特征工程产出的几十个字段
  • 训练/测试:按时间切分,用过去的数据训练,用最近的数据验证,避免随机切分导致的未来信息泄漏
  • 评估:AUC、召回率、精确率,以及Top N捕获率

这里最需要注意的是正负样本不平衡。直播电商流失率通常在40%到60%之间,天然没有太严重的样本不平衡,但如果你定义30天未访问为流失,可能正样本会偏低。处理方法可以用class_weight调整,或者对负样本做下采样。我实践下来,最有效的不是调过采样算法,而是把你最关心的正样本定义清楚,保证标签质量。

核心建模代码:

import xgboost as xgb from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score, classification_report X = df[feature_cols] y = df["is_churn"] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) model = xgb.XGBClassifier( n_estimators=300, max_depth=5, learning_rate=0.05, subsample=0.8, colsample_bytree=0.8, eval_metric="auc", use_label_encoder=False ) model.fit(X_train, y_train, verbose=False) y_pred = model.predict_proba(X_test)[:, 1] print("AUC:", roc_auc_score(y_test, y_pred))

跑完之后的AUC在0.85左右。这个成绩不是特别高,但在用户流失场景里完全够用。流失预测的任务不是完美预测每一个用户,而是要从几十万用户里捞出一个高概率流失名单,让运营的召回动作聚焦。实际上,我把预测概率按从高到低排序,取Top 10%的用户,能覆盖掉整体流失用户中的35%以上。这个覆盖率已经可以支撑运营做精准触达了。

3.3 特征重要性:流失原因的可解释分析

XGBoost的特征重要性,是我整个项目里业务价值最高的产出。SHAP值分析显示,排在前面的是这几个特征:

  • 最近一次观看距今间隔(last_watch_gap):这个特征一骑绝尘,说明“不来看”是流失最强信号
  • 近30天观看天数
  • 场均观看时长
  • 关注主播数
  • 优惠券核销占比

逐个看下来,这些信号其实各自代表一种流失模式。观看间隔变长代表习惯在退化;场均时长下降代表内容吸引力在减弱;关注主播数少代表关系链太单薄;优惠券核销占比高但复购上不来,说明用户是价格敏感型,谁便宜跟谁走。

运营侧看到这些结论之后,行动项就很明确了:

  • 对观看间隔超过5天的用户,触发App推送和短信召回,话术侧重“你关注的主播今晚有专场”
  • 对场均时长下滑的用户,投放直播间秒杀和红包,用利益点把人拉回来
  • 对单主播绑定用户,在主播下播时推荐同品类替代主播

这个“特征重要性-用户分层-运营动作”的链条,是流失分析项目最终能产生业务价值的关键步骤。

4. 数据可视化与业务看板:让分析结果人人可用

4.1 留存率Cohort分析

做用户流失分析,Cohort留存分析是一个绕不开的图。我要看的是,每个月份首次进入直播间的新用户,在后续1到8周里还有多少比例回访。这张图在直播电商里尤其直观,因为它能清晰地看出不同时期进来的用户质量差异。

Python画Cohort热力图的核心逻辑是:先确定每个用户的first_visit_week,再计算后续每周是否访问。代码可以这么写:

import seaborn as sns import matplotlib.pyplot as plt # df_cohort: 包含 main_uid, first_week, active_week 三个字段 cohort_data = df_cohort.groupby(["first_week", "active_week"])["main_uid"].nunique().reset_index() cohort_data["week_offset"] = (cohort_data["active_week"] - cohort_data["first_week"]).astype(int) cohort_size = df_cohort.groupby("first_week")["main_uid"].nunique() cohort_data["size"] = cohort_data["first_week"].map(cohort_size) cohort_data["retention_rate"] = cohort_data["main_uid"] / cohort_data["size"] pivot = cohort_data.pivot_table(index="first_week", columns="week_offset", values="retention_rate") sns.heatmap(pivot, annot=True, fmt=".1%", cmap="YlGnBu") plt.title("用户周留存Cohort分析") plt.show()

我拿实际数据跑出来的图,最明显的特征是:第一周留存普遍在20%上下,但到了第四周会跌到10%以下。这说明直播电商的流量红利期内,大量用户是一次性体验,内容吸引力和主播承接能力还没有形成用户习惯。这个结论直接影响投放策略——广告拉新不能只算首单ROI,还要结合4周留存来看真实获客质量。

4.2 流失预警名单的可视化看板

模型可以跑,但不能每次分析都让运营来跑代码。所以我做了一套看板,分为三层:

  • 第一层:核心指标总览,包括整体流失率、沉默用户数、高价值流失用户数、召回响应率。这一层是给管理者的日报数据
  • 第二层:流失趋势图,按周展示流失率的走势,同时叠加运营活动时间节点,方便观察活动是否对流失有抑制作用
  • 第三层:流失用户明细表,列出模型输出的Top风险用户列表、风险等级、流失前行为特征和推荐召回渠道

技术栈上,我当时的方案是用Superset连接底层宽表,看板实现拖拽配置。你也可以用Power BI或者Quick BI,逻辑都一样。数据显示层尽量轻量化,把特征工程和模型预测跑成定时任务(比如每天凌晨跑一次),产出日更的风险用户名单表,看板直接读表就好。这样既能保证分析结果的时效性,又不用给业务方配一套复杂的建模环境。

4.3 向业务方讲清楚结论的几种表达方式

做数据分析的人容易犯一个毛病:输出一堆图表,但业务方看不懂。我当时踩过这个坑,后来总结了几种讲结论的方式,效果明显好很多。

第一种,叫“跟上周比”。不要只说“流失率是18%”,要说“高价值沉默用户占比从上周的8%涨到了12%”。百分比没有锚点,趋势才是业务方真正关心的。

第二种,叫“给名单”。分析结论落到行动上,永远是一份名单。不只是“内容吸引力下滑导致流失”,而是“以下是近7天场均观看时长下滑超30%的Top用户,建议优先触达”。一个具体的用户列表,比一万字的分析报告更有价值。

第三种,叫“算钱”。把流失用户折算成预估损失的GMV。当时我们团队估算,高价值沉默用户如果全部挽回,理论上每月可以挽回平台大约6%的GMV。这个数字一出来,运营和高层对流失治理的重视程度立刻上了一个台阶。数据人要学会用业务语言翻译分析结果,模型AUC多少他们不关心,损失多少钱、能赚回多少钱,他们秒懂。

5. 常见问题与实操避坑:这些坑你可能也会踩

5.1 时间口径不一致

项目中最烦的问题,就是不同表里的时间字段定义不统一。订单表里的paid_time是支付完成时间,行为表里的log_date是日志落库时间,直播场次表里又有scheduled_start_time和actual_start_time。如果你拿订单的支付时间去和直播的开播时间做匹配,两张表的时间差可能会造成错位。

我的做法是:定一个主时间口径,所有时间字段统一转换到东八区、统一到天粒度,行为时间用事件实际发生时的时间戳,订单时间用支付成功时间。涉及活动效果评估时,再额外取用场次的实际上播时间。口径这个东西一定要在最开始定下来,否则后面所有报表上的数字都会对不上。

5.2 用户ID覆盖不全

前面提到过,用户ID映射是个大坑。但还有一个更隐蔽的问题:不是所有用户都有手机号。游客模式下,用户只在直播间里点赞、观看,但不登录、不注册,后台只有一个设备ID。这部分用户无法做跨设备跟踪,也没有稳定的身份标识。

处理方式很简单:单独建一个“游客用户”分区,不做身份映射,不建议参与建模训练。等游客有注册行为后,再通过设备ID回溯历史行为,补全到主UID上。一定要在初期就想清楚这个策略,否则后面会有几百万无主ID的数据堆在那里,分析起来十分痛苦。

5.3 模型AUC高不代表有用

我做这个项目时第一次跑出模型,AUC有0.89,当时还挺兴奋。但把预测名单给到运营做召回后,响应率只有3%多一点。老板问“模型是不是不准”,我才意识到,AUC衡量的是排序能力,而不是干预效果。

后来我做了一件事:把预测流失的高概率用户随机分成两组,一组用短信+优惠券召回,一组不触达,对比两组后续14天的回访率和下单率。这才是衡量模型业务价值的正确方式——不是看AUC,而是看增量提升。那次实验做完,召回组的回访率比对照组高出了将近8个百分点,运营才真正认可这个模型可以用。

所以我强烈建议你:建模和分析只是项目的一半,上线之后的AB实验和价值验证,才是流失分析闭环里绝对不能省的一步。没有这一步,分析报告永远只是PPT。

5.4 数据量不足时怎么做分层

小团队或者新业务可能没有海量历史数据。我当时刚开始时也只有几十万用户,分层和建模都面临样本量不够的问题。这时不要强行上机器学习,直接用RFM规则分层,加上人工定义的关键行为阈值,也能快速产出可用结论。

比如,你可以用最近7天是否访问、近30天下单金额是否超过100元、关注主播数是否大于1这三个规则,组合出4到8个用户分组。运营按分组做差异化的投放策略,回头再根据投放效果迭代规则。规则模型的好处是简单透明,业务方敢用,也方便解释。等数据积累到一定量级,再换成机器学习模型。

6. 写在最后:流失分析落到业务闭环中

这个项目做完,我最大的体会是:流失分析不是一次性项目,而是一套需要持续迭代的业务机制。模型的名单每天更新,运营每一天都按名单做触达,数据侧每周复盘召回效果并调整阈值,每月重训一次模型。这套机制跑起来之后,用户流失率从刚上线看板时的周均13%左右,降到了稳定期的9%上下。投入的资源没有增加多少,靠的是让分析结果真正进入了业务的工作流里。

最后再分享一个小技巧。刚开始做流失预警名单时,运营反馈太多太杂看不过来。后来我把名单按风险等级和预估用户价值分了档:高危且高价值用户用人工微信维护,中危用户走短信和Push,低危用户靠直播间内的定向红包触达。分层之后运营不再觉得是一个负担,而是一份每天都能用起来的工作清单。做数据分析不是追求模型多复杂,而是让你的产出能在第二天早上被业务方点开使用。能做到这一点,这个项目就算真正成功了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询