数据分析 B端

B端客户数据分析从零到一:以某制造商为例

2026-07-16 · 约12分钟阅读 · SQL · Python · RFM · 客户分层 · 流失预警
摘要:如何用2周完成数据摸底、4周搭建RFMP分层模型、8周上线流失预警系统——完整的从零到一实战拆解,含SQL/Python可复用代码。

一、场景:你面前是一堆B端客户数据,然后呢?

你的岗位是市场分析师(B端)

打开CRM和ERP系统,数据长这样:客户表、订单表、报价表、产品表、回款表——零零散散几万行,分布在三套不互通的老系统里。没人能告诉你"哪些客户在流失""丢单最多卡在哪一步""客户定制需求的共性是什么"。

你的任务:从零搭建一套B端客户分析体系。

这篇文章就是我怎么做的完整拆解——方法论、SQL、Python代码、踩过的坑,全在这里。

二、第一件事:给客户"画像",不是"标签"

很多分析师上来就跑RFM模型,这其实跳步了。

B端客户和C端最大的区别:类型差异比行为差异更重要。

一家LED灯带制造商的B端客户可以分成四类,决策逻辑完全不同:

客户类型典型画像交易特征核心决策因素
工程承包商 照明工程公司、市政亮化团队 项目驱动、单笔金额大(10万-200万+)、定制化高、回款周期长 资质认证(UL/ETL/CE)、产能稳定性、现场技术支持
品牌经销商 海外品牌代理、区域分销商 批量订单、复购率高、交期敏感、价格谈判激烈 OEM/ODM能力、MOQ灵活度、账期支持
品牌委托方 欧莱雅、康佳等品牌直采 长周期合作、品控严、需验厂 品牌背书、ESG合规、全链路质检
跨境贸易 亚马逊/Shopify卖家 高频小单、标准化产品、自助下单 网站产品数据完备度、物流时效、样品政策

这四类客户的"活跃"标准完全不同。 工程承包商可能6个月才下一单——因为一个项目从招标到交付就是6个月。但跨境贸易客户60天不下单,大概率是被竞品切走了。

所以第一步不是跑模型,而是先和四类客户的销售负责人各聊30分钟,搞清楚各自业务节奏。这一步不做,后面所有分层都建立在错误假设上。

三、RFM在B端要重新定义:从RFM到RFMP

C端的RFM套到B端会翻车。比如F(购买频次)——C端一个月买10次算高频,B端工程商一年买2次可能就算高频。

我的做法是重新定义三个维度,并增加一个P(Product Mix,产品线宽度)

指标B端定义数据来源
R(Recency)最近一次下单距今天数。阈值:30天=热活跃,90天=温,180天以上=冷ERP订单表
F(Frequency)过去12个月下单次数。注意:B端一单可能是一个大项目,一个工程商F=2可能已是高价值ERP订单表/项目管理系统
M(Monetary)过去12个月累计交易金额(含已回款和未回款),附加细分指标:回款率ERP + 财务系统
P(Product Mix)购买了几个产品系列?标准化vs定制化占比?——B端最有区分度的指标ERP + 产品目录

P值为什么重要?

一个年贡献100万的工程商,如果只买标准品——他随时可以找到替代供应商。但如果他买过COB灯带+硅胶霓虹+PU霓虹+定制幻彩四条线——他的切换成本极高,因为每条线的品质标准、交货节奏、配套服务都是磨合出来的。

关键洞察:"高M低R低P"的客户 = 在花钱但不忠诚 = 第一优先级干预对象。

四、客户生命周期的B端版本

C端的生命周期是"注册→首单→复购→流失",几天到几周一个周期。

B端的生命周期是数月至数年,而且每一阶段都有独特的分析关注点:

