运用汽车数据进行Python可视化分析

数据来源:

vehicles.csv是一份来自于www.fuelconomy.gov的,数据,它包含了美国各个汽车制造商各个型号汽车不同时间点的油耗表现参数和各个汽车型号丰富的其他特性和属性,为我们整理和分组分析数据以发现有趣的趋势和关系提供了机会

分析过程:

描述汽车油耗数据:

# 导入相关的库

import numpy as np

import pandas as pd

%matplotlib inline

# 从csv文件中导入数据

vehicles = pd.read_csv('vehicles.csv')

# 查看数据中的行数

len(vehicles)

返回结果为:38064

# 查看数据中的列

len(vehicles.columns)

一共有:83列

# 看看都有哪些列

vehicles.columns

再看看包含的年份:

# 查看数据集中包含了多少个年份,最小年和最大年

yearcount = len(pd.unique(vehicles.year))

minyear = min(vehicles.year)

maxyear = max(vehicles['year'])

print(yearcount,minyear,maxyear)

其中一共包含了34年的数据,从1984-2017年;

接下来,我们看看数据集中的汽车都使用的是什么类型的燃料:

# 统计汽车使用的燃料类型的数量,使用pd.value_counts方法

pd.value_counts(vehicles.fuelType)

返回结果为:

Regular 25239

Premium 10120

Gasoline or E85 1221

Diesel 1013

Premium or E85 122

Electricity 122

Midgrade 77

CNG 60

Premium and Electricity 24

Gasoline or natural gas 20

Regular Gas and Electricity 18

Premium Gas or Electricity 18

Gasoline or propane 8

Regular Gas or Electricity 2

查看汽车所使用的变速箱的类型:

# 统计汽车使用的变速箱种类的数量

pd.value_counts(vehicles.trany)

返回的数据很多,而且没有对变速箱进行分类,我们对它按手动和自动进行一下分类:

# 新建一列trany2,内容为trany的值的第一个字母

vehicles['trany2'] = vehicles.trany.str[0]

pd.value_counts(vehicles.trany2)

结果出来了,自动档比手动挡多出了差不多一倍的数量:

A 25642

M 12411

接下来,咱们分析一下汽车油耗随时间变化的趋势

首先,按年对vehicles数据进行分组

# 按年对vehicles数据进行分组

grouped = vehicles.groupby('year')

# 计算分组中三列的平均值

# groupby()方法中的agg()方法可以对不同的列使用不用的聚合函数,在此并用不上

# averageed = grouped['comb08','highway08','city08'].agg([np.mean])

averageed = grouped['comb08','highway08','city08'].mean()

averageed.head(5)

查看前5条数据:

comb08

highway08

city08

year

1984

19.881874

23.075356

17.982688

1985

19.808348

23.042328

17.878307

1986

19.550413

22.699174

17.665289

1987

19.228549

22.445068

17.310345

1988

19.328319

22.702655

17.333628

对列进行重命名,并新增一个以索引为值的year列

averageed.columns = ['comb08_mean','highway08_mean','city08_mean']

averageed['year'] = averageed.index

averageed.head(5)

前5条数据为:

comb08_mean

highway08_mean

city08_mean

year

year

1984

19.881874

23.075356

17.982688

1984

1985

19.808348

23.042328

17.878307

1985

1986

19.550413

22.699174

17.665289

1986

1987

19.228549

22.445068

17.310345

1987

1988

19.328319

22.702655

17.333628

1988

接下来将处理后的平均数据绘制成线图:

# 将处理后的数据绘制成散点图

x = np.arange(len(averageed.index))

y = averageed.comb08_mean

plt.figure(figsize=(12,6))

plt.title("平均每加仑汽油可行驶英里数随时间的变化")

plt.xlabel("年数")

plt.ylabel('每加仑汽油可行驶英里数')

plt.xticks(x,averageed.year,rotation=45)

plt.plot(x,y)

plt.scatter(x,y)

plt.grid()

得到平均每加仑汽油可行驶里程数随时间的变化图:

可以看出,随着时间的推移,每加仑汽油可行驶的里程数是总体增加的,换而言之,汽车每公里的油耗是总体不断减少的。 但是,在数据中我们忽略了一个问题:有着出色油耗表现的混合动力汽车越来越流行。

为了获得更加准确的分析,我们需要将混合动力汽车的数据从数据集中删除。

# 从数据集中去除混合动力汽车

# 设置筛选条件

# 条件1:燃料类型fuelType1为普通汽油、优质汽油或中等

critera_1 = vehicles.fuelType1.isin(['Regular Gasoline','Permium Gasoline','Midgrade Gasoline'])

# 条件2:燃料类型fuelType2为空

critera_2 = vehicles.fuelType2.isnull()

# 条件3:动力类型atvType不为混合

