京公网安备 11010802034615号
			经营许可证编号:京B2-20210330
		在 CDA(Certified Data Analyst)数据分析师的工作中,“无监督样本分组” 是高频需求 —— 例如 “将用户按行为特征分为高价值、潜力、一般用户”“将商品按销售表现归类为爆款、平销、滞销品”。这类问题缺乏明确标签(如无 “用户等级” 标注),而聚类分析(Clustering Analysis) 正是核心解决方案:它通过衡量样本间的相似性(如距离),将特征相似的样本自动归为一类,实现 “从无标签数据中挖掘潜在分组规律”。本文聚焦 CDA 分析师如何运用聚类分析解决业务问题,覆盖核心认知、实操流程、全流程案例与误区规避,助力从 “数据聚合” 到 “精准运营” 的落地转化。
聚类分析是一种无监督学习算法,核心目标是 “基于样本特征的相似性,将无标签数据自动划分为若干个互不重叠的簇(Cluster)”,簇内样本相似度高,簇间样本相似度低。其核心逻辑可概括为:
定义相似性:通过距离指标(如欧氏距离、曼哈顿距离)衡量样本间的相似性,距离越小相似度越高;
簇划分规则:按预设算法(如 K-Means 的中心迭代、层次聚类的树状合并)将样本分配到不同簇中;
业务映射:将抽象的簇转化为可理解的业务分组(如 “簇 1 = 高消费高活跃用户”)。
其核心优势在于无监督发现:无需提前标注标签,可从原始数据中挖掘潜在分组规律,适合探索性数据分析(如 “未知用户分层结构”“商品隐性分类”)。
普通使用者常止步于 “跑出簇标签、输出分组结果”,而 CDA 分析师的价值体现在 “业务 - 数据 - 聚类 - 策略” 的闭环,两者差异显著:
| 对比维度 | 普通使用者 | CDA 分析师 | 
|---|---|---|
| 分析目标 | 追求 “簇内相似度高”,忽视业务意义 | 平衡 “聚类效果” 与 “业务可解释性”(如簇需对应明确运营维度) | 
| 数据处理 | 直接对原始数据聚类(如未标准化,量纲干扰结果) | 严格预处理(标准化、异常值剔除、特征筛选),确保聚类可靠 | 
| 簇数确定 | 随意指定簇数(如固定分 3 组) | 结合统计指标(肘部法则、轮廓系数)与业务需求确定最佳簇数 | 
| 结果落地 | 仅输出簇标签,无后续动作 | 转化为业务策略(如基于簇特征制定差异化运营方案) | 
CDA 分析师在聚类分析中的价值,不是 “机械划分簇”,而是:
簇特征解读师:分析每个簇的核心特征(如 “簇 1 消费金额均值高、复购频次高”),将抽象簇定义为业务分组(如 “核心用户”);
策略落地者:基于簇的特征差异制定运营策略(如核心用户专属服务、潜力用户转化激励)。
聚类算法多样,CDA 分析师需根据数据特征(如样本量、密度分布)与业务需求选择适配算法,核心掌握K-Means 聚类(最常用)、层次聚类(可视化强)、密度聚类(DBSCAN)(抗异常值)三类。
K-Means 是最经典的聚类算法,核心是 “迭代优化簇中心,使簇内样本到中心的距离和最小”,适用于样本量大、簇呈球形分布的场景(如用户行为分层、商品销量聚类)。
预设簇数 K;
随机初始化 K 个簇中心;
计算每个样本到簇中心的距离,分配至最近簇;
重新计算各簇中心(样本均值);
重复 3-4 步,直至簇中心稳定(收敛)。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
plt.rcParams['font.sans-serif'] = ['SimHei']
# 1. 数据加载与预处理
# 数据:电商用户行为特征(消费金额、复购频次、浏览次数、访问时长)
df = pd.read_csv("电商用户行为数据.csv")
X = df.drop("用户ID", axis=1)
user_ids = df["用户ID"]  # 保留用户ID用于后续关联
# 1.1 异常值处理(3σ原则)
def remove_outliers(data, col):
   mean = data[col].mean()
   std = data[col].std()
   return data[(data[col] >= mean - 3*std) & (data[col] <= mean + 3*std)]
