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 取数。
标签体系设计原则
— 动态标签的实时更新逻辑(以 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'; — 使用了优惠券
五、总结
客户分群的进化不只是技术升级,更是思维方式的变化:
你们现在用的是哪个阶段的方法?还在 RFM 吗,还是已经有自己的标签平台了?评论区说说现状,一起交流~
最后提醒一点:这个方案在上生产之前建议先用灰度流量验证一周,确认资源消耗在预期范围内再全量推送。我们在实际项目中因为跳过了这步,有一次把缓存集群打挂了,教训深刻。




