#引用要用的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt #画图
from sklearn.cluster import Birch
from sklearn.cluster import KMeans
from sklearn.cluster import KMeans,DBSCAN #对比两个算法的聚类差异
from sklearn.metrics import calinski_harabasz_score #ch得分用于评价聚类效果,越大越好

  • 数据处理‌:numpypandas用于数据加载、清洗和预处理。
  • 可视化‌:matplotlib用于生成聚类结果的图表。
  • 聚类分析‌:BirchKMeansDBSCAN用于不同聚类算法的对比分析。
  • 效果评估‌:calinski_harabasz_score用于量化聚类效果,帮助选择最优算法。

#读取数据
data = pd.read_csv('ods_cust_cosumption_info.csv',encoding='gb2312')
data.head(10)

  • 数据加载‌:将CSV文件加载到pandas数据框中,便于后续分析。
  • 数据预览‌:通过head方法快速检查数据前10行,确保数据读取正确。

从用户消费数据表格可得出以下结论:

  • 消费行为差异显著‌:消费次数(consumption_cnt)范围1-14次,消费金额(consumption_fee)范围3092-9005,存在高频高消用户(如ID 100006,14次消费9005元)和低频低消用户(如ID 100007,4次消费3092元)。
  • 积分兑换行为集中‌:仅3条记录存在积分兑换(integral_exchange_cnt>0),占比低,多数用户未使用积分兑换功能。
  • 消费与折扣关联性弱‌:消费金额与折扣次数(discount_cnt)无明显正相关,如ID 100003折扣2次消费845元,ID 100005折扣3次消费6661元。

data.info()结果可得出以下结论:

  • 数据完整性‌:数据框含219条记录,6个列(cust_idlast_current_daysconsumption_cntconsumption_feediscount_cntintegral_exchange_cnt),所有列非空值计数均为219,‌无缺失值‌。
  • 数据类型‌:所有列数据类型均为int64(64位整数),符合消费行为数据特征。
  • 内存占用‌:数据框内存使用10.4 KB,规模较小,适合内存中处理。

从消费数据表格可得出以下结论:

  • 消费行为差异显著‌:消费次数(consumption_cnt)范围1-14次,消费金额(consumption_fee)范围3092-9005,存在高频高消用户(如ID 100006,14次消费9005元)和低频低消用户(如ID 100007,4次消费3092元)。
  • 积分兑换行为集中‌:仅3条记录存在积分兑换(integral_exchange_cnt>0),占比低,多数用户未使用积分兑换功能。
  • 消费与折扣关联性弱‌:消费金额与折扣次数(discount_cnt)无明显正相关,如ID 100003折扣2次消费845元,ID 100005折扣3次消费6661元。

#切出X
x = data[['cust_id','last_current_days','consumption_cnt','consumption_fee','discount_cnt','integral_exchange_cnt']].values

  • 从DataFrame data 中选取指定的6个特征列(用户ID、最后消费天数、消费次数、消费金额、折扣次数、积分兑换次数)。
  • 通过 .values 将选取的列转换为NumPy数组 x,作为后续模型的输入数据(特征矩阵)。

#想构造通道,那么先引入管道和标准化
from sklearn.pipeline import Pipeline #管道
from sklearn.preprocessing import StandardScaler #标准化

  • Pipeline:用于将多个数据预处理步骤和模型训练步骤串联起来,形成一个完整的工作流,避免数据泄露(如训练集和测试集的标准化参数不一致)。
  • StandardScaler:用于对数据进行标准化处理(将特征值转换为均值为0、标准差为1的分布),消除量纲差异对模型的影响。

#构造通道:标准化和BIRCH
birch_pipe = Pipeline(
    [('stand',StandardScaler()),
    ('birch',Birch(n_clusters=3))]
)

总结

这段代码的核心是构建一个“数据标准化→BIRCH聚类”的分析管道,用于对用户消费行为数据进行聚类分析,将用户划分为3个不同的群体,以便进一步挖掘群体特征(如高价值用户、低频用户等)。

在对数据进行Birch聚类前会先进行标准化处理,以改善聚类效果,该流程适合大规模数据聚类。

labels = birch_pipe.fit_predict(x)

#通过标签把原始样本点分成三类
x0 = x[labels==0]
x1 = x[labels==1]
x2 = x[labels==2]

