当前位置:   article > 正文

大数据分析-利用k-means聚类分析对客户种类进行分析_kmeans聚类算法预测消费产品模型

kmeans聚类算法预测消费产品模型

一. 选题的背景

     在当今社会,大数据已经成为了企业决策的重要依据,我们可以通过对客户进行细分分析,企业可以更好的了解客户的需求和行为,从而制定出更加精准的营销策略,从而提高产品的竞争力,更加要达到通过对客户的数据分析,从而找出不同客户群体的特征和需求,为企业提供有针对性的营销建议。从社会,经济,技术,数据来源等方面来看,随着互联网和移动互联网的快速发展,企业和个人产生的数据量呈现井喷式的增长,这些数据为大数据分析提供了丰富的数据来源,同时大数据技术也有了更加广泛的应用。

二. 大数据分析设计方案

 2.1 本数据集的数据内容与数据特征分析

首先给出本次项目所要使用的数据集链接: 

           kaggle:https://www.kaggle.com/datasets/govindkrishnadas/segment/data

本数据集的数据包括 客户ID,  性别, 客户年龄, 客户年收入, 客户的消费习惯。

1. 客户ID: 代表唯一标识客户的整数;

2. 客户的性别: 区分男客户和女客户, 使得相关数据更加的完整;

3. 客户的年龄: 客户的出生年份,表示客户的年龄;

4. 客户的年收入: 客户的年度收入, 表示客户的消费能力;

5. 客户的消费习惯: 客户的购买行为和偏好, 包括所购买商品的类别,购买次数,购买金额。

对于数据特征的分析主要包括以下几个方面:

1. 描述性统计分析: 对客户年龄,客户年收入等数值性特征进行描述性的统计分析,了解数据的基本情况;

2. 分类特征分析: 对客户的消费习惯等特征进行分析,从而找出不同类别的特征分布情况;

3. 关联规则挖掘: 分析不同特征之间的关联关系,例如年龄和消费习惯等;

4. 聚类分析: 通过聚类算法将客户化分为不同的群体,从而找出每个特征的特征和需求。

2.2 数据分析的方案概述

1. 数据预处理: 对原始数据进行清洗,缺失值处理,异常值处理等,为后续的数据分析做好准别

2. 描述性统计分析: 利用Python的pandas库进行描述性统计分析,例如计算平均数,中位数,等

3. 聚类分析: 使用k-means算法或者层次聚类算法进行聚类分析,从而将样本中的客户划分为不同的群体

三. 数据分析的具体步骤

3.1 数据源

数据来自:    kaggle:https://www.kaggle.com/datasets/govindkrishnadas/segment/data

3.2 数据清洗

导入库:
  1. #导入所需库
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. %matplotlib inline
  6. import seaborn as sns
  7. plt.style.use('fivethirtyeight')
  8. from sklearn.cluster import KMeans
  9. import plotly as py
  10. import plotly.graph_objects as go
  11. import warnings
  12. import os
  13. warnings.filterwarnings('ignore')
读取数据并显示出数据集的前五行:
  1. #读取数据集并显示前5行
  2. df=pd.read_csv(r'C:\Users\Lenovo\Desktop\杂类文件夹\人工智能课程设计\k-means聚类分析\k-means\database\Segmentation_dataset.csv')
  3. df.head()

将数据集下载好之后放置到项目的同级目录下,执行下面的相关命令之后运行:

python main.py

显示出的数据前五行内容如下:

  1. # Column Non-Null Count Dtype
  2. --- ------ -------------- -----
  3. 0 CustomerID 1599 non-null int64
  4. 1 Gender 1599 non-null object
  5. 2 Age 1599 non-null int64
  6. 3 Annual Income (k$) 1599 non-null int64
  7. 4 Spending Score (1-100) 1599 non-null int64

从数据的基本情况可以看出数据的主要评价指标:

3.3 数据分析与可视化

查看数据分布情况:

  1. #查看数据分布
  2. sns.pairplot(df)

运行之后就可以系那是出数据的结果:

单独查看数据直方图:

  1. #单独查看直方图
  2. plt.figure(1,figsize=(12,6))
  3. n=0
  4. for x in ['Age','Annual Income (k$)','Spending Score (1-100)']:
  5. n+=1
  6. plt.subplot(1,3,n)
  7. plt.subplots_adjust(hspace=0.5,wspace=0.5)
  8. sns.distplot(df[x],bins=20)
  9. plt.show()

运行之后显示的结果如下所示: 

 每一个柱状图显示出了不同年龄段的人口密度,第二个柱状图显示了不同年龄段的之处得分,第三个柱状图显示了不同年龄段的平均收入,从图中可以看出,随着年龄的增长,人口密度逐渐减少,而之处得分与平均年收入呈现不同的趋势:

样本数据中的性别比例:

  1. #样本数据中的性别比
  2. #计算每个性别的数量
  3. df_gender_c = df['Gender'].value_counts()
  4. #定义了标签、颜色等
  5. p_lables = ['Female', 'Male']
  6. p_color = ['lightcoral', 'lightskyblue']
  7. p_explode = [0, 0.03]
  8. # 绘图
  9. #创建一个10x10的图形窗口
  10. plt.figure(1,figsize=(10,10))
  11. plt.pie(df_gender_c, labels=p_lables, colors=p_color, explode=p_explode, shadow=True, autopct='%.2f%%')
  12. plt.title('Sex Ratio',fontsize=20)
  13. plt.axis('off')
  14. plt.legend(fontsize=14)
  15. plt.legend()
  16. plt.show()

 如下所示:

 从图中可以看出,女性人口占比为71%,男性人口占比,有助于了解人口结构中的性别差异:

年龄与年收入的关系:

  1. #显示年龄与年收入的关系
  2. # 导入matplotlib.pyplot库,用于绘制图形
  3. import matplotlib.pyplot as plt
  4. # 设置字体为SimHei,支持中文显示
  5. plt.rcParams['font.sans-serif'] = [u'SimHei']
  6. # 设置负号正常显示
  7. plt.rcParams['axes.unicode_minus'] = False
  8. # 创建一个12x6英寸的图形窗口
  9. plt.figure(1,figsize=(12,6))
  10. # 遍历性别列表,分别绘制男性和女性的散点图
  11. for gender in ['Male','Female']:
  12. # 使用scatter函数绘制散点图,x轴为年龄,y轴为年收入,数据来源为df中性别为当前性别的数据
  13. plt.scatter(x='Age',y='Annual Income (k$)',data=df[df['Gender']==gender],
  14. s=100,alpha=0.5,label=gender)
  15. # 设置x轴标签为“Age”,y轴标签为“Annual Income (k$)”
  16. plt.xlabel('Age'),plt.ylabel('Annual Income (k$)')
  17. # 设置图形标题为“不同性别在年龄与年收入之间的关系”
  18. plt.title('不同性别在年龄与年收入之间的关系')
  19. # 显示图例
  20. plt.legend()
  21. # 显示图形
  22. plt.show()

从图中可以看出,不同的性别在年龄与年收入之间存在差异,这就意味着不同性别在相同的年龄段年收入水平存在差异,不同性别在不同的年龄段存在差异 

年龄与消费的分之间的关系:

  1. #不同性别在年龄与年收入之间的关系
  2. import matplotlib.pyplot as plt
  3. plt.rcParams['font.sans-serif'] = [u'SimHei']
  4. plt.rcParams['axes.unicode_minus'] = False
  5. plt.figure(1,figsize=(12,6))
  6. for gender in ['Male','Female']:
  7. plt.scatter(x='Age',y='Spending Score (1-100)',data=df[df['Gender']==gender],
  8. s=100,alpha=0.5,label=gender)
  9. plt.xlabel('Age'),plt.ylabel('Spending Score (1-100)')
  10. plt.title('不同性别在年龄与消费得分之间的关系')
  11. plt.legend()
  12. plt.show()
  13. #不同性别在年收入与消费得分之间的关系
  14. plt.figure(1,figsize=(12,6))
  15. for gender in ['Male','Female']:
  16. plt.scatter(x='Annual Income (k$)',y='Spending Score (1-100)',data=df[df['Gender']==gender],
  17. s=100,alpha=0.5,label=gender)
  18. plt.xlabel('Annual Income (k$)'),plt.ylabel('Spending Score (1-100)')
  19. plt.title('不同性别在年收入与消费得分之间的关系')
  20. plt.legend()
  21. plt.show()

 从图中可以看出,男性的消费得分普遍偏高,而女性则相对较低,随着年龄的增长,消费的分存在一定的波动,但总体趋势是男性在年轻时消费的分较高,而女性在年长是消费得分较低。