阶段定义分析师要回答的问题
① 获客展会/阿里国际站/官网/推荐光亚展来的客户 vs 阿里国际站来的客户——谁转化快?谁客单价高?
② 激活首次正式询价/索样样品寄出后7天内跟进率是多少?未跟进的客户有什么共同特征?
③ 首单第一次下单首单周期>30天的客户,后续复购率是否明显更低?
④ 成长复购频率和金额增长哪些客户在"飞轮"中?他们买了什么产品组合?
⑤ 成熟稳定复购,核心客户这群客户对价格敏感度如何?竞品挖角风险多大?
⑥ 流失预警采购频次明显下降或超90天未复购是"项目断档"还是"被竞品切走"?
核心认知:B端客户3-6个月不买不一定在流失——工程项目有自然断档期。关键是要能区分"正常断档"和"被竞品切走"。判别信号:看他们的行为轨迹——询价了但没下单?浏览了新产品页面?这些比"距离上次下单"更准。

五、项目转化漏斗:从100个询盘到14个中标

LED灯带的B端销售链条有9个节点:展会/平台曝光 → 询盘 → 送样 → 报价 → 打样确认 → 商务谈判 → 中标下单 → 生产交付 → 验收回款

假设数据是这样的(入职后第一件事就是从CRM里拉这个漏斗):

100
询盘
→ 55%
55
送样
→ 65%
36
报价
→ 40%
14
中标
→ 85%
12
交付

最有价值的分析是"报价→中标"这个环节的丢单原因分类:

  • 价格原因?——需要重新审视定价策略,还是"客户就是想要30块钱/米的,我们最低是35"?
  • 交期原因?——产能瓶颈到底卡在哪条线?
  • 资质原因?——哪些认证(UL/ETL/CE/RoHS)是丢单高频词?
  • 竞品关系?——被谁抢了?对方拿什么打我们?

这些问题只能靠数据+销售访谈交叉验证。纯看CRM里的"丢单原因"下拉框基本等于没看——销售填的永远都是"价格因素"。

六、SQL实战:三个入职后立刻能跑的业务查询

查询一:找出"只报价不中标"的客户

业务问题:过去6个月,哪些客户给了报价机会但一次都没中标?他们最常询价的是什么产品线?

WITH lost_customers AS (
  SELECT
    c.customer_id,
    c.customer_name,
    c.customer_type,
    COUNT(DISTINCT q.quotation_id) AS quotation_count,
    COUNT(DISTINCT CASE WHEN s.deal_status = 'lost' THEN q.quotation_id END) AS lost_count,
    ROUND(
      COUNT(DISTINCT CASE WHEN s.deal_status = 'lost' THEN q.quotation_id END) * 100.0
      / COUNT(DISTINCT q.quotation_id), 1
    ) AS lost_rate_pct
  FROM crm.quotations q
  JOIN crm.sales_pipeline s ON q.quotation_id = s.quotation_id
  JOIN master.customers c ON q.customer_id = c.customer_id
  WHERE q.created_date >= DATE_SUB(CURRENT_DATE, INTERVAL 6 MONTH)
    AND s.quote_status = 'sent'
  GROUP BY c.customer_id, c.customer_name, c.customer_type
  HAVING COUNT(DISTINCT CASE WHEN s.deal_status = 'won' THEN q.quotation_id END) = 0
),
favorite_products AS (
  SELECT
    q.customer_id,
    GROUP_CONCAT(DISTINCT p.product_series ORDER BY COUNT(*) DESC SEPARATOR ' / ') AS top_series,
    GROUP_CONCAT(DISTINCT s.lost_reason ORDER BY COUNT(*) DESC SEPARATOR ' / ') AS top_lost_reasons
  FROM crm.quotations q
  JOIN crm.sales_pipeline s ON q.quotation_id = s.quotation_id
  JOIN erp.products p ON q.product_id = p.product_id
  WHERE s.deal_status = 'lost'
  GROUP BY q.customer_id
)
SELECT lc.*, fp.top_series, fp.top_lost_reasons
FROM lost_customers lc
LEFT JOIN favorite_products fp ON lc.customer_id = fp.customer_id
ORDER BY lc.lost_count DESC, lc.lost_rate_pct DESC
LIMIT 20;