#画图
plt.scatter(x0[:,0],x0[:,2],c='red',marker='o',label = 'cluster 0')
plt.scatter(x1[:,0],x1[:,2],c='blue',marker='+',label = 'cluster 1')
plt.scatter(x2[:,0],x2[:,2],c='green',marker='*',label = 'cluster 2')
plt.legend(loc=0)
plt.show()

  • 管道结构‌:定义了一个包含两个步骤的管道:
    • 第一步('stand')‌:使用 StandardScaler 对输入数据 x 进行标准化处理。
    • 第二步('birch')‌:使用 Birch 算法进行聚类,设置聚类数量 n_clusters=3(即目标将数据分为3个簇)。
  • 作用‌:通过管道将标准化和聚类过程整合,后续只需调用 birch_pipe.fit(x) 即可完成数据预处理和聚类训练,简化流程并确保处理一致性。
  • 这三行代码分别从原始数据集 x 中提取出标签为 012 的样本点,分别存储在 x0x1x2 中,以便后续对不同簇的样本进行可视化展示。
  • plt.scatter(x0[:,0],x0[:,2],c='red',marker='o',label = 'cluster 0'):使用 matplotlib 的 scatter 函数绘制散点图。x0[:,0] 表示取 x0 中所有样本点的第 0 个特征值作为横坐标,x0[:,2] 表示取 x0 中所有样本点的第 2 个特征值作为纵坐标 ,c='red' 设置点的颜色为红色,marker='o' 设置点的形状为圆形,label = 'cluster 0' 为该簇的散点图设置图例标签。
  • 后面两行绘制 x1 和 x2 对应散点图的代码原理与上述类似,只是颜色、形状和标签有所不同。
  • plt.legend(loc=0):显示图例,loc=0 表示自动选择最佳位置放置图例。
  • plt.show():展示绘制好的图形。
  • 总体来说,这段代码的功能是先使用BIRCH聚类算法对数据集 x 进行聚类,然后根据聚类得到的标签将样本点划分成三类,并通过散点图将这三类样本点在二维特征空间(第 0 和第 2 个特征)中可视化展示出来。

  • 数据集中的数据点存在聚类结构,可以被划分为三个簇,且不同簇的数据点在分布区域上存在差异。

  • 仅从给定的calinski_harabasz_score1.9865020063825962较难直观判断聚类效果的优劣,通常需对比多个CH得分,得分越高聚类效果越好 。

  • 在使用K - Means模型进行聚类分析时,当原始数据量级差别不大可不进行数据标准化;在Windows系统下使用MKL且线程和数据块存在特定情况时,K - Means模型有内存泄漏风险,可通过设置环境变量OMP_NUM_THREADS = 1规避。

#使用模型的聚类分配标签的结果,对聚类结果可视化
#先获取聚类标签
pred_label= model.labels_

这里的model应该是之前经过训练的聚类模型(比如参考资料中提到的KMeansBirchDBSCAN等聚类算法模型实例)。model.labels_是聚类模型的一个属性,它存储了每个样本被分配到的聚类标签。通过这行代码,将模型为每个样本分配的聚类标签提取出来,存储在pred_label变量中。

#通过标签把原始样本点分成三类
x0 = x[pred_label ==0]
x1 = x[pred_label ==1]
x2 = x[pred_label ==2]

假设x是原始的样本数据集(通常是一个二维数组,每一行代表一个样本,每一列代表样本的一个特征)。这几行代码通过布尔索引的方式,从原始样本数据集x中分别筛选出被分配到标签为012的样本子集,并分别存储在x0x1x2变量中。也就是说,x0中存储的是属于第0类的所有样本,x1中是第1类的样本,x2中是第2类的样本。

#画图
plt.scatter(x0[:,0],x0[:,2],c='red',marker='o',label = 'cluster 0')
plt.scatter(x1[:,0],x1[:,2],c='blue',marker='+',label = 'cluster 1')
plt.scatter(x2[:,0],x2[:,2],c='green',marker='*',label = 'cluster 2')
plt.legend(loc=0)
plt.show()

  • plt.scatter(x0[:, 0], x0[:, 2], c='red', marker='o', label='cluster 0'):使用matplotlib库的scatter函数绘制散点图。x0[:, 0]表示取x0数据集中所有样本的第0个特征值作为散点图的x轴坐标,x0[:, 2]表示取x0数据集中所有样本的第2个特征值作为散点图的y轴坐标。c='red'指定散点的颜色为红色,marker='o'指定散点的形状为圆形,label='cluster 0'为该类数据点添加标签,用于在图例中显示。
  • 后面两行plt.scatter(x1[:, 0], x1[:, 2], c='blue', marker='+', label='cluster 1')plt.scatter(x2[:, 0], x2[:, 2], c='green', marker='*', label='cluster 2')与第一行类似,分别绘制了标签为12的样本点的散点图,只是颜色、形状和标签有所不同。
  • plt.legend(loc=0):添加图例,loc=0表示自动选择合适的位置放置图例。
  • plt.show():显示绘制好的图形。

数据存在聚类结构,可分为三个不同类别,不同类别数据点在图中的分布位置有明显区分。

相应聚类结果表现较好,聚类间分离程度相对较大,类内凝聚程度较好。

plt.scatter(x[:,0],x[:,1],marker='*',c='gray')
plt.show()

