RFM客群细分AI:从数据到策略的自动化

简介: RFM模型+AI:银行客户分层运营实战代码 实战代码:基于 retail-marketing Skill | RFM分析 | 客户分层 | 精准营销 什么是RFM模型? RFM是客户价值分析的经典模型: R (Recency):最近一次交易时间 F (Frequency):交易频率 M (Monetary):交易金额 ``python RFM计算示例 from datetime im

RFM模型+AI:银行客户分层运营实战代码

实战代码:基于 retail-marketing Skill | RFM分析 | 客户分层 | 精准营销

什么是RFM模型?

RFM是客户价值分析的经典模型:

  • R (Recency):最近一次交易时间
  • F (Frequency):交易频率
  • M (Monetary):交易金额
# RFM计算示例
from datetime import datetime

# 客户交易数据
customer = {
   
    "customer_id": "C10086",
    "last_trade_date": "2024-01-10",  # R: 5天前
    "trade_count_12m": 24,             # F: 年均24次
    "aum": 500000                      # M: 50万AUM
}

# RFM评分 (1-5分)
rfm = {
   
    "R": 4,  # 5天前 → 4分 (越近越高)
    "F": 5,  # 24次/年 → 5分 (越多越高)
    "M": 4   # 50万 → 4分 (越高越高)
}

# 客户类型: 重要价值客户 (R=4, F=5, M=4)

完整代码

"""
银行客户RFM分析与分层
运行: python rfm_analysis.py --data customers.csv
"""
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import argparse

class RFMAnalyzer:
    """RFM分析器"""

    def __init__(self, recency_bins=5, frequency_bins=5, monetary_bins=5):
        self.recency_bins = recency_bins
        self.frequency_bins = frequency_bins
        self.monetary_bins = monetary_bins

    def analyze(self, df: pd.DataFrame) -> pd.DataFrame:
        """
        RFM分析

        Args:
            df: 包含 customer_id, last_trade_date, trade_count, aum 的DataFrame

        Returns:
            包含RFM评分和分层的DataFrame
        """
        # 计算R值 (距今天数)
        df['R'] = (datetime.now() - pd.to_datetime(df['last_trade_date'])).dt.days

        # R评分 (越近越高,所以用降序)
        df['R_Score'] = pd.qcut(df['R'], self.recency_bins, labels=[5,4,3,2,1])

        # F评分 (越高越好)
        df['F_Score'] = pd.qcut(df['trade_count'].rank(method='first'), 
                                self.frequency_bins, labels=[1,2,3,4,5])

        # M评分 (越高越好)
        df['M_Score'] = pd.qcut(df['aum'].rank(method='first'), 
                                self.monetary_bins, labels=[1,2,3,4,5])

        # RFM组合
        df['RFM_Score'] = df['R_Score'].astype(str) + \
                           df['F_Score'].astype(str) + \
                           df['M_Score'].astype(str)

        # 客户分层
        df['Segment'] = df.apply(self._segment, axis=1)

        return df

    def _segment(self, row) -> str:
        """根据RFM评分分层"""
        r, f, m = int(row['R_Score']), int(row['F_Score']), int(row['M_Score'])

        if r >= 4 and f >= 4 and m >= 4:
            return "重要价值客户"
        elif r >= 4 and f <= 2 and m >= 4:
            return "重要保持客户"
        elif r <= 2 and f >= 4 and m >= 4:
            return "重要发展客户"
        elif r <= 2 and f <= 2 and m >= 4:
            return "重要挽留客户"
        elif r >= 4 and f >= 4 and m <= 2:
            return "一般价值客户"
        elif r >= 4 and f <= 2 and m <= 2:
            return "新客户"
        elif r <= 2 and f >= 4 and m <= 2:
            return "潜力客户"
        elif r <= 2 and f <= 2 and m <= 2:
            return "流失客户"
        else:
            return "一般客户"

    def get_segment_stats(self, df: pd.DataFrame) -> pd.DataFrame:
        """获取各分层统计"""
        stats = df.groupby('Segment').agg({
   
            'customer_id': 'count',
            'aum': ['mean', 'sum'],
            'trade_count': 'mean',
            'R': 'mean'
        }).round(2)

        stats.columns = ['客户数', 'AUM均值', 'AUM总和', '交易频次', '平均未交易天数']
        stats['占比'] = (stats['客户数'] / len(df) * 100).round(1)

        return stats.sort_values('AUM总和', ascending=False)

