汽车产品聚类分析实验
汽车产品聚类分析
1 实验简介
本实验以竞品分析为背景,通过数据的聚类,为汽车提供聚类分类。对于指定的车型,可以通过聚类分析找到其竞品车型。通过这个实验,鼓励学生利用车型数据,进行车型画像的分析,为产品的定位,竞品分析提供数据决策。
2 实验目的
- 掌握三种聚类方法,包括至少一种深度聚类方法
- 完成对实验数据的聚类分析
3 相关理论与知识点
方法一:K-Means聚类算法
K-Means聚类算法是常用的无监督学习算法,其思想是将n个数据点分成k个簇,使得簇内的数据点相似度较高,簇间的数据点相似度较低。在汽车产品聚类分析中,我们可以利用K-Means算法将具有相似车型、价格、品牌、排量等特征的汽车产品聚类在一起。
通过计算数据之间的距离将它们分配到预定数量的簇中,使得簇内数据的差异最小化,而簇间数据的差异最大化。在这个方法中,我们需要选择一个合适的k值(簇的数量),并且通过迭代的方式来最小化数据的总距离。
具体实现过程如下:
1.选择合适的k值(簇的数量);
2.随机初始化k个聚类中心;
3.对于每个数据点,计算它与每个聚类中心之间的距离,并将数据点分配到距离最近的聚类中心所代表的簇中;
4.计算每个簇的中心,并将它作为新的聚类中心;
5.重复步骤3和4,直到聚类中心不再变化或者达到了最大迭代次数。
方法二:层次聚类算法
层次聚类算法是将数据点逐步进行合并,形成一个层次结构,最终形成一个树状结构,从而将数据点聚类成不同的组。在汽车产品聚类分析中,我们可以利用层次聚类算法将具有相似车型、价格、品牌、排量等特征的汽车产品聚类在一起。
具体实现过程如下:
1.对数据进行预处理,去除无用字段并对缺失值进行填充。
2.对数据进行归一化处理,使各个特征维度具有相同的权重。
3.选择合适的距离度量方法,本例中采用欧氏距离。
4.进行层次聚类,直到簇的数量为3。
方法三:DBSCAN聚类算法
DBSCAN是一种基于密度的聚类算法,它能够将密度相近的数据点聚集在一起形成簇。相对于K-Means和层次聚类,DBSCAN算法不需要指定簇的个数,而是通过设置距离阈值和密度阈值来判断数据点是否属于同一簇。
具体实现过程如下:
1.数据预处理:对数据进行标准化或归一化处理,使各个维度的特征权重一致。
2.参数设置:DBSCAN算法的主要参数有两个:ε(eps)和minPts。其中,ε表示领域的半径大小,minPts表示领域内最少的数据点个数。
3.计算点密度:对于每个数据点,计算其ε领域内的点数。
4.标记点类型:将每个点按照其ε领域内的点数与minPts进行比较,确定其为核心点、边界点或噪声点。
5.构建簇:对于每个核心点,以其为中心,将其ε领域内的所有点添加到同一个簇中。
6.迭代聚类:对于所有未被标记为核心点或边界点的数据点,将其标记为噪声点或分配到合适的簇中。
4 实验任务及评分标准
序号 |
任务名称 |
任务具体要求 |
评分标准(100分制) |
1 |
采用至少三种聚类方法分析 |
运用聚类算法,对该汽车数据进行聚类分析,并找到vokswagen汽车的相应竞品。聚类个数学生可以根据数据集的特点自己指定,但需说明聚类的依据。 使用Mindspore框架,采用Jupyter写代码。 开发语言:Python。 每种算法对应一个独立的代码文件(.ipynb)。 |
至少三种聚类算法可以写到一个实验报告中。 Jupyter代码提交到华为云平台; 同时将提交到将源代码、实验报告打包成一个文件上传到乐学网站中,压缩包命名:学号+姓名+汽车产品聚类 |
5 实验条件与环境
要求 |
名称 |
版本要求 |
备注 |
编程语言 |
Python |
|
|
开发环境 |
Jupyter |
|
|
第三方工具包/库/插件 |
Mindspore |
|
|
6 实验数据及其说明
属性(条目) |
内容 |
数据集的名称 |
汽车产品聚类分析数据集 |
数据集的出处 |
汽车产品 |
数据集的主要内容 |
汽车产品聚类分析数据集通常包含一系列汽车产品的相关信息,这些信息可以用来进行聚类分析以确定不同汽车产品之间的相似性和差异性。 以下是可能包含在汽车产品聚类分析数据集中的主要内容: 汽车产品的属性、汽车产品的尺寸和重量、汽车产品的燃油经济性、汽车产品的安全性能、汽车产品的舒适性和便利性。 这些信息可以帮助进行聚类分析,以找到相似的汽车产品群组,可以用于市场分析、产品定位和推销策略等。
|
数据集的文件格式 |
car_price.csv,数据包括了205款车的26个字段 |
7 实验步骤及其代码
步骤序号 |
1 |
步骤名称 |
读取、观察数据 |
步骤描述 |
|
代码及讲解 |
import pandas as pd
car_price=pd.read_csv('car_price.csv') car_price.head() car_price.duplicated().sum() car_price.info() |
输出结果及其解读 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 205 entries, 0 to 204 Data columns (total 26 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 car_ID 205 non-null int64 1 symboling 205 non-null int64 2 CarName 205 non-null object 3 fueltype 205 non-null object 4 aspiration 205 non-null object 5 doornumber 205 non-null object 6 carbody 205 non-null object 7 drivewheel 205 non-null object 8 enginelocation 205 non-null object 9 wheelbase 205 non-null float64 10 carlength 205 non-null float64 11 carwidth 205 non-null float64 12 carheight 205 non-null float64 13 curbweight 205 non-null int64 14 enginetype 205 non-null object 15 cylindernumber 205 non-null object 16 enginesize 205 non-null int64 17 fuelsystem 205 non-null object 18 boreratio 205 non-null float64 19 stroke 205 non-null float64 20 compressionratio 205 non-null float64 21 horsepower 205 non-null int64 22 peakrpm 205 non-null int64 23 citympg 205 non-null int64 24 highwaympg 205 non-null int64 25 price 205 non-null float64 dtypes: float64(8), int64(8), object(10) memory usage: 41.8+ KB |
步骤序号 |
2 |
步骤名称 |
观察每个类别的取值情况 |
步骤描述 |
|
代码及讲解 |
cate_columns=['symboling','fueltype','aspiration','doornumber','carbody','drivewheel','enginelocation','enginetype','fuelsystem','cylindernumber']
for i in cate_columns: print(i) print(set(car_price[i])) |
输出结果及其解读 |
symboling {0, 1, 2, 3, -2, -1} fueltype {'diesel', 'gas'} aspiration {'std', 'turbo'} doornumber {'four', 'two'} carbody {'convertible', 'hatchback', 'wagon', 'sedan', 'hardtop'} drivewheel {'rwd', 'fwd', '4wd'} enginelocation {'front', 'rear'} enginetype {'dohc', 'ohcv', 'l', 'dohcv', 'rotor', 'ohc', 'ohcf'} fuelsystem {'spdi', 'mfi', 'spfi', 'idi', 'mpfi', '1bbl', '4bbl', '2bbl'} cylindernumber {'eight', 'six', 'two', 'three', 'five', 'four', 'twelve'} |
步骤序号 |
3 |
步骤名称 |
气缸数数值化并提取变量特征数据(除了'car_ID'和'CarName') |
步骤描述 |
|
代码及讲解 |
car_price['cylindernumber']=car_price.cylindernumber.replace({'two':2,'three':3,'four':4,'five':5,'six':6,'eight':8,'twelve':12}) car_df=car_price.drop(['car_ID','CarName'],axis=1)
car_df.describe() |
输出结果及其解读 |
|
步骤序号 |
4 |
步骤名称 |
拆出品牌信息 |
步骤描述 |
利用split,由CarName拆出品牌信息 |
代码及讲解 |
carBrand=car_price['CarName'].str.split(expand=True)[0] print(set(carBrand)) |
输出结果及其解读 |
{'volkswagen', 'porcshce', 'saab', 'renault', 'subaru', 'isuzu', 'maxda', 'honda', 'Nissan', 'plymouth', 'audi', 'alfa-romero', 'dodge', 'vw', 'peugeot', 'volvo', 'chevrolet', 'buick', 'bmw', 'jaguar', 'mercury', 'toyota', 'porsche', 'toyouta', 'vokswagen', 'mitsubishi', 'nissan', 'mazda'} |
步骤序号 |
5 |
步骤名称 |
修改品牌名称的不规则命名 |
步骤描述 |
|
代码及讲解 |
carBrand=carBrand.replace({'porcshce':'porsche','vokswagen':'volkswagen','Nissan':'nissan','maxda':'mazda','vw':'volkswagen','toyouta':'toyota'}) print(set(carBrand))
car_price['carBrand']=carBrand |
输出结果及其解读 |
{'volkswagen', 'saab', 'renault', 'subaru', 'isuzu', 'honda', 'plymouth', 'audi', 'alfa-romero', 'dodge', 'peugeot', 'volvo', 'chevrolet', 'buick', 'bmw', 'jaguar', 'mercury', 'toyota', 'porsche', 'mitsubishi', 'nissan', 'mazda'} |
步骤序号 |
6 |
步骤名称 |
依据车身长划分为6类 |
步骤描述 |
|
代码及讲解 |
bins=[min(car_df.carlength)-0.01,145.67,169.29,181.10,192.91,200.79,max(car_df.carlength)+0.01] label=['A00','A0','A','B','C','D'] carSize=pd.cut(car_df.carlength,bins,labels=label) print(carSize)
car_price['carSize']=carSize car_df['carSize']=carSize |
输出结果及其解读 |
0 A0 1 A0 2 A 3 A 4 A .. 200 B 201 B 202 B 203 B 204 B Name: carlength, Length: 205, dtype: category Categories (6, object): ['A00' < 'A0' < 'A' < 'B' < 'C' < 'D'] |
步骤序号 |
7 |
步骤名称 |
剔除carlength |
步骤描述 |
|
代码及讲解 |
features=car_df.drop(['carlength'],axis=1) |
输出结果及其解读 |
|
步骤序号 |
8 |
步骤名称 |
类别变量编码 |
步骤描述 |
|
代码及讲解 |
from sklearn.preprocessing import LabelEncoder
features1=features.copy() carSize1=LabelEncoder().fit_transform(features1['carSize']) features1['carSize']=carSize1
cate=features1.select_dtypes(include='object').columns print(cate)
features1=features1.join(pd.get_dummies(features1[cate])).drop(cate,axis=1) features1.head() |
输出结果及其解读 |
Index(['fueltype', 'aspiration', 'doornumber', 'carbody', 'drivewheel', 'enginelocation', 'enginetype', 'fuelsystem'], dtype='object') |
步骤序号 |
9 |
步骤名称 |
对数值型数据进行归一化 |
步骤描述 |
|
代码及讲解 |
from sklearn import preprocessing
features1=preprocessing.MinMaxScaler().fit_transform(features1) features1=pd.DataFrame(features1) features1.head() |
输出结果及其解读 |
|
步骤序号 |
10 |
步骤名称 |
对数据集进行PCA降维 |
步骤描述 |
|
代码及讲解 |
from sklearn.decomposition import PCA
pca=PCA(n_components=8) features2=pca.fit_transform(features1) |
输出结果及其解读 |
|
步骤序号 |
11 |
步骤名称 |
导出为csv文件 |
步骤描述 |
|
代码及讲解 |
features2 = pd.DataFrame(features2) features2.to_csv('csv.csv', sep=',', index=False, header=True) |
输出结果及其解读 |
|
步骤序号 |
12 |
步骤名称 |
读取数据 |
步骤描述 |
|
代码及讲解 |
from pandas import read_csv
data = read_csv('csv.csv', header=0, index_col=None) x = data.iloc[:, 2:].values y = data.iloc[:, 1].values |
输出结果及其解读 |
|
步骤序号 |
13 |
步骤名称 |
数据标准化 |
步骤描述 |
|
代码及讲解 |
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() x_scaled = scaler.fit_transform(x) |
输出结果及其解读 |
|
步骤序号 |
14 |
步骤名称 |
KMeans聚类 |
步骤描述 |
|
代码及讲解 |
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=5, random_state=0).fit(x_scaled) centroids = kmeans.cluster_centers_ labels = kmeans.labels_
print(centroids) print(labels) |
输出结果及其解读 |
[[-0.58589626 -0.37460815 -0.55737669 0.18666357 0.21133472 0.43280211] [-0.61163855 1.26456235 1.44528704 -0.93102337 -0.2190535 0.98908825] [ 0.95037702 -1.15980248 1.49330234 1.0747582 0.79711426 0.04042766] [ 2.37827065 0.38552139 -0.86738029 -0.40430012 -0.80793767 0.09853577] [-0.15474449 0.29421379 -0.06848992 -0.14764467 -0.20048994 -0.90540357]] [0 0 4 0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 4 4 0 4 4 2 4 0 0 2 1 2 4 4 4 4 4 0 1 4 4 0 0 0 0 0 0 0 4 4 4 0 4 4 4 0 0 4 4 4 4 4 0 4 0 3 4 0 3 3 3 3 3 4 0 4 4 2 4 4 4 2 2 4 2 2 2 0 0 2 0 0 3 0 0 1 0 4 0 1 0 4 0 4 1 4 4 2 4 4 3 1 3 4 3 1 3 4 3 2 4 2 4 0 0 1 2 0 0 0 0 4 1 4 4 0 4 0 2 2 4 4 0 0 0 0 0 2 1 1 1 1 4 4 4 1 1 1 0 4 3 3 0 4 0 0 4 0 4 0 0 0 0 0 0 0 3 4 0 4 4 4 4 1 3 0 3 0 0 3 0 0 4 0 3 1 0 1 0 1 2 1 0 2 4 3 2] |
步骤序号 |
15 |
步骤名称 |
dbscan聚类 |
步骤描述 |
|
代码及讲解 |
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=3, min_samples=2).fit(x_scaled) labels = dbscan.labels_
print(labels) |
输出结果及其解读 |
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] |
步骤序号 |
16 |
步骤名称 |
层次聚类 |
步骤描述 |
|
代码及讲解 |
from sklearn.cluster import AgglomerativeClustering agg = AgglomerativeClustering(n_clusters=5).fit(x_scaled) labels = agg.labels_
print(labels) |
输出结果及其解读 |
[1 1 1 2 2 2 2 0 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 1 4 0 4 2 2 2 2 2 2 0 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 1 1 1 1 4 1 1 1 4 4 1 4 4 4 1 1 4 2 1 3 1 1 0 1 1 1 0 1 1 1 2 0 2 1 2 1 1 3 0 3 1 3 0 3 1 3 2 1 4 1 1 1 0 4 1 0 0 0 1 0 2 2 2 2 2 2 2 0 0 0 0 0 2 0 0 0 0 0 0 1 1 1 0 0 0 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 2 2 2 1 1 1 0 3 2 3 2 2 3 2 2 2 2 3 0 1 0 1 0 4 0 1 4 1 3 4] |
8 实验结果及解读
KMeans和层次聚类都有比较好的聚类效果,dbscan的聚类结果有一些问题。
- 点赞
- 收藏
- 关注作者
评论(0)