一、先搞懂两件事:什么是转化分析?什么是用户分层?
1. 转化分析
简单说:追踪客户从刷到广告,到最后下单付款完整路上,每一步有多少人流失。
转化分析就是算每一步留了多少人、跑掉多少人,一眼看出哪个环节流失最严重。
比如:1000 人点广告,只有 50 人付款,中间 800 多人在哪走丢了?是注册页面太难?还是商品太贵?靠转化漏斗就能找到答案。
2. 用户分层
不能把所有用户当成同一批人投放广告,所有人统一投放会浪费钱。分层就是给用户贴标签、分人群:
按行为分层:刚注册没下单、下单没付款、付过一次款、经常复购老客;
按获客渠道分层:抖音来的、小红书来的、百度搜索来的流量质量不一样;
按消费价值分层:花钱多的大客户、只买低价产品的小额用户、从来不消费的白嫖用户。
分层后我们就能针对性操作:高价值用户多投放高客单价产品广告,流失用户投放优惠券召回广告,差渠道直接减少预算省钱。
二、第一步:搭建模拟用户投放数据表
先拿模拟数据练手,数据包含市场投放所有关键信息:
用户 ID、广告渠道、广告计划、注册时间、浏览商品次数、是否点击下单、是否下单、是否付款、消费金额、获取这个用户花了多少广告费。
下面代码会自动生成 2000 条用户投放数据,复制直接运行就能用,每一行注释解释作用:
# 导入所有工具包import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 解决图表中文乱码问题,不写这句图表汉字会变成方框plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 屏蔽无关报错,小白运行更干净import warningswarnings.filterwarnings('ignore')# 制作模拟投放用户数据,共2000个用户data = { "user_id": list(range(1,2001)), # 每个用户唯一编号1-2000 "channel": np.random.choice(["抖音信息流","快手","腾讯广点通","小红书","百度搜索"], 2000), # 5个投放渠道 "ad_plan": np.random.choice(["计划A","计划B","计划C","计划D"], 2000), # 4条广告计划 "register_time": pd.date_range("2026-07-01","2026-07-25",periods=2000), # 用户注册日期 "browse": np.random.randint(0,10,2000), # 浏览商品数量,0代表没看商品 "click_btn": np.random.randint(0,2,2000), # 0=没点下单按钮,1=点击下单按钮 "order": np.random.randint(0,2,2000), # 0=没下单,1=生成订单 "pay": np.random.randint(0,2,2000), # 0=未付款,1=完成付款 "pay_amount": np.where(np.random.randint(0,2,2000)==1, np.random.uniform(30,500,2000),0), # 付款金额,没付款就是0 "cost": np.random.uniform(10,80,2000) # 获取这个用户消耗的广告费}# 把数据转换成Excel一样的表格df = pd.DataFrame(data)# 打印前5行数据,让小白直观看到表格长什么样print("原始用户投放数据前5行:")print(df.head())
第二部分:转化漏斗分析
1. 漏斗基础逻辑
完整链路:广告点击人群 → 注册用户 → 浏览商品用户 → 点击下单按钮用户 → 下单用户 → 付款成交用户。
我们需要统计每一层还有多少用户,再算从上一层到下一层流失比例。比如 1000 人注册,只有 200 人下单,注册到下单转化率 20%,这里就是流失重灾区,运营重点优化这里。
2. 代码计算漏斗数据
# 统计每一个转化环节的真实用户数量funnel_data = pd.DataFrame({ "转化环节": ["广告点击访客", "完成注册用户", "浏览商品用户", "点击下单按钮", "生成订单", "付款成交客户"], "留存人数": [ 2000, # 全部点击广告的人,总基数 df["user_id"].nunique(), # 全部注册账号的用户 df[df["browse"]>0]["user_id"].nunique(), # 至少浏览1个商品的用户 df[df["click_btn"]==1]["user_id"].nunique(), # 点击下单按钮 df[df["order"]==1]["user_id"].nunique(), # 成功生成订单 df[df["pay"]==1]["user_id"].nunique() # 最终付款成交 ]})# 计算两个核心转化率# 环比转化率:上一步到当前步骤,能留下来的人占比funnel_data["步骤转化率"] = funnel_data["留存人数"].shift(-1) / funnel_data["留存人数"]# 整体转化率:从最开始点击广告到当前环节的总留存比例funnel_data["整体转化率(广告点击起算)"] = funnel_data["留存人数"] / funnel_data["留存人数"][0]# 小数保留3位,方便阅读funnel_data = funnel_data.round(3)print("\n完整转化漏斗数据表格:")print(funnel_data)
运行后会输出表格,一眼就能看到哪个步骤转化率最低,就是投放、页面、产品需要优化的地方。
3. 自动绘制漏斗柱状图,不用 Excel 手动作图
plt.figure(figsize=(10,5))# 绘制柱状图展示每个环节人数sns.barplot(x="转化环节", y="留存人数", data=funnel_data, color="#4287f5")plt.title("用户转化漏斗可视化图", fontsize=14)# x轴文字旋转,防止文字重叠看不清plt.xticks(rotation=30)# 增加网格线,数字更好对比plt.grid(axis="y", alpha=0.3)# 自动适配布局,不会出现文字被截断plt.tight_layout()plt.show()
直观展示用户一路流失的全过程。
4. 分渠道对比转化效果(投放核心用途)
不同渠道流量质量天差地别,抖音来的人转化率高、花钱多,某渠道用户注册后直接划走,消耗广告费却没有成交。这段代码自动对比所有渠道数据:
# 按照渠道分组,统计每个渠道全部数据channel_stat = df.groupby("channel").agg( 渠道总注册用户=("user_id","nunique"), 浏览商品用户数量=("browse",lambda x: (x>0).sum()), 成功付款人数=("pay","sum"), 渠道总成交金额=("pay_amount","sum"), 渠道总广告消耗=("cost","sum")).reset_index()# 计算两个投放核心指标# 注册到付款转化率:注册的人里多少最终买单channel_stat["注册转付款转化率"] = channel_stat["成功付款人数"] / channel_stat["渠道总注册用户"]# ROI投放回报率:成交总额 ÷ 广告花费,大于1才不亏钱,越高越赚钱channel_stat["渠道ROI投放回报"] = channel_stat["渠道总成交金额"] / channel_stat["渠道总广告消耗"]# 按回报率从高到低排序,优质渠道排在最上面channel_stat = channel_stat.sort_values("渠道ROI投放回报", ascending=False)print("\n各投放渠道转化&收益对比:")print(channel_stat[["channel","注册转付款转化率","渠道ROI投放回报"]])
看完结果直接做投放决策:ROI 高的渠道加大预算,ROI 低于 1 持续亏损的渠道减少投放。
第三部分:4 套通用用户分层方法
分层 1:用户生命周期分层
只看用户走到转化链路哪一步,给用户分 4 类人群,运营动作完全不一样:
成交付费用户:已经花钱,重点做复购、高单价商品广告;
下单未支付流失用户:有购买意向,推送优惠券召回广告;
浏览未下单潜在用户:对产品感兴趣,推送爆款产品广告;
注册沉默用户:注册后什么都没看,低价值流量,减少持续投放。
# 自定义分层规则函数,判断每个用户属于哪一类def life_cycle_tag(row): if row["pay"] == 1: return "成交付费用户" elif row["order"] == 1: return "下单未支付流失用户" elif row["browse"] > 0: return "浏览未下单潜在用户" else: return "注册沉默用户"# 给每一行用户数据打上生命周期标签df["用户生命周期分层"] = df.apply(life_cycle_tag, axis=1)# 统计每一类用户有多少人life_user_count = df["用户生命周期分层"].value_counts()print("\n用户生命周期分层人数统计:")print(life_user_count)
分层 2:投放渠道分层
基于每个渠道的转化率、ROI 自动划分 3 个等级,直接指导预算分配:
def channel_tier(row): # ROI≥1.8 且转化率超30% = 优质渠道 if row["渠道ROI投放回报"] >= 1.8 and row["注册转付款转化率"]>0.3: return "优质高转化渠道(加预算)" # ROI≥1小幅盈利 = 普通渠道 elif row["渠道ROI投放回报"] >= 1 and row["注册转付款转化率"]>0.15: return "稳定普通渠道(维持预算)" # 剩下全部是亏损低效渠道 else: return "低效渠道(缩预算/关停)"# 给每个渠道分层标签channel_stat["渠道质量分层"] = channel_stat.apply(channel_tier, axis=1)print("\n投放渠道分层结果:")print(channel_stat[["channel","渠道质量分层","渠道ROI投放回报"]])
分层 3:广告计划分层
很多投放会同时跑多条广告计划,有的计划来的客户质量高,有的计划只烧钱不成交,这段代码自动区分广告好坏:
# 按广告计划分组统计数据plan_stat = df.groupby("ad_plan").agg( 获取总用户数=("user_id","nunique"), 付费用户数量=("pay","sum"), 广告消耗总额=("cost","sum"), 计划总成交GMV=("pay_amount","sum")).reset_index()# 计算转化率和ROIplan_stat["付费转化率"] = plan_stat["付费用户数量"] / plan_stat["获取总用户数"]plan_stat["广告计划ROI"] = plan_stat["计划总成交GMV"] / plan_stat["广告消耗总额"]# 给广告计划分层def plan_level(row): if row["广告计划ROI"]>2 and row["付费转化率"]>0.25: return "优质计划,追加投放预算" elif row["广告计划ROI"]<0.8: return "劣质计划,减少预算或直接关停" else: return "中等计划,优化广告素材"plan_stat["广告计划分层"] = plan_stat.apply(plan_level,axis=1)print("\n各广告计划分层效果:")print(plan_stat[["ad_plan","广告计划分层","广告计划ROI"]])
分层 4:RFM 价值分层
适合做私域、复购投放,只针对付过钱的用户分层,三个简单判断标准:
R(最近消费时间):多久之前下的单,越近活跃度越高;
F(消费频次):一共买过多少次,次数越多忠诚度越高;
M(消费金额):总共花了多少钱,金额越高客户价值越高。
通过三个维度打分,自动分出 5 类客户:核心高价值客户、新付费客户、流失大客户、普通复购客户、低价单次客户。小白不用手动打分,代码自动完成分层:
# 统计截止日期,用来计算用户多久没消费end_date = pd.to_datetime("2026-07-27")# 只筛选付过钱的用户,不付费用户不参与价值分层pay_user_data = df[df["pay"]==1].copy()# 统计每个付费用户的R、F、M三项指标user_rfm = pay_user_data.groupby("user_id").agg( R最近消费间隔天数=("register_time", lambda x: (end_date - x.max()).days), F消费总次数=("pay","sum"), M总消费金额=("pay_amount","sum")).reset_index()# 自动给三项指标打分1-4分user_rfm["R得分"] = pd.qcut(user_rfm["R最近消费间隔天数"], 4, labels=[4,3,2,1])user_rfm["F得分"] = pd.qcut(user_rfm["F消费总次数"].rank(method="first"),4,labels=[1,2,3,4])user_rfm["M得分"] = pd.qcut(user_rfm["M总消费金额"],4,labels=[1,2,3,4])# 拼接分数标签user_rfm["RFM综合标签"] = user_rfm["R得分"].astype(str) + user_rfm["F得分"].astype(str) + user_rfm["M得分"].astype(str)# 根据综合标签划分用户价值等级def rfm_user_type(tag): if tag in ["444","443","434"]: return "高价值核心客户" elif tag in ["411","412","421"]: return "近期新付费客户" elif tag in ["144","143"]: return "流失高价值老客户" elif tag in ["222","232","322"]: return "普通复购客户" else: return "低价值单次客户"user_rfm["用户价值分层"] = user_rfm["RFM综合标签"].apply(rfm_user_type)# 统计每一类价值用户数量value_user_count = user_rfm["用户价值分层"].value_counts()print("\nRFM用户价值分层人数:")print(value_user_count)
五、分层 +转化结合:自动输出投放运营建议
前面所有分层、漏斗分析最终目的是给出可执行的投放方案,不用自己手动分析,代码自动总结建议:
def get_market_suggest(): suggest_list = [] # 1.渠道投放建议 good_channel = channel_stat[channel_stat["渠道质量分层"]=="优质高转化渠道(加预算)"]["channel"].tolist() bad_channel = channel_stat[channel_stat["渠道质量分层"]=="低效渠道(缩预算/关停)"]["channel"].tolist() suggest_list.append(f"【渠道预算调整】优质渠道加大投放:{good_channel};亏损渠道缩减预算:{bad_channel}") # 2.生命周期人群投放建议 suggest_list.append("【分层人群广告策略】") suggest_list.append("1. 成交付费用户:投放高端产品、会员活动广告,提升复购") suggest_list.append("2. 下单未支付流失用户:发放优惠券,投放召回类广告") suggest_list.append("3. 浏览未下单用户:推送爆款低价商品广告刺激下单") suggest_list.append("4. 注册沉默用户:减少持续广告投放,节省广告费") # 3.高价值客户运营建议 suggest_list.append("【高价值客户运营】RFM分层里的核心客户单独做精细化私域投放,提高客单价") return "\n".join(suggest_list)print("\n========== 自动生成投放运营建议 ==========")print(get_market_suggest())