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\')
()
小结
本项目采用二手车之家官网的数据,先介绍了数据去重、指标提取、相关性分析等数据处理,然后重点介绍了通过柱形图和条形图分析客户的需求与喜好。
更多推荐
数据,二手车,品牌,进行,类型
发布评论