plt.scatter(x[:,0],x[:,1],marker='*',c='gray')

  • pltmatplotlib.pyplot的常见别名。scattermatplotlib.pyplot中的一个函数,用于创建散点图。
  • x[:,0]x[:,1]:这里假设x是一个二维的numpy数组(或者类似的数据结构)。x[:,0]表示选取x数组中所有行的第0列的数据,作为散点图中每个点的横坐标;x[:,1]表示选取x数组中所有行的第1列的数据,作为散点图中每个点的纵坐标。
  • marker='*':指定散点图中数据点的标记样式为星号。除了'*'外,还有'o'(圆形)、's'(正方形)、'^'(三角形)等多种样式可供选择。
  • c='gray'c代表color,用于指定散点图中数据点的颜色,这里设置为灰色。

 plt.show()

  • showmatplotlib.pyplot中的函数,用于显示绘制好的图形。当执行到这一行代码时,之前使用scatter等函数绘制的图形就会在图形窗口中展示出来。

总体而言,这段代码的作用是根据x数组中两列的数据绘制一个散点图,其中点的样式为星号、颜色为灰色,并将绘制好的散点图展示出来。

仅从该散点图初步观察,散点分布较为分散,无明显聚集规律,确切结论需结合更多背景信息判断。

#数据准备好了,先看看k均值分类的效果
model1 = KMeans(n_clusters=4)
label1 = model1.fit_predict(x)
plt.scatter(x[:,0],x[:,1],c = label1)
plt.show()

  1. 创建KMeans模型对象

    pythonCopy Code

    model1 = KMeans(n_clusters=4)

    • KMeanssklearn.cluster模块中的K均值聚类算法类。
    • n_clusters=4KMeans类的一个参数,用于指定要将数据聚成的类别数为4类。这里创建了一个KMeans模型对象model1,后续将使用该对象对数据进行聚类操作。
  2. 训练模型并获取聚类标签

    pythonCopy Code

    label1 = model1.fit_predict(x)

    • fit_predictKMeans模型对象的方法。
    • 它首先使用fit方法对输入数据x进行训练,即根据数据的分布情况确定聚类中心等参数;然后使用predict方法预测每个数据点所属的类别,并返回每个数据点对应的聚类标签,这里将这些标签赋值给label1
  3. 绘制聚类结果散点图

    pythonCopy Code

    plt.scatter(x[:,0],x[:,1],c = label1)

    • plt.scattermatplotlib.pyplot模块中的函数,用于绘制散点图。
    • x[:,0]表示取数据矩阵x的第一列作为散点图的横坐标数据。
    • x[:,1]表示取数据矩阵x的第二列作为散点图的纵坐标数据。
    • c = label1表示根据label1中的聚类标签来设置散点的颜色,即同一类别的点用相同颜色表示,这样可以直观地看出聚类的效果。
  4. 显示图形

    pythonCopy Code

    plt.show()

    • plt.showmatplotlib.pyplot模块中的函数,用于显示之前绘制的图形,即上述绘制的聚类结果散点图。

总体而言,这段代码的目的是使用K均值聚类算法对数据x进行聚类,并通过散点图可视化聚类的结果,以便直观地查看聚类效果。

散点分布较为分散,无明显规律,因缺乏横纵坐标含义等信息,难以得出更深入结论。

在当前数据x和聚类标签label1下,聚类效果相对较好。

#用DBSCAN聚类看看
model2 = DBSCAN(eps = 0.125,min_samples=10)
label2 = model2.fit_predict(x)
plt.scatter(x[:,0],x[:,1],c = label2)
plt.show()

1. 实例化DBSCAN模型

pythonCopy Code

model2 = DBSCAN(eps = 0.125,min_samples=10)

  • DBSCANsklearn.cluster模块中基于密度的聚类算法类。
  • eps = 0.125:设置邻域半径参数,它决定了一个点的邻域范围,在该范围内的点被视为邻居点。在这个参数设置下,算法会寻找距离小于等于0.125的点作为邻居点。
  • min_samples=10:设置形成核心对象所需的邻域样本数阈值。如果在某个点的eps邻域内至少有10个样本点,那么这个点就被定义为核心对象。

2. 执行聚类并获取标签

pythonCopy Code

label2 = model2.fit_predict(x)

  • fit_predictDBSCAN模型的方法,它将模型拟合到数据x上,并同时预测每个样本所属的簇标签。
  • x是输入的数据集,通常是一个二维数组,每一行代表一个样本,每一列代表一个特征。
  • label2是一个数组,保存了每个样本对应的簇标签。如果某个样本被标记为噪声点,其标签通常为-1

3. 绘制聚类结果

pythonCopy Code