for col in X.columns:
   X = remove_outliers(X, col)
# 1.2 标准化(K-Means对量纲敏感,必做步骤)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled_df = pd.DataFrame(X_scaled, columns=X.columns)
# 2. 确定最佳簇数K(肘部法则+轮廓系数)
# 2.1 肘部法则(看簇内平方和拐点)
inertia = []
k_range = range(2, 10)  # 测试K=2到9
for k in k_range:
   kmeans = KMeans(n_clusters=k, random_state=42)
   kmeans.fit(X_scaled)
   inertia.append(kmeans.inertia_)  # 簇内平方和
# 可视化肘部法则
plt.figure(figsize=(10, 5))
plt.plot(k_range, inertia, marker="o", linewidth=2, color="#1f77b4")
plt.axvline(x=4, color="red", linestyle="--", label="K=4(肘部拐点)")
plt.title("K-Means肘部法则(确定最佳簇数K)")
plt.xlabel("簇数K")
plt.ylabel("簇内平方和(Inertia)")
plt.legend()
plt.grid(alpha=0.3)
plt.show()
# 2.2 轮廓系数(评估聚类效果,越接近1越好)
sil_scores = []
for k in k_range:
   kmeans = KMeans(n_clusters=k, random_state=42)
   clusters = kmeans.fit_predict(X_scaled)
   sil_score = silhouette_score(X_scaled, clusters)
   sil_scores.append(sil_score)
# 可视化轮廓系数
plt.figure(figsize=(10, 5))
plt.plot(k_range, sil_scores, marker="o", linewidth=2, color="#ff7f0e")
plt.axvline(x=4, color="red", linestyle="--", label="K=4(轮廓系数较高)")
plt.title("K-Means轮廓系数(评估聚类效果)")
plt.xlabel("簇数K")
plt.ylabel("轮廓系数(Silhouette Score)")
plt.legend()
plt.grid(alpha=0.3)
plt.show()
# 3. 确定最佳K=4,执行K-Means聚类
best_k = 4
kmeans = KMeans(n_clusters=best_k, random_state=42)
clusters = kmeans.fit_predict(X_scaled)
# 4. 聚类结果分析
# 合并簇标签与原始数据
df_result = pd.DataFrame({
   "用户ID": user_ids.iloc[X.index],  # 对齐预处理后的样本
   "消费金额": X["消费金额"].values,
   "复购频次": X["复购频次"].values,
   "浏览次数": X["浏览次数"].values,
   "访问时长": X["访问时长"].values,
   "簇标签": clusters
})
# 分析各簇核心特征
cluster_analysis = df_result.groupby("簇标签").agg({
   "消费金额": "mean",
   "复购频次": "mean",
   "浏览次数": "mean",
   "访问时长": "mean"
}).round(2)
print("=== K-Means聚类结果(K=4) ===")
print(cluster_analysis)
print(f"n轮廓系数:{silhouette_score(X_scaled, clusters):.3f}(≥0.5说明聚类效果良好)")
# 5. 可视化聚类结果(消费金额vs复购频次)
plt.figure(figsize=(10, 6))
scatter = plt.scatter(
   df_result["消费金额"],
   df_result["复购频次"],
   c=df_result["簇标签"],
   cmap="Set2",
   alpha=0.7,
   s=60
)
plt.colorbar(scatter, label="簇标签")
plt.xlabel("消费金额(元)")
plt.ylabel("复购频次(次/月)")
plt.title("电商用户K-Means聚类结果(消费金额vs复购频次)")
plt.grid(alpha=0.3)
# 标注簇中心
cluster_centers = scaler.inverse_transform(kmeans.cluster_centers_)  # 反标准化回原始尺度
for i, center in enumerate(cluster_centers):
   plt.scatter(center[0], center[1], marker="*", s=200, color="red", label=f"簇{i}中心")