critera_3 = vehicles.atvType != "Hybrid"

# 对条件进行筛选

vehicles_non_hybrid = vehicles[critera_1 & critera_2 & critera_3]

len(vehicles_non_hybrid)

筛选出的数据有:24947条

然后,对剔除混合动力汽车数据的数据集进行分组和计算平均值:

grouped = vehicles_non_hybrid.groupby(['year'])

averageed = grouped['comb08'].mean()

averageed.head(5)

再对处理后的数据集进行可视化:

x = np.arange(len(averageed.index))

y = averageed

plt.figure(figsize=(12,6))

plt.title("平均每加仑汽油可行驶英里数随时间的变化(不包含混合动力汽车)")

plt.xlabel("年数")

plt.ylabel('每加仑汽油可行驶英里数')

plt.xticks(x,averageed.index,rotation=45)

plt.plot(x,y)

plt.scatter(x,y)

plt.grid()

去除混合动力汽车数据后,每加仑可行驶的里程数与之前的数据细微之处有些许变化和不同,但是,基本的走势和变化趋势都是一致的:也就是每加仑汽油可行驶的里程数不断地在增加,并且这一趋势变化中,在2006年的时候出现了显著的提升。

接下来,我们想知道,到底是什么原因导致了平均每加仑里程数增加?有没有可能是因为大引擎的汽车越来越少了?

获取汽车排量信息

pd.unique(vehicles_non_hybrid.displ)

发现数据集中有如下汽车排量信息:

array([ 2. , 4.9, 2.2, 5.2, 1.8, 1.6, 2.3, 5. , 3.3, 3.1, 3.8,

3.4, 5.9, 2.5, 3. , 2.8, 2.4, 2.9, 5.7, 4.3, 3.5, 5.8,

4.6, 1.9, 2.6, 7.4, 3.9, 4. , 1.5, 4.2, 1.3, 4.1, 3.2,

4.5, 3.6, 5.4, 1. , 2.1, 1.2, 2.7, 1.1, 5.3, 4.4, 4.7,

3.7, 4.8, 6. , 1.7, 6.8, 5.6, 1.4, 6.1, 6.2, nan])

在数据集中发现空值,我们将其去除:

# 数据中存在空值,需要对其进行剔除

critera = vehicles_non_hybrid.displ.notnull()

vehicles_non_hybrid = vehicles_non_hybrid[critera]

vehicles_non_hybrid.displ = vehicles_non_hybrid.displ.astype('float')

critera = vehicles_non_hybrid.comb08.notnull()

vehicles_non_hybrid = vehicles_non_hybrid[critera]

vehicles_non_hybrid.comb08 = vehicles_non_hybrid.comb08.astype('float')

接下来,绘制每加仑汽油可行驶里程数和引擎排量之间的散点图:

# 绘制每加仑汽油里程数与引擎排量相关性关系的散点图

# x轴为引擎排量

x = vehicles_non_hybrid.displ

# y轴为每加仑汽油可行驶里程数

y = vehicles_non_hybrid.comb08

plt.figure(figsize=(12,6))

plt.title("每加仑汽油可行驶里程数与引擎排量的相关性")

plt.xlabel("汽车引擎排量")

plt.ylabel('每加仑汽油可行驶里程数')

plt.scatter(x,y)

plt.grid()

从散点图上可以发现,随着汽车引擎排量的增加,每加仑汽油可行驶里程数逐步地在减少,两者呈现负相关性。

那么,现在我们的问题是,大引擎汽车近年来是不是制造得更少了?

我们继续按年份对数据进行分组:

# 按year对数据进行分组

groupby_year = vehicles_non_hybrid.groupby(['year'])

# 对分组数据进行comb08和displ的平均值进行计算

avg_groupby_year = groupby_year['comb08','displ'].mean()

再绘制出各年的comb08和displ平均走势图:

从上面两个走势图可以发现,每加仑汽油可行驶里程数在2006年之前一直都是上下浮动的,变化并不大,但在2006年之后,每加仑可行驶里程数就扶摇直上了;而反观平均汽车引擎排量,则是在2007年达到了顶峰,然后下滑趋势明显。

那么在2006年和2007年到底发生了什么?感兴趣的可以自己去找一下旧闻,这里暂且不表。

下面,我们来看看汽车的品牌和型号是如何影响油耗随时间变化的趋势的:

查看四缸汽车在美国市场出现的品牌和信号的频次

# 查看数据集中存在的所有汽缸类型

pd.unique(vehicles_non_hybrid.cylinders)

# 筛选出汽缸数为4的数据

vehicles_non_hybrid_4 = vehicles_non_hybrid[(vehicles_non_hybrid.cylinders == 4)]

# 按年进行分组

groupby_year_4_cylinder = vehicles_non_hybrid_4.groupby(['year']).make.nunique()

