1、聚类分析的概念:

聚类分析是无监督学习,目标是将数据集划分为若干组,使得组内相似度高,且组间差异较大。与监督学习的区别是组中没有表示数据类别的分类信息。不需要预先知道数据的标签,而是将相似的数分到一组。

原始数据很杂乱,通过聚类分析对数据分组,无须预先标注数据

原始数据 → 🟦🟥🟩🟨🟪⬜️ (混乱状态)

聚类算法 → 🟦🟦🟦 | 🟥🟥🟥 | 🟩🟩🟩 (自动分组)

1.1 数据预处理

        先对原始数据进行处理,首先对数据标准化,接着处理异常值、冗余特征

        -- 标准化:不同特征的量纲差异会影响聚类效果,需将数据缩放至同一尺度,如Z-score标准化:

        -- 缺失值处理:采用均值、中位数或预测方法填充缺失值

        -- 特征选择:去掉冗余特征。比如用户浏览时长和点击次数高度相关,可以去掉一个

1.2 距离度量

        数据之间的相似性是通过定义一个距离或相关系数来判断

  • 欧式距离:适用于连续数据

  • 曼哈顿距离:在数据中存在异常值时能够保持稳定

  • 余弦相似性:衡量向量间方向一致性的角度,常用于文本数据

2、主流的聚类算法

K-Means算法

1)定义

        数据特点是大样本,实际场景如用户消费行为分群

2)算法步骤
  1. 随机选K个中心点(质心)
  2. 将每个点分配给最近的质心
  3. 重新计算质心位置
  4. 重复第2,3步,知道质心位置不在显著变化,说明聚类已经收敛

DBSCAN算法

1)定义

        可以处理任意形状的数据,还能识别噪声点,可用于异常交易检测

2)算法步骤
  1. 找到核心点,(邻居≥min_samples),核心点是指周围邻居数量超过设定阈值的点
  2. 合并密度可达的核心点成簇,将这些核心点以及它们的邻居连接起来,形成一个个聚类簇
  3. 标记边界点,识别出那些位于簇边缘的点,它们虽然属于某个簇,但周围邻居数量较少
  4. 忽略噪声点,过滤掉那些既不属于任何核心点邻居,也不属于边界点的孤立点

3、簇内有效性评价

3.1 内部指标(无需真实标签)

  • 轮廓系数:衡量样本与自身簇或其他簇的紧密程度

        s(i) = (b(i) - a(i)) / max(a(i), b(i))。范围在[-1,1],>0.5表示聚类合理。

  • 肘部法则:选择最佳K值,通过绘制不同K值对应的簇内误差平方和,观察拐点来确定最佳聚类数。

3.2 外部指标(需要真实标签)

  • 调整兰德指数(ARI):比较聚类与真实分类的相似度,考虑聚类结果与真实标签的重叠情况,取值范围在[-1,1],值越高表示聚类结果越接近真实分类。
  • 互信息(NMI):衡量两个划分的信息重叠程度。其值范围在[0,1],值越高说明两个划分的信息重叠越多,聚类结果越接近真实分类

4、案例

4.1 背景

比如一个电商平台拥有10万用户的行为数据,包含月订单数、客单价、最近购买频率、优惠券使用率几个特征。现在要通过聚类分析将用户分为不同价值群体,制定差异化营销策略。

4.2 分析

首先通过数据预处理,采用K近邻插值填充缺失值,对特征值进行Z-score标准化处理

然后采用K-Means算法,通过手肘法则确定K值,通过聚类分析将用户分成不同价值用户群,再针对每个群体制定不同的营销策略。高价值群体(提高专属优惠和会员服务)低价值群体(促销活动提升购买频率和客单价)

4.3 代码实现

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns


# 1、加载数据
df = pd.read_csv('user_data.csv')

# 2、特征选择
features = df[['月订单数','客单价','最近购买间隔','优惠券使用率']]

# 3、数据标准化
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)

# 4、确认最佳K值(肘部法则)
wcss = []
for k in range(1,11):
    kmeans = KMeans(n_clusters=k,random_state=42)
    kmeans.fit(scaled_features)
    wcss.append(kmeans.inertia_)

plt.plot(range(1,11),wcss,marker='o')
plt.title('肘部法则 - 选择最佳K值')
plt.xlabel('簇数量')
plt.ylabel('WCSS')
plt.show() # K=4

# 5、执行聚类
kmeans = KMeans(n_clusters=4,random_state=42)
df['cluster'] = kmeans.fit_predict(scaled_features)

# 6、分析结果
cluster_profile = df.groupby('cluster').agg({
    '月订单数':'mean',
    '客单价':'median',
    '最近购买间隔':'mean',
    '优惠券使用率':'mean'
}).reset_index()

# 7. 可视化
plt.figure(figsize=(10,6))
sns.scatterplot(data=df, x='客单价', y='月订单数',
                hue='cluster', palette='viridis',
                size='最近购买间隔', sizes=(20,200))
plt.title('用户价值分群结果')
plt.show()
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