plt.legend()
plt.show()
最佳簇数 K=4,轮廓系数 = 0.62(良好),聚类效果可靠;
簇特征定义:
簇 0:消费金额高(890 元)、复购频次高(12 次)→ 核心用户;
簇 1:消费金额低(120 元)、浏览次数高(58 次)→ 潜力用户;
簇 2:消费金额高(750 元)、复购频次低(3 次)→ 流失风险用户;
簇 3:消费金额低(80 元)、浏览次数低(15 次)→ 一般用户。
层次聚类通过 “自下而上合并(凝聚式)” 或 “自上而下拆分(分裂式)” 构建簇的树状结构,适用于样本量小、需可视化簇关系的场景(如客户细分研究、商品分类探索)。
无需预设簇数,可通过树状图(Dendrogram)直观选择簇数;
适合分析簇间层级关系(如 “核心用户” 包含 “高消费高活跃” 和 “高消费低活跃” 子簇);
缺点:样本量大时计算效率低(时间复杂度 O (n³))。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
from sklearn.preprocessing import StandardScaler
plt.rcParams['font.sans-serif'] = ['SimHei']
# 1. 数据加载与预处理(商品销售数据:销量、毛利率、库存周转率)
df = pd.read_csv("商品销售数据.csv")
X = df.drop("商品ID", axis=1)
X_scaled = StandardScaler().fit_transform(X)
# 2. 执行层次聚类(凝聚式,欧氏距离+Ward链接法)
linkage_matrix = linkage(X_scaled, method="ward", metric="euclidean")  # Ward法最小化簇内方差
# 3. 可视化树状图
plt.figure(figsize=(12, 6))
dendrogram(
   linkage_matrix,
   labels=df["商品ID"].values,
   leaf_rotation=90,
   leaf_font_size=8,
   color_threshold=10  # 颜色阈值,辅助划分簇
)
plt.axhline(y=10, color="red", linestyle="--", label="簇数划分阈值")
plt.title("商品层次聚类树状图")
plt.xlabel("商品ID")
plt.ylabel("簇间距离")
plt.legend()
plt.tight_layout()
plt.show()
# 4. 根据树状图确定簇数K=3,提取簇标签
best_k = 3
clusters = fcluster(linkage_matrix, t=10, criterion="distance")  # 按距离阈值划分
# 5. 结果分析
df_result = pd.concat([df, pd.DataFrame({"簇标签": clusters-1})], axis=1)  # 簇标签从0开始
cluster_analysis = df_result.groupby("簇标签").agg({
   "销量": "mean",
   "毛利率": "mean",
   "库存周转率": "mean"
}).round(2)
print("=== 层次聚类结果(K=3) ===")
print(cluster_analysis)
树状图显示,按距离阈值 10 可将商品分为 3 簇:
簇 0:高销量(1200 件)、高毛利率(35%)→ 爆款商品;
簇 1:中销量(500 件)、中毛利率(25%)→ 平销商品;
簇 2:低销量(100 件)、低毛利率(15%)→ 滞销商品。
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)基于 “样本密度” 聚类,核心是 “将密度足够高的区域划分为簇,低密度区域为异常值”,适用于非球形簇、含异常值的场景(如用户行为轨迹聚类、异常交易识别)。
核心参数:ε(邻域半径)、min_samples(邻域内最小样本数);
优势:无需预设簇数,自动识别异常值,适配任意形状簇;
缺点:对 ε 和 min_samples 敏感,高维数据效果较差。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import DBSCAN
plt.rcParams['font.sans-serif'] = ['SimHei']
# 1. 数据加载与预处理(交易数据:交易金额、交易频率、异地交易占比)
df = pd.read_csv("交易数据.csv")
X = df.drop("交易ID", axis=1)
X_scaled = StandardScaler().fit_transform(X)
# 2. 确定DBSCAN参数(ε=0.5,min_samples=5,可通过K距离图优化)
dbscan = DBSCAN(eps=0.5, min_samples=5, metric="euclidean")
clusters = dbscan.fit_predict(X_scaled)
# 3. 结果分析(-1表示异常值)
df_result = pd.concat([df, pd.DataFrame({"簇标签": clusters})], axis=1)
normal_count = sum(clusters != -1)
outlier_count = sum(clusters == -1)
print("=== DBSCAN聚类结果 ===")
print(f"正常交易簇数:{len(set(clusters))-1}(-1为异常值)")
print(f"正常交易数:{normal_count},异常交易数:{outlier_count}")
print(f"异常交易占比:{outlier_count/len(clusters)*100:.2f}%")
# 分析正常簇特征
normal_clusters = df_result[df_result["簇标签"] != -1]
cluster_analysis = normal_clusters.groupby("簇标签").agg({
   "交易金额": "mean",
   "交易频率": "mean",
   "异地交易占比": "mean"
}).round(2)
print("n正常交易簇特征:")
print(cluster_analysis)
# 4. 可视化结果(交易金额vs异地交易占比)
plt.figure(figsize=(10, 6))
# 正常簇
for cluster in set(clusters):
   if cluster != -1:
       data = df_result[df_result["簇标签"] == cluster]
       plt.scatter(
           data["交易金额"],
           data["异地交易占比"],
           label=f"簇{cluster}",
           alpha=0.7,
           s=60
       )
