使用聚类模型|客户对汽车满意度数据集聚类

        数据集从汽车的价格、质量、及舒适度这三个方面的相关数据出发,对汽车的客户满意度进行分类预测。数据一共包含6个相关特征,1个类别变量(即汽车满意度),共1728个样本点。

buying

maint

doors

persons

lug_boot

safety

count

1728

1728

1728

1728

1728

1728

mean

2.5

2.5

2.5

2

2

2

std

1.1183576

1.11835

1.1183576

0.816732

0.816732

0.81673

min

1

1

1

1

1

1

25%

1.75

1.75

1.75

1

1

1

50%

2.5

2.5

2.5

2

2

2

75%

3.25

3.25

3.25

3

3

3

max

4

4

4

3

3

3

原样本中的标签数量。聚类前,先把标签都删除。

        “物以类聚,人以群分”,将数据集中相似的样本分到一组,每个组称为一个簇(cluster),相同簇的样本之间相似度较高,不同簇的样本之间相似度较低。样本之间的相似度通常是通过距离定义的,距离越远,相似度越低。

        本文主要采用K-Means算法和Meanshift算法对数据进行聚类分析。当使用K-Means模型时,聚类值取2类,得到的直方图。此时,模型的轮廓系数为0.1664。当Cluster取不同的值时,得到轮廓系数折线图。

        当使用Meanshift算法采用不同窗宽时,其对应的轮廓系数如图所示,当窗宽为2时,轮廓系数达到最大,且此时的簇的个数为2。具体数值如表所示。 

Bandwidth

Cluster_number

Silhouette_score

0

1.0

362

0.0411

1

1.2

864

-0.0141

2

1.4

48

0.1262

3

1.6

16

0.1354

4

1.8

8

0.1325

5

2.0

2

0.1424

Kmeans代码如下:

import warnings
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
from plotnine import *
from sklearn import metrics
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 读入数据
auto = pd.read_csv('Car.csv')

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.figure(figsize=(8, 6))
auto.car_acceptability.value_counts().plot(kind='bar', rot=360, title='类别数量分布条形图')
plt.xticks([1, 0], ['满意', '不满意'])
plt.show()
model = KMeans(n_clusters=2,random_state=111).fit(auto)    #为使复现效果与PPT效果相同,设置随机种子为111
#样本标签和簇质心
auto_label = model.labels_
auto_cluster = model.cluster_centers_
auto_label

#画每个簇样本数的柱状图
auto_label_dataframe = pd.DataFrame({'clusters':auto_label})
auto_label_dataframe['clusters'] = auto_label_dataframe['clusters'].astype('category')
a=ggplot(auto_label_dataframe,aes('clusters',fill='clusters')) + geom_bar()
#print(a)

# 轮廓系数评估聚类效果
labels = model.labels_
print("轮廓系数(Silhouette Coefficient): %0.4f"
      % metrics.silhouette_score(auto, labels))
label=[]
k=np.arange(2,7,1)
for i in k:
    model = KMeans(n_clusters=i,random_state=111).fit(auto)  
    labels = model.labels_
    label.append(round(metrics.silhouette_score(auto, model.labels_), 4))
plt.plot(k,label, marker='.', linestyle='-', color='g')
plt.title('Silhouette Coefficient vs Number of Clusters')
plt.xlabel('Number of Clusters')
plt.ylabel('Silhouette Coefficient')
#plt.legend()
#plt.show()

Meanshift代码如下:

# 读入数据
auto = pd.read_csv('Car.csv')
a=auto.describe()
print(a)
bandwidth_grid = np.arange(1, 2.1, 0.2)
cluster_number = []
slt_score = []
# 训练模型
for i in bandwidth_grid:
    model = MeanShift(bandwidth=i).fit(auto)
    cluster_number.append(len(np.unique(model.labels_)))
    slt_score.append(round(metrics.silhouette_score(auto, model.labels_), 4))
result = pd.DataFrame([])

result['bandwidth'] = bandwidth_grid
result['cluster_number'] = cluster_number
result['silhouette_score'] = slt_score

print(result)
# 得到标签和聚类中心
auto_label = model.labels_
auto_cluster = model.cluster_centers_
# 轮廓系数
labels = model.labels_
#找出簇质心连续性变量的坐标
centroid_cluster = pd.DataFrame(auto_cluster).copy().iloc[:,:6]
centroid_cluster.columns=['buying','maint','doors','persons','lug_boot','safety']
#将数据逆标准化,转换为原始数据
c=centroid_cluster.applymap(lambda x:'%.2f'%x)
print(c)
print("轮廓系数(Silhouette Coefficient): %0.4f"
      % metrics.silhouette_score(auto, labels))

