1、本次案例概述(案例描述、代码地址)
获取近几年汽车行业总体数据,并对其进行一定整理。重点分析燃油使用率(MPG),发动机类型(cylinder)、传动类型(Trany)、排量(displ)供应商以及其相互之间的关系,来发现近年来汽车生产销售的趋势或规律。
代码展示:
代码下载:https://github.com/HelloMrChen/DataScienceCookbook/tree/master/R-01-carDataVisualization
#install.packages("plyr")
library(plyr)
#install.packages("ggplot2")
#install.packages("reshape2")
library(ggplot2)
library(reshape2)
#cmd+shift+c 注释快捷键
#将文件夹拖进终端中即可
setwd("/Users/gavinchen/我的文档/MBA养成记/2-自我提升/2-数据分析/程序练习/数据科学实战手册/R-01-carDataVisualization")
vehicles<-read.csv("Data/vehicles.csv") #由于设置了工作目录,直接写下一层目录Data即可
head(vehicles)
#给csv中的变量贴上标签
#这里的空格很重要,防止无拆分连续的字符串,这用到了readline、strsplit、docall、rbind
labels<-do.call(rbind,strsplit(readLines("Data/varlabels.txt")," - "))
#------数据准备及查看详情
summary(vehicles)
nrow(vehicles)
ncol(vehicles)
names(vehicles)
length(unique(vehicles[,"year"]))
vehicles[,"year"] #取数据框中的某一列
length(unique(vehicles$year))
min_year=min(vehicles[,"year"])
max_year=max(vehicles[,"year"])
table(vehicles$fuelType1)
#按条件筛选某列并将汽传动类型的空值赋值为NA
vehicles$trany[vehicles$trany==""]<-NA
length(vehicles$trany[vehicles$trany==""]<-NA)
vehicles$trany2<-ifelse(substr(vehicles$trany,1,4)=="Auto","Auto","Manual")
vehicles$trany2<-as.factor(vehicles$trany2) #设置为新变量为因子类型
table(vehicles$trany2)
with(vehicles,table(sCharger,year))
#-----------画图描述相关业务
#一、查看近几年来所有汽车每加仑汽油能行驶的公里数 趋势
#ddply可以将数据集按照制定函数进行计算并且赋给新数据框
#参数1 数据集,2 分类变量
mpgByYr<-ddply(vehicles,~year,summarise,avgMPG=mean(comb08),avgHghy=mean(highway08),avgCity=mean(city08))
#画图发现现在汽车每加仑汽油行驶的燃油数越来越多
ggplot(mpgByYr,aes(year,avgMPG))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average MPG")+ggtitle("All cars")#geom_smooth的使用
table(vehicles$fuelType1) #查看之后发现有很多非汽油动力在里边,数据有误
#二、筛选出燃油车然后查看MPG趋势
gasCars<-subset(vehicles,fuelType1 %in%c("Regular Gasoline","Premium Gasoline","midgrade Gasoline")&fuelType2==""&atvType!="Hybrid")
nrow(gasCars);nrow(vehicles)
table(gasCars$fuelType1) #注意table函数应用
GascarmpgByYr<-ddply(gasCars,~year,summarise,avgMPG=mean(comb08),avgHghy=mean(highway08),avgCity=mean(city08))
ggplot(GascarmpgByYr,aes(year,avgMPG))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average MPG")+ggtitle("All cars")
#三、查看汽车排量和燃油效率的趋势
typeof(gasCars$displ)
gasCars$displ<-as.numeric(gasCars$displ)
ggplot(gasCars,aes(displ,comb08))+geom_point()+geom_smooth()
#四、查看近几年生产车型的趋势
avgCarSize<-ddply(gasCars,~year,summarise,avgDispl=mean(displ))
ggplot(avgCarSize,aes(year,avgDispl))+xlab("year")+ylab("avgDispl")+geom_point()+geom_smooth()
#五、查看引擎排量和和MPG之间的关系
byYear<-ddply(gasCars,~year,summarise,avgMPG=mean(comb08),avgDispl<-mean(displ))
byyear2=melt(byYear,id="year") #melt 函数?
levels(byyear2$variable)<-c("Average MPG","Avg engine displacement")
byyear2
nrow(byyear2)
ggplot(byyear2,aes(year,value))+geom_point()+geom_smooth()+facet_wrap(~variable,ncol = 1,scales = "free_y")+xlab("Year")+ylab("")
#六、根据五中排量comb08与MPG在2006年左右的矛盾关系,查看是否自动挡或者手动挡比四缸发动机更加高效
gasCars4<-subset(gasCars,cylinders=="4")
ggplot(gasCars4,aes(factor(year),comb08))+geom_boxplot()+facet_wrap(~trany2,ncol = 1)+theme(axis.title.x = element_text(angle = 45))+labs(x="year",y="MPG")
#七、查看每一年手动挡的车占比情况
ggplot(gasCars4,aes(factor(year),fill=factor(trany2)))+geom_bar(position = "fill")
+labs(x="Year",y="Proportion of cars",fill="Transmission")+theme(axis.text.x = element_text(angle = 45))+geom_hline(yintercept=0.5,lintype=2)
#发现随着随着年份的增多,自动车占比越来越多
#八、查看汽车生产厂商随年份的变化
carsMakes<-ddply(gasCars,~year,summarise,numberofMakers=length(unique(make)))
ggplot(carsMakes,aes(year,numberofMakers))+geom_point()+labs(x="Year",y="Number of makers")+ggtitle("Four cylinder Cars")
#九、选出每年制造4缸发动机的厂商,并看这些厂商每年制造的汽车燃油效率如何
uniqueMakes<-dlply(gasCars4,~year,function(x) unique(x$make))
commonMakes<-Reduce(intersect,uniqueMakes)
carsCommonMakes4<-subset(gasCars4,make %in% commonMakes)
#这里按照两个变量进行分组统计,所以分为了
avgMpg_commonMakers<-ddply(carsCommonMakes4,~year+make,summarise,avg_MPG=mean(comb08))
avgMpg_commonMakers
ggplot(avgMpg_commonMakers,aes(year,avg_MPG))+geom_line()+facet_wrap(~make,ncol=3)
#可以看到每个厂商的燃油效率都是提高了的
2、在本次案例中学到了哪些技术细节(包、语法、作图、模型、算法)
plyr包(ddply) ggplot2包(ggplot),reshape(melt)等
3、相关技术细节有无返回到工具书中系统学习,及学习结果
案例中用到的语句为:
mpgByYr<-ddply(vehicles,~year,summarise,avgMPG=mean(comb08),avgHghy=mean(highway08),avgCity=mean(city08))
意图将vehicles中的数据按照年份进行重新组合,后边的聚合函数为mean,输出结果为每年相应业务指标的平均值。
本身的函数使用方式为ddply(data,.(var1,var2..),summarise,a=fun(),b=fun())
属于ply包中的一个函数
案例中使用的代码:
ggplot(mpgByYr,aes(year,avgMPG))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average MPG")+ggtitle("All cars")
首先ggplot的格式为ggplot(data,aes(x,y))即按照data中x,y的维度去绘制曲线
+geom_point()即为绘制类型为点图 相应的geom_boxplot()为绘制箱线图
+geom_smooth() 绘制出了曲线的置信区间部分
+xlab、ylab以及ggtitle分别设置了坐标轴的xy显示标题以及总标题。同样可以用lab(x="",y="")来替换
facet_wrap()函数是一个ggplot2中设置分页的函数,https://www.cnblogs.com/wkslearner/p/5715095.html
table 函数统计的是数据集中因子对出现的频数,相当于统计学中的列联表。
a<-c(1,2,3,3)
b<-c('a','c','b','b')
c=data.frame(a,b)
table(c)
输出结果为:
b
a a b c
1 1 0 0
2 0 0 1
3 0 2 0
subset(gasCars4,make %in% commonMakes)
subset函数可以很轻松的取到集合中的子集,具体的形式为subset(data,条件),功能堪比sql中的select where
首先,因子类型可以看做事一种分类数据,它可以记录其中的分类名称以及相应的数量。比如:
c<-factor(c('男','女','男','女')) class(c) 即为factor类型 level(c)即为"男" "女"
实际使用过程中factor例子 df$class <- factor(df$class,levels = c(2,4),labels = c("benign","malignant")) 可以设置labels
do.call函数 labels<-do.call(rbind,strsplit(readLines("Data/varlabels.txt")," - "))
案例中用到的语句:labels<-do.call(rbind,strsplit(readLines("Data/varlabels.txt")," - "))
strsplit 即将字符串按照特定要求进行拆分,其命令形式为strsplit(x,split)
R中相关的字符串操作函数总结:https://www.cnblogs.com/awishfullyway/p/6601539.html
melt函数属于reshape包中的函数,将数据框的数据打散后重新组合。
文中的使用方法为:levels(byyear2$variable)<-c("Average MPG","Avg engine displacement")
即将某个变量值进行分层级
文章中用到的为:commonMakes<-Reduce(intersect,uniqueMakes)
本身reduce函数是将数组中的数值做相应的二元运算,比如:a=c(12,25,3,8) Reduce("+",a) [1] 48
文章中的intersect为求交集的意思,即对uniqueMakes中各个向量求交集。
4、本次案例输出结果展示