运用汽车数据进行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 条评论
登录 后参与评论

相关文章

来自专栏码农分享

工厂模式(Factory)

简单工厂和工厂方法这俩个设计模式不做详细介绍,请各位看官自行百度,有大量的解释。再次我简单引用一下其他博客主对这三种模式的理解。

571
来自专栏数据结构与算法

P1070 道路游戏

题目描述 小新正在玩一个简单的电脑游戏。 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接。小新以某个机器人工厂为起点,...

2826
来自专栏C语言及其他语言

如何到达C语言的巅峰?我推荐你阅读《C语言小白变怪兽》!

《C语言小白变怪兽》融入了作者 8 年的编程功力,以及文学级的写作能力,耗时 5 年完成,期间经过了 5 次大改版。

2021
来自专栏程序人生

抽象的能力

人类的智商从低幼逐渐走向成熟的标志之一就是认识和运用数字的能力。当我们三四岁的时候,数数虽然能够熟练地对一百以内的数字随心所欲地倒背如流,但数字对孩童时代的我们...

3277
来自专栏用户画像

PAT 1003 Emergency

As an emergency rescue team leader of a city, you are given a special map of yo...

471
来自专栏数据结构与算法

P2002 消息扩散

题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着。 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问...

34710
来自专栏张善友的专栏

面向对象设计的SOLID原则

S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写。 SRP The Sin...

2036
来自专栏程序员的知识天地

谈谈编码与规范

既然是风格,就没有对错。就如现实生活中,我们每个人都有自己的穿着打扮一样。可能有些人打扮土一点,但土就土,并不影响什么。

411
来自专栏禁心尽力

Java设计模式之适配器设计模式(项目升级案例)

 今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标...

2198
来自专栏贾老师の博客

【笔记】软件工程设计原则

991

扫码关注云+社区