当前位置:首页>python>用Python进行用户分层和转化分析也太方便了!大大缩短了我的工作时长(小白快进来练一练)

用Python进行用户分层和转化分析也太方便了!大大缩短了我的工作时长(小白快进来练一练)

  • 2026-10-11 06:18:54
用Python进行用户分层和转化分析也太方便了!大大缩短了我的工作时长(小白快进来练一练)

一、先搞懂两件事:什么是转化分析?什么是用户分层?

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())

最新文章

随机文章