技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 204|回复: 3
收起左侧

探究私家车价格与哪些因素有关

[复制链接]

265

主题

434

帖子

4516

积分

用户组: 真·技术宅

UID
2
精华
61
威望
147 点
宅币
3358 个
贡献
125 次
宅之契约
0 份
在线时间
586 小时
注册时间
2014-1-25
发表于 2017-10-22 11:56:48 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
探究私家车价格与哪些因素有关

数据库在我的git上,之前分享过一篇文章介绍怎样爬取该数据库,这次为了方便机器学习我做成csv格式
https://github.com/lichao890427/ ... dataset/cardata.csv

先来看看基本信息:
[Python] 纯文本查看 复制代码
import pandas as pd

import warnings
warnings.filterwarnings("ignore")
import time
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.linear_model import *
from sklearn.tree import *
from sklearn.neighbors import *
from sklearn.ensemble import *
from sklearn.svm import *
from sklearn.naive_bayes import *
from sklearn.preprocessing import *
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.neural_network import *
from sklearn.model_selection import *
from sklearn.preprocessing import Imputer
clfs = [
    [LogisticRegression(max_iter=1000), {}],
    [SVC(), {'C': [0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0]}],
    [PassiveAggressiveClassifier(), {}],
    [RidgeClassifier(), {}],
    [RidgeClassifierCV(), {}],
    [SGDClassifier(), {}],
    [KNeighborsClassifier(n_neighbors=20), {}],
    [NearestCentroid(), {}],
    [DecisionTreeClassifier(), {}],
    [ExtraTreeClassifier(), {}],
    [AdaBoostClassifier(base_estimator=BaggingClassifier()), {}],
    [BaggingClassifier(), {}],
    [ExtraTreeClassifier(), {}],
    [GradientBoostingClassifier(), {}],
    [RandomForestClassifier(n_estimators=100), {}],
    [BernoulliNB(), {}],
    [GaussianNB(), {}],
]

pipes = [Pipeline([
    ['sc', StandardScaler()],
    ['clf', GridSearchCV(pair[0], param_grid=pair[1])]
]) for pair in clfs]  # 用于统一化初值处理、分类

def test_classifier():
    for i in range(0, len(clfs)):
        start = time.time()
        acc_arr = []
        for j in range(0, testnum):
            X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)
            pipes[i].fit(X_train, y_train)
            y_pred = pipes[i].predict(X_test)
            acc_arr.append(accuracy_score(y_test, y_pred))
        npacc = np.array(acc_arr)
        end = time.time()
        print('Accuraty:%s meanscore=%.2f minscore=%.2f time=%d' % (type(clfs[i][0]), npacc.mean(), npacc.min(), end - start))


dataset = pd.read_csv('cardata.csv', header = 0)
print(dataset.head())
dataset.info()


          车型名称  厂商指导价(元)    级别  上市时间  排量(mL)     变速箱  长度(mm)  \
0          千里马 2004款 1.3L AT      8.08   小型车   NaN  1341.0    4挡自动  4115.0   
1  标致206(进口) 2004款 206CC 1.6     25.50   小型车   NaN  1587.0  4挡手自一体  3835.0   
2            标致607 2004款 3.0     47.00  中大型车   NaN  2946.0  6挡手自一体  4902.0   
3           乐驰 2004款 0.8L 手动      4.58   微型车   NaN   796.0    5挡手动  3495.0   
4         蒙迪欧 2004款 2.0L 尊贵型     20.98   中型车   NaN  1999.0    4挡自动  4810.0   

   宽度(mm)  高度(mm)  最高车速(km/h)  ...    后制动器类型          后悬架类型       后轮胎规格  备胎规格  \
0  1620.0  1410.0       162.0  ...        鼓式        双连杆独立悬架  175/70 R13   全尺寸   
1  1673.0  1373.0       188.0  ...        盘式           拖曳臂式  205/45 R16   全尺寸   
2  1835.0  1442.0       231.0  ...        盘式        多连杆独立悬架  225/50 R17   全尺寸   
3  1495.0  1485.0       135.0  ...        鼓式  连杆摆臂式非独立,螺旋弹簧  155/65 R13   全尺寸   
4  1800.0  1450.0       190.0  ...        盘式          复合连杆式  205/55 R16   全尺寸   

   挡位个数  排量(L)  行李厢容积(L)  车体结构   车身结构 驻车制动类型  