年龄与消费的分与年收入之间的分布:

  1. # 创建一个1行3列的图形,大小为12x6英寸
  2. plt.figure(1,figsize=(12,6))
  3. # 初始化计数器n
  4. n=0
  5. # 遍历三个类别(年龄、年收入和消费得分)
  6. for cloname in ['Age','Annual Income (k$)','Spending Score (1-100)']:
  7. # 增加计数器n的值
  8. n+=1
  9. # 创建第n个子图
  10. plt.subplot(1,3,n)
  11. # 调整子图之间的水平间距和垂直间距
  12. plt.subplots_adjust(hspace=0.5,wspace=0.5)
  13. # 使用箱线图展示不同性别在当前类别的数据分布情况
  14. sns.boxenplot(x=cloname,y='Gender',data=df,palette='vlag')
  15. # 使用散点图展示不同性别在当前类别的数据分布情况
  16. sns.swarmplot(x=cloname,y='Gender',data=df,alpha=0.5)
  17. # 如果当前子图是第一个子图,则不显示y轴标签
  18. plt.ylabel('' if n==1 else '')
  19. # 如果当前子图是第三个子图,则不显示标题
  20. plt.title('不同性别的数据分布情况' if n==2 else '')
  21. # 显示图形
  22. plt.show()

最后显示的结果如下:

这张图展示了不同性别在年龄,年收入和之处得分之间的变化情况,从图中可以看出,男性在相关指标上分布较为集中,二女性则呈现分散的趋势,可以移位这男性在这些方面表现的相对稳定,二女性则存在一定的波动。 

3.4 使用k-means聚类进行分析

根据年龄和消费得分进行细分:

  1. #使用k-means进行聚类分析,根据年龄和消费得分进行细分
  2. # 从数据框df中提取'Age'和'Spending Score (1-100)'两列的数据,并将其转换为numpy数组x1
  3. x1 = df[['Age', 'Spending Score (1-100)']].iloc[:, :].values
  4. # 导入KMeans类
  5. from sklearn.cluster import KMeans
  6. # 初始化一个空列表inertia,用于存储每次迭代的inertia值
  7. inertia = []
  8. # 循环尝试不同的聚类数量(从1到10)
  9. for i in range(1, 11):
  10. # 创建KMeans对象,设置聚类数量、初始化方法、最大迭代次数、初始运行次数和随机种子
  11. km = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
  12. # 使用KMeans对象对数据进行拟合
  13. km.fit(x1)
  14. # 将当前迭代的inertia值添加到inertia列表中
  15. inertia.append(km.inertia_)
  16. # 创建一个大小为12x6的图形窗口
  17. plt.figure(1, figsize=(12, 6))
  18. # 绘制inertia值随聚类数量变化的曲线图
  19. plt.plot(range(1, 11), inertia)
  20. # 设置图形标题和坐标轴标签
  21. plt.title('The Ebow Method', fontsize=20)
  22. plt.xlabel('Number of Clusters')
  23. plt.ylabel('inertia')
  24. # 显示图形
  25. plt.show()

该图显示出了列表指标随着聚类数量变化的折线关系图,能够反映聚类所产生的关系 ,