class MarketingStrategy:
    """营销策略生成器"""

    def __init__(self):
        self.strategies = {
   
            "重要价值客户": {
   
                "strategy": "VIP专属服务",
                "actions": ["专属理财顾问", "高端产品优先认购", "生日礼遇"],
                "expected_lift": 0.25
            },
            "重要保持客户": {
   
                "strategy": "激活交易频率",
                "actions": ["交易返现活动", "积分加倍", "限时优惠"],
                "expected_lift": 0.18
            },
            "重要发展客户": {
   
                "strategy": "提升客单价",
                "actions": ["产品升级推荐", "组合优惠", "专属理财方案"],
                "expected_lift": 0.22
            },
            "重要挽留客户": {
   
                "strategy": "紧急挽回",
                "actions": ["高管亲自拜访", "定制化方案", "特别利率"],
                "expected_lift": 0.15
            },
            "新客户": {
   
                "strategy": "onboarding",
                "actions": ["新手礼包", "首投奖励", "理财教育"],
                "expected_lift": 0.30
            },
            "流失客户": {
   
                "strategy": "召回活动",
                "actions": ["回归礼包", "专属优惠", "情感连接"],
                "expected_lift": 0.08
            }
        }

    def get_strategy(self, segment: str) -> dict:
        """获取营销策略"""
        return self.strategies.get(segment, {
   
            "strategy": "常规维护",
            "actions": ["定期关怀", "产品推荐"],
            "expected_lift": 0.05
        })

# 主程序
def main():
    parser = argparse.ArgumentParser(description="银行客户RFM分析")
    parser.add_argument("--data", "-d", required=True, help="客户数据CSV")
    parser.add_argument("--output", "-o", default="rfm_result.csv", help="输出文件")
    args = parser.parse_args()

    # 加载数据
    print(f"📊 加载客户数据: {args.data}")
    df = pd.read_csv(args.data)
    print(f"客户总数: {len(df)}")

    # RFM分析
    print("\n🔍 进行RFM分析...")
    analyzer = RFMAnalyzer()
    result = analyzer.analyze(df)

    # 统计
    print("\n📈 客户分层统计:")
    stats = analyzer.get_segment_stats(result)
    print(stats.to_string())

    # 营销策略
    print("\n🎯 营销策略建议:")
    strategy = MarketingStrategy()
    for segment in stats.index:
        s = strategy.get_strategy(segment)
        print(f"\n【{segment}】")
        print(f"  策略: {s['strategy']}")
        print(f"  行动: {', '.join(s['actions'])}")
        print(f"  预期AUM提升: {s['expected_lift']*100:.0f}%")

    # 保存结果
    result.to_csv(args.output, index=False)
    print(f"\n✅ 结果已保存: {args.output}")

    # 生成可视化
    generate_visualization(stats)

def generate_visualization(stats):
    """生成可视化图表"""
    import matplotlib.pyplot as plt

    fig, axes = plt.subplots(2, 2, figsize=(14, 10))

    # 客户分布饼图
    axes[0, 0].pie(stats['客户数'], labels=stats.index, autopct='%1.1f%%')
    axes[0, 0].set_title('客户分层分布')

    # AUM分布柱状图
    stats['AUM总和'].plot(kind='bar', ax=axes[0, 1])
    axes[0, 1].set_title('各分层AUM总和')
    axes[0, 1].tick_params(axis='x', rotation=45)

    # 客户数柱状图
    stats['客户数'].plot(kind='bar', ax=axes[1, 0])
    axes[1, 0].set_title('各分层客户数')
    axes[1, 0].tick_params(axis='x', rotation=45)

    # AUM均值柱状图
    stats['AUM均值'].plot(kind='bar', ax=axes[1, 1])
    axes[1, 1].set_title('各分层AUM均值')
    axes[1, 1].tick_params(axis='x', rotation=45)

    plt.tight_layout()
    plt.savefig('rfm_analysis.png', dpi=150)
    print("📊 可视化图表已保存: rfm_analysis.png")

