RFM客户分层模型从原理到SQL实操:用数据分析优化用户运营策略

发布时间:2026/10/5 11:44:16
RFM客户分层模型从原理到SQL实操:用数据分析优化用户运营策略 做用户运营这些年我最大的一个体会就是80%的团队在做客户分层时用的还是“按消费金额排序取前20%”这种粗暴打法。结果就是运营资源投给了一批高客单但已经流失的“僵尸大户”真正的绩优股反而被晾在一边。大概两年前我开始系统地去啃CDA数据分析师那套体系其中一个对我工作改变最大的东西就是RFM模型。今天把这套方法从头到尾拆一遍包括底层逻辑、SQL计算实操、踩坑记录和进阶玩法。这篇文章适合正在做用户运营、CRM数据分析或者想转行做数据分析师的朋友尤其是那些手头有用户消费数据但不知道怎么用起来的人。RFM模型不是一个新概念但真正用得好的团队确实不多。它不是简单地给客户打个分而是通过三个最核心的行为维度把客户价值这件事还原成可视化的结构再反向指导运营动作。下面我尽量用做项目复盘的口吻把整个从搭建模型到落地应用的过程说透。1. 为什么客户分层必须看RFM而不是只看消费金额很多老板和管理者最关心的问题就是谁是我最值钱的客户大部分人会直接拉一张消费总金额的TOP100榜单然后告诉运营“重点维护这些人”。这套逻辑在客户量小的时候勉强能用但一旦你的客户池超过几万甚至几十万只看金额一定会出事。1.1 消费金额高的客户不一定是高价值客户举个例子。你有一个客户A一年前在某品牌买了一套上万元的高端厨电之后再没来过另一个客户B过去三个月里每个月都来买一些几百块的耗材。从单一金额看A的贡献远高于B但如果你是这家店的运营你会把下个月的优惠券重点发给谁答案显然是B。A已经处于沉默状态大概率连你的短信都不点开发再大的优惠券也是打水漂。B则处于活跃期推荐新品、引导升级套餐转化率都会明显高很多。RFM模型在这里的价值就是把“价值”这件事拆成了三个可独立衡量的角度RRecency最近一次消费时间衡量客户离现在有多久没买了。这个指标直接反应客户的“温度”——越近越热越远越冷。FFrequency消费频率在一定周期内买了多少次。频率代表客户的“粘性”——买得越频繁习惯越固定。MMonetary消费金额在一定周期内累计花了多少钱。金额代表客户的“钱包份额”。三者组合起来就能避免“只看金额”这个单视角带来的盲区。A客户是“高M低R”B客户是“中M高R高F”他们的运营策略完全不同。R、F、M不是三个并列指标而是三条互相补充的线索组合起来才能画出一张完整的客户价值画像。1.2 经典8类客户分层一张表看懂逻辑RFM最常用的是二分法每个维度按中位数或阈值分成“高/低”两类理论上三三组合能得到8种客户类型。业内习惯把这8类客户命名为重要价值客户、重要发展客户、重要保持客户、重要挽留客户、一般价值客户、一般发展客户、一般保持客户、一般挽留客户。为了让你快速建立直觉我把8类客户的特征和策略整理成一张表客户类型RFM核心特征建议运营动作重要价值客户高高高又在买、又常买、又买得多重点维护VIP专属权益优先体验新品重要发展客户高低高最近买了大单但频率不高追加热销关联品办会员/储值提升复购重要保持客户低高高曾经买得多但有一阵没来了召回为主用专属优惠/服务通知激活重要挽留客户低低高历史贡献大已沉默大力度召回电话回访找流失原因一般价值客户高高低常买但每次花得少做交叉销售关联高毛利品一般发展客户高低低新客或边缘客培养习惯发新人礼包引导二次购一般保持客户低高低频率还行但金额低已趋冷用日常促销提醒唤醒一般挽留客户低低低几乎流失、没什么贡献低成本触达不行就放弃或养着这张表最大的价值在于让运营能够有的放矢。以前做活动是全量群发现在你能针对“重要保持客户”定向设计一套“回来就送专属券”的方案转化率和ROI完全不是一个量级。1.3 很多资料没讲透的口径问题第一次落地RFM时最容易翻车的地方不是模型本身而是指标口径。R、F、M看起来定义简单实际一算全是坑。先说R。R最常见的定义是“截至计算日客户最近一次下单时间与计算日之间的天数”。但下单时间到底取哪天是支付时间还是订单创建时间我的建议是取支付成功时间因为创建订单之后可以取消、可以赖账只有支付成功才代表真实交易发生。另外还要注意在退款场景下如果客户最近一笔订单支付后又退款了那这笔订单是否还算数我的口径是剔除退款订单后再取最近的支付时间因为客户实际没有留下真实消费。再说F。F最朴素的定义是“统计周期内购买次数”。但算次数时按订单数还是按购买天数一个客户一天下5单账面上是5次但本质上就是同一天的需求。我更倾向于使用“有效购买天数”作为F这样更贴近真实粘性尤其是做电商的一个促销日里用户拆单太常见了。最后说M。M最常用的定义是“统计周期内实际支付金额”。这里有两个细节需要注意一是是否扣减退款我建议使用净实付金额累计支付金额减去累计退款金额否则刷单用户会把模型带偏二是是否要剔除运费。我一般建议区分业务场景如果客单价本身包含运费就不用剔除如果运费是单独收的剔除后更公平。2. 从订单表到RFM评分SQL和Excel都能跑通的3步流程明确口径之后接下来的实操流程就清晰了。这里我给出一个可以直接抄作业的流程核心是从订单明细表产出每个客户的R、F、M原始值再做评分和分层。整个过程分三步定窗口、算指标、打评分。2.1 确定数据窗口和客户范围别一上来就梭哈全量表在动手算之前先回答三个问题统计周期取多久我一般取近12个月。太短像季度数据的季节性波动会让结果失真太长则早期行为对当下的指导意义已经很弱。如果你做的是高客单低频生意比如装修、婚庆周期可以放宽到24个月如果是快消高频生意奶茶、便利店12个月甚至6个月就够。客户范围怎么定义是否包含只注册未购买的用户我的建议是RFM只对“有过至少一次成功交易”的用户进行计算。未成交用户单独放一个“潜在客户”池不参与打分。另外要排除B端、内部测试账号、明显异常的刷单号。金额口径怎么统一用实付金额还是毛利在客户价值评估这个场景我推荐用实付金额。因为毛利需要关联成本表跨部门取数容易扯皮而且客户分层不需要那么精细化等做完RFM再对头部的“重要价值客户”做毛利分析也不迟。这三个问题不先定下来后面所有SQL和评分全都会白搭。举一个真实案例某团队统计F时把“申请退款但尚未处理完成”的订单也算进去了结果给一个已经流失用户打了“高频率”标签运营还专门给他发了一堆优惠券一周后发现此人已退款亏了两次。这就是口径不清导致的连锁问题。2.2 用SQL计算每个客户的R、F、M原始值假设你有一张订单明细表字段大致如下customer_id客户IDpay_time支付时间order_no订单号pay_amount实付金额refund_time退款时间未退款则为NULLstatus订单状态success/cancel/refund第一步先生成“有效订单”子集排除取消订单、排除退款订单、排除账号状态异常的单子。WITH valid_orders AS ( SELECT customer_id, DATE(pay_time) AS pay_date, pay_amount FROM order_table WHERE status success AND refund_time IS NULL AND pay_time DATE_SUB(CURRENT_DATE(), INTERVAL 12 MONTH) )第二步聚合出每个客户的R、F、M原始值SELECT customer_id, DATEDIFF(CURRENT_DATE(), MAX(pay_date)) AS recency_days, COUNT(DISTINCT pay_date) AS frequency_days, SUM(pay_amount) AS monetary_value FROM valid_orders GROUP BY customer_id这段SQL的核心逻辑有三点MAX(pay_date)取最近一次支付日期用DATEDIFF换算成天数就是R值越小代表越近。COUNT(DISTINCT pay_date)计算有效购买天数这里刻意去重防止一天多个订单刷高F。SUM(pay_amount)计算累计净支付金额就是M值。如果你用的是Excel同样可以在PQ里做分组去重订单、清洗退款、按客户ID分组汇总、用MAX日期和透视表计算R/F/M。逻辑完全一样只是工具不同。Python的话一条groupby加agg就能处理不展开写了。2.3 评分规则怎么定五等分法比简单二分法好使得到原始值之后还需要把R、F、M转化为可比较的分数。这步处理得好不好直接影响后面分层的稳定性。我推荐使用五分位评分法。也就是说把每个指标从低到高切成5个档位打分为1到5分。注意一个方向性细节R值天数是越小越好所以实际打分是反着的——R越小得分越高。F和M则是值越大得分越高。以SQL为例可以通过窗口函数PERCENT_RANK()计算百分位排名再用CASE WHEN落到对应的档位WITH rfm_raw AS ( -- 上一段的R/F/M计算结果 ), rfm_score AS ( SELECT customer_id, recency_days, frequency_days, monetary_value, CASE WHEN PERCENT_RANK() OVER (ORDER BY recency_days) 0.2 THEN 5 WHEN PERCENT_RANK() OVER (ORDER BY recency_days) 0.4 THEN 4 WHEN PERCENT_RANK() OVER (ORDER BY recency_days) 0.6 THEN 3 WHEN PERCENT_RANK() OVER (ORDER BY recency_days) 0.8 THEN 2 ELSE 1 END AS r_score, CASE WHEN PERCENT_RANK() OVER (ORDER BY frequency_days) 0.2 THEN 1 WHEN PERCENT_RANK() OVER (ORDER BY frequency_days) 0.4 THEN 2 WHEN PERCENT_RANK() OVER (ORDER BY frequency_days) 0.6 THEN 3 WHEN PERCENT_RANK() OVER (ORDER BY frequency_days) 0.8 THEN 4 ELSE 5 END AS f_score, CASE WHEN PERCENT_RANK() OVER (ORDER BY monetary_value) 0.2 THEN 1 WHEN PERCENT_RANK() OVER (ORDER BY monetary_value) 0.4 THEN 2 WHEN PERCENT_RANK() OVER (ORDER BY monetary_value) 0.6 THEN 3 WHEN PERCENT_RANK() OVER (ORDER BY monetary_value) 0.8 THEN 4 ELSE 5 END AS m_score FROM rfm_raw )这里最关键的决策点是分位数的选择。五分位法比二分法更适合国内零售业务因为二分法会把约一半人分到“高M”组完全失去了区分度五分位则能把真正的头部20%单独圈出来。当然如果你客户池很小比如只有几千五等分会很稀疏退回到三分位或者结合业务阈值也可以。还有一种做法是“业务阈值法”比如M值超过1万算5分、5000-1万算4分R值7天内算5分、8-15天算4分。这种方法的优势是可解释性强、但阈值需要业务部门反复确认而且业务一变阈值就得改。没有绝对优劣但我自己更喜欢五分位因为它是数据驱动的不需要拍脑袋。分打好之后可以做加权综合分综合分 0.3*R 0.2*F 0.5*M。但要注意加权综合分只能用来做客户排名不能用来定义“高/低”。真要分8类客户还是用R/F/M各自的高/低阈值来做交叉而不是综合分一刀切。3. 分层后的运营策略不同客户不同打法模型算完、分打完这只是第一步。RFM项目的成败其实取决于分层结果能不能被运营团队真正用起来。如果你把8类客户名单发给运营对方只回一句“然后呢”那说明策略没有跟上。下面我拆解几种典型客户群的具体打法都是验证过效率比较高的思路。3.1 重要价值客户R高F高M高维护比促单更重要这类客户是金字塔尖通常在整体客群中只占5%-10%但贡献了30%-50%的收入。针对他们我建议运营上做“特权感”而不是“多卖货”。典型动作包括定向的VIP专属客服、新品优先体验、生日礼物、线下活动邀请等。核心目标不是让他们多买一单而是延长生命周期、提升忠诚度。这里有一个反向教训。某美妆品牌曾给这批客户发了一张某品类“满199减100”的大额券结果转化率反而不如普通客户高。原因是这类客户买的是高端线凑单阈值和他们的消费习惯根本不匹配大额券在他们眼里反而显得品牌掉价。所以对重要价值客户少打扰、多给权益比垂涎他们的钱包更有用。3.2 重要保持/挽留客户R低、F/M高召回要分节奏做这两个群体是典型的“沉默的金矿”。他们的共同特征是历史贡献很大但已经有一段时间没有光顾了。区别在于重要保持客户是近期刚刚沉默R处于中低还有机会尽快拉回重要挽留客户则已经沉默了较长时间,需要更大力度的刺激。实操中我见过最高效的召回方式是“首次触达用服务属性内容二次触达用利益点”。第一波先给一条关怀信息比如“您购买的某产品有新版固件/服务升级了”或者“您账户中有积分即将到期”目的是唤起记忆不产生压迫感。如果两三天内没有回应再发一个有明确时间窗口的专属召回券比如“7日内有效、满500减80”制造稀缺感。如果这波还没反应基本可以判断当前周期内流失已成定局强行召回的成本可能会大于客户未来带来的收益。3.3 一般发展客户R高F低M低新客养成先追频次这类客户的“最近消费时间”很近但频次和金额都低本质上是还没有形成购买习惯的新客户。从运营角度讲他们是“最容易培养成中长期客户”的群体因为温度还热着关键是趁热打铁。我的建议是在一个月内做三次触达形成“记忆点”第一次是购买后第7-10天的回访附带一个“新人专享复购券”第二次是第20天左右推送一个关联品类或者更高客单价的新品试探其消费升级意愿第三次是第30天左右做一次权益提醒比如“您还有一张券即将过期”。这三次触达的目标不是单笔转化而是让用户记住你习惯在你的平台上消费。3.4 用分层结果做营销效果对比一个实际案例2023年我给一家零售客户做会员运营项目时把全量客户跑完RFM之后匹配了一次“春季大促”活动的结果。当时运营原本准备全量群发5元无门槛券预算约15万元。我建议改成重要价值客户不发现金券而是发双倍积分权益重要保持客户发满减券一般发展客户发新人礼包券。同样的预算裂变控制在8万元以内并且通过对比发现定向分层的转化率是之前盲目全量群发的2.3倍单客ROI提升了近1倍。最直观的说服力就在这个数字上。4. 实操中避坑指南这些坑我全都踩过RFM模型本身不复杂但实操过程中有大量细节会让你的结果“看上去没毛病、用起来全是病”。下面几条坑我基本都真金白银地踩过一遍。4.1 异常值处理大单客户会把M评分打偏零售数据里总有极端值。比如一个客户买了100台设备用于公司内部采购虽然在订单明细里是真实成交但如果你用这个数据来定义所有客户“高金额”的阈值会造成一大批普通高价值客户的M评分被压缩到1-2分。处理方式有两种缩尾法把M值超过95%分位的金额强制拉低到95%分位对应的数值保留排名信息但消除极端影响这是我在常规项目中比较喜欢的方式操作成本低。对数变换对M值取对数后再做五等分压缩长尾数据的差值范围。缺点是业务方解释起来有门槛比如“M值对数6.8分”没法直接给运营团队讲。另外一定要把刷单和内部采购单独打标签剔除。团队里有一个口径是“单笔金额超过正常客单价30倍且收货地址为公司地址”的订单全部不提。这个规则先和业务确认再落到取数SQL里。4.2 不同品类客户放一起算会得出荒唐结论如果你的业务横跨多个品类比如一个平台既卖9.9元的数据线又卖上万元的电脑那么把两个品类的客户放在同一个模型里算M评分实际上是对高客单品类客户严重有利、低客单品类的客户全部被压到低分区。最后你可能得出“卖数据线的客户全是低价值客”的错误结论但这个结论是完全被商品结构扭曲出来的。解决思路有两种。一是分业务线建模数据线和电脑各自跑一套RFM二是引入相对M如果一定要放到同一个模型先把每个客户的消费金额除以该客户所属品类的平均客单价得到一个标准化后的“相对钱包份额”再参与打分。实操中我更常做前者因为不同业务线连运营团队都是分开的分别建模更好落地。4.3 数据口径变了历史标签必须重建RFM标签不是做一次就一劳永逸的。尤其是当底层数据仓库的字段逻辑发生变化时比如取消订单从“物理删除”改成“状态标记”、退款流程从“立即退款”改成“T1退款”都会导致同一批客户的RFM值在重建日前后不可比。我的经验是每一期RFM标签必须在表里同时记录model_version和calc_date。发布到业务方之前先抽30个客户人工校验和运营同事共同确认是否有明显的逻辑错误。做月度趋势分析时不要直接跨月对比标签除非确认数据口径在这段时间内完全一致否则你对比的可能是两套统计逻辑。4.4 RFM的“8种客户”不是都要运营最后是一个很容易踩的心态坑。很多同学刚学会RFM就把8类客户每一个都制定一套运营策略还搞出8条不同文案、8种不同券模板。结果运营根本没那么多精力和预算去执行最后停留在PPT里。我给的建议是先做价值集中度分析统计每一类客户的人数占比和营收占比优先针对“人数占比不高、营收占比很高”的2-3个类型设计策略。剩下的先不动等跑顺了再逐步扩展。5. 进阶RFM为什么不够用以及我常做的改进RFM模型很经典但在今天的精细化运营要求下它有几个天生的盲区。不是说要抛弃它而是要在它之上再叠一层“增强滤镜”。5.1 只描述历史不预测未来RFM的所有指标都是过去的交易行为的统计视图。它告诉你“谁过去有价值”但没法直接告诉你“谁未来有价值”。比如一个刚注册的新客本周买了一次虽然RFM得分很低但结合他访问频次、加购行为、活动点击等即时互动信号来看他可能比一个“三个月前连续买了5次、但现在已冷却”的用户潜力更大。我现在做增强版的做法是在RFM的基础上叠加一个“EEngagement互动度”指标比如最近30天的登录次数、浏览深度、加购次数、内容点击率。这就把「购后沉默但仍在浏览」的用户和「彻底流失不看一眼」的用户区分开了前者在挽回优先级上更高后者则可以进入低成本唤醒流程。5.2 引入时间衰减让F和M更敏感传统RFM对F和M做的是简单累加这意味着一个用户半年前买了5次和昨天买了5次在这个模型中的F值完全一样。这其实不太合理——近期的行为应当比远期的行为更能反映用户当下的状态。改进的方法是时间衰减加权给每次交易按“距今的月数”赋一个权重越近权重越高。例如权重可以设定为0.9^(距今天数/30)然后把每单金额乘上这个权重后再累加得到的weighted_M会比原始M更灵敏地反映“当下的消费质量”。R本身已经天然包含“近与远”不需要再做衰减,重点放在F和M上。5.3 用LTV来给“重要价值客户”按优先级排座次RFM能帮你圈出重要价值客户群体但在这个群体内部仍然有优先级差异。我通常会在分层完成之后再计算一个简单的LTV预估LTV 平均客单价 x 年均购买频次 x 预估留存年数。然后用这个LTV在“重要价值客户”内部做二次排序把最强的10%单独拎出来做“战略级客户”管理。这样比单纯看RFM综合分要更贴近业务逻辑。最后再说一个我个人在实际执行中反复验证过的观点RFM项目最大的失败风险不是计算复杂度而是“只算不用”。模型跑出来了报表发到群里然后就没有然后了。所以我会在搭建模型的同时就强拉着运营和CRM团队一起定义“分层之后的第一条动作”哪怕是最简单的一组消息推送也一定要落地。另一个小技巧是每次分层完先抽三五十个客户人工核一遍再看细节避免被个别脏数据带到沟里去。这套东西确实是CDA体系里面偏“重”但很实用的一环我自己是在做会员项目时把它彻底吃透的。希望这篇梳理能帮你少走一些弯路把RFM真正用出效果来。