目录
赛题简介
本次教学赛是数据科学家陈博士发起的数据分析系列赛事第3场 —— 汽车产品聚类分析
赛题以竞品分析为背景,通过数据的聚类,为汽车提供聚类分类。对于指定的车型,可以通过聚类分析找到其竞品车型。通过这道赛题,鼓励学习者利用车型数据,进行车型画像的分析,为产品的定位,竞品分析提供数据决策。
赛题背景
赛题以竞品分析为背景,通过数据的聚类,为汽车提供聚类分类。对于指定的车型,可以通过聚类分析找到其竞品车型。通过这道赛题,鼓励学习者利用车型数据,进行车型画像的分析,为产品的定位,竞品分析提供数据决策。
赛题数据
数据源:car_price.csv,数据包括了205款车的26个字段
一、查看数据
import pandas as pd
import time
import matplotlib.pyplot as plt
car_price = pd.read_csv("./car_price.csv")
car_price.head()
car_price.info()
# car_price.duplicated().sum()
数据特征具体可区分为3大类:
第一类:汽车ID类属性
1 Car_ID 车号
3 CarName 车名
第二类:类别型变量(10个)
2 Symboling 保险风险评级
4 fueltype 燃料类型
5 aspiration 发动机吸气形式
6 doornumber 车门数
7 carbody 车身型式
8 drivewheel 驱动轮
9 enginelocation 发动机位置
15 enginetype 发动机型号
16 cylindernumber 气缸数
18 fuelsystem 燃油系统
第三类:连续数值型变量(14个)
10 wheelbase 轴距
11 carlength 车长
12 carwidth 车宽
13 carheight 车高
14 curbweight 整备质量(汽车净重)
17 enginesize 发动机尺寸
19 boreratio 气缸横截面面积与冲程比
20 stroke 发动机冲程
21 compressionratio 压缩比
22 horsepower 马力
23 peakrpm 最大功率转速
24 citympg 城市里程(每加仑英里数)
25 highwaympg 高速公路里程(每加仑英里数)
26 price(Dependent variable) 价格(因变量)
查看类别型变量
# 提取类别变量的列名
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 {'gas', 'diesel'} aspiration {'std', 'turbo'} doornumber {'two', 'four'} carbody {'convertible', 'hatchback', 'wagon', 'sedan', 'hardtop'} drivewheel {'4wd', 'fwd', 'rwd'} enginelocation {'rear', 'front'} enginetype {'ohcv', 'ohcf', 'dohc', 'ohc', 'l', 'rotor', 'dohcv'} fuelsystem {'idi', 'mfi', '4bbl', '2bbl', 'mpfi', 'spfi', '1bbl', 'spdi'} cylindernumber {'eight', 'six', 'five', 'two', 'four', 'three', 'twelve'}
查看数值型变量
#提取连续数值型变量特征数据(除了'car_ID'和'CarName')
car_df=car_price.drop(['car_ID','CarName'],axis=1)
#查看连续数值型情况,并是检查否有异常值
#对数据进行描述性统计
car_df.describe()
# 描绘数据集的箱线图,查看异常值
#提取连续数值型数据的列名
num_cols=car_df.columns.drop(cate_columns)
print(num_cols)
#绘制连续数值型数据的箱线图,检查异常值
import seaborn as sns
fig=plt.figure(figsize=(12,8))
i=1
for col in num_cols:
ax=fig.add_subplot(3,5,i)
sns.boxplot(data=car_df[col],ax=ax)
i=i+1
plt.title(col)
plt.subplots_adjust(wspace=0.4,hspace=0.3)
plt.show()
#查看数值型特征的与价格的相关系数
df_corr=car_df.corr()
df_corr['price'].sort_values(ascending = False)
price 1.000000 enginesize 0.874145 curbweight 0.835305 horsepower 0.808139 carwidth 0.759325 carlength 0.682920 wheelbase 0.577816 boreratio 0.553173 carheight 0.119336 stroke 0.079443 compressionratio 0.067984 symboling -0.079978 peakrpm -0.085267 citympg -0.685751 highwaympg -0.697599 Name: price, dtype: float64
f , ax = plt.subplots(figsize = (7, 7))
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
sns.heatmap(df_corr,square = True, vmax=0.8)
二、数据处理
cylindernumber 气缸数
将英文表示为阿拉伯数字
car_price['cylindernumber'] = car_price.cylindernumber.replace({'three':3,'four':4,'five':5,'six':6,'eight':8,'twelve':12})
CarName 车名
#去重查看CarName
print(car_price['CarName'].drop_duplicates())#验证是否object全部改为数值类型
carBrand = car_price['CarName'].str.split(expand=True)[0]#根据车名提取品牌,车名中第一个词为品牌
print(set(carBrand))
#修改品牌名称的不规则命名
carBrand=carBrand.replace({'porcshce':'porsche','vokswagen':'volkswagen','Nissan':'nissan','maxda':'mazda','vw':'volkswagen','toyouta':'toyota'})
print(set(carBrand))
#将carBrand放入原数据集中
car_price['carBrand']=carBrand
由 carlength构建新特征carSize
# 由上面描述性统计可知,车身长范围为141.1~208.1英寸之间,可划分为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
#剔除carlength
features=car_df.drop(['carlength'],axis=1)
处理类别型特征
对于类别型特征的取值,有大小意义的数据转换为数值型映射,没有大小意义(不同取值表示类别不同),进行独热编码。
LabelEncoder
# 将取值具有大小意义的类别型变量数据转变为数值型映射
featu