# 异常值(红色×)
outliers = df_result[df_result["簇标签"] == -1]
plt.scatter(
   outliers["交易金额"],
   outliers["异地交易占比"],
   color="red",
   marker="x",
   s=100,
   label="异常交易"
)
plt.xlabel("交易金额(元)")
plt.ylabel("异地交易占比(%)")
plt.title("DBSCAN交易聚类结果(红色×为异常交易)")
plt.legend()
plt.grid(alpha=0.3)
plt.show()
DBSCAN 自动识别出 2 个正常交易簇和 15% 的异常交易;
异常交易特征:交易金额极高(均值 5000 元)、异地交易占比 100%,需重点排查欺诈风险;
正常簇 1:低金额(500 元)、低异地占比(10%)→ 日常消费交易;
正常簇 2:中金额(2000 元)、中异地占比(30%)→ 出差消费交易。
某电商平台拥有 10 万用户,用户行为特征分散,运营策略缺乏针对性,需通过聚类分析按 “消费能力、互动活跃度、留存潜力” 分层,制定差异化运营方案,提升用户留存与 GMV。
异常值处理:3σ 原则剔除极端值(如消费金额 > 10000 元);
标准化:StandardScaler 处理,确保量纲一致。
选择 K-Means(样本量大,簇呈球形分布);
肘部法则与轮廓系数确定最佳簇数 K=4。
# 1. 执行K-Means聚类(K=4)
kmeans = KMeans(n_clusters=4, random_state=42)
clusters = kmeans.fit_predict(X_scaled)
# 2. 簇特征详细分析
df_result = pd.DataFrame({
   "用户ID": df["用户ID"],
   "消费金额": df["消费金额"],
   "复购频次": df["复购频次"],
   "浏览次数": df["浏览次数"],
   "访问时长": df["访问时长"],
   "收藏次数": df["收藏次数"],
   "簇标签": clusters
})
# 计算各簇关键指标
cluster_metrics = df_result.groupby("簇标签").agg({
   "用户ID": "count",
   "消费金额": ["mean", "median"],
   "复购频次": "mean",
   "浏览次数": "mean"
}).round(2)
cluster_metrics.columns = ["用户数", "平均消费金额", "中位数消费金额", "平均复购频次", "平均浏览次数"]
cluster_metrics["用户占比"] = (cluster_metrics["用户数"] / cluster_metrics["用户数"].sum() * 100).round(2)
print("=== 电商用户分层详细结果 ===")
print(cluster_metrics)
# 3. 簇业务命名与特征总结
cluster_names = {
   0: "核心用户(高消费+高复购+高互动)",
   1: "潜力用户(低消费+高互动+高潜力)",
   2: "流失风险用户(高消费+低互动+低复购)",
   3: "一般用户(低消费+低互动+低潜力)"
}
print("n=== 簇业务解读 ===")
for cluster, name in cluster_names.items():
   metrics = cluster_metrics.loc[cluster]
   print(f"- {name}:用户占比{metrics['用户占比']}%,平均消费{metrics['平均消费金额']:.0f}元,平均复购{metrics['平均复购频次']:.1f}次;")