0     4    1.3       450   承载式    三厢车     手刹  
1     4    1.6       410   承载式  硬顶敞篷车     手刹  
2     6    3.0       510   承载式    三厢车     手刹  
3     5    0.8       145   承载式    两厢车     手刹  
4     4    2.0       500   承载式    三厢车     手刹  

[5 rows x 54 columns]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 22143 entries, 0 to 22142
Data columns (total 54 columns):
车型名称                22143 non-null object
厂商指导价(元)            22143 non-null float64
级别                  22143 non-null object
上市时间                19162 non-null float64
排量(mL)              21371 non-null float64
变速箱                 22141 non-null object
长度(mm)              22106 non-null float64
宽度(mm)              22097 non-null float64
高度(mm)              22102 non-null float64
最高车速(km/h)          16980 non-null float64
工信部综合油耗(L/100km)    14243 non-null float64
整车质保                22057 non-null object
轴距(mm)              22054 non-null float64
前轮距(mm)             16454 non-null float64
后轮距(mm)             16452 non-null float64
整备质量(kg)            17843 non-null float64
车门数(个)              22104 non-null float64
座位数(个)              22108 non-null float64
油箱容积(L)             20387 non-null float64
进气形式                21847 non-null object
气缸排列形式              21847 non-null object
气缸数(个)              21847 non-null float64
每缸气门数(个)            21837 non-null object
配气机构                21833 non-null object
最大马力(Ps)            22097 non-null float64
最大功率(kW)            22092 non-null float64
最大功率转速(rpm)         21347 non-null object
最大扭矩(N·m)           21998 non-null float64
最大扭矩转速(rpm)         21400 non-null object
燃料形式                22108 non-null object
燃油标号                21847 non-null object
供油方式                21834 non-null object
缸盖材料                21841 non-null object
缸体材料                21841 non-null object
环保标准                21842 non-null object
驱动方式                22108 non-null object
前制动器类型              22108 non-null object
前悬架类型               22107 non-null object
前轮胎规格               22102 non-null object
助力类型                22108 non-null object
厂商                  22143 non-null object
发动机                 22143 non-null object
发动机型号               15787 non-null object
变速箱类型               22108 non-null object
后制动器类型              22108 non-null object
后悬架类型               22107 non-null object
后轮胎规格               22105 non-null object
备胎规格                22108 non-null object
挡位个数                22108 non-null object
排量(L)               21847 non-null float64
行李厢容积(L)            14816 non-null object
车体结构                22108 non-null object
车身结构                22143 non-null object
驻车制动类型              22108 non-null object
dtypes: float64(20), object(34)
memory usage: 9.1+ MB

由统计数据可知:
* id 车型名称 与最终价格无关,忽略特征。发动机及型号数据太多我们这次不当作特征处理
* 级别、变速箱,整车质保,进气形式,每缸气门数,配气结构,最大功率转速,最大扭矩转速,及后面一堆object特征,数据需要转换为特征数值
* 上市时间数据缺失13%,排量数据缺失3%,长宽高数据缺失40+,变速箱数据缺失2,最高车速数据缺失23%,整车质保和轴距数据缺失80+,前轮距和后轮距数据缺失25%,整车质量缺失19%,

