AI 客户分群进化论:从规则分群到 AI 聚类再到动态标签
一、客户分群这件事,你做对了吗
"把用户分成新用户、活跃用户、沉睡用户"——这大概是每个数据分析师都做过的事情。基于几行 SQL 的 IF-ELSE 规则,简单粗暴地把用户打上标签。
问题在哪呢?用户的行为从来不是非黑即白的。一个"沉睡用户"昨天刚浏览了 5 个商品页面,一个"活跃用户"可能三个月没下单只是天天签到领积分。规则分群太僵硬了,它只能描述你已知的模式,发现不了你未知的规律。
今天这篇文章,我想沿着客户分群的进化路线走一遍:从规则的起点,到 AI 聚类的升级,再到动态标签体系。
客户分群三阶段的进化路径:
二、V1:规则分群——SQL 一把梭
规则分群是最入门的玩法,核心就是 SQL + CASE WHEN:
-- 传统规则分群:基于 RFM 模型的简单实现 -- R: 最近消费时间(Recency) -- F: 消费频次(Frequency) -- M: 消费金额(Monetary) SELECT user_id, DATEDIFF(CURRENT_DATE, last_order_date) AS recency_days, total_orders AS frequency, total_amount AS monetary, CASE -- 高价值用户:最近消费 + 高频 + 高金额 WHEN DATEDIFF(CURRENT_DATE, last_order_date) <= 30 AND total_orders >= 5 AND total_amount >= 1000 THEN '高价值用户' -- 重要发展用户:最近消费 + 高频,但金额偏低 WHEN DATEDIFF(CURRENT_DATE, last_order_date) <= 30 AND total_orders >= 3 THEN '重要发展用户' -- 重要挽留用户:曾经是高价值但已流失 WHEN DATEDIFF(CURRENT_DATE, last_order_date) > 60 AND total_orders >= 5 AND total_amount >= 1000 THEN '重要挽留用户' -- 一般用户 WHEN DATEDIFF(CURRENT_DATE, last_order_date) <= 90 THEN '一般活跃用户' -- 流失用户 ELSE '流失用户' END AS user_segment FROM user_rfm_summary;这套逻辑的优点是快速、可解释、运营能看懂。但它的问题也很致命:
- 阈值是拍脑袋的:为什么是 30 天而不是 28 天?
- 维度太少了:只看交易行为,忽略了浏览、收藏、加购等行为
- 无法发现隐藏模式:一些用户可能在浏览维度上高度相似,但 RFM 完全看不到
三、V2:AI 聚类分群——让数据自己说话
聚类的核心思想是"让数据自己分组"。我们选的是K-Means + PCA 降维可视化的组合:
import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.metrics import silhouette_score def ai_user_segmentation(df, feature_cols, k_range=range(3, 10)): """使用 K-Means 聚类进行 AI 驱动的用户分群 参数: df: 包含用户行为特征的 DataFrame feature_cols: 用于聚类的特征列 k_range: 尝试的聚类数量范围 返回: 最佳模型、聚类结果、每个簇的特征画像 """ # Step 1: 特征标准化(聚类对尺度敏感,必须标准化) scaler = StandardScaler() X_scaled = scaler.fit_transform(df[feature_cols]) # Step 2: 通过轮廓系数选择最佳 K 值 best_k = 3 best_score = -1 for k in k_range: kmeans = KMeans(n_clusters=k, random_state=42, n_init=10) labels = kmeans.fit_predict(X_scaled) score = silhouette_score(X_scaled, labels) if score > best_score: best_score = score best_k = k print(f"K={k}, 轮廓系数={score:.4f}") print(f"\n最优 K 值: {best_k}, 轮廓系数: {best_score:.4f}") # Step 3: 用最优 K 值训练最终模型 final_model = KMeans(n_clusters=best_k, random_state=42, n_init=10) df['cluster'] = final_model.fit_predict(X_scaled) # Step 4: 生成每个簇的特征画像 cluster_profiles = df.groupby('cluster')[feature_cols].mean() # 用 PCA 降到 2 维用于可视化 pca = PCA(n_components=2) X_pca = pca.fit_transform(X_scaled) df['pca_x'] = X_pca[:, 0] df['pca_y'] = X_pca[:, 1] print(f"\n=== 各簇用户占比 ===") print(df['cluster'].value_counts(normalize=True).sort_index()) print(f"\n=== 各簇特征均值 ===") print(cluster_profiles.round(2)) return final_model, df, cluster_profiles # 聚类特征示例(比 RFM 维度更丰富) # feature_cols = [ # 'recency_days', # 距上次活跃天数 # 'order_count_30d', # 近30天下单数 # 'order_amount_90d', # 近90天消费金额 # 'browse_count_30d', # 近30天浏览商品数 # 'cart_add_count_30d', # 近30天加购次数 # 'coupon_use_count_30d', # 近30天用券次数 # 'avg_session_duration', # 平均会话时长(秒) # 'review_count', # 累计评价数 # ]在一次实际分析中,K-Means 帮我们发现了一个 RFM 规则完全没有捕捉到的群体——"浏览狂魔型"用户:几乎不下单,但每天浏览 50+ 个商品、加购 10+ 次但迟迟不下单。这群用户其实是最适合发券转化的目标,但按 RFM 规则他们被分成了"流失用户",直接放弃了。
聚类不是终点
AI 聚类虽然比规则分群更科学,但它有个致命局限:分群结果是一次性的静态快照。一个用户今天是"A 类"用户,明天行为变了,他不会自动变成"B 类"——除非你重新跑一遍聚类。
这就引出了第三阶段的问题:如何让分群动态起来。
四、V3:动态标签体系——让分群活起来
动态标签的核心思路是:不把用户关在一个固定的"群"里,而是给用户打上一系列实时更新的标签。这样运营同学可以根据活动目标灵活组合标签来圈定目标人群,而不需要通过数据团队反复跑 SQL 取数。
标签体系设计原则
- 标签要分层级:一级分类(人口属性/行为偏好/消费能力/风险特征)→ 二级标签(性别/价格敏感度/流失风险)→ 标签值
- 标签要有生命周期:不是所有标签都永久有效,要定义 TTL
- 标签要可组合:运营应该能灵活组合标签,而不是被固定的分群框住
-- 动态标签的实时更新逻辑(以 Kafka + Flink 为例) -- 监听用户行为事件流,实时更新标签值 -- 示例:用户"价格敏感度"标签的计算逻辑 -- 触发条件:用户使用优惠券 → 价格敏感度 +1 -- 用户原价购买 → 价格敏感度 -1 -- 标签值范围: 0~100 UPDATE user_tags SET tag_value = CASE WHEN tag_value + 1 > 100 THEN 100 -- 上限 100 ELSE tag_value + 1 END, updated_at = NOW() WHERE user_id = 12345 AND tag_name = 'price_sensitivity' AND event_type = 'coupon_used'; -- 使用了优惠券五、总结
客户分群的进化不只是技术升级,更是思维方式的变化:
- V1 规则分群:适合快速启动,运营友好,但边界僵硬、维度有限
- V2 AI 聚类:能发现隐藏模式,K-Means + 轮廓系数选 K 是标准操作,但结果是一次性快照
- V3 动态标签:标签可组合、可过期、可实时更新,是真正的"千人千面"
- 进阶不是"V3 替代 V1",而是三者共存:规则分群做日常运营,聚类做深度分析,动态标签做精细化触达
- 标签体系最容易被忽视的是标签质量治理——无效标签要及时清理,否则运营会被"标签噪音"淹没
你们现在用的是哪个阶段的方法?还在 RFM 吗,还是已经有自己的标签平台了?评论区说说现状,一起交流~
最后提醒一点:这个方案在上生产之前建议先用灰度流量验证一周,确认资源消耗在预期范围内再全量推送。我们在实际项目中因为跳过了这步,有一次把缓存集群打挂了,教训深刻。