利用The Elbow Method手肘法则由图可知最佳聚类个数是1.0:

  1. # 创建KMeans对象,设置聚类数量为4,初始化方法为'k-means++',最大迭代次数为500,初始运行次数为10,随机种子为0
  2. km = KMeans(n_clusters=4, init='k-means++', max_iter=500, n_init=10, random_state=0)
  3. # 使用KMeans模型对数据x1进行拟合,并预测每个样本所属的簇
  4. y_means = km.fit_predict(x1)
  5. # 创建一个大小为16x8的图形窗口
  6. plt.figure(1, figsize=(16, 8))
  7. # 绘制属于簇0的样本点,颜色为蓝色,标签为'1',透明度为0.6
  8. plt.scatter(x1[y_means == 0, 0], x1[y_means == 0, 1], s=200, c='blue', label='1', alpha=0.6)
  9. # 绘制属于簇1的样本点,颜色为橙色,标签为'2',透明度为0.6
  10. plt.scatter(x1[y_means == 1, 0], x1[y_means == 1, 1], s=200, c='orange', label='2', alpha=0.6)
  11. # 绘制属于簇2的样本点,颜色为粉色,标签为'3',透明度为0.6
  12. plt.scatter(x1[y_means == 2, 0], x1[y_means == 2, 1], s=200, c='pink', label='3', alpha=0.6)
  13. # 绘制属于簇3的样本点,颜色为紫色,标签为'4',透明度为0.6
  14. plt.scatter(x1[y_means == 3, 0], x1[y_means == 3, 1], s=200, c='purple', label='4', alpha=0.6)
  15. # 绘制聚类中心点,颜色为红色,标签为'5',透明度为0.6
  16. plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=200, c='red', label='5', alpha=0.6)
  17. # 设置y轴标签为'Spending Score (1-100)',x轴标签为'Age'
  18. plt.ylabel('Spending Score (1-100)'), plt.xlabel('Age')
  19. # 显示图例
  20. plt.legend()
  21. # 显示图形
  22. plt.show()
 

 由运行的记过可以蓝色代表第一个簇,橙色代表第二个簇,紫色代表第三个簇,红色还可以用来表示聚类中心,可以了解不同颜色点在年龄和消费得分上的分布情况,以及他们所属的簇和聚类中心。

在此利用KMeans算法对数据进行聚类,并绘制3D散点图来展示聚类效果 :

  1. #使用KMeans算法对数据进行聚类,并绘制3D散点图展示聚类结果
  2. # 创建KMeans算法实例,设置聚类数量为6,初始化方法为'k-means++',运行次数为10,最大迭代次数为300,容差为0.0001,随机种子为100,使用'elkan'算法
  3. algorithm = (KMeans(n_clusters=6, init='k-means++', n_init=10, max_iter=300, tol=0.0001, random_state=100, algorithm='elkan'))
  4. # 使用算法对数据x3进行拟合
  5. algorithm.fit(x3)
  6. # 获取聚类标签
  7. labels = algorithm.labels_
  8. # 获取聚类中心
  9. centroids = algorithm.cluster_centers_
  10. # 将聚类标签添加到原始数据框df中
  11. df['label'] = labels
  12. # 创建3D散点图,x轴为年龄,y轴为消费得分(1-100),z轴为年收入(k$),根据聚类标签设置颜色和大小,同时设置线条颜色和宽度,透明度为0.8
  13. trace1 = go.Scatter3d(
  14. x=df['Age'],
  15. y=df['Spending Score (1-100)'],
  16. z=df['Annual Income (k$)'],
  17. mode='markers',
  18. marker=dict(
  19. color=df['label'],
  20. size=5,
  21. line=dict(
  22. color=df['label'],
  23. width=5
  24. ),
  25. opacity=0.8
  26. )
  27. )
  28. # 定义绘图布局,设置高度、宽度、标题和坐标轴标题
  29. data = [trace1]
  30. layout = go.Layout(
  31. height=1000,
  32. width=1000,
  33. title='Clusters!',
  34. scene=dict(
  35. xaxis=dict(title='Age'),
  36. yaxis=dict(title='Spending Score (1-100)'),
  37. zaxis=dict(title='Annual Income (k$)')
  38. )
  39. )
  40. # 创建绘图对象,传入数据和布局
  41. fig = go.Figure(data=data, layout=layout)
  42. # 离线显示绘图结果
  43. py.offline.iplot(fig)

聚类的结果如下

图中的每个彩色小点代表一个观察值,他们在x轴与y轴上的位置分别表示年龄年收入,在z轴上的位置代表消费的分,通过观察这些小点的密度和大小,我们可以了解到数据在这个上面的三维分布情况 。