下面来测算价格与什么因素有关
[Python] 纯文本查看 复制代码
dataset = pd.read_csv('cardata.csv', header = 0)
dataset.drop("车型名称", inplace=True, axis=1)
dataset.drop("发动机", inplace=True, axis=1)
dataset.drop("发动机型号", inplace=True, axis=1)
dataset["级别"] = LabelEncoder().fit_transform(dataset["级别"].values)
dataset["上市时间"].fillna(dataset["上市时间"].mean(), inplace=True)
dataset["排量(mL)"].fillna(dataset["排量(mL)"].mean(), inplace=True)
dataset["变速箱"].fillna("5挡手动", inplace=True) # 用频率最大的填充
dataset["变速箱"] = LabelEncoder().fit_transform(dataset["变速箱"].values)
dataset["长度(mm)"].fillna(dataset["长度(mm)"].mean(), inplace=True)
dataset["宽度(mm)"].fillna(dataset["宽度(mm)"].mean(), inplace=True)
dataset["高度(mm)"].fillna(dataset["高度(mm)"].mean(), inplace=True)
dataset["最高车速(km/h)"].fillna(dataset["最高车速(km/h)"].mean(), inplace=True)
dataset["工信部综合油耗(L/100km)"].fillna(dataset["工信部综合油耗(L/100km)"].mean(), inplace=True)
dataset["整车质保"].fillna("三年或10万公里", inplace=True) # 用频率最大的填充
dataset['整车质保'] = dataset['整车质保'].apply(get_zhibao)
dataset["轴距(mm)"].fillna(dataset["轴距(mm)"].mean(), inplace=True)
dataset["前轮距(mm)"].fillna(dataset["前轮距(mm)"].mean(), inplace=True)
dataset["后轮距(mm)"].fillna(dataset["后轮距(mm)"].mean(), inplace=True)
dataset["车门数(个)"].fillna(dataset["车门数(个)"].mean(), inplace=True)
dataset["座位数(个)"].fillna(dataset["座位数(个)"].mean(), inplace=True)
dataset["整备质量(kg)"].fillna(dataset["整备质量(kg)"].mean(), inplace=True)
dataset["油箱容积(L)"].fillna(dataset["油箱容积(L)"].mean(), inplace=True)
dataset["进气形式"].fillna("自然吸气", inplace=True)
dataset["进气形式"] = LabelEncoder().fit_transform(dataset["进气形式"].values)
dataset["气缸排列形式"].fillna("L", inplace=True)
dataset["气缸排列形式"] = LabelEncoder().fit_transform(dataset["气缸排列形式"].values)
dataset["气缸数(个)"].fillna(dataset["气缸数(个)"].mean(), inplace=True)
dataset["每缸气门数(个)"] = dataset['每缸气门数(个)'].apply(get_qimenshu)
dataset["配气机构"].fillna("DOHC", inplace=True)
dataset["配气机构"] = LabelEncoder().fit_transform(dataset["配气机构"].values)
dataset["最大马力(Ps)"].fillna(dataset["最大马力(Ps)"].mean(), inplace=True)
dataset["最大功率(kW)"].fillna(dataset["最大功率(kW)"].mean(), inplace=True)
dataset["最大功率转速(rpm)"] = dataset['最大功率转速(rpm)'].apply(get_gonglv)
dataset["最大扭矩(N·m)"].fillna(dataset["最大扭矩(N·m)"].mean(), inplace=True)
dataset["最大扭矩转速(rpm)"] = dataset['最大扭矩转速(rpm)'].apply(get_niuju)
dataset["燃料形式"].fillna("汽油", inplace=True)
dataset["燃料形式"] = LabelEncoder().fit_transform(dataset["燃料形式"].values)
dataset["燃油标号"].fillna("92号", inplace=True)
dataset["燃油标号"] = LabelEncoder().fit_transform(dataset["燃油标号"].values)
dataset["供油方式"].fillna("多点电喷", inplace=True)
dataset["供油方式"] = LabelEncoder().fit_transform(dataset["供油方式"].values)
dataset["缸盖材料"].fillna("铝", inplace=True)
dataset["缸盖材料"] = LabelEncoder().fit_transform(dataset["缸盖材料"].values)
dataset["缸体材料"].fillna("铝", inplace=True)
dataset["缸体材料"] = LabelEncoder().fit_transform(dataset["缸体材料"].values)
dataset["环保标准"].fillna("国IV(国V)", inplace=True)
dataset["环保标准"] = LabelEncoder().fit_transform(dataset["环保标准"].values)
dataset["驱动方式"].fillna("前置前驱", inplace=True)
dataset["驱动方式"] = LabelEncoder().fit_transform(dataset["驱动方式"].values)
dataset["前制动器类型"].fillna("通风盘式", inplace=True)
dataset["前制动器类型"] = LabelEncoder().fit_transform(dataset["前制动器类型"].values)
dataset["前悬架类型"].fillna("麦弗逊式独立悬架", inplace=True)
dataset["前悬架类型"] = LabelEncoder().fit_transform(dataset["前悬架类型"].values)
dataset["前轮胎规格"] = dataset["前轮胎规格"].apply(get_luntai)
dataset["助力类型"].fillna("电动助力", inplace=True)
dataset["助力类型"] = LabelEncoder().fit_transform(dataset["助力类型"].values)
dataset["厂商"].fillna("未知", inplace=True)
dataset["厂商"] = LabelEncoder().fit_transform(dataset["厂商"].values)
dataset["变速箱类型"].fillna("手动变速箱(MT)", inplace=True)
dataset["变速箱类型"] = LabelEncoder().fit_transform(dataset["变速箱类型"].values)
dataset["后制动器类型"].fillna("盘式", inplace=True)
dataset["后制动器类型"] = LabelEncoder().fit_transform(dataset["后制动器类型"].values)
dataset["后悬架类型"].fillna("多连杆独立悬架", inplace=True)
dataset["后悬架类型"] = LabelEncoder().fit_transform(dataset["后悬架类型"].values)
dataset["后轮胎规格"] = dataset["后轮胎规格"].apply(get_luntai)
dataset["备胎规格"].fillna("全尺寸", inplace=True)
dataset["备胎规格"] = LabelEncoder().fit_transform(dataset["备胎规格"].values)
dataset["挡位个数"] = dataset["挡位个数"].apply(get_dangwei)
dataset["排量(L)"].fillna(dataset["排量(L)"].mean(), inplace=True)
dataset["排量(L)"] = LabelEncoder().fit_transform(dataset["排量(L)"].values)
dataset["行李厢容积(L)"] = dataset["行李厢容积(L)"].apply(get_xingli)
dataset["车体结构"].fillna("承载式", inplace=True)
dataset["车体结构"] = LabelEncoder().fit_transform(dataset["车体结构"].values)
dataset["车身结构"].fillna("三厢车", inplace=True)
dataset["车身结构"] = LabelEncoder().fit_transform(dataset["车身结构"].values)
dataset["驻车制动类型"].fillna("手刹", inplace=True)
dataset["驻车制动类型"] = LabelEncoder().fit_transform(dataset["驻车制动类型"].values)