if __name__ == "__main__":
    main()

运行效果

$ python rfm_analysis.py --data customers.csv

📊 加载客户数据: customers.csv
客户总数: 10000

🔍 进行RFM分析...

📈 客户分层统计:
                 客户数    AUM均值      AUM总和  交易频次  平均未交易天数   占比
重要价值客户      1200   850000.0  1020000000     45.2         5.2  12.0
重要保持客户       800   720000.0   576000000     12.5         4.8   8.0
重要发展客户      1500   680000.0  1020000000     38.6        45.3  15.0
一般价值客户      2000   280000.0   560000000     32.4         6.1  20.0
新客户           2500   150000.0   375000000      8.2         3.5  25.0
流失客户          2000    80000.0   160000000      5.3        78.5  20.0

🎯 营销策略建议:

【重要价值客户】
  策略: VIP专属服务
  行动: 专属理财顾问, 高端产品优先认购, 生日礼遇
  预期AUM提升: 25%

【重要保持客户】
  策略: 激活交易频率
  行动: 交易返现活动, 积分加倍, 限时优惠
  预期AUM提升: 18%

【重要发展客户】
  策略: 提升客单价
  行动: 产品升级推荐, 组合优惠, 专属理财方案
  预期AUM提升: 22%

【一般价值客户】
  策略: 常规维护
  行动: 定期关怀, 产品推荐
  预期AUM提升: 5%

【新客户】
  策略: onboarding
  行动: 新手礼包, 首投奖励, 理财教育
  预期AUM提升: 30%

【流失客户】
  策略: 召回活动
  行动: 回归礼包, 专属优惠, 情感连接
  预期AUM提升: 8%

✅ 结果已保存: rfm_result.csv
📊 可视化图表已保存: rfm_analysis.png

数据格式要求

customer_id,last_trade_date,trade_count,aum
C10001,2024-01-10,45,850000
C10002,2024-01-05,12,720000
C10003,2023-11-20,38,680000
...

进阶:动态RFM

# 按月更新RFM
class DynamicRFM(RFMAnalyzer):
    def update_monthly(self, new_transactions):
        """每月更新RFM评分"""
        # 合并新交易
        self.transactions = pd.concat([self.transactions, new_transactions])

        # 重新计算RFM
        self.rfm = self.analyze(self.transactions)

        # 检测变化
        changes = self.detect_changes()

        for customer_id, change in changes.items():
            if change['segment_changed']:
                print(f"⚠️ 客户 {customer_id} 从 {change['old_segment']} 变为 {change['new_segment']}")
                # 触发营销动作
                self.trigger_marketing(customer_id, change['new_segment'])

完整代码https://github.com/yuzhaopeng-up/financial-ai-skills/tree/main/skills/retail-marketing/examples

#RFM模型 #客户分层 #精准营销 #银行零售 #Python实战

