汽車數據的可視化分析(R)
數據下載:http://www.fueleconomy.gov/feg/epadata/vehicles.csv.zip
將數據導入R中,
1.首先將工作路徑設定到本地保存了vehicles.csv的路徑下:
setwd("path")
2.我們可以直接從zip文件中載入數據,只要你知道zip中壓縮的文件名:
vehicles<-read.csv(unz("vehicles.csv.zip","vehicles.csv"),stringsAsFactors = F)
這裏用到了參數stringAsFactors=F.R默認會將字符串轉為因子。因子是R中定性變量的稱呼,可以被認為對數據的標註或者標簽。在R的內部,因子是存為整數的,每個整數映射到因子的一個水平。這項技術可以使得老版本R的存儲成本降低。
一般而言定性變量是沒有順序的。然而也存在有順序的分類變量,在統計學中也被稱為序數。序數也是一種分類變量
3.為了檢查數據是否已經載入,我們可以在R中展現頭幾行,使用如下代碼:
head(vehicles)
4.查看數據有多少行
nrow(vehicles)
5.查看有多少個變量(列)
ncol(vehicles)
6.查看各列的含義,用name()函數
names(vehicles)
7.我們可以看到數據集中包含幾年的數據,只需要計算year這一列的不同取值的向量,然後計算這個向量的長度即可
length(unique(vehicles[,"year"]))
8.使用max和min函數
first_year<-min(vehicles[,"year"]) last_year<-max(vehicles[,"year"])
9.找出燃料類型有哪些
table(vehicles$fuelType1)
10.探索一下這些汽車使用的傳動方式,首先把缺失值用NA填補
vehicles$trany[vehicles$trany==""]<-NA
11.現在trany這一列是文本,我們僅僅關註車輛的傳動方式是自動還是手動。因此我們使用substr函數提取trany的值的前四個字符,然後確定這個是自動還是手動。我們生成一個新的變量:trany2
vehicles$trany2<-ifelse(substr(vehicles$trany,1,4)=="Auto","Auto","Manual")
10.我們將這個新變量變成因子,然後使用table函數來看不同類型傳動方式的記錄各有多少
vehicles$trany<-as.factor(vehicles$trany) table(vehicles$trany2)
學習了如何快速瀏覽R中的數據。最明顯的是,使用table函數來觀察fuelType1這個變量不同取值所對應的記錄數。這個函數其實還有很多其他用途,比如計算交叉列聯表等
with(vehicles,table(sCharger,year))
這裏使用了with命令。這個命令告訴R使用vehicles數據集作為接下來命令的默認數據集。在這個例子中,接下來將用table函數。因此,我們可以直接用變量sCharger和year,而不必再使用美元符號和數據框名稱組合來引用了。
我們可以使用class查看變量的類型:
class(vehicles$sCharger)
進一步分析汽車燃料效率數據
接下來用plyr和ggplot2來探索數據集
1.首先,我們看看平均MPG是否隨著時間有一個趨勢上的變化。為此,我們使用plyr包的ddply函數來操作vehicles數據集,按年份整合,然後對每個組計算highway、city和combine的燃油效率。這個結果將賦值給一個新的數據框:mpgByYr
library(plyr)
mpgByYr<-ddply(vehicles,~year,summarise,avgMPG=mean(comb08),avgHghy=mean(highway08),avgCity=mean(city08))
2.為了對新的數據框得到一個更好的理解,我們將它傳入ggplot函數中,用散點圖繪制avgMPG和year之間的關系。此外,我們還會標明我們需要的坐標軸的命名、圖的標題,一級加上一個平滑的條件均值,geom_smooth()在圖片上增加一個陰影的區域。
ggplot(mpgByYr,aes(year,avgMPG))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average MPG")+ggtitle("All cars")
3.我們只看燃油車,雖然非燃油車數量並不多。為了做到這個,我們使用subset函數來生成一個新的數據框:gasCars.這個數據框只包含fuelType1的取值為如下取值的記錄。
gasCars<-subset(vehicles,fuelType1 %in% c("Regular Gasoline","Premium Gasoline","Midgrade Gasoline")&fuelType2==""&atvType!="Hybrid") mpgByYr_Gas<-ddply(gasCars,~year,summarise,avgMPG=mean(comb08)) ggplot(mpgByYr_Gas,aes(year,avgMPG))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average MPG")+ggtitle("Gasoline cars")
4.我們註意變量displ,表示引擎的排量,單位為升。現在他還是字符串類型,我們需要把他變為數值型
typeof(gasCars$displ) gasCars$displ<-as.numeric(gasCars$displ) ggplot(gasCars,aes(displ,comb08))+geom_point()+geom_smooth()
5.現在,讓我們看看是否近年生產了更多的小車,這樣就可以解釋燃油效率最近有大幅的提升了
avgCarSize<-ddply(gasCars,~year,summarise,avgDispl=mean(displ)) ggplot(avgCarSize,aes(year,avgDispl))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average engine displacemment(1)")
6.為了更好地看到這可能會影響到燃油效率地提升,我們逐年繪制出MPG和排量之間地關系。我們使用ddply函數,生成一個新的數據框byYear,包含每年地平均燃油效率和平均引擎排量。
byYear<-ddply(gasCars,~year,summarise,avgMPG=mean(comb08),avgDispl=mean(displ))
head(byYear)
7.head函數展示了生成的新的數據框,這個數據框包含3個列:year、avgMPG以及avgDispl。我們呢將要使用ggplot2包中分面的功能,在同一張圖但是不同的面上來逐年顯示平均油耗以及平均排量之間的關系。我們必須分解這個數據框,把一個寬的數據框變成一個長的數據框。
byYear2=melt(byYear,id="year") levels(byYear2$variable)<-c("Average MPG","Avg engine displacement")
8.來看看是否自動擋或者手動擋傳動比四缸發動的油耗更加高效,以及油耗是如惡化隨時變化的
gasCars4<-subset(gasCars,cylinders=="4") ggplot(gasCars4,aes(factor(year),comb08))+geom_boxplot()+facet_wrap(~tranny2,ncol=1)+theme(axis.text.x=element_text(angle = 45))+labs(x="Year",y="MPG")
這次ggplot生成了一個箱線圖。這個圖幫助展示了每一年值得分布情況(而不只展示像均值這樣得單一數值)
研究汽車產量以及車型
1.讓我們看看生產商和車型隨時間得變化如何燃油得效率。首先,我們看看美國這些年不同的車型和生產商出現的頻次,然後將註意力放在四缸發動的車上。
carMake<-ddply(gasCars4,~year,summarise,numberOfMakes=length(unique(make)))
ggplot(carMake,aes(year,numberOfMakes))+geom_point()+labs(x="Year",y="Number of available makes")+ggtitle("Four cylinder cars")
2.我們可以看看每一年的生產商
uniqMakes<-dlply(gasCars4,~year,function(x)unique(x$make)) commonMakes<-Reduce(intersect,uniqMakes) commonMakes
3.這些制造商每年生產出來的汽車的燃油效率如何?我們看到大多數制造商的燃油效率在逐年提升,有一些制造商在最近5年在燃油效率上有一個飛速的提升。
carsCommonMakes4<-subset(gasCars4,make %in% commonMakes) avgMPG_commonMakes<-ddply(carsCommonMakes4,~year+make,summarise,avgMPG=mean(comb08)) ggplot(avgMPG_commonMakes,aes(year,avgMPG))+geom_line()+facet_wrap(~make,nrow=3)
我們使用dlply(註意不是ddply)來操作gasCars4數據框,按照年來分割數據集,然後對每一塊的make變量應用一個函數。對每一年,計算出獨立的制造商列表,然後dlply返回每一年的列表。dlply輸入一個數據框返回一個列表,而ddply輸入一個數據框返回一個數據框
使用reduce函數來做更高階的排序。這個Reduce函數和map reduce編程中的reduce過程的想法是一樣的,而map reduce是google提出的基於Hadoop的編程模式。從某種角度來講,R是一個函數式編程語言,其核心包含一些高階的函數。所謂高階函數,是指其輸入是其他的函數。在這行代碼中,我們將intersect函數作為輸入賦值給Reduce函數,這個函數將會對數據集uniqMakes的每一個元素求交集,而這個數據集是我們之前已經生成的每一年不同制造商的列表。最終,結果放在一個新的列表中,這個列表展現了每一年都會出現的制造商。
汽車數據的可視化分析(R)