y = dataset["厂商指导价(元)"].values
X = dataset.drop("厂商指导价(元)", axis=1).values
forest.fit(X, y)

testnum=1
# test_classifier()

column = "级别,上市时间,排量(mL),变速箱,长度(mm),宽度(mm),高度(mm),最高车速(km/h),工信部综合油耗(L/100km),整车质保,轴距(mm),前轮距(mm),后轮距(mm),整备质量(kg),车门数(个),座位数(个),油箱容积(L),进气形式,气缸排列形式,气缸数(个),每缸气门数(个),配气机构,最大马力(Ps),最大功率(kW),最大功率转速(rpm),最大扭矩(N·m),最大扭矩转速(rpm),燃料形式,燃油标号,供油方式,缸盖材料,缸体材料,环保标准,驱动方式,前制动器类型,前悬架类型,前轮胎规格,助力类型,厂商,变速箱类型,后制动器类型,后悬架类型,后轮胎规格,备胎规格,挡位个数,排量(L),行李厢容积(L),车体结构,车身结构,驻车制动类型"
columns = column.split(",")
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
for f in range(0, len(columns)):
    print("%2d) %-*s %f" % (f + 1, 30, columns[f], importances[indices[f]]))


得到的结果:
1) 级别                             0.378886
2) 上市时间                           0.182963
3) 排量(mL)                         0.094539
4) 变速箱                            0.063815
5) 长度(mm)                         0.028085
6) 宽度(mm)                         0.025301
7) 高度(mm)                         0.024928
8) 最高车速(km/h)                     0.024396
9) 工信部综合油耗(L/100km)               0.020386
10) 整车质保                           0.018657
11) 轴距(mm)                         0.017533
12) 前轮距(mm)                        0.012673
13) 后轮距(mm)                        0.011954
14) 整备质量(kg)                       0.011823
15) 车门数(个)                         0.010095
16) 座位数(个)                         0.006407
17) 油箱容积(L)                        0.006368
18) 进气形式                           0.005758
19) 气缸排列形式                         0.004817
20) 气缸数(个)                         0.004454
21) 每缸气门数(个)                       0.003579
22) 配气机构                           0.003363
23) 最大马力(Ps)                       0.003216
24) 最大功率(kW)                       0.003183
25) 最大功率转速(rpm)                    0.002861
26) 最大扭矩(N·m)                      0.002757
27) 最大扭矩转速(rpm)                    0.002547
28) 燃料形式                           0.002285
29) 燃油标号                           0.002178
30) 供油方式                           0.002173
31) 缸盖材料                           0.002066
32) 缸体材料                           0.001998
33) 环保标准                           0.001755
34) 驱动方式                           0.001514
35) 前制动器类型                         0.001435
36) 前悬架类型                          0.001383
37) 前轮胎规格                          0.001284
38) 助力类型                           0.001123
39) 厂商                             0.000993
40) 变速箱类型                          0.000952
41) 后制动器类型                         0.000723
42) 后悬架类型                          0.000573
43) 后轮胎规格                          0.000499
44) 备胎规格                           0.000484
45) 挡位个数                           0.000481
46) 排量(L)                          0.000248
47) 行李厢容积(L)                       0.000247
48) 车体结构                           0.000204
49) 车身结构                           0.000059
50) 驻车制动类型                         0.000000