# 4. 可视化分层结果(消费金额vs浏览次数)
plt.figure(figsize=(12, 6))
colors = ["#ff9999", "#66b3ff", "#99ff99", "#ffcc99"]
for cluster in range(4):
   data = df_result[df_result["簇标签"] == cluster]
   plt.scatter(
       data["消费金额"],
       data["浏览次数"],
       color=colors[cluster],
       label=cluster_names[cluster],
       alpha=0.7,
       s=50
   )
plt.xlabel("消费金额(元)")
plt.ylabel("浏览次数(次/月)")
plt.title("电商用户K-Means分层结果")
plt.legend(bbox_to_anchor=(1.05, 1), loc="upper left")
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
# 5. 分层运营策略落地
print("n=== 分层运营策略 ===")
print("1. 核心用户(簇0):")
print("   - 专属权益:VIP客服、新品优先购、满减券(满1000减200);")
print("   - 运营目标:提升留存率,促进交叉消费;")
print("2. 潜力用户(簇1):")
print("   - 激励策略:新人优惠券(满200减50)、个性化商品推荐;")
print("   - 运营目标:提升消费转化率,培养复购习惯;")
print("3. 流失风险用户(簇2):")
print("   - 召回策略:定向推送召回短信、专属回归福利(满500减100);")
print("   - 运营目标:激活互动活跃度,提升复购频次;")
print("4. 一般用户(簇3):")
print("   - 基础运营:低成本签到奖励、大众化商品推送;")
print("   - 运营目标:维持基础粘性,筛选潜力用户。")
业务价值:落地策略后,核心用户留存率提升 18%,潜力用户消费转化率提升 12%,流失风险用户召回率提升 25%,整体 GMV 增长 15%。
表现:“消费金额(万元)” 与 “浏览次数(次)” 未标准化,K-Means 聚类时消费金额主导距离计算,导致簇划分失真;
规避策略:
表现:固定 K=3 进行 K-Means 聚类,未用肘部法则 / 轮廓系数验证,导致簇内特征重叠(如核心用户与潜力用户混为一簇);
规避策略:
结合统计指标(肘部法则找拐点、轮廓系数最大化)与业务需求(如按 “拉新、促活、留存” 目标分 3-5 簇)确定最佳簇数;
拒绝 “拍脑袋” 定簇数,确保簇划分既有统计意义,又符合运营场景。
表现:原始数据含极端异常值(如消费金额 = 10 万元),未剔除直接聚类,导致簇中心向异常值偏移,正常样本分组混乱;
规避策略:
表现:对非球形簇数据(如用户行为轨迹的不规则分布)用 K-Means,导致聚类效果差;对大样本数据用层次聚类,导致计算超时;
规避策略:
按数据特征选择算法:
小样本预测试:先对部分数据测试不同算法,选择效果最优者。
表现:聚类后仅得到 “用户分为 4 簇”,未分析簇特征,也未制定运营策略,导致聚类结果无业务价值;
规避策略:
计算各簇核心指标(均值、中位数、占比);
结合业务逻辑命名簇(如 “核心用户”“潜力用户”);
针对簇特征制定差异化策略(如核心用户专属服务、潜力用户转化激励);
对 CDA 数据分析师而言,聚类分析不仅是 “无监督样本分组工具”,更是 “精准业务运营的基础”—— 它能从海量无标签数据中挖掘潜在分组规律,让运营策略从 “一刀切” 升级为 “千人千面”。
在数据驱动的时代,CDA 分析师需避免 “只懂技术不懂业务”,始终以 “业务价值” 为核心:用数据预处理确保聚类可靠,用科学指标确定最佳簇数,用业务逻辑解读簇特征,用差异化策略落地聚类结果。无论是电商用户分层、金融客户风险分级,还是零售商品分类,聚类分析都能以 “无监督发现 + 精准适配” 成为 CDA 分析师的核心利器,这正是其作为经典无监督学习算法的永恒价值。
若需进一步落地应用,我可以帮你整理一份CDA 聚类分析实操手册,包含不同业务场景(用户分层、商品分类、异常识别)的算法选择、代码模板、簇数确定方法与运营策略,方便你直接复用。

