運用汽車數據進行Python可視化分析

數據來源:

vehicles.csv是一份來自於fuelconomy.gov的,數據,它包含了美國各個汽車製造商各個型號汽車不同時間點的油耗表現參數和各個汽車型號豐富的其他特性和屬性,為我們整理和分組分析數據以發現有趣的趨勢和關係提供了機會

分析過程:

描述汽車油耗數據:

# 導入相關的庫nimport numpy as npnimport pandas as pdn%matplotlib inlinenn# 從csv文件中導入數據nvehicles = pd.read_csv(vehicles.csv)n

# 查看數據中的行數nlen(vehicles)n

返回結果為:38064

# 查看數據中的列nlen(vehicles.columns)n

一共有:83列

# 看看都有哪些列nvehicles.columnsn

結果為:nIndex([barrels08, barrelsA08, charge120, charge240, city08,n city08U, cityA08, cityA08U, cityCD, cityE, cityUF, co2,n co2A, co2TailpipeAGpm, co2TailpipeGpm, comb08, comb08U,n combA08, combA08U, combE, combinedCD, combinedUF, cylinders,n displ, drive, engId, eng_dscr, feScore, fuelCost08,n fuelCostA08, fuelType, fuelType1, ghgScore, ghgScoreA,n highway08, highway08U, highwayA08, highwayA08U, highwayCD,n highwayE, highwayUF, hlv, hpv, id, lv2, lv4, make,n model, mpgData, phevBlended, pv2, pv4, range, rangeCity,n rangeCityA, rangeHwy, rangeHwyA, trany, UCity, UCityA,n UHighway, UHighwayA, VClass, year, youSaveSpend, guzzler,n trans_dscr, tCharger, sCharger, atvType, fuelType2, rangeA,n evMotor, mfrCode, c240Dscr, charge240b, c240bDscr,n createdOn, modifiedOn, startStop, phevCity, phevHwy,n phevComb],n dtype=object)n

再看看包含的年份:

# 查看數據集中包含了多少個年份,最小年和最大年nyearcount = len(pd.unique(vehicles.year))nminyear = min(vehicles.year)nmaxyear = max(vehicles[year])nprint(yearcount,minyear,maxyear)n

其中一共包含了34年的數據,從1984-2017年;

接下來,我們看看數據集中的汽車都使用的是什麼類型的燃料:

# 統計汽車使用的燃料類型的數量,使用pd.value_counts方法npd.value_counts(vehicles.fuelType)n

返回結果為:

Regular 25239nPremium 10120nGasoline or E85 1221nDiesel 1013nPremium or E85 122nElectricity 122nMidgrade 77nCNG 60nPremium and Electricity 24nGasoline or natural gas 20nRegular Gas and Electricity 18nPremium Gas or Electricity 18nGasoline or propane 8nRegular Gas or Electricity 2nName: fuelType, dtype: int64n

查看汽車所使用的變速箱的類型:

# 統計汽車使用的變速箱種類的數量npd.value_counts(vehicles.trany)n

嗯,返回的結果很多哇:

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

上面返回的數據很多,而且沒有對變速箱進行分類,我們對它按手動和自動進行一下分類:

# 上面返回的變速箱的類型沒有進行分類,對上面的變速箱類型數據進行分類n# 新建一列trany2,內容為trany的值的第一個字母nvehicles[trany2] = vehicles.trany.str[0]npd.value_counts(vehicles.trany2)n

結果出來了,自動檔比手動擋多出了差不多一倍的數量:

A 25642nM 12411nName: trany2, dtype: int64n

接下來,咱們分析一下汽車油耗隨時間變化的趨勢

首先,按年對vehicles數據進行分組

grouped = vehicles.groupby(year)n

# 按年對vehicles數據進行分組ngrouped = vehicles.groupby(year)nn# 計算分組中三列的平均值n# groupby()方法中的agg()方法可以對不同的列使用不用的聚合函數,在此並用不上n# averageed = grouped[comb08,highway08,city08].agg([np.mean])naverageed = grouped[comb08,highway08,city08].mean()naverageed.head(5)n

查看前5條數據:

comb08highway08city08year 198419.88187423.07535617.982688198519.80834823.04232817.878307198619.55041322.69917417.665289198719.22854922.44506817.310345198819.32831922.70265517.333628

對列進行重命名,並新增一個以索引為值的year列

# 對列重命名,並新增一個列year為索引naverageed.columns = [comb08_mean,highway08_mean,city08_mean]naverageed[year] = averageed.indexnaverageed.head(5)n

前5條數據為:

comb08_meanhighway08_meancity08_meanyearyear 198419.88187423.07535617.9826881984198519.80834823.04232817.8783071985198619.55041322.69917417.6652891986198719.22854922.44506817.3103451987198819.32831922.70265517.3336281988