相关文章
|
1天前
|
人工智能 监控 C++
技能架构设计:208个金融AI Skill的分类体系
银行智能体架构:7个Skill如何协同工作 实战代码:基于 financial-ai-skills 项目 | 架构设计 | Skill协同 | 数据流 单体架构 vs 微服务架构 银行系统常见的两种架构: `` 单体架构: 微服务架构: ┌─────────────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ 核心系统 │ │信贷 │ │风控 │ │营销 │ │ ├─信贷
|
1天前
|
人工智能 算法 Python
贷款计算器AI:从利率测算到还款方案优化
等额本息算法揭秘:信贷审批背后的数学 实战代码:基于 credit-approval Skill | 还款计算 | 利率定价 | 月供公式 信贷审批的核心:还款能力评估 银行审批贷款时,最核心的问题是:客户还得起吗? 这需要计算: 1. 月供金额:每月还多少 2. 还款能力:收入能否覆盖 3. 总利息:贷款成本多少 等额本息公式 等额本息是最常见的还款方式:每月还款额相同。 `` 月
|
2天前
|
人工智能 监控 数据库
贷前尽调AI助手:7步流水线实战
对公客户尽职调查智能化:从7天到7分钟的企业风险扫描 开源Skill:due-diligence | 企业风险画像 | 舆情监控 | 担��链分析 痛点:对公开户的"马拉松" 银行对公客户经理最怕什么?新开户尽调。 传统流程: 1. 收集企业资料(营业执照、财报、征信)→ 1天 2. 工商信息查询 → 1天 3. 舆情风险搜索 → 2天 4. 关联企业排查 → 2天 5. 撰写尽调报告
|
1天前
|
人工智能 自然语言处理 监控
开源生态构建:从6个GitHub仓库到金融AI工具链
开源金融AI技能库:56个场景全覆盖 实战代码:基于 financial-ai-skills 项目 | 开源生态 | 场景覆盖 | 贡献指南 项目概览 `` financial-ai-skills/ ├── README.md ├── LICENSE (MIT) ├── skills/ │ ├── financial-intelligence/ # 财务智能 (8个场景) │ ├──
|
1天前
|
人工智能 监控
工作流自动化AI:从审批流到合规检查的Skill编排
从工单到闭环:银行运营自动化完整方案 实战代码:基于 operations-automation Skill | 工单系统 | 流程编排 | SLA监控 痛点:银行运营的"人肉接力" 银行运营流程的典型场景: `` 客户投诉 → 客服记录 → 转运营 → 转技术 → 转合规 → 回复客户 ↑___________________________________________↓ (平
|
1天前
|
人工智能 算法
财富管理AI:从产品推荐到资产配置的智能化
银行财富管理AI助手:资产配置+税务优化+退休规划 开源Skill:wealth-management | 资产配置 | 税务优化 | 退休规划 痛点:财富管理的"信息不对称" 银行客户经理面对高净值客户时: 客户问:"我500万怎么配置?" → 经理凭经验推荐 客户问:"怎么合法节税?" → 经理说不清楚 客户问:"我50岁退休够吗?" → 经理算不出来 问题:缺乏量化工具,只能"
|
1天前
|
人工智能 监控
运营自动化AI:7大场景如何用Skill降本增效
银行运营7×24无人值守:工单自动分派+流程编排+监控告警 开源Skill:operations-automation | 工单系统 | 流程编排 | 智能监控 痛点:运营团队的"救火队"模式 银行运营团队的日常: 早上8点:处理昨晚积压的200+工单 上午10点:系统告警,紧急排查 下午3点:客户投诉,协调各部门 晚上8点:批处理失败,加班处理 问题:80%时间花在"救火",20%
|
1天前
|
人工智能 监控
信贷审批AI:规则引擎+LLM的双轨模式
银行信贷审批智能化:信用评分88分自动通过50万 开源Skill:credit-approval | 信用评分 | 自动审批 | 风险定价 痛点:信贷审批的"两难" 银行信贷审批面临永恒矛盾: 审得太严:好客户流失,业务做不起来 审得太松:坏账上升,风险控不住 传统人工审批: 小微企业贷款:3-5天 个人消费贷:1-2天 房贷:1-2周 客户等不及,经理审不完。 方案:评分卡+自动审
|
1天前
|
人工智能 搜索推荐
零售营销AI化:从客群细分到精准推荐
银行零售营销AI化:客户分层+精准推荐+AUM提升实战 开源Skill:retail-marketing | RFM模型 | 客户分层 | 精准营销 痛点:"撒网式"营销的困境 银行零售客户经理的常见场景: 群发理财短信,回复率 0.3% 电话推销信用卡,接通率 15% 网点发传单,转化率 0.1% 问题:不知道谁是目标客户,只能大海捞针。 方案:RFM+AI的客户分层运营 我开发的
|
1天前
|
人工智能
贷前尽调报告AI生成:结构化提取与风险标注
对公开户尽调:一键生成标准化Markdown风险报告 实战代码:基于 due-diligence Skill | 企业风险扫描 | 报告自动生成 痛点:尽调报告的"复制粘贴" 银行对公客户经理写尽调报告: 1. 打开Word模板 2. 复制粘贴企业信息 3. 手动填写风险分析 4. 调整格式、排版 5. 反复修改... 平均耗时:4小时/份,且容易出错。 方案:一键生成标准化报告 `