这条查询的价值:把"报价-中标"环节的最高流失客户挑出来,并且告诉销售团队——这个客户连续丢了三单COB灯带,都是价格原因。

查询二:流失风险评分卡

业务问题:给每个客户打一个流失风险分(0-100),生成"本周必须联系的TOP10高危客户"。

WITH client_health AS (
  SELECT
    c.customer_id,
    c.customer_name,
    c.sales_rep,
    DATEDIFF(CURRENT_DATE, MAX(o.order_date)) AS days_since_last_order,
    COUNT(CASE WHEN o.order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 6 MONTH) THEN 1 END) AS recent_6m_orders,
    COUNT(CASE WHEN o.order_date BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 18 MONTH)
               AND DATE_SUB(CURRENT_DATE, INTERVAL 12 MONTH) THEN 1 END) AS same_period_last_year,
    COUNT(DISTINCT p.product_series) AS product_diversity,
    COUNT(DISTINCT CASE WHEN s.deal_status = 'lost'
        AND q.created_date >= DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH)
        THEN q.quotation_id END) AS recent_lost_bids
  FROM master.customers c
  LEFT JOIN erp.orders o ON c.customer_id = o.customer_id
  LEFT JOIN erp.products p ON o.product_id = p.product_id
  LEFT JOIN crm.quotations q ON c.customer_id = q.customer_id
  LEFT JOIN crm.sales_pipeline s ON q.quotation_id = s.quotation_id
  WHERE c.is_active = 1
  GROUP BY c.customer_id, c.customer_name, c.sales_rep
)
SELECT
  *,
  ROUND(
    CASE WHEN days_since_last_order > 90 THEN 30 ELSE 0 END +
    CASE WHEN recent_6m_orders < same_period_last_year * 0.5 THEN 20 ELSE 0 END +
    CASE WHEN product_diversity <= 1 THEN 10 ELSE 0 END +
    CASE WHEN recent_lost_bids >= 2 THEN 15 ELSE 0 END +
    CASE WHEN days_since_last_order > 180 THEN 25 ELSE 0 END
  , 0) AS churn_risk_score
FROM client_health
HAVING churn_risk_score >= 40
ORDER BY churn_risk_score DESC
LIMIT 10;

权重是可调的。 初始版本用经验值,跑一个月后用A/B测试校准:预测流失的客户中实际流失了多少?没预测到的流失有多少?持续迭代权重。

Python实战:从2000多个定制案例中挖需求趋势

业务问题:公司有2000多个定制案例,每个案例有一段中文需求描述。能不能自动找到"所有工程商都想要但现有产品线没覆盖"的需求?

import pandas as pd
import jieba
from collections import Counter

# 从ERP/CRM导出定制案例数据
df = pd.read_excel('custom_cases.xlsx')
# 字段:case_id, customer_type, product_series, requirement_desc, customer_annual_value

# 1. 词频统计(按客户类型分组)
def extract_keywords(text_series):
    all_words = []
    for text in text_series.dropna():
        words = jieba.cut(text)
        stopwords = {'的', '了', '和', '是', '在', '等', '对', '为', '需', '要'}
        all_words.extend([w for w in words if len(w) > 1 and w not in stopwords])
    return Counter(all_words).most_common(10)

for customer_type, group in df.groupby('customer_type'):
    print(f"\n=== {customer_type}需求高频词 ===")
    print(extract_keywords(group['requirement_desc']))
    # 示例输出:工程承包商→ [('防水', 87), ('IP68', 52), ('户外', 48), ('超长', 35)]