plt.scatter(x[:,0],x[:,1],c = label2) plt.show()

  • plt.scatter用于创建散点图。
    • x[:,0]表示取数据集x的第一列作为散点图的x轴坐标。
    • x[:,1]表示取数据集x的第二列作为散点图的y轴坐标。
    • c = label2表示根据label2中的簇标签为每个散点上色,这样不同簇的点会被绘制成不同颜色,方便直观地观察聚类效果。
  • plt.show()用于显示绘制好的图形。

整体而言,这段代码的目的是使用DBSCAN算法对数据集x进行聚类,并通过散点图将聚类结果可视化展示出来。

散点分布较为杂乱,难以看出变量之间存在明确的函数关系或聚集特征等规律。

#参数效果一般,我们通过K距离法去找最小样本量是10的时候,eps参数的取值
from sklearn.neighbors import NearestNeighbors  #引入K距离模型
nbrs= NearestNeighbors(n_neighbors=10).fit(x)  #构建K距离模型
distances, indices = nbrs.kneighbors(x) #获取算法中拿到的距离和indices
k_distances = distances[:, -1]  # 第 MinPts 个邻居的距离
k_distances_sorted = np.sort(k_distances)[::-1] #按距离对近邻进行排序,排序后的结果可以画图了
plt.plot(k_distances_sorted)#画图找拐点,拐点对应的y值就是最好的eps
plt.show()

引入K距离模型

pythonCopy Code

from sklearn.neighbors import NearestNeighbors #引入K距离模型

sklearn.neighbors模块提供了用于邻居搜索和分类的工具,NearestNeighbors类用于实现最近邻算法。这里从该模块中引入NearestNeighbors类,目的是为后续构建K距离模型做准备。

构建K距离模型

pythonCopy Code

nbrs = NearestNeighbors(n_neighbors=10).fit(x) #构建K距离模型

  • NearestNeighbors(n_neighbors=10):创建一个NearestNeighbors对象,其中n_neighbors=10表示要寻找每个样本的10个最近邻居,即这里设置的最小样本量为10。
  • .fit(x):使用给定的数据集x来拟合模型,通过这个操作,模型会学习数据集中样本之间的距离关系等信息,以便后续进行邻居搜索等操作。

获取算法中拿到的距离和索引

pythonCopy Code

distances, indices = nbrs.kneighbors(x) #获取算法中拿到的距离和indices

调用已经拟合好的nbrs模型的kneighbors方法,传入数据集x。该方法会返回两个结果:

  • distances:一个数组,其中每一行表示对应样本到其10个最近邻居的距离。
  • indices:一个数组,每一行记录对应样本的10个最近邻居在原始数据集中的索引。

提取第MinPts个邻居的距离

pythonCopy Code

k_distances = distances[:, -1] # 第 MinPts 个邻居的距离

这里使用了数组切片操作,distances[:, -1]表示从distances数组中提取每一行的最后一个元素,也就是每个样本到其第10个(因为n_neighbors=10)最近邻居的距离,将其存储在k_distances数组中。

按距离对近邻进行排序

pythonCopy Code

k_distances_sorted = np.sort(k_distances)[::-1] #按距离对近邻进行排序,排序后的结果可以画图了

  • np.sort(k_distances):使用numpy库的sort函数对k_distances数组进行排序,默认是升序排序。
  • [::-1]:这是一个Python的切片操作,用于将排序后的数组反转,从而得到按距离从大到小排序的数组k_distances_sorted

画图找拐点

pythonCopy Code

plt.plot(k_distances_sorted)#画图找拐点,拐点对应的y值就是最好的eps plt.show()

  • plt.plot(k_distances_sorted):使用matplotlib.pyplot库的plot函数绘制折线图,横坐标是样本的序号(隐式的),纵坐标是每个样本到其第10个最近邻居的距离(即k_distances_sorted数组中的值)。
  • plt.show():显示绘制好的图形。通过观察图形中的拐点(即曲线变化趋势突然改变的点),该拐点对应的纵坐标值(即y值)被认为是最优的eps参数取值。在DBSCAN等聚类算法中,eps参数表示两个样本之间的最大距离,其中一个样本被认为是相邻的,通过这种方式可以较为合理地确定该参数的值。

该折线图整体呈下降趋势,起始下降迅速,随后速度变缓,后期趋于平稳且数值较低。

通过系统学习大数据技术,我深刻认识到其核心价值在于从海量数据中提取洞察。数据采集与清洗是基础,确保信息质量;分析技术如机器学习和数据挖掘揭示隐藏模式;应用领域覆盖金融、医疗和智慧城市,优化决策。

学习过程中,挑战在于处理数据复杂性,但实践项目增强了我的问题解决能力。未来,大数据将更深度融合AI,推动跨行业创新。作为学习者,我掌握了关键技能,并体会到持续更新的必要性。这一领域不仅提升效率,还为社会进步注入动力,激励我深入探索,贡献于数字化转型。

更多推荐