这篇文章的内容来自于天池的数据科学比赛,主要对汽车产品聚类分析。
赛题链接:https://tianchi.aliyun.com/competition/entrance/531892/introduction
1、赛题和数据
1.1 赛题
赛题以竞品分析为背景,通过数据的聚类,为汽车提供聚类分类。对于指定的车型,可以通过聚类分析找到其竞品车型。通过这道赛题,鼓励学习者利用车型数据,进行车型画像的分析,为产品的定位,竞品分析提供数据决策。
1.2 数据
数据源:car_price.csv,数据包括了205款车的26个字段
1.3 赛题任务
选手需要对该汽车数据进行聚类分析,并找到vokswagen汽车的相应竞品。(聚类分析是常用的数据分析方法之一,不仅可以帮助我们对用户进行分组,还可以帮我们对产品进行分组(比如竞品分析) 这里的聚类个数选手可以根据数据集的特点自己指定,并说明聚类的依据)
2、解决方案
2.1 思路
这里题目要求是找出 vokswagen 车型的竞品(这里有可能是数据中书写错误,应该是大众车型的一种型号),关于竞品的一般解释是竞争对手的产品,这里理解为面向相同用户群体、在功能价格等方面具有一定相似性的产品,例如h5的竞品,如下图所示:
因此,采用聚类的方法找出 vokswagen 车型的竞品,本文使用的是Kmeans聚类,是一种采用距离进行相似度度量、进而聚类的方法。
2.2 数据预处理
首先,读取数据,查看特征包含的信息,以及特征的取值类型,代码如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 24 16:30:09 2022
@author: zenghang.feng
"""
import pandas as pd
import seaborn as sns
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import silhouette_score
# 读取数据,查看特征
df = pd.read_csv('car_price.csv')
df.info()
"""
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
"""
可以筛选出数值特征绘制数据分布图,代码如下:
"""筛选 carlength, horsepower, price 绘制特征分布"""
for i in ['carlength','horsepower','price']:
fig = sns.distplot(df[i])
fig_save = fig.get_figure()
fig_save.savefig('{}.png'.format(i),dpi=300)
fig_save.clear()
然后把非数值特征转换为数值特征