数据来源
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:燃料类型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()
去除混合动力汽车数据后,每加仑可行驶的里程数与之前的数据细微之处有些许变化和不同,但是,基本的走势和变化趋势都是一致的:也就是每加仑汽油可行驶的里程数不断地在增加,并且这一趋势变化中,在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
最后,得到各年各汽车制造商品牌的油耗情况:
基本的可视化分析就结束了。不知道看完分析过程之后,你有没有别的思路和想法呢?欢迎告诉我。
文章版权所有:州的先生博客,转载必须保留出处及原文链接
如何汽车耗油的原始数据
您好,请问您是否找到原始数据呢?
您好,请问如何获取原始数据呢