轮廓系数:

  1. # 轮廓系数
  2. import sklearn.metrics
  3. score = []
  4. for i in range(2,10):
  5. model = KMeans(n_clusters=i).fit(x2)
  6. score.append(silhouette_score(x2, model.labels_, metric='euclidean'))
  7. plt.plot(range(2,10),score)
  8. plt.xlabel('Annual Income (k$)')
  9. plt.ylabel('Spending Score (1-100)')
  10. plt.show()
  11. kmeans = KMeans( n_clusters = 6, init='k-means++')
  12. kmeans.fit(x1)
  13. print(silhouette_score(x2, kmeans.labels_, metric='euclidean'))

由图可知年龄与消费的分之间的轮廓系数为0.37,接近于0可以看出样本差距不大聚类效果一般

四. 完成的程序代码 

  1. #Time: 2024 1.9
  2. #autor: GaoShun
  3. #k-means: main.py
  4. #database: https://www.kaggle.com/datasets/govindkrishnadas/segment/data
  5. #导入库函数
  6. import matplotlib.pyplot as plt
  7. # 导入库
  8. import pandas as pd
  9. import seaborn as sns
  10. plt.style.use('fivethirtyeight')
  11. import plotly as py
  12. import plotly.graph_objects as go
  13. import warnings
  14. warnings.filterwarnings('ignore')
  15. import os
  16. #读取数据集并显示前5行
  17. df=pd.read_csv(r'C:\Users\Lenovo\Desktop\杂类文件夹\人工智能课程设计\k-means聚类分析\k-means\database\Segmentation_dataset.csv')
  18. df.head()
  19. df.shape
  20. df.info()
  21. df.dtypes
  22. #查看各列缺失值数量
  23. df.isnull().sum()
  24. df.describe()
  25. #查看数据分布
  26. sns.pairplot(df)
  27. #单独查看直方图
  28. plt.figure(1,figsize=(12,6))
  29. n=0
  30. for x in ['Age','Annual Income (k$)','Spending Score (1-100)']:
  31. n+=1
  32. plt.subplot(1,3,n)
  33. plt.subplots_adjust(hspace=0.5,wspace=0.5)
  34. sns.distplot(df[x],bins=20)
  35. plt.show()
  36. #样本数据中的性别比
  37. #计算每个性别的数量
  38. df_gender_c = df['Gender'].value_counts()
  39. #定义了标签、颜色等
  40. p_lables = ['Female', 'Male']
  41. p_color = ['lightcoral', 'lightskyblue']
  42. p_explode = [0, 0.03]
  43. # 绘图
  44. #创建一个10x10的图形窗口
  45. plt.figure(1,figsize=(10,10))
  46. plt.pie(df_gender_c, labels=p_lables, colors=p_color, explode=p_explode, shadow=True, autopct='%.2f%%')
  47. plt.title('Sex Ratio',fontsize=20)
  48. plt.axis('off')
  49. plt.legend(fontsize=14)
  50. plt.legend()
  51. plt.show()
  52. #显示年龄与年收入的关系
  53. # 导入matplotlib.pyplot库,用于绘制图形
  54. import matplotlib.pyplot as plt
  55. # 设置字体为SimHei,支持中文显示
  56. plt.rcParams['font.sans-serif'] = [u'SimHei']
  57. # 设置负号正常显示
  58. plt.rcParams['axes.unicode_minus'] = False
  59. # 创建一个12x6英寸的图形窗口
  60. plt.figure(1,figsize=(12,6))
  61. # 遍历性别列表,分别绘制男性和女性的散点图
  62. for gender in ['Male','Female']:
  63. # 使用scatter函数绘制散点图,x轴为年龄,y轴为年收入,数据来源为df中性别为当前性别的数据
  64. plt.scatter(x='Age',y='Annual Income (k$)',data=df[df['Gender']==gender],
  65. s=100,alpha=0.5,label=gender)
  66. # 设置x轴标签为“Age”,y轴标签为“Annual Income (k$)”
  67. plt.xlabel('Age'),plt.ylabel('Annual Income (k$)')
  68. # 设置图形标题为“不同性别在年龄与年收入之间的关系”
  69. plt.title('不同性别在年龄与年收入之间的关系')
  70. # 显示图例
  71. plt.legend()
  72. # 显示图形
  73. plt.show()
  74. #不同性别在年龄与年收入之间的关系
  75. import matplotlib.pyplot as plt
  76. plt.rcParams['font.sans-serif'] = [u'SimHei']
  77. plt.rcParams['axes.unicode_minus'] = False
  78. plt.figure(1,figsize=(12,6))
  79. for gender in ['Male','Female']:
  80. plt.scatter(x='Age',y='Spending Score (1-100)',data=df[df['Gender']==gender],
  81. s=100,alpha=0.5,label=gender)
  82. plt.xlabel('Age'),plt.ylabel('Spending Score (1-100)')
  83. plt.title('不同性别在年龄与消费得分之间的关系')
  84. plt.legend()
  85. plt.show()
  86. #不同性别在年收入与消费得分之间的关系
  87. plt.figure(1,figsize=(12,6))
  88. for gender in ['Male','Female']:
  89. plt.scatter(x='Annual Income (k$)',y='Spending Score (1-100)',data=df[df['Gender']==gender],
  90. s=100,alpha=0.5,label=gender)
  91. plt.xlabel('Annual Income (k$)'),plt.ylabel('Spending Score (1-100)')
  92. plt.title('不同性别在年收入与消费得分之间的关系')
  93. plt.legend()
  94. plt.show()
  95. # 创建一个1行3列的图形,大小为12x6英寸
  96. plt.figure(1,figsize=(12,6))
  97. # 初始化计数器n
  98. n=0
  99. # 遍历三个类别(年龄、年收入和消费得分)
  100. for cloname in ['Age','Annual Income (k$)','Spending Score (1-100)']:
  101. # 增加计数器n的值
  102. n+=1
  103. # 创建第n个子图
  104. plt.subplot(1,3,n)
  105. # 调整子图之间的水平间距和垂直间距
  106. plt.subplots_adjust(hspace=0.5,wspace=0.5)
  107. # 使用箱线图展示不同性别在当前类别的数据分布情况
  108. sns.boxenplot(x=cloname,y='Gender',data=df,palette='vlag')
  109. # 使用散点图展示不同性别在当前类别的数据分布情况
  110. sns.swarmplot(x=cloname,y='Gender',data=df,alpha=0.5)
  111. # 如果当前子图是第一个子图,则不显示y轴标签
  112. plt.ylabel('' if n==1 else '')
  113. # 如果当前子图是第三个子图,则不显示标题
  114. plt.title('不同性别的数据分布情况' if n==2 else '')
  115. # 显示图形
  116. plt.show()
  117. #使用k-means进行聚类分析,根据年龄和消费得分进行细分
  118. # 从数据框df中提取'Age'和'Spending Score (1-100)'两列的数据,并将其转换为numpy数组x1
  119. x1 = df[['Age', 'Spending Score (1-100)']].iloc[:, :].values
  120. # 导入KMeans类
  121. from sklearn.cluster import KMeans
  122. # 初始化一个空列表inertia,用于存储每次迭代的inertia值
  123. inertia = []
  124. # 循环尝试不同的聚类数量(从1到10)
  125. for i in range(1, 11):
  126. # 创建KMeans对象,设置聚类数量、初始化方法、最大迭代次数、初始运行次数和随机种子
  127. km = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
  128. # 使用KMeans对象对数据进行拟合
  129. km.fit(x1)
  130. # 将当前迭代的inertia值添加到inertia列表中
  131. inertia.append(km.inertia_)
  132. # 创建一个大小为12x6的图形窗口
  133. plt.figure(1, figsize=(12, 6))
  134. # 绘制inertia值随聚类数量变化的曲线图
  135. plt.plot(range(1, 11), inertia)
  136. # 设置图形标题和坐标轴标签
  137. plt.title('The Ebow Method', fontsize=20)
  138. plt.xlabel('Number of Clusters')
  139. plt.ylabel('inertia')
  140. # 显示图形
  141. plt.show()
  142. # 创建KMeans对象,设置聚类数量为4,初始化方法为'k-means++',最大迭代次数为500,初始运行次数为10,随机种子为0
  143. km = KMeans(n_clusters=4, init='k-means++', max_iter=500, n_init=10, random_state=0)
  144. # 使用KMeans模型对数据x1进行拟合,并预测每个样本所属的簇
  145. y_means = km.fit_predict(x1)
  146. # 创建一个大小为16x8的图形窗口
  147. plt.figure(1, figsize=(16, 8))
  148. # 绘制属于簇0的样本点,颜色为蓝色,标签为'1',透明度为0.6
  149. plt.scatter(x1[y_means == 0, 0], x1[y_means == 0, 1], s=200, c='blue', label='1', alpha=0.6)
  150. # 绘制属于簇1的样本点,颜色为橙色,标签为'2',透明度为0.6
  151. plt.scatter(x1[y_means == 1, 0], x1[y_means == 1, 1], s=200, c='orange', label='2', alpha=0.6)
  152. # 绘制属于簇2的样本点,颜色为粉色,标签为'3',透明度为0.6
  153. plt.scatter(x1[y_means == 2, 0], x1[y_means == 2, 1], s=200, c='pink', label='3', alpha=0.6)
  154. # 绘制属于簇3的样本点,颜色为紫色,标签为'4',透明度为0.6
  155. plt.scatter(x1[y_means == 3, 0], x1[y_means == 3, 1], s=200, c='purple', label='4', alpha=0.6)
  156. # 绘制聚类中心点,颜色为红色,标签为'5',透明度为0.6
  157. plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=200, c='red', label='5', alpha=0.6)
  158. # 设置y轴标签为'Spending Score (1-100)',x轴标签为'Age'
  159. plt.ylabel('Spending Score (1-100)'), plt.xlabel('Age')
  160. # 显示图例
  161. plt.legend()
  162. # 显示图形
  163. plt.show()
  164. x2=df[['Annual Income (k$)','Spending Score (1-100)']].iloc[:,:].values
  165. import sklearn.cluster
  166. inertia=[]
  167. for i in range(1,11):
  168. km=KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0)
  169. km.fit(x2)
  170. inertia.append(km.inertia_)
  171. plt.figure(1,figsize=(12,6))
  172. plt.plot(range(1,11),inertia)
  173. plt.title('The Ebow Method',fontsize=20)
  174. plt.xlabel('Number of Clusters')
  175. plt.ylabel('inertia')
  176. plt.show()
  177. km = KMeans(n_clusters = 5, init = 'k-means++', max_iter = 500,n_init = 10,random_state=0)
  178. y_means = km.fit_predict(x2)
  179. plt.figure(1,figsize = (16,8))
  180. plt.scatter(x2[y_means == 0,0],x2[y_means==0,1],s=200,c='blue', label='1', alpha=0.6)
  181. plt.scatter(x2[y_means == 1,0],x2[y_means==1,1],s = 200,c='orange', label='2', alpha=0.6)
  182. plt.scatter(x2[y_means == 2,0],x2[y_means==2,1],s = 200,c='pink', label='3', alpha=0.6)
  183. plt.scatter(x2[y_means == 3,0],x2[y_means==3,1],s = 200,c='purple', label='4', alpha=0.6)
  184. plt.scatter(x2[y_means == 5,0],x2[y_means==5,1],s = 200,c='green', label='5', alpha=0.6)
  185. plt.scatter(km.cluster_centers_[:,0], km.cluster_centers_[:, 1], s = 200,c='red', label='6', alpha=0.6)
  186. plt.ylabel('Spending Score (1-100)'), plt.xlabel('Annual Income (k$)')
  187. plt.legend()
  188. plt.show()
  189. x3=df[['Age','Annual Income (k$)','Spending Score (1-100)']].iloc[:,:].values
  190. import sklearn.cluster
  191. inertia=[]
  192. for i in range(1,11):
  193. km=KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0)
  194. km.fit(x3)
  195. inertia.append(km.inertia_)
  196. plt.figure(1,figsize=(12,6))
  197. plt.plot(range(1,11),inertia)
  198. plt.title('The Elbow Method',fontsize=20)
  199. plt.xlabel('Number of Clusters')
  200. plt.ylabel('inertia')
  201. plt.show()
  202. #使用KMeans算法对数据进行聚类,并绘制3D散点图展示聚类结果
  203. # 创建KMeans算法实例,设置聚类数量为6,初始化方法为'k-means++',运行次数为10,最大迭代次数为300,容差为0.0001,随机种子为100,使用'elkan'算法
  204. algorithm = (KMeans(n_clusters=6, init='k-means++', n_init=10, max_iter=300, tol=0.0001, random_state=100, algorithm='elkan'))
  205. # 使用算法对数据x3进行拟合
  206. algorithm.fit(x3)
  207. # 获取聚类标签
  208. labels = algorithm.labels_
  209. # 获取聚类中心
  210. centroids = algorithm.cluster_centers_
  211. # 将聚类标签添加到原始数据框df中
  212. df['label'] = labels
  213. # 创建3D散点图,x轴为年龄,y轴为消费得分(1-100),z轴为年收入(k$),根据聚类标签设置颜色和大小,同时设置线条颜色和宽度,透明度为0.8
  214. trace1 = go.Scatter3d(
  215. x=df['Age'],
  216. y=df['Spending Score (1-100)'],
  217. z=df['Annual Income (k$)'],
  218. mode='markers',
  219. marker=dict(
  220. color=df['label'],
  221. size=5,
  222. line=dict(
  223. color=df['label'],
  224. width=5
  225. ),
  226. opacity=0.8
  227. )
  228. )
  229. # 定义绘图布局,设置高度、宽度、标题和坐标轴标题
  230. data = [trace1]
  231. layout = go.Layout(
  232. height=1000,
  233. width=1000,
  234. title='Clusters!',
  235. scene=dict(
  236. xaxis=dict(title='Age'),
  237. yaxis=dict(title='Spending Score (1-100)'),
  238. zaxis=dict(title='Annual Income (k$)')
  239. )
  240. )
  241. # 创建绘图对象,传入数据和布局
  242. fig = go.Figure(data=data, layout=layout)
  243. # 离线显示绘图结果
  244. py.offline.iplot(fig)
  245. # 导入轮廓系数计算函数
  246. import sklearn.metrics
  247. # 初始化一个空列表,用于存储每个聚类数量对应的轮廓系数
  248. score = []
  249. # 遍历聚类数量从2到9
  250. for i in range(2, 10):
  251. # 使用KMeans算法对数据x1进行聚类,聚类数量为当前循环的变量i
  252. model = KMeans(n_clusters=i).fit(x1)
  253. # 计算聚类结果的轮廓系数,并将结果添加到score列表中
  254. score.append(silhouette_score(x1, model.labels_, metric='euclidean'))
  255. # 绘制轮廓系数与聚类数量的关系图
  256. plt.plot(range(2, 10), score)
  257. plt.xlabel('Age')
  258. plt.ylabel('Spending Score (1-100)')
  259. plt.show()
  260. # 创建KMeans聚类模型,设置聚类数量为6,初始化方法为'k-means++'
  261. kmeans = KMeans(n_clusters=6, init='k-means++')
  262. # 使用x1数据进行聚类
  263. kmeans.fit(x1)
  264. # 计算x1数据的轮廓系数,使用欧氏距离作为度量标准
  265. print(silhouette_score(x1, kmeans.labels_, metric='euclidean'))
  266. # 轮廓系数
  267. import sklearn.metrics
  268. score = []
  269. for i in range(2,10):
  270. model = KMeans(n_clusters=i).fit(x2)
  271. score.append(silhouette_score(x2, model.labels_, metric='euclidean'))
  272. plt.plot(range(2,10),score)
  273. plt.xlabel('Annual Income (k$)')
  274. plt.ylabel('Spending Score (1-100)')
  275. plt.show()
  276. kmeans = KMeans( n_clusters = 6, init='k-means++')
  277. kmeans.fit(x1)
  278. print(silhouette_score(x2, kmeans.labels_, metric='euclidean'))

以下代码仅供参考,可以自行修改参数分别观察聚类的效果,并对效果进行评估。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/619297
推荐阅读
相关标签
  

闽ICP备14008679号