1 案例描述
说明:赛题以竞品分析为背景,通过数据的聚类,为汽车提供聚类分类。对于指定的车型,可以通过聚类分析找到其竞品车型。通过这道赛题,鼓励学习者利用车型数据,进行车型画像的分析,为产品的定位,竞品分析提供数据决策。
任务:选手需要对该汽车数据进行聚类分析,并找到vokswagen汽车的相应竞品。要求选手在天池实验室中用notebook完成以上任务,并分享到比赛论坛。
(聚类分析是常用的数据分析方法之一,不仅可以帮助我们对用户进行分组,还可以帮我们对产品进行分组(比如竞品分析) 这里的聚类个数选手可以根据数据集的特点自己指定,并说明聚类的依据)
2 代码详情
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
data = pd.read_csv("./car_price.csv", encoding='gbk')
print(data)
# 1 数据探索
data.info()
# 判断是否有重复值
data.duplicated().sum()
# 2 增加CarBrand列
data['CarBrand'] = data['CarName'].str.split(expand=True)[0]
data['CarBrand'].value_counts().sort_index()
# 3 CarBrand列拼写错误更正/大小写统一/名称统一
data['CarBrand'] = data['CarBrand'].replace(
{'Nissan': 'nissan', 'maxda': 'mazda', 'porcshce': 'porsche', 'toyouta': 'toyota', 'vokswagen': 'volkswagen',
'vw': 'volkswagen', })
data['CarBrand'].value_counts().sort_index()
# 4 剔除表征车型的特征值
data_train = data.drop(['car_ID', 'CarName', 'CarBrand'], axis=1)
# 5 将symboling列转换为object数据类型
data_train['symboling'] = data_train['symboling'].astype('object')
data_train['symboling'].value_counts()
# 6 object类型列转换为编码数值
for name in data_train.columns:
if data_train[name].dtype == 'object':
data_train[name] = LabelEncoder().fit_transform(data_train[name])
# 7 归一化规范化到 [0,1] 空间
data_train = MinMaxScaler().fit_transform(data_train)
data_train = pd.DataFrame(data_train)
print(data_train)
# 8 k-means聚类算法,获得K最合理取值
sse = []
for k in range(1, 14):
kmeans = KMeans(n_clusters=k)
kmeans.fit(data_train)
sse.append(kmeans.inertia_)
x = range(1, 14)
plt.xlabel('K')
plt.ylabel('SSE')
plt.plot(x, sse, 'o-')
plt.show()
# 9 选择n_clusters = 6;使用KMeans聚类
kmeans = KMeans(n_clusters=6)
kmeans.fit(data_train)
car_class = kmeans.predict(data_train)
# 10 分组选出volkswagen品类的数据
data_car_ID = data[['car_ID', 'CarName', 'CarBrand']]
data_car_ID['Class_Result'] = car_class
data_volkswagen = data_car_ID[data_car_ID['CarBrand'] == 'volkswagen']
print(data_volkswagen)
# 11 结果输出
print('编号为192的volkswagen rabbit的竞品车为:' + '\n' + str(list(data_car_ID[data_car_ID['Class_Result'] == 2]['CarName'])))