接下來將處理後的平均數據繪製成線圖:

# 將處理後的數據繪製成散點圖nx = np.arange(len(averageed.index))ny = averageed.comb08_meannplt.figure(figsize=(12,6))nplt.title("平均每加侖汽油可行駛英里數隨時間的變化")nplt.xlabel("年數")nplt.ylabel(每加侖汽油可行駛英里數)nplt.xticks(x,averageed.year,rotation=45)nplt.plot(x,y)nplt.scatter(x,y)nplt.grid()n

得到平均每加侖汽油可行駛里程數隨時間的變化圖:

可以看出,隨著時間的推移,每加侖汽油可行駛的里程數是總體增加的,換而言之,汽車每公里的油耗是總體不斷減少的。 但是,在數據中我們忽略了一個問題:有著出色油耗表現的混合動力汽車越來越流行。

為了獲得更加準確的分析,我們需要將混合動力汽車的數據從數據集中刪除。

# 從數據集中去除混合動力汽車n# 設置篩選條件n# 條件1:燃料類型fuelType1為普通汽油、優質汽油或中等ncritera_1 = vehicles.fuelType1.isin([Regular Gasoline,Permium Gasoline,Midgrade Gasoline])n# 條件2:燃料類型fuelType2為空ncritera_2 = vehicles.fuelType2.isnull()n# 條件3:動力類型atvType不為混合ncritera_3 = vehicles.atvType != "Hybrid"n# 對條件進行篩選nvehicles_non_hybrid = vehicles[critera_1 & critera_2 & critera_3]nlen(vehicles_non_hybrid)n

篩選出的數據有:24947條

然後,對剔除混合動力汽車數據的數據集進行分組和計算平均值:

# 對去除了混合動力汽車數據的數據集進行分組和計算平均值ngrouped = vehicles_non_hybrid.groupby([year])naverageed = grouped[comb08].mean()naverageed.head(5)n

查看前5條數據:

yearn1984 19.121622n1985 19.383495n1986 19.345865n1987 19.189655n1988 19.489447nName: comb08, dtype: float64n

再對處理後的數據集進行可視化:

# 對處理後的數據集繪製圖形nx = np.arange(len(averageed.index))ny = averageednplt.figure(figsize=(12,6))nplt.title("平均每加侖汽油可行駛英里數隨時間的變化(不包含混合動力汽車)")nplt.xlabel("年數")nplt.ylabel(每加侖汽油可行駛英里數)nplt.xticks(x,averageed.index,rotation=45)nplt.plot(x,y)nplt.scatter(x,y)nplt.grid()n

去除混合動力汽車數據後,每加侖可行駛的里程數與之前的數據細微之處有些許變化和不同,但是,基本的走勢和變化趨勢都是一致的:也就是每加侖汽油可行駛的里程數不斷地在增加,並且這一趨勢變化中,在2006年的時候出現了顯著的提升。

接下來,我們想知道,到底是什麼原因導致了平均每加侖里程數增加?有沒有可能是因為大引擎的汽車越來越少了?

獲取汽車排量信息

# 提取數據集中的汽車排量信息npd.unique(vehicles_non_hybrid.displ)n

發現數據集中有如下汽車排量信息:

array([ 2. , 4.9, 2.2, 5.2, 1.8, 1.6, 2.3, 5. , 3.3, 3.1, 3.8,n 3.4, 5.9, 2.5, 3. , 2.8, 2.4, 2.9, 5.7, 4.3, 3.5, 5.8,n 4.6, 1.9, 2.6, 7.4, 3.9, 4. , 1.5, 4.2, 1.3, 4.1, 3.2,n 4.5, 3.6, 5.4, 1. , 2.1, 1.2, 2.7, 1.1, 5.3, 4.4, 4.7,n 3.7, 4.8, 6. , 1.7, 6.8, 5.6, 1.4, 6.1, 6.2, nan])n

在數據集中發現空值,我們將其去除:

# 數據中存在空值,需要對其進行剔除ncritera = vehicles_non_hybrid.displ.notnull()nvehicles_non_hybrid = vehicles_non_hybrid[critera]nvehicles_non_hybrid.displ = vehicles_non_hybrid.displ.astype(float)nncritera = vehicles_non_hybrid.comb08.notnull()nvehicles_non_hybrid = vehicles_non_hybrid[critera]nvehicles_non_hybrid.comb08 = vehicles_non_hybrid.comb08.astype(float)n

接下來,繪製每加侖汽油可行駛里程數和引擎排量之間的散點圖:

# 繪製每加侖汽油里程數與引擎排量相關性關係的散點圖n# x軸為引擎排量nx = vehicles_non_hybrid.displn# y軸為每加侖汽油可行駛里程數ny = vehicles_non_hybrid.comb08nplt.figure(figsize=(12,6))nplt.title("每加侖汽油可行駛里程數與引擎排量的相關性")nplt.xlabel("汽車引擎排量")nplt.ylabel(每加侖汽油可行駛里程數)nplt.scatter(x,y)nplt.grid()n

