2023年12月25日发(作者:华晨宝马有哪些车型)

6.4二手车交易数据可视化

随着社会经济快速发展和人民生活水平的不断提高,汽车消费需求增长旺盛,汽车保有量呈现快速上升趋势,与购买新车对比,二手车的高性价比和低门槛成为许多人的首选,这种需求推动了二手车市场的发展。为了更好的适应二手车市场的变化需求,需要通过大量的数据分析客户的需求与喜好,从而获取市场上的竞争优势。本文主要针对瓜子二手车数据进行分析与可视化。

学习目标

(1)

了解我国二手车市场的背景与发展前景。

(2)

掌握pandas库对数据进行预处理。

(3)

掌握Python数据分析、数据可视化等技术。

6.4.1了解二手车数据分析流程

任务描述

基于二手汽车交易网站上二手汽车交易数据,分析本案例的流程。

任务分析

(1)

了解我国二手车市场的背景与发展前景。

(2)

熟悉案例分析流程。

背景分析

二手车是指在公安交通管理机关登记注册,在达到国家规定的报废标准之前或在经济实用寿命期内服役,并仍可继续使用的机动车辆。二手车英文译为“Second Hand Vehicle”或\"Used Car\",意为“第二手的汽车”或“使用过的汽车”,在中国称为 “旧机动车”。

随着全国二手车限迁政策的解除,我国二手车流通壁垒逐渐消除,二手车转籍比例逐渐提高,促进了二手车市场的快速发展。据中国汽车流通协会统计数据显示,至2019年全国二手车转籍比例高达27.87%。因2020年受疫情影响,这个比例有所降低。

通常来说,二手车交易可以分为4个模块:选车、检验评估、交易、过户。其中最重要的就是选车,选一辆心仪的车是非常重要的,这对于进行交易的时候,对二手车信息的掌握、车辆价格的估值大概在心里有一个底。

本案例的主要分析的目标为根据二手汽车之家对二手车交易数据进行处理、可视化的操作。

6.4.2分析流程

本项目二手车交易数据分析流程,大致可分为主要步骤如下。

(1)

利用Python对二手车数据进行预处理。

(2)

对预处理后的数据进行相关性分析,提取出关系较大的指标。

(3)

绘制关系图,例如柱状图。

(4)

分析指标间存在的关系。

6.4.2.1数据预处理

任务描述

将原始数据导入python中进行数据预处理,去掉缺失值、重复值、异常值等。预处理后将数据进行简单的数据处理,不同的指标针对所需的类型分别处理,并将结果放置在文件output_data文件,后对指标之间进行相关性分析,相关性较大的指标分别绘制散点图,并做分析。

任务分析

对python数据分析分为以下步骤:

(1)

数据预处理,去除重复值、缺失值、异常值等。

(2)

简单的数据处理,指标提取。

(3)

相关性分析。

(4)

绘制图形。

了解二手车采集数据基本情况

原始数据总共有38220行71列,具体的字段名称以及数据示例如下表所示。

特征名称

数据示例 数据类型

详情页ID

二手价

表显里程

上牌时间

车辆所在地

车型名称

厂商指导价(元)

厂商

级别

能源类型

环保标准

上市时间

最大功率(kW)

36242

¥19.38

1.5万公里

Jan-19

合肥

本田CR-V 2019款 240TURBO

CVT四驱豪华版 国V

21.38万

东风本田

紧凑型SUV

汽油

国V

2018.1

142

Int

String

String

String

String

String

String

String

String

String

String

String

String

最大扭矩(N?m)

发动机

变速箱

长*宽*高(mm)

车身结构

最高车速(km/h)

官方0-100km/h加速(s)

实测0-100km/h加速(s)

实测100-0km/h制动(m)

工信部综合油耗(L/100km)

实测油耗(L/100km)

整车质保

长度(mm)

宽度(mm)

高度(mm)

轴距(mm)

前轮距(mm)

后轮距(mm)

最小离地间隙(mm)

车门数(个)

座位数(个)

油箱容积(L)

行李厢容积(L)

整备质量(kg)

发动机型号

排量(mL)

排量(L)

进气形式

气缸排列形式

气缸数(个)

每缸气门数(个)

压缩比

配气机构

缸径(mm)