我们用随机森林算法获得了价格和其他因子的关联程度
1.首先与级别有关,占37%的比重,是小型车,中型车,大型车直接决定价格
2.与上市时间有关,毕竟货币通货膨胀很快,同等性能的车价随年代不断贬值,这点我们可以从18%看出来
3.与排量有关,大排量的车,直观感觉性能也更好,贵一些是正常的,这个比重占9%
4.与变速能力有关
5.与车的大小有关,这点可能与级别有重复,其余的因子比重都比较小

下面来看一下各个回归器性能:
Accuraty:<class 'sklearn.tree.tree.DecisionTreeRegressor'> meanscore=4.91 minscore=4.91 time=1
Accuraty:<class 'sklearn.tree.tree.ExtraTreeRegressor'> meanscore=5.80 minscore=5.80 time=0
Accuraty:<class 'sklearn.ensemble.bagging.BaggingRegressor'> meanscore=4.70 minscore=4.70 time=10
Accuraty:<class 'sklearn.tree.tree.ExtraTreeRegressor'> meanscore=7.47 minscore=7.47 time=0
Accuraty:<class 'sklearn.ensemble.gradient_boosting.GradientBoostingRegressor'> meanscore=9.62 minscore=9.62 time=14
Accuraty:<class 'sklearn.ensemble.forest.RandomForestRegressor'> meanscore=4.88 minscore=4.88 time=186
Accuraty:<class 'sklearn.neighbors.regression.KNeighborsRegressor'> meanscore=12.15 minscore=12.15 time=123
Accuraty:<class 'sklearn.svm.classes.SVR'> meanscore=9.92 minscore=9.92 time=155

单位是万元,这里都是用默认参数没有经过调优。可以看到决策树、随机森林算法的表现最好

1

主题

6

帖子

32

积分

用户组: 初·技术宅

UID
2920
精华
0
威望
2 点
宅币
22 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2017-10-2
发表于 2017-10-22 12:12:29 | 显示全部楼层
寄居蟹‍‭‭

986

主题

2166

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
15947 个
贡献
30926 次
宅之契约
0 份
在线时间
1518 小时
注册时间
2014-1-26
发表于 2017-10-23 05:59:56 | 显示全部楼层
像这样非常虚的概念都可以借助人工智能来挖掘。不错的应用方向。

1

主题

86

帖子

91

积分

用户组: 小·技术宅

UID
3026
精华
0
威望
1 点
宅币
3 个
贡献
0 次
宅之契约
0 份
在线时间
6 小时
注册时间
2017-10-31
发表于 2017-11-7 23:33:00 | 显示全部楼层
像这样非常虚的概念都可以借助人工智能来挖掘。不错的应用方向。

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-5-27 05:05 , Processed in 0.080482 second(s), 14 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表