运用汽车数据进行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
结果为:
Index(['barrels08', 'barrelsA08', 'charge120', 'charge240', 'city08',
       'city08U', 'cityA08', 'cityA08U', 'cityCD', 'cityE', 'cityUF', 'co2',
       'co2A', 'co2TailpipeAGpm', 'co2TailpipeGpm', 'comb08', 'comb08U',
       'combA08', 'combA08U', 'combE', 'combinedCD', 'combinedUF', 'cylinders',
       'displ', 'drive', 'engId', 'eng_dscr', 'feScore', 'fuelCost08',
       'fuelCostA08', 'fuelType', 'fuelType1', 'ghgScore', 'ghgScoreA',
       'highway08', 'highway08U', 'highwayA08', 'highwayA08U', 'highwayCD',
       'highwayE', 'highwayUF', 'hlv', 'hpv', 'id', 'lv2', 'lv4', 'make',
       'model', 'mpgData', 'phevBlended', 'pv2', 'pv4', 'range', 'rangeCity',
       'rangeCityA', 'rangeHwy', 'rangeHwyA', 'trany', 'UCity', 'UCityA',
       'UHighway', 'UHighwayA', 'VClass', 'year', 'youSaveSpend', 'guzzler',
       'trans_dscr', 'tCharger', 'sCharger', 'atvType', 'fuelType2', 'rangeA',
       'evMotor', 'mfrCode', 'c240Dscr', 'charge240b', 'c240bDscr',
       'createdOn', 'modifiedOn', 'startStop', 'phevCity', 'phevHwy',
       'phevComb'],
      dtype='object')

再看看包含的年份:

# 查看数据集中包含了多少个年份,最小年和最大年
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
Name: fuelType, dtype: int64

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

# 统计汽车使用的变速箱种类的数量
pd.value_counts(vehicles.trany)

嗯,返回的结果很多哇:

Automatic 4-spd                     11042
Manual 5-spd                         8319
Automatic 3-spd                      3151
Automatic (S6)                       2684
Manual 6-spd                         2438
Automatic 5-spd                      2191
Manual 4-spd                         1483
Automatic 6-spd                      1446
Automatic (S8)                        972
Automatic (S5)                        824
Automatic (variable gear ratios)      698
Automatic 7-spd                       673
Automatic (S7)                        270
Automatic 8-spd                       267
Auto(AM-S7)                           265
Automatic (S4)                        233
Auto(AM7)                             165
Auto(AV-S6)                           153
Auto(AM6)                             118
Automatic (A1)                        113
Automatic 9-spd                       103
Auto(AM-S6)                            80
Auto(AV-S7)                            77
Manual 3-spd                           77
Manual 7-spd                           73
Automatic (S9)                         29
Auto(AV-S8)                            28
Manual 4-spd Doubled                   17
Auto(AM5)                              12
Automatic (AV-S6)                       9
Automatic (S10)                         7
Auto(AM-S8)                             6
Auto(AM8)                               5
Automatic (AV)                          4
Automatic (A6)                          4
Manual(M7)                              3
Auto(L4)                                2
Auto(L3)                                2
Auto (AV)                               2
Automatic (AM5)                         2
Auto (AV-S6)                            1
Automatic 6spd                          1
Automatic (AM6)                         1
Manual 5 spd                            1
Auto (AV-S8)                            1
Auto(AM-S9)                             1
Name: trany, dtype: int64

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

# 上面返回的变速箱的类型没有进行分类,对上面的变速箱类型数据进行分类
# 新建一列trany2,内容为trany的值的第一个字母
vehicles['trany2'] = vehicles.trany.str[0]
pd.value_counts(vehicles.trany2)

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

A    25642
M    12411
Name: trany2, dtype: int64

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

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

grouped = vehicles.groupby('year')
# 按年对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列

# 对列重命名,并新增一个列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

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

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

# 从数据集中去除混合动力汽车
# 设置筛选条件
# 条件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)

查看前5条数据:

year
1984    19.121622
1985    19.383495
1986    19.345865
1987    19.189655
1988    19.489447
Name: comb08, dtype: float64

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

# 对处理后的数据集绘制图形
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()

2

去除混合动力汽车数据后,每加仑可行驶的里程数与之前的数据细微之处有些许变化和不同,但是,基本的走势和变化趋势都是一致的:也就是每加仑汽油可行驶的里程数不断地在增加,并且这一趋势变化中,在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()

3

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

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

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

# 按year对数据进行分组
groupby_year = vehicles_non_hybrid.groupby(['year'])
# 对分组数据进行comb08和displ的平均值进行计算
avg_groupby_year = groupby_year['comb08','displ'].mean()

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

4

从上面两个走势图可以发现,每加仑汽油可行驶里程数在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()

5

可以发现,从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

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

6

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

猜你也喜欢

发表评论

电子邮件地址不会被公开。