從散點圖上可以發現,隨著汽車引擎排量的增加,每加侖汽油可行駛里程數逐步地在減少,兩者呈現負相關性。

那麼,現在我們的問題是,大引擎汽車近年來是不是製造得更少了?

我們繼續按年份對數據進行分組:

# 按year對數據進行分組ngroupby_year = vehicles_non_hybrid.groupby([year])n# 對分組數據進行comb08和displ的平均值進行計算navg_groupby_year = groupby_year[comb08,displ].mean()n

再繪製出各年的comb08和displ平均走勢圖:

從上面兩個走勢圖可以發現,每加侖汽油可行駛里程數在2006年之前一直都是上下浮動的,變化並不大,但在2006年之後,每加侖可行駛里程數就扶搖直上了;而反觀平均汽車引擎排量,則是在2007年達到了頂峰,然後下滑趨勢明顯。

那麼在2006年和2007年到底發生了什麼?感興趣的可以自己去找一下舊聞,這裡暫且不表。

下面,我們來看看汽車的品牌和型號是如何影響油耗隨時間變化的趨勢的:

查看四缸汽車在美國市場出現的品牌和信號的頻次

# 查看數據集中存在的所有汽缸類型npd.unique(vehicles_non_hybrid.cylinders)nn# 篩選出汽缸數為4的數據nvehicles_non_hybrid_4 = vehicles_non_hybrid[(vehicles_non_hybrid.cylinders == 4)]n# 按年進行分組ngroupby_year_4_cylinder = vehicles_non_hybrid_4.groupby([year]).make.nunique()nplt.figure(figsize=(12,6))nplt.title(四缸汽車品牌數量變化)nplt.ylabel(品牌數)nplt.xlabel(年份)nplt.plot(groupby_year_4_cylinder)nplt.scatter(groupby_year_4_cylinder.index,groupby_year_4_cylinder)nplt.grid()n

可以發現,從1980年以來有四缸引擎的汽車品牌數量呈下降趨勢,但是我們並不知道汽車品牌的總數是否發生了變化?

下面我們從汽車品牌入手:

from functools import reducen# 找出每年的品牌列表n# 按年對數據進行分組ngroupby_year_4_cylinder = vehicles_non_hybrid_4.groupby([year])nnunique_make = []n# 遍歷分組,將品牌和型號信息存入列表nfor name,group in groupby_year_4_cylinder:n unique_make.append(set(pd.unique(group[make])))n# 對列表中的信息進行化簡nunique_make = reduce(set.intersection,unique_make)nunique_maken

得到如下結果:

{Chevrolet,n Chrysler,n Dodge,n Ford,n Honda,n Jeep,n Mazda,n Mitsubishi,n Nissan,n Subaru,n Toyota}n

嗯,只有11家製造商每年都生產四缸引擎汽車;

接下來看看這11家汽車製造商的型號隨時間變化的油耗表現:

boolean_mask = []nfor index,row in vehicles_non_hybrid_4.iterrows():n make = row[make]n boolean_mask.append(make in unique_make)ndf_common_makes = vehicles_non_hybrid_4[boolean_mask]ndf_common_makes_grouped = df_common_makes.groupby([year,make]).mean()ndf_common_makes_grouped = df_common_makes_grouped.reset_index()n

df_common_makes_grouped.head(10)nn = 1nplt.figure(figsize=(18,10))nplt.title(各年各汽車製造商品牌油耗情況)nplt.subplots_adjust(hspace=0.5)nfor i in unique_make:n datas = df_common_makes_grouped[df_common_makes_grouped[make]==i]n plt.subplot(4,3,n)n plt.title(i)n plt.xlabel(年份)n plt.ylabel(每加侖汽油可行駛里程數)n plt.plot(datas.year,datas.comb08)n plt.scatter(datas.year,datas.comb08)n plt.grid()n n += 1n

最後,得到各年各汽車製造商品牌的油耗情況:

基本的可視化分析就結束了。不知道看完分析過程之後,你有沒有別的思路和想法呢?歡迎告訴我。

文章首發:州的先生

文章鏈接:運用汽車數據進行Python可視化分析 - 州的先生

同步更新微信公眾號:州的先生

推薦閱讀:

一街之隔的美國富翁與貧民,這張地圖都能告訴你
簡書=雞湯?爬取簡書今日看點:1916篇熱門文章可視化
數據科學導論:探索性數據分析
R語言可視化——散點圖及其美化技巧!
可能是比Python更方便的詞雲製作了

TAG:数据分析 | Python | 数据可视化 |