# 2. 识别"高价值共性需求":频次≥10 + 来自年贡献≥50万的客户
high_value = (
    df.groupby('requirement_keyword')
    .agg(
        frequency=('case_id', 'count'),
        avg_customer_value=('customer_annual_value', 'mean'),
        total_opportunity=('customer_annual_value', 'sum')
    )
    .query('frequency >= 10 and avg_customer_value > 500000')
    .sort_values('total_opportunity', ascending=False)
)

print("\n=== 建议优先研发的方向 ===")
print(high_value.head(10))
# 示例输出:Mini LED超窄(3mm)灯带 - 来自12个客户,合计年贡献320万

这段代码的价值:把"研发团队拍脑袋想下一个产品"变成"数据告诉你客户想要什么"。分析师的终极价值不是做图表——是把需求信号翻译成产品投资决策。

七、从零到一的四阶段实施路径

01 第1-2周

数据摸底 & 口径统一

  • 拉通ERP/CRM/财务数据字典
  • 与4个部门做30分钟访谈
  • 画数据流转图,标出断点
输出:《数据现状与口径问题清单》
02 第3-4周

基础分析体系搭建

  • RFMP分层模型跑通
  • 每个客户标注生命周期
  • 项目漏斗第一版
输出:PowerBI看板V1.0 + 客户全景画像报告
03 第5-8周

深度分析与洞察输出

  • 流失预警模型上线
  • 竞品矩阵搭建
  • 产品线健康度+需求词云
输出:月度洞察报告 + 每周高危预警
04 第9-12周+

持续优化与决策支持

  • A/B测试(干预 vs 对照)
  • 行业趋势追踪
  • CEO专题决策建议
输出:季度报告 + 专项决策建议
Phase 1是最重要的一步——也是最容易被跳过的。 我在上一个项目的教训:数据口径不统一,两个部门对"活跃客户"的定义差了一倍,我先跑了一个月分析然后发现全是错的。现在我会要求所有分析项目先做数据摸底,不做假设。

八、竞品监测:制造业企业怎么做?

制造企业的竞品分析不能学互联网公司——我们的竞品信息不在Sensor Tower里,而在:

  • 展会情报:光亚展上竞品展了什么新品?拿了多少名片?
  • 客户反馈:"你们的价格比金博安高5%,但品质稳定性好"——这种话销售每天在听,但没人系统记录
  • 报价对比:同一个客户同时向3家供应商询价,我们排第几?
  • 认证动向:竞品新拿到了UL认证?这意味着他们可能进入北美高端市场

我设计的竞品评分卡(5维度每月更新):

维度权重评分依据
价格竞争力25%同一规格产品报价对比,按"我们最低/中等/最高"打分
产品品质25%客诉率、退货率、第三方检测报告差异
交期稳定性20%行业口碑 + 客户反馈
资质壁垒15%认证数量(UL/ETL/CE/RoHS/FCC)的变化
服务响应15%样品周期、技术方案响应速度(通过伪询盘测试)

评分卡+流失客户去向分析 = 竞品的真实弱点。比如发现"被竞品A抢走的客户有70%是因为对方交期快3天"——这就直接指向生产排期的优化机会。

九、核心认知:行业知识 vs 分析能力,哪个更重要?

第一,方法论可迁移。 RFM分层、漏斗分析、流失预警、A/B测试——这些不挑行业。我在食品分销做过的客户分群,逻辑换到光电制造,只是换了一套数据表和业务名词。

第二,行业知识可以快速补。 2周沉浸式访谈+100个典型客户案例阅读,对行业理解的准确度可以从30分涨到70分。但数据分析框架感(知道什么问题是能用数据回答的、什么不能)、SQL/Python的技术肌肉、跨部门沟通的方法——这些需要2年积累。

同样的数据,给一个懂行业但不会写SQL的分析师,产出不如给一个有方法论但行业刚入门的人。

因为行业知识2周能补到及格线,数据直觉和工具链需要时间的复利。
🤖
AI助手
ONLINE