教材入口:https://edu.cda.cn/goods/show/3151 “纲举目张,执本末从。” 若想在数据分析领域有所收获,一套合适的学习教材至 ...
2025-11-04【2025最新版】CDA考试教材:CDA教材一级:商业数据分析(2025)__商业数据分析_cda教材_考试教材 (cdaglobal.com) ...
2025-11-04在数字化时代,数据挖掘不再是实验室里的技术探索,而是驱动商业决策的核心能力 —— 它能从海量数据中挖掘出 “降低成本、提升 ...
2025-11-04在 DDPM(Denoising Diffusion Probabilistic Models)训练过程中,开发者最常困惑的问题莫过于:“我的模型 loss 降到多少才算 ...
2025-11-04在 CDA(Certified Data Analyst)数据分析师的工作中,“无监督样本分组” 是高频需求 —— 例如 “将用户按行为特征分为高价值 ...
2025-11-04当沃尔玛数据分析师首次发现 “啤酒与尿布” 的高频共现规律时,他们揭开了数据挖掘最迷人的面纱 —— 那些隐藏在消费行为背后 ...
2025-11-03这个问题精准切中了配对样本统计检验的核心差异点,理解二者区别是避免统计方法误用的关键。核心结论是:stats.ttest_rel(配对 ...
2025-11-03在 CDA(Certified Data Analyst)数据分析师的工作中,“高维数据的潜在规律挖掘” 是进阶需求 —— 例如用户行为包含 “浏览次 ...
2025-11-03在 MySQL 数据查询中,“按顺序计数” 是高频需求 —— 例如 “统计近 7 天每日订单量”“按用户 ID 顺序展示消费记录”“按产品 ...
2025-10-31在数据分析中,“累计百分比” 是衡量 “部分与整体关系” 的核心指标 —— 它通过 “逐步累加的占比”,直观呈现数据的分布特征 ...
2025-10-31在 CDA(Certified Data Analyst)数据分析师的工作中,“二分类预测” 是高频需求 —— 例如 “预测用户是否会流失”“判断客户 ...
2025-10-31在 MySQL 实际应用中,“频繁写入同一表” 是常见场景 —— 如实时日志存储(用户操作日志、系统运行日志)、高频交易记录(支付 ...
2025-10-30为帮助教育工作者、研究者科学分析 “班级规模” 与 “平均成绩” 的关联关系,我将从相关系数的核心定义与类型切入,详解 “数 ...
2025-10-30对 CDA(Certified Data Analyst)数据分析师而言,“相关系数” 不是简单的数字计算,而是 “从业务问题出发,量化变量间关联强 ...
2025-10-30在构建前向神经网络(Feedforward Neural Network,简称 FNN)时,“隐藏层数目设多少?每个隐藏层该放多少个神经元?” 是每个 ...
2025-10-29这个问题切中了 Excel 用户的常见困惑 —— 将 “数据可视化工具” 与 “数据挖掘算法” 的功能边界混淆。核心结论是:Excel 透 ...
2025-10-29在 CDA(Certified Data Analyst)数据分析师的工作中,“多组数据差异验证” 是高频需求 —— 例如 “3 家门店的销售额是否有显 ...
2025-10-29在数据分析中,“正态分布” 是许多统计方法(如 t 检验、方差分析、线性回归)的核心假设 —— 数据符合正态分布时,统计检验的 ...
2025-10-28箱线图(Box Plot)作为展示数据分布的核心统计图表,能直观呈现数据的中位数、四分位数、离散程度与异常值,是质量控制、实验分 ...
2025-10-28在 CDA(Certified Data Analyst)数据分析师的工作中,“分类变量关联分析” 是高频需求 —— 例如 “用户性别是否影响支付方式 ...
2025-10-28