plt.plot(bandwidth_grid,slt_score, marker='.', linestyle='-', color='g')
plt.title('Meanshift Clustering-Silhouette Score')
plt.xlabel('Bandwiths')
plt.ylabel('Silhouette Score')
#plt.legend()
plt.show()

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 项目背景 基于项目提供的汽车相关数据,通过聚类分析的方法实现汽车产品聚类,以构建汽车产品画像、分析产品定位、完成汽车竞品分析等要求。 2. 项目数据 项目提供的汽车数据包括26个字段共205条数据,数据文件为“car_price.csv” 26个字段可以划分为类别型变量和数值型变量两种,包括汽车的长/宽/高、汽车净重、燃油系统、燃油类型、驱动类型、峰值转速、里程数、汽车价格等。 3. 项目要求 通过聚类的方法构建汽车产品画像、分析不同类别汽车的产品定位,寻找Volkswagen大众汽车的竞品品牌。 4. 项目思路 第一步:数据字段理解 根据项目所提供的数据,对数据中26个字段进行理解。结合汽车行业的相关知识,26个字段可以大致归为两类:第一类是车辆自身属性(如燃油系统、燃油类型、汽缸数、峰值转速、汽车长宽高等);第二类是车辆的市场属性(如车辆名称、车辆价格、风险评估等级)。 26个字段主要分为数值型变量和类别型变量两类。 第二步:原始数据描述性统计及变量分布可视化 对原始数据进行描述性统计并对数据中的字段分布进行可视化(详情见主文档)。通过对原始数据的观察,数据不存在缺失值、不存在重复值,“CarName”字段存在部分车辆品牌名称错误的情况。 第三步:确定聚类方法,明确聚类要求 通过对原始数据的变量观察,该数据变量主要为数值型变量和类别型变量两类,且类别型变量数量较多,常用的K-means聚类只能分析数值型变量,无法考虑类别型变量所包含的信息。二阶段聚类法适用于包含数值型和类别型变量的混合数据,因此考虑使用二阶段聚类分析数据。 二阶段聚类法的要求是:类别型变量符合多项式分布(即变量的值分属几个类别);数值型变量间要相互独立,且数值型变量近似服从正态分布。项目所给出的数据中,类别型变量符合多项式分布,因此仅需进一步观察并处理数值型变量。 第四步:特征工程 数据清洗与新变量生成。原始数据指给出了车辆的名称,没有给出车辆所属品牌,结合最终聚类分析的需要,根据“CarName”字段提取出车辆所属品牌信息,命名为“brand”。同时对品牌名称中的错误拼写进行清洗。 变量相关性分析与可视化。由于二阶段聚类要求数值型变量间相互独立,所以需要对数值型变量间的相关性进行查看与处理。相关性分析结果表示14个数值型变量之间存在高相关性情况,需要结合汽车知识背景与变量特征进行进一步处理。 高相关变量的处理——“highwaympg”和“citympg”呈高度正相关。其实不管是高速mpg还是城市mpg,其本质都是mpg指标,而且通过观察数据,二者之间的差异较小(极值、均值),因此考虑将二者合并为一个指标'mpg',计算方式为取二者均值:mpg=(highwaympg+citympg)/2; 高相关性变量的处理——“price”变量与其余变量产生高相关性的频数最多,可能是因为车辆自身属性和配置的变动会直接影响着车辆的市场价格。此外,与其他变量相比,price属性属于车辆的市场销售属性(而非车辆自身属性),在聚类中更适合作为类别型变量,对车辆的价位进行划分,因此,考虑将price变量转换为类别型变量,按照其价格分布划分为Low price(20000)三类; 高相关性变量的处理——对于其余数值型变量,变量数目较多且多个变量之间存在相关性,因此考虑使用因子分析对数值型变量进行降维,以减少数值型变量的数目并使变量间相互独立。 第五步:数值型变量因子分析结果(基于SPSS实现) 利用SPSS对数值型变量进行因子分析,KMO值>0.8,巴特利球形检验p值=0,说明参与因子分析的变量间存在相关性,可以进行因子分析。最终得到两个因子。 第一个因子包括:车长、车宽、车净重、引擎尺寸、车轴距、mpg、马力、车内径比。简单将该因子归纳为车辆截面与马力因子; 第二个因子包括:车高、峰值转速、车压缩比。简单将该因子归纳为车辆垂面与转速因子; 第六步:两阶段聚类及结果(基于SPSS实现) 对处理后的数据进行两阶段聚类,最终将205辆车聚为两类。 根据SPSS聚类结果,第一类中包含120条车辆数据,占总数据的58.5%;第二类中包含85条车辆数据,占总数据的41.5%。两类簇数据规模近似,没有过大或过小的类簇。 根据SPSS聚类结果,聚类质量属于“良好”范围,仍有进一步改进和优化的空间。 根据SPSS聚类结果,显著区分两类类簇的变量(重要性>0.6)按重要性大小排序依次是驱动类型、燃油系统、车辆截面与马力因子、价格范围。 汽车产品画像与产品定位 根据区分类簇的四个重要标签来对数据中的汽车产品进行产品画像与产品定位。 第一类画像:驱动类型多为fwd(前轮驱动),燃油系统多

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔雀飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值