行程(mm)

最大马力(Ps)

最大功率转速(rpm)

最大扭矩转速(rpm)

发动机特有技术

燃料形式

燃油标号

供油方式

243

1.5T 193马力 L4

CVT无级变速

4585*1855*1689

SUV

-

9.9

-

-

6.7

-

三年或10万公里

4585

1855

1689

2660

-

-

-

5

5

57

-

1609

L15BL

1498

1.5

涡轮增压

L

4

4

10.3

DOHC

-

-

193

5600

2000-5000

VTEC

汽油

92号

直喷

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

缸盖材料

缸体材料

挡位个数

变速箱类型

简称

驱动方式

前悬架类型

后悬架类型

助力类型

车体结构

前制动器类型

后制动器类型

驻车制动类型

前轮胎规格

后轮胎规格

备胎规格

铝合金

铝合金

无级变速

无级变速箱(CVT)

CVT无级变速

前置四驱

麦弗逊式独立悬架

多连杆式独立悬架

电动助力

承载式

通风盘式

盘式

电子驻车

235/65 R17

235/65 R17

非全尺寸

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

String

数据预处理

针对原始数据进行数据预处理,去除重复值、缺失值、异常值等。代码如下所示:

import pandas as pd

df = _csv(\'二手车数据.csv\',low_memory=False)

print(\'原始数据长度:\',len(df)) # 原始数据长度

_duplicates(inplace=True) # 去除重复值

print(\'去重后数据长度:\', len(df)) # 去重后数据长度

# 查看数据类型

运行错误!未找到引用源。,可得结论如下:

数据去重:根据项目要求,在二手车之家网站上针对不同的省份的原始数据38220条,

整体筛选去除重复值后剩余34719条,去除重复值3501条。

查看数据的数据类型。

根据上图结果,需要对部分字段进行数据类型转换。

数据类型转换

根据所原始数据,存在异常值,例如:上牌时间有个别为“未上牌”,在厂商指导价中,小部分数据为价格范围,没有实际给出,针对整体数据来看,存在个别数据没有内容,只有‘-’,对于这部分,我们通过函数replace()函数进行处理。并对后续需要用到的字段进行数据类型转换,例如将上牌时间转为时间戳格式类型,二手价、表显里程、厂商指导价(院)转为数值型数据。

df[\'二手价\'] = df[\'二手价\'].e(\'¥\',\'\') # 去除¥

df[\'表显里程\'] = df[\'表显里程\'].e(\'万公里\',\'\') # 去除万公里

df[\'厂商指导价(元)\'] = df[\'厂商指导价(元)\'].e(\'万\',\'\').replace(\'16.80-19.80\',\'0\')

df[df[\'上牌时间\'].isin([\'未上牌\'])]

df[\'上牌时间\'] = [str(i).replace(\'未上牌\',\'2020.10\').replace(\'-\',\'.\')for i in df[\'上牌时间\']]

df[\'上牌时间\'] = _datetime(df[\'上牌时间\'],format=\'%Y-%m\')

df[\'上市时间\'] = [str(i).replace(\'-\',\'2020.10\') for i in df[\'上市时间\']]

df[\'上市时间\'] = _datetime(df[\'上市时间\'],format=\'%Y-%m\')

df[\'上牌天数\'] = [(_datetime(\'2020.10\',format=\'%Y-%m\')-i).days for i in df[\'上牌时间\']]

df[\'上市天数\'] = [(_datetime(\'2020.10\',format=\'%Y-%m\')-i).days for i in df[\'上市时间\']]

df[\'排量(L)\'] = _numeric(df[\'排量(L)\'].e(\'-\',\'0\'))

df[\'最大马力(Ps)\'] = _numeric(df[\'最大马力(Ps)\'].e(\'-\',\'0\'))

df[\'厂商指导价(元)\'] = df[\'厂商指导价(元)\'].e(r\'暂无报价|-|万|.*?~\',\'0\',regex=True)

# 转换数据类型为数值型

df[\'二手价\'] = _numeric(df[\'二手价\'])

df[\'表显里程\'] = _numeric(df[\'表显里程\'])

df[\'厂商指导价(元)\'] = _numeric(df[\'厂商指导价(元)\'])

data = () # 复制数据

_csv(\'output_\',encoding=\'utf-8-sig\') # 保存数据

指标提取

在原始数据中,存在许多数据带有符号、单位、字符串等,例如¥、万公里、万等,部分数据如下图所示

对此,需要对数据处理,并提取指标:

vac = set(df[\'能源类型\'])

df[\'能源类型\'] = df[\'能源类型\'].map(dict(zip(vac, range(1, len(vac)+1)))) # 使用映射函数构造字典

val_counts = df[\'变速箱\'].value_counts()

rates = [i/sum(val_) for i in val_]

def acc(rates):

key, num, s = [], [], 0

for i in range(len(rates)):

s +=rates[i]

(val_[i])

( i +1)

if s > 0.90:

break

return key,num

keys, nums = acc(rates)

df[\'变速箱\'] = df[\'变速箱\'].map(dict(zip(keys,nums)))

# 品牌指标提取

with open(\'\',encoding=\'utf-8-sig\') as f:

brand_list = [() for line in nes()]

factors = []

for i,row in [:,(\'厂商\',\'车型名称\')].iterrows():

for made in brand_list:

if (made in row[\'厂商\']) or (made in row[\'车型名称\']):

(made)

break

else:

(\'其他品牌\')

df[\'品牌\'] = factors

cols = [

\'车辆所在地\',\'品牌\',\'二手价\',\'表显里程\',\'厂商指导价(元)\',\'最大功率(kW)\',\'排量(L)\',

\'最大马力(Ps)\',\'能源类型\',\'变速箱\',\'上牌时间\',\'上市时间\',\'上牌天数\',\'上市天数\']

df1 = [:,cols] # 提取数据

_csv(\'output_\',encoding=\'utf-8-sig\') # 保存数据

运行代码后,指标提取后写入output_data2,文件中部分数据如下图所示:

6.4.2.2相关性分析

通过对二手价与其他指标(如:车辆所在地、品牌、表显里程、厂商指导价、最大功率、排量、最大马力、能源类型、变速箱、上牌时间、上市时间、上牌天数以及上市天数)做相关性分析得到二手价与这些因素之间的相关性,若得到的相关性系数绝对值大于0.3,则认为二手价与这个指标之间的关系较大,相关性的绝对值小于0.3的话则说相关性不大,对二手价的影响不大,即这个指标可以忽略,不考虑这个指标对二手价的影响。如下代码错误!未找到引用源。所示:

factor = [\'二手价\',\'表显里程\',\'厂商指导价(元)\',\'最大功率(kW)\',\'排量(L)\',

\'最大马力(Ps)\',\'能源类型\',\'上牌天数\',\'上市天数\']

df2 = [:,factor]

print(()) # 相关系数矩阵

import seaborn as sns

import as plt

ms[\'-serif\'] = \'SimHei\' # 设置显示中文字体,苹果系统需要修改字体

p((),annot=True,vmax=1,square=True,cmap=\'Blues\')

运行代码,结果如下图所示:

二手价

表显里程

-0.157659

厂商指导价(元)

排量(L)

最大马力(Ps)

能源类型

-上牌天数

-上市天数

-二手价 1.000000

表显里程

厂商指导价-0.157659

0.842171 0.579861 0.686424

0.062526 0.189481 0.143238

1.000000 0.072683 0.240014 0.033780 0.039724 0.785811 0.554054

0.842171 0.072683 1.000000 0.737889 0.774036

-0.034721

-0.054798

-0.080037 0.049176

(元)

排(L)

最大马力(Ps)

能源类型

上牌天数

上市天数

量0.579861 0.240014 0.737889 1.000000 0.819442 0.215741 0.137336

--0.686424 0.033780 0.774036 0.819442 1.000000

-0.062526

-0.189481

-0.143238

---0.138271 0.032594 0.028987

1.000000 0.034257 0.046186 0.039724

0.034721 0.054798 0.138271

-0.032594

-0.028987

0.785811 0.080037 0.215741 0.034257 1.000000 0.642613

0.554054 0.049176 0.137336 0.046186 0.642613 1.000000

观察上表,可知二手价与排量(L)、最大马力(Ps)的相关系数分别为0.579861、0.686424,排量(L)与最大马力(Ps)的相关系数为0.819442,二手价、排量(L)、最大马力(Ps)三者两两之间呈现正相关;表显里程与上牌天数、上市天数的相关系数分别为0.785811、0.554054,同样是正相关。

6.4.2.3数据可视化

二手汽车交易品牌前15排行榜

针对提取出的指标,我们对其进行统计性分析,首先,根据处理过的数据,统计出每个品牌的数量如下表:

品牌 大众 东风

3558

宝马

3339

本田

943

马自达

406

日产

148

林肯

93

奔驰

2920

路虎

868

MINI

319

捷豹

144

凯迪拉克

60

上汽

2209

保时捷

816

福特

260

英菲尼迪

140

DS

37

丰田

2004

奥迪

791

比亚迪

236

玛莎拉蒂

137

标志

14

长安

1700

雷克萨斯

604

沃尔沃

226

领克

128

斯柯达

1

数量(辆) 6209

别克

1639

长城

592

奇瑞

183

江淮

107

其他品牌 现代

1395

广汽

475

Smart

173

斯巴鲁

102

1047

吉利汽车

428

Jeep

172

宾利

96

根据上表,绘制出前15类品牌的柱状图,如下图:

具体代码实现如下代码所示。

ms[\'-serif\'] = [\'SimHei\'] # 用来正常显示中文标签#指定默认字体

ms[\'e_minus\'] = False # 解决保存图像是负号\'-\'显示为方块的问题

df1=_csv(\'output_\')

tmp = df1[\'品牌\'].value_counts().head(15) # 对品牌列进行频数统计,提取前15

(figsize=(10,5))

(,,color=\'b\')

(\'二手汽车交易品牌前15排行榜\')

for i,j in zip(,):

(i,j+100,j,ha=\'center\')

()

二手汽车各品牌保值率

根据品牌类型,对每类品牌求出的厂商指导价与二手价的差价,再对差价求平均,并对其结果排序取出前15个品牌,二手车数量从大到小分别是大众品牌、东风、宝马、奔驰、上汽、丰田、长安、别克,用户可以根据这些二手车的数量上区选择自己想要的品牌,再综合出品牌与二手价之间的关系图,根据厂商指导价与二手价的差价均值,综合考虑选择心仪

的二手车。

绘制出每个品牌厂商指导价跟二手价的平均差距前15的柱状图,如下图所示下:

根据上图可以分析出雷克萨斯、福特、丰田、领克、本田、广汽、长城等等的品牌厂商指导价与二手价之间相差较小,说明这些品牌下的车保值率较高,其中宾利、玛莎拉蒂、捷豹这些品牌厂商指导价与二手价之间相差较大,这些品牌下的车保值率较低。

具体代码实现如下代码所示。

df1[\'差价\'] = df1[\'厂商指导价(元)\'] - df1[\'二手价\']

zhejiu = (y(by=\'品牌\').agg({\'差价\':\'mean\'}).sort_values(by=\'差价\',ascending=False)[:15]).astype(int)

(figsize=(10,5))

(,zhejiu[\'差价\'].values,color=\'g\')

(rotation=90) # 将x轴标签旋转90°

(\'二手汽车各品牌厂商指导价跟二手价的平均差距\')

for i,j in zip(, zhejiu[\'差价\'].values):

(i, j+1, j, ha=\'center\')

()

不同上牌天数区间的各个品牌汽车销售情况

对数量较多的前6个汽车品牌进行分析上牌天数与汽车销量的关系图,如下图所示。

观察上图,我们可以得到在6个品牌下,上牌天数与二手价的关系为:其中大部分的品牌上牌天数与二手价之间的关系是成反比关系,上牌天数越大,二手车价格越低。其中上汽品牌上牌天数与二手价之间的反比关系并不明显,由此可以看出上汽品牌的车辆较为保值,其他品牌车辆较不大保值。用户购再买二手车时可以考虑较为保值的车辆进行购买。

具体代码实现如下所示。

from import Bar, Timeline

import s as opts

import numpy as np

# 将数据离散化

n=5

bins = ce(min(df1[\'上牌天数\'].unique()),max(df1[\'上牌天数\'].unique()),n+1,endpoint=True)

df1[\'day_bins\'] = (df1[\'上牌天数\'],bins,labels=list(\"ABCDE\"))

tmp = _table(df1, index=\'品牌\',columns=\'day_bins\',values=\'二手价\',aggfunc=\'mean\',fill_value=0)

a,b = (),()

bar={}

for pinpai in [\'大众\',\'东风\',\'宝马\',\'奔驰\',\'上汽\',\'丰田\']:

data2 = [pinpai,:]

bar[pinpai] = (

Bar()

.add_xaxis(xaxis_data=list()) # 给x轴添加数据

.add_yaxis(series_name=\'\',y_axis=[int(i) for i in ]) # 给y轴添加数据

.set_global_opts(title_opts=pts(title=\'不同上牌天数区间的各品牌汽车销量情况\',

subtitle=f\'{pinpai}\'),

yaxis_opts=ts(max_=int(b)/5, min_=int(a))) # 设置y轴标签长度

)

(

Timeline(init_opts=ts(width=\'720px\',height=\'320px\'))

.add(bar[\'大众\'],\'大众\')

.add(bar[\'东风\'],\'东风\')

.add(bar[\'宝马\'],\'宝马\')

.add(bar[\'奔驰\'],\'奔驰\')

.add(bar[\'上汽\'],\'上汽\')

.add(bar[\'丰田\'],\'丰田\')

).render_notebook()

不同车辆所在地的二手汽车售价情况

根据不同的车辆所再度,分析汽车品牌与二手价之间的关系,对此,绘制车辆所在地较多的前6个城市,在对应城市中售价较高的前10个品牌与二手价的关系图,如下图所示。

观察上图,我们可以得到在5个城市下,品牌与二手价的关系为:虽然不同城市售价前10的汽车品牌不同,但是有3个品牌的售价是位居这5个城市的前三个位置,并且并没有因为城市不同导致这三个品牌的排名发生变化,分别是宾利、保时捷与玛莎拉蒂。在根据前面分析各品牌的保值率可知,虽然这三个品牌的保值率不高,但是这并不会使得它的售价降低。对于豪华车和一般汽车而言,豪华车的价格和其他方面肯定会好得多,即使它们是二手车,其价值也将比普通二手车贵

代码实现如下所示。

tmp = _table(df1,index=\'车辆所在地\',columns=\'品牌\',values=\'二手价\',aggfunc=\'mean\',fill_value=0)

a,b = (),()

bar={}

for area in [\'武汉\',\'成都\',\'合肥\',\'沈阳\',\'温州\']:

data2 = [area, :].sort_values(ascending=False)[:10]

bar[area] = (

Bar()

.add_xaxis(xaxis_data=list()[::-1])

.add_yaxis(series_name=\'\',y_axis=[int(i) for i in list(data2)][::-1])

.reversal_axis()

.set_series_opts(label_opts=pts(position=\'right\'))

.set_global_opts(title_opts=pts(title=\'不同车辆所在地的二手汽车售价情况\',

subtitle=f\'{area}市\'),

xaxis_opts = ts(max_=int(b)-150, min_=int(a)))

)

(

Timeline(init_opts=ts(width=\'720px\',height=\'320px\'))

.add(bar[\'武汉\'],\'武汉\')

.add(bar[\'成都\'],\'成都\')

.add(bar[\'合肥\'],\'合肥\')

.add(bar[\'沈阳\'],\'沈阳\')

.add(bar[\'温州\'],\'温州\')

).render_notebook()

各能源类型统计

针对其他的指标,如能源类型等,绘制柱状图如图所示:

根据上图,基本的二手车都是使用汽油作为能源,较少的是油电混合、柴油、纯电动等类型。

代码实现如下所示。

data=_csv(\'output_\')

data[\'能源类型\'].value_counts() # 对其频数统计

data = data[-(data[\'能源类型\']==\'-\')]

ny = data[\'能源类型\'].value_counts()

(figsize=(10,5))

(,)

(\'各能源类型统计\')

(\'能源类型\')

for i,j in zip(,):

(i, j+300, j, ha=\'center\')

()

小结

本项目采用二手车之家官网的数据,先介绍了数据去重、指标提取、相关性分析等数据处理,然后重点介绍了通过柱形图和条形图分析客户的需求与喜好。

更多推荐

数据,二手车,品牌,进行,类型