plt.figure(figsize=(12,6))

plt.title('四缸汽车品牌数量变化')

plt.ylabel('品牌数')

plt.xlabel('年份')

plt.plot(groupby_year_4_cylinder)

plt.scatter(groupby_year_4_cylinder.index,groupby_year_4_cylinder)

plt.grid()

可以发现,从1980年以来有四缸引擎的汽车品牌数量呈下降趋势,但是我们并不知道汽车品牌的总数是否发生了变化?

下面我们从汽车品牌入手:

from functools import reduce

# 找出每年的品牌列表

# 按年对数据进行分组

groupby_year_4_cylinder = vehicles_non_hybrid_4.groupby(['year'])

unique_make = []

# 遍历分组,将品牌和型号信息存入列表

for name,group in groupby_year_4_cylinder:

unique_make.append(set(pd.unique(group['make'])))

# 对列表中的信息进行化简

unique_make = reduce(set.intersection,unique_make)

unique_make

得到如下结果:

{'Chevrolet',

'Chrysler',

'Dodge',

'Ford',

'Honda',

'Jeep',

'Mazda',

'Mitsubishi',

'Nissan',

'Subaru',

'Toyota'}

嗯,只有11家制造商每年都生产四缸引擎汽车;

接下来看看这11家汽车制造商的型号随时间变化的油耗表现:

boolean_mask = []

for index,row in vehicles_non_hybrid_4.iterrows():

make = row['make']

boolean_mask.append(make in unique_make)

df_common_makes = vehicles_non_hybrid_4[boolean_mask]

df_common_makes_grouped = df_common_makes.groupby(['year','make']).mean()

df_common_makes_grouped = df_common_makes_grouped.reset_index()

df_common_makes_grouped.head(10)

n = 1

plt.figure(figsize=(18,10))

plt.title('各年各汽车制造商品牌油耗情况')

plt.subplots_adjust(hspace=0.5)

for i in unique_make:

datas = df_common_makes_grouped[df_common_makes_grouped['make']==i]

plt.subplot(4,3,n)

plt.title(i)

plt.xlabel('年份')

plt.ylabel('每加仑汽油可行驶里程数')

plt.plot(datas.year,datas.comb08)

plt.scatter(datas.year,datas.comb08)

plt.grid()

n += 1

最后,得到各年各汽车制造商品牌的油耗情况:

基本的可视化分析就结束了。不知道看完分析过程之后,你有没有别的思路和想法呢?欢迎告诉我。

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2016-12-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

HDU1846 Brave Game

Problem Description 十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫《勇敢者的游戏》(英文名称:Zathura)...

3435
来自专栏牛客网

深信服面经(C++)

1612
来自专栏阮一峰的网络日志

微软面试100题

网上流传一份微软公司面试的考题,共100道,真实性不可考。 这种题目用来面试,是否科学,那就智者见智了。在我看来,它们更像游戏。转贴如下,可供闲时娱乐。 ===...

3817
来自专栏量子位

机器人实用Python代码合集,帮你搞定自主导航 |GitHub高热

1543
来自专栏calmound

The 9th Zhejiang Provincial Collegiate Programming Contest

2012年4月14日进行的第九届浙江省省赛,进行的网络同步赛,以小组进行的训练,比赛期间没有上机做题,仅仅是充当翻译的作用, 完全拖本组的后腿,如果没有我,完全...

3495
来自专栏互联网杂技

还有哪些类似0.99999…=1有趣的事实?

初听到0.99999…=1都会吓一跳,不符“常识”,解释之后又感觉数学的魅力所在。 还有那些这样的例子? 再比如: 给地球和小皮球做一个紧箍的钢环,同时给钢...

3619
来自专栏云市场·精选汇

三道脑力测试题,95%的大学生都做错了,你会吗?

脑力测试不仅对于小学生能有很重要的拓展思维的作用,对中老年人也能活跃思维预防老年痴呆,所以就有了每天动动脑,永远不会老的说法!

7743
来自专栏专知

自然语言处理NLP快速入门

【导读】自然语言处理已经成为人工智能领域一个重要的分支,它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文提供了一份简要的自然语言处理介绍,...

1934
来自专栏AI研习社

NLP 教程:词性标注、依存分析和命名实体识别解析与应用

当我们提到数据科学时,我们经常想到的是针对数字的统计分析。但实际上,更为常见的是由机构所产生的大量非结构化文本数据,它们需要被量化和分析。其中的一些例子有社交网...

1923
来自专栏程序员互动联盟

学会了C语言能做些啥?

我现在C语言入门,基本靠自学,就看网上的那种教程,但是我怎么觉得它就是只能做下数学题,我觉得它并不能编辑出一个啥子游戏或者软件出来噢……初学者,见谅。 ? 马...

6556

扫码关注云+社区