【个人比赛】天池数据达人赛:汽车产品聚类分析

        纯个人分享,若方法、代码有不当之处,请多批评指正。

        本赛题以竞品分析为背景,通过数据的聚类,为汽车提供聚类分类。对于指定的车型,可以通过聚类分析找到其竞品车型。通过这道赛题,鼓励参赛者利用车型数据,进行车型画像的分析,为产品的定位,竞品分析提供数据决策。

        首先是常规操作,加载第三方库。

# 加载第三方库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random
from sklearn.cluster import KMeans
# 统一量纲
from sklearn.preprocessing import MinMaxScaler as mms
# 根据轮廓系数选择合适的 n_clusters
from sklearn.metrics import silhouette_score

       

        把数据读进来看看长什么样子。

# 读取数据
path = r'D:\汽车产品聚类分析\car_price.csv'
data = pd.read_csv(path)
data.head()

       

        一共有26个字段,先看看各字段的数据类型、是否有空值。

# 查看字段的数据类型、空值
# 结果显示无空值
data.info()

       

        赛题要求找出大众汽车的竞品,因此先对品牌字段做洞察、清洗。

# 查看品牌字段的值
data['CarName'].unique()

       

        发现品牌字段有很多不规则命名,对其进行替换,顺便看看替换后的效果。

# 替换品牌字段的不规则命名
data['CarName'] = data['CarName'].replace({'audi 100 ls':'audi 100ls',
'vokswagen rabbit':'volkswagen rabbit',
'vw dasher':'volkswagen dasher',
'vw rabbit':'volkswagen rabbit'})

data['CarName'].unique()

        

        是否需要去除重复值呢?

# 是否有必要做去除重复值的操作(结果:没必要)
data.drop_duplicates().shape == data.shape
# 结果:True

        

        分类型变量不适合做聚类分析,先把它们转换成哑变量。

# 需要转哑变量的字段

# lst_1 是字符型的变量,lst_2 是非字符型的变量
lst_1 = ['fueltype','aspiration','doornumber','carbody',
       'drivewheel','enginelocation','enginetype','cylindernumber','fuelsystem']
lst_2 = ['symboling']

# 转换为字符类型
data[lst_2] = data[lst_2].astype(str)

# 删除原转码的字段,合并得到新表
data_1 = pd.get_dummies(data[lst_1 + lst_2])
data_2 = data.drop(columns = lst_1 + lst_2)
data_3 = pd.concat([data_1,data_2],axis = 1)

       

        汽车ID、汽车品牌名不是汽车的属性,就不作为聚类的依据了。

# 删除不是汽车属性的字段
data_new = data_3.drop(columns = ['car_ID','CarName'])

       

        各字段的量纲不一,先做归一化再做聚类。

# 归一化,统一量纲
MMS_01 = mms().fit(data_new)
data_01 = MMS_01.transform(data_new)
data_02 = pd.DataFrame(data_01,columns=data_new.columns)

       

        看看转码、归一化后的表格长什么样子。

# 转码、归一化后的表格
data_02.head()

        

        好了,数据清洗完毕,现在正式开始用 KMeans 做聚类。

        最大的问题在于,如何选择最合适的参数 n_clusters。这里采用轮廓系数作为依据,目的是使簇外差异与簇内差异的两者之差最大。

# 绘制 n_clusters 和 所有样本的平均轮廓系数 的关系图

score = []

for i in range(2,21):
    cluster = KMeans(n_clusters = i,random_state = 0).fit(data_02)
    score.append(silhouette_score(data_02,cluster.labels_))

plt.plot(range(2,21),score)

        

        肉眼可见,轮廓系数与 n_clusters 正相关,但 n_clusters 并非越大越好,这里就粗略地选择【2,20】中轮廓系数最大的 n_clusters 吧。

# 找出平均轮廓系数最高时对应的 n_clusters:20
plt.axvline(pd.DataFrame(score).idxmax()[0]+2,ls=':')

        

        最合适的参数也找到了,开始应用 KMeans。

# 应用 KMeans 进行聚类
n = pd.DataFrame(score).idxmax()[0]+2
cluster = KMeans(n_clusters = n,random_state = 0).fit(data_02)
y_pred = cluster.labels_
y_pred

       

        至此,各汽车产品聚类完成,最后看看各分类的车型数量。

# 得到分类完成后的完整信息表
car = data_3[['car_ID','CarName']]
label = pd.Series(y_pred)
data_03 = pd.concat([car,data_02],axis = 1)
data_03['label'] = label

# 查看各分类的车型数量
data_03['label'].value_counts()

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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(前轮驱动),燃油系统多

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值