原标题:使用Python探索二手车市场(含代码)

前言

上一期中,我们已经手把手的分享了如何使用Python实现某二手车平台数据的抓取,并成功的完成11,281条二手车数据的搜集。基于此,我们需要对获取的数据进行探索性分析,这里就采用我们之前学习的pandas模块和matplotlib模块的知识点做一个小小的数据分析项目。

数据清洗

我们再来看一下爬虫后获取数据的前几行,便于读者清楚的了解数据结构,各变量分别代表汽车品牌、汽车款式、上牌时间、行驶里程数、排放标准、二手价格和同款新车的参考价格:

从数据的前6行我们可以发现数据的一些问题,包括二手车的上牌时间,有的样本记录为“未上牌”,需要特殊处理、行驶里程数为字符串,需要类型的转化、新车原价也是字符串,也需要处理、上牌时间为字符串,如何计算上牌时间与当前10月份的时间差(月数)。而这些问题的解决,就需要我们进行数据清洗工作。

上牌时间字段的处理

由于上牌时间字段存在“未上牌”的值,我们需要看看这样的值占多大比例,如果比例不大,可以考虑将其删除。

# 导入第三方模块

importpandas aspd

importnumpy asnp

importmatplotlib.pyplot asplt

fromsklearn.linear_model importLinearRegression

# 可视化的中文处理

plt.rcParams[ 'font.sans-serif'] = 'Microsoft YaHei'

plt.rcParams[ 'axes.unicode_minus'] = False

# 设置类似R语言中的ggplot2风格

plt.style.use( 'ggplot')

# 读取数据(记得需要将csv文件先另存为UTF-8的编码,否则会报编码错误)

cars = pd.read_csv( 'second_cars_info.csv')

# “未上牌”的二手车占比

N = np.sum(cars.Boarding_time == '未上牌')Ratio = N/cars.shape[ 0]Ratio

# 由于未上牌的汽车数量占比极少,仅千分之八,这里不妨考虑将其删除

cars = cars.loc[cars.Boarding_time != '未上牌',:]

由于上面的清洗步骤,导致一些观测被删除,此时的行索引就不再是一个连续的自然数了,故需要重新设置索引,以免产生不必要的错误(因为pandas模块中数据结构的行索引会自动对齐)。

# 重新设置行索引

cars.index = range( 0,cars.shape[ 0])

# 取出上牌时间变量中的年和月

cars[ 'year'] = cars.Boarding_time.str[: 4].astype( 'int')month = cars.Boarding_time.str.findall( '年(.*?)月')

print(month.head(10))

# 由于month是列表构成的序列,所以需要非列表化,再序列化

month = pd.Series([i[ 0] fori inmonth]).astype( 'int')cars[ 'month'] = month

# print(month.head(10))

# 计算上牌日期距离2017年10月份的月数

cars[ 'diff_months'] = ( 2017-cars.year)* 12+ ( 10-cars.month) + 1

# 显示数据的前5行

cars.head()

行驶里程数字段的处理

行驶里程数为字符串,要实现字符串转数值,需要先将字段中的“万公里”字样去除,然后再进行数据类型的转换。

# 剔除“万公里”三个字

cars[ 'Km_new'] = cars.Km.str[:- 3]

# 数值类型转换

cars.Km_new = cars.Km_new.astype( 'float')

哎?这里报错了,原因是行驶公里数字段中含“百公里内”这样的值,所以剔除该字段末尾3个字符之后,还剩余“百”字,导致了无法将“百”实现数值的转化。

# “百公里内”的样本量

N = np.sum(cars.Km == '百公里内')Ratio = N/cars.shape[ 0]Ratio

行驶里程数为“百公里内”的样本量仅仅只有63条,占比为千分之六,我们不妨将“百公里内”的样本替换成50公里,即0.005万公里。

# 将“百”字替换为0.005

cars.Km_new.replace( '百', '0.005', inplace= True)

# 数据类型转换

cars.Km_new = cars.Km_new.astype( 'float')cars.head()

同款新车价格字段的处理

从上面的数据结构可知,同款新车的参考价格都存在“万”字,要想实现数据类型的转换,同样先是将“万”字去掉,然后进行数值转换。

# 删除字段中的“万”字

cars[ 'New_price_new'] = cars.New_price.str[:- 1]

#cars.New_price_new.astype('float')

# 这里无法实现数据类型的转换,因为该字段中含有“暂无”这样的值。

# “暂无”的样本量

N = np.sum(cars.New_price == '暂无')Ratio = N/cars.shape[ 0]Ratio

由于本人对车子的了解情况甚少,无法对“暂无”的价格进行评估,不妨就将这1.3%的样本作剔除处理。

cars = cars.loc[cars.New_price != '暂无',:]

# 数据类型的转换

cars.New_price_new = cars.New_price_new.astype( 'float')cars.head()

经过上面的数据清洗工作,数据中有一部分被删除,也有一部分值被替换。通过数据框结构的shape方法,可知目前数据集还剩下11,047个样本,一共减少了234条二手车样本。最后,我们再来看看数据集的概览情况:

# 数据集的概览信息

cars.describe()

采用可视化方法进行数据探索

直方图的绘制

我想大家一定也和我一样,最关心的是二手车的价格分布吧,看看二手车的价格都落在什么范围内?首先,我们对二手车的价格绘制一张直方图,看看其分布形状。

# 二手车价格分布情况

min_price = cars.Sec_price.min()max_price = cars.Sec_price.max()

# 直方图

plt.hist(cars.Sec_price, # 二手车价格数据bins = np.arange(min_price,max_price+ 10, 10), # 以10万元为组距color = 'steelblue', # 指定填充色)

# 设置坐标轴标签和标题

plt.title( '二手车价格分布直方图')plt.xlabel( '价格')plt.ylabel( '频数')

# 去除图形顶部边界和右边界的刻度

plt.tick_params(top= 'off', right= 'off')

# 图形显示

plt.show()

图形明显呈现偏态分布,并且是右偏长尾,即随着二手车价格越高,车子的数量就下降的越多。那请问,多少比例的二手车会落在某个价格范围内呢?这个问题的回答,可以借助于累计频率直方图来展示。

# 累积频率直方图

plt.hist(cars.Sec_price, # 二手车价格数据bins = np.arange(min_price,max_price+ 10, 10), # 以10万元为组距normed = True, # 设置为频率直方图cumulative = True, # 积累直方图color = 'steelblue', # 指定填充色)

# 添加水平参考线

plt.axhline(y = 0.5, color = 'blue', linestyle = '--', linewidth = 2)plt.axhline(y = 0.8, color = 'red', linestyle = '--', linewidth = 2)

# 设置坐标轴标签和标题

plt.title( '二手车价格累积分布直方图')plt.xlabel( '价格')plt.ylabel( '累积频率')

# 去除图形顶部边界和右边界的刻度

plt.tick_params(top= 'off', right= 'off')

# 图形显示

plt.show()

从这个累积直方图可知,一半的二手车价格在10万以内,就整体而言,80%的二手车均在30万以内。哈哈,如果你有想法,可以去二手车市场观望观望哦。

条形图的绘制

上面的直方图,其实质反映的就是等间距的条形图。如果需要自定义价格范围,然后基于这个范围再作条形图的绘制,该如何操作呢?这里需要借助于pandas模块中的cut函数,将连续的数值切割成不同的数据段:

# 指定任意的切割点,将数据分段

price_cuts = pd.cut(cars.Sec_price, bins = [min_price, 3, 5, 8, 10, 15, 20, 30, 50,max_price])

# 按照数据段,进行数据的统计,即频数统计

price_stats = price_cuts.value_counts()x = range(len(price_stats))

# 将索引用作绘图的刻度标签

label = price_stats.index

# 占比用于绘图的数值标签

percent = [str(round(i* 100, 2))+ '%'fori inprice_stats/price_stats.sum()]

# 绘图plt.bar(x, # x轴数据price_stats, # y轴数据align = 'center', # 刻度居中对齐color= 'steelblue', # 填充色alpha = 0.8# 透明度)

# 设置y轴的刻度范围plt.ylim( 0, 2200)

# x轴刻度标签

plt.xticks(x,label)

# 设置坐标轴标签和标题

plt.title( '二手车价格区间条形图')plt.xlabel( '价格区间')plt.ylabel( '频数')

# 去除图形顶部边界和右边界的刻度

plt.tick_params(top= 'off', right= 'off')

# 为每个条形图添加数值标签

forx,y,z inzip(x,price_stats,percent): plt.text(x, y+ 30, '%s'%z,ha= 'center')

# 显示图形

plt.show()

很显然,从这个自定义的分段数据中,5~8万的二手车最多,占了17.72%,其次是3~5万,也占了16.21%。从总体的排序来看,10万以内的二手车数量,排在了前3。

饼图的绘制

关心完了二手车的价格,是不是该关心一下这辆车跑了多少路了?毕竟二手车的价格跟行驶里程数也是有关系的嘛。我们按照二手车网站的筛选条件,将行驶里程数分割为5段,即1万公里以内、1~3万公里、3~5万公里、5~10万公里及10万公里以上。

# 行驶公里数的饼图展现

km_min = cars.Km_new.min()km_max = cars.Km_new.max()

# 指定任意的切割点,将数据分段

km_cuts = pd.cut(cars.Km_new, bins = [km_min, 1, 3, 5, 10,km_max])km_stats = km_cuts.value_counts()km_stats

# 绘制饼图

# 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆

plt.axes(aspect= 'equal')

# 提取出索引作为标签

labels = km_stats.index

# 自定义颜色

colors=[ '#9999ff', '#ff9999', '#7777aa', '#2442aa', '#dd5555'] # 绘制饼图

plt.pie(km_stats.values, labels=labels, colors = colors, # 设置颜色autopct= '%.1f%%', # 设置百分比的格式,这里保留一位小数counterclock = False, # 设置为顺时针方向wedgeprops = { 'linewidth': 1.5, 'edgecolor': 'green'}, # 设置饼图内外边界的属性值textprops = { 'fontsize': 12, 'color': 'k'} # 设置文本标签的属性值)

# 添加图标题

plt.title( '二手车行驶公里数分布(万公里)')

# 显示图形

plt.show()

从饼图返回的信息可知,超过一半的车,其行驶里程数在5~10万公里,而占比最少的是1万公里以内的二手车,6%不到。

散点图的绘制

影响二手车价格的因素可能二手车的行驶时长、行驶公里数和汽车品牌,直观感觉,二手车的价格应该与行驶时长、行驶公里数成反向关系,即行驶时长或行驶公里数越大,则二手车的价格应该越便宜。接下来我们来探索一下,是不是这么个道理,由于二手车的品牌也严重影响价格,故这里以奥迪和大众为例,绘制散点图。

# 取出奥迪和大众两种车辆

index = cars[ 'Brand'].isin([ '奥迪', '大众'])some_cars = cars.loc[index,:]

# 散点图的绘制

brands = some_cars[ 'Brand'].unique()colors = [ 'steelblue', '#ff9999']

fori inrange(len(brands)): plt.scatter(some_cars.loc[some_cars[ 'Brand'] == brands[i], 'Km_new'], # x轴数据为二手车行驶公里数some_cars.loc[some_cars[ 'Brand'] == brands[i], 'Sec_price'], # y轴数据为二手车价格s = 20, # 设置点的大小c = colors[i], # 设置点的颜色marker = 'o', # 设置点的形状alpha = 0.9, # 设置点的透明度linewidths = 0.3, # 设置散点边界的粗细edgecolors = 'k', # 设置散点边界的颜色label = brands[i] # 添加标签)

# 添加轴标签和标题

plt.title( '二手车行驶公里数与价格的关系')plt.xlabel( '行驶公里数')plt.ylabel( '价格')

# 去除图边框的顶部刻度和右边刻度

plt.tick_params(top = 'off', right = 'off')

# 显示图例

plt.legend()

# 显示图形

plt.show()

很显然,从图中可知,二手车的行驶里程数与价格成反向关系,似乎奥迪车显示的更为明显。接下来我们再来看看二手车的行驶时长与价格之间是否也是反向关系,这里就以奥迪车为例了,同时,我们也在散点图的基础上再添加一条回归线。

# 取出奥迪车的数据子集

aodi_car = cars.loc[cars[ 'Brand'] == '奥迪',:]

plt.scatter(aodi_car.diff_months, aodi_car.Sec_price, s = 30, # 设置点的大小c = 'steelblue', # 设置点的颜色marker = 'o', # 设置点的形状alpha = 0.9, # 设置点的透明度linewidths = 0.3, # 设置散点边界的粗细label = '观测点')

# 建模

reg = LinearRegression().fit(aodi_car.diff_months.reshape(- 1, 1), aodi_car.Sec_price)

# 回归预测值

pred = reg.predict(aodi_car.diff_months.reshape(- 1, 1))

# 绘制回归线

plt.plot(aodi_car.diff_months, pred, linewidth = 2, label = '回归线')

# 添加轴标签和标题

plt.title( '二手车的行驶时长与价格的关系')plt.xlabel( '行驶时长(月)')plt.ylabel( '价格(万元)')

# 去除图边框的顶部刻度和右边刻度

plt.tick_params(top = 'off', right = 'off')

# 显示图例

plt.legend(loc = 'best') # 显示图形

plt.show()

OK,感觉上还是蛮准确的,即二手车的行驶时长与价格之间确实存在反向关系。从图中我们也发现一些远离总体的异常点,即价格在100万以上的,我想这些都是顶级高档的奥迪汽车了吧。但不管怎样,这些“异常点”也符合行驶时长与价格之间反向关系。

结语

OK,关于二手车的探索性分析案例,我们就分享到这里,但感兴趣的你,一定要动手操作一遍,否则还是走马观花的效果哦。如果你有问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让跟多的人学习和操作。最后,本文相关的Python脚本和PDF版本已存放到百度云盘,可以通过下面的链接获取:

链接: https://pan.baidu.com/s/1dFapkdV 密码: 9qv4返回搜狐,查看更多

责任编辑:

python二手交易平台代码_使用Python探索二手车市场(含代码)相关推荐

  1. 用python描述车_使用Python探索二手车市场(含代码)

    原标题:使用Python探索二手车市场(含代码) 感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式 ...

  2. python 运行程序代码_一些python程序

    <从问题到程序:用Python学编程和计算>--1.2 Python语言简介 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第1章,第1.2节,作者 ...

  3. python编写代码_用 Python 编写干净、可测试、高质量的代码

    用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...

  4. python编写高质量代码_用 Python 编写干净、可测试、高质量的代码

    用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...

  5. excel图片变成代码_没错, Python杀死了Excel

    在大家的印象里,想进入金融行业或者数据岗位,首先需要精通Excel.然而野村证券副首席数字官马修·汉普森在上周五的伦敦Quant Conference上发表讲话:"现在走进交易大厅,用Exc ...

  6. python基础教程微信_用Python实现让微信地球转起来附代码!

    微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片. 大概是站在月亮上看地球的效果. 你有没有想过,如果上面那个地球转起来会是怎样? 素材 这里有两个表面素材,一个是地球表面素材,一个是云图素 ...

  7. python 预编译加速_让Python代码运行更快的最佳方式

    Python因其强大.灵活且易于使用等特性,而赢得了声誉.这些优点使其在各种各样的应用程序.工作流程和领域中得到了广泛应用.但是就语言的设计,也就是它天然的解释能力还有它的运行时的动态性而言,Pyth ...

  8. python好玩的代码_一行 Python 能实现什么丧心病狂的功能?

    能够把自身代码打印出来的程序,叫做Quine.下面是python的一行quine: ​有人说有分号不算一行,无分号版: 其实,如果你用程序语言的名字+quine作为关键字去搜索,你能找到各种语言实现的 ...

  9. python作品代码_学习python的一些心得体会

    初识python 专升本来到桂林电子科技大学的时候,谈及这个学校也许他是全国四所叫电子科技大学的学校,而我很幸运的从这个学校里毕业了,那个时候选修一门课程就是python的选修课,从此跟python结 ...

最新文章

  1. 短视频出海的关键指标、挑战及应对
  2. php 网格,PHP中的数据网格
  3. 4.Jenkins 2 权威指南 --- 通知与报告
  4. MD4、MD5、SHA1、HMAC、HMAC_SHA1区别
  5. 日期:将格林尼治时间(GMT)转化为北京时间
  6. 不了解喜欢的明星有什么关系?教你用Neo4j 快速构建明星关系图谱,让你比他自己还了解
  7. 运放的原理、应用、参数和命名规则
  8. 手指头肌腱损伤鸿蒙训练,手指肌腱损伤恢复方法有哪些
  9. 标签名选择器、id选择器、class类型选择器、组合选择器
  10. 高位字节与低位字节简单介绍
  11. 基于EasyExcel锁定指定列导出数据到excel
  12. 外设篇:NandFlash和iNand
  13. M100自动吞吐式读写器读卡器在C#程序如何通过函数调用读取社保卡卡号
  14. Java行之有效的学习方法,Java直播课:Spring Cloud Alibaba Nacos 注册中心
  15. View UI中textarea字数统计不变问题
  16. 《区域经济分析方法》读书笔记
  17. 一文看懂风控模型所有
  18. 机器学习:期望风险、经验风险、结构风险
  19. Docker系列七安装私人云盘
  20. Laravel请求钉钉获取access_token报错:cURL error 60: SSL certificate problem: unable to get local issuer certi

热门文章

  1. 达梦数据库和鼎甲备份一体机使用问题
  2. 关于uthash库的终级使用方法。
  3. (转)[AndEngine学习教程] 第6节 模拟手柄控制器
  4. 2020.9.12课堂练习(mysql课堂练习答案)
  5. 投影仪免费的影视软件有哪些?看《追光者》我却感动得想哭
  6. 【计算机毕业设计】029网上购物商城系统研发
  7. 不是所有人都适合职场
  8. python开发环境有中文的吗_中文 python
  9. WIFI安全:利用Kali自带的Aircarck-ng工具包,以及Fluxion渗透wap/wap2无线WIFI,超详细。(前言:无线网卡选择,环境详尽信息)2020.01
  10. SSM旅游购票系统之Echart实现中国地图进行销量统计