大数据分析社区第3关--某汽车融资租赁公司季度数据分析

大数据分析社区第3关--某汽车融资租赁公司季度数据分析

本案例将运用R语言对某汽车融资租赁公司第一季度数据进行分析。

一、知识点:

1. EXCEL读取。

2. 数据类型转换、去除空数据、数据选取、数据分类合并、排序。

3. 直方图显示排序、箱线图显示分布、泛型函数显示趋势。



二、数据分析步骤:

1. 导入该公司的EXCEL数据。

2. 清洗、整理数据。分析指标有:

  • 各区域第一季度汽车销量、排名
  • 区域汽车销量中位数
  • 各区域第一季度总融资额、排名
  • 区域融资额中位数
  • 全国第一季度销售总趋势
  • 全国第一季度融资额总趋势

3. 数据展示。在同一张图中维度显示数据结果

4. 结论分析。



三、步骤详细讲解:

1. 导入数据

下载包“openxlsx”,用read.xlsx方法读取数据

2.清洗整理数据

  • 数据预处理:

重命名数据框的变量

删除缺失的数据,例如金额、日期缺失的数据

将销售量、融资额转换为数字,日期数据转换为字符串

只筛选出第一季度,即1~3月份的数据

  • 根据要分析的指标处理数据

先将区域分组,再合并各区域的销售数量、融资金额。用到了tapply()方法,并用cbind()处理合并后的数据。

对各区域的销售数量、融资金额排名。用到了order()方法。

合并全国每月的销售数量、金额。

将合并后全国的销售数量、融资金额按照1、2、3月依次排序。通过因子factor()将月份区分出先后顺序后,再进行排序。



3.在一张图中多维度显示数据

显示各区域第一季度汽车销售量、融资额排名。这里有疑问:使用barplot()显示直方图,但barplot不能按照顺序排序显示直方图;hist()是用于显示频率直方图,只能显示频率,也不能达到效果。如何才能按销售金额顺序从左到右按顺序显示直方图呢?

显示各区域第一季度汽车销售量、融资额中位数。用summary()进行计算,并用boxplot()箱线图显示。

显示全国第一季度销售数量、融资额趋势。使用layout()进行图形排布,使用plot()显示趋势图,使用axis()设置坐标轴刻度,使用text()对趋势图中的点进行标注。




图形显示的结果:

这里有疑问:用泛型函数plot()时,需要将y轴“数值”向量转换成“字符” ?若不转换,泛型函数中的点会变成直线?

将“数值”向量转换成“字符”,泛型函数中的数据是点:


若向量是“数值”,泛型函数中的数据是线:



4. 结论分析

第1季度销售数量新疆区域第一,销售数量区域的中位数是6822台。

第1季度融资金额青海区域第一,融资金额区域的中位数是7031万元。

第1、2、3月全国的销售总数量、融资总金额都有波动。



五、代码

#------------------------------------------------
#某租赁公司第一季度销售数据,分析以下数据:
#每各区域第一季度汽车销售量
#每各区域第一季度总融资额
#区域排名
#全国第一季度销售总趋势
#全国第一季度融资额总趋势
#------------------------------------------------

#install.packages("openxlsx")
library("openxlsx")

#install.packages("RColorBrewer")
library(RColorBrewer)

#------------------------------------------------
#读取excel数据
#------------------------------------------------
readFilePath <- "D:\\working 工作\\R_workplace\\某租赁公司第一季度销售数据\\某租赁公司第一季度销售数据.xlsx"

excelData <- read.xlsx(readFilePath,"Sheet1")


#------------------------------------------------
#数据预处理
#------------------------------------------------

#列名重命名
names(excelData) <- c("area","month",
                      "saleNumber","saleMoney"
                      )

#删除缺失数据
excelData<-excelData[!is.na(excelData$saleNumber),]

#数据类型转换
excelData$month <- as.character(excelData$month)
excelData$saleNumber <- as.numeric(excelData$saleNumber)
excelData$saleMoney <- as.numeric(excelData$saleMoney)


#只选取第一季度,1~3月的数据
quartData <- excelData[excelData$month=="201701" | 
                       excelData$month=="201702" | 
                       excelData$month=="201703" ,]

#------------------------------------------------
#将每个区域的季度数据合并,
#得到各区域第一季度汽车销售总量、融资总额
#------------------------------------------------
#合并各区域销售数量
quartDataArea_saleNumber <- tapply(quartData$saleNumber,quartData$area,sum)
#将分组后的键、值放入table中
quartDataArea_saleNumber <- as.data.frame.table(quartDataArea_saleNumber)
#重命名table的数据
names(quartDataArea_saleNumber) <- c("area","saleNumber")

#合并各区域销售金额
quartDataArea_saleMoney <- tapply(quartData$saleMoney,quartData$area,sum)
#将分组后的键、值放入table中
quartDataArea_saleMoney <- as.data.frame.table(quartDataArea_saleMoney)
#重命名table的数据
names(quartDataArea_saleMoney) <- c("area","saleMoney")

#将合并后的销售数量、销售金额合并成获取季度数据
quartDataArea <- cbind(quartDataArea_saleMoney,quartDataArea_saleNumber$saleNumber)
names(quartDataArea)[3] <- "saleNumber"

quartDataArea$area <- as.character(quartDataArea$area)


#------------------------------------------------
#按照汽车销售量、融资总额将各区域排名
#------------------------------------------------
#按照销售金额、数量排序
quartMoneyArea <- quartDataArea[order(quartDataArea$saleMoney,decreasing = TRUE),] 
quartMoneyArea$seq <- c(1:nrow(quartMoneyArea))

quartNumberArea <- quartDataArea[order(quartDataArea$saleNumber,decreasing = TRUE),] 
quartNumberArea$seq <- c(1:nrow(quartMoneyArea))


#------------------------------------------------
#将第一季度的数据合并,
#得到第一季度全国汽车销售总量、融资总额
#------------------------------------------------
#合并全国每月的销售数量
quartDataChina_saleNumber <- tapply(quartData$saleNumber,quartData$month,sum)
#将分组后的键、值放入table中
quartDataChina_saleNumber <- as.data.frame.table(quartDataChina_saleNumber)
#重命名table的数据
names(quartDataChina_saleNumber) <- c("month","saleNumber")

#合并全国每月的销售金额
quartDataChina_saleMoney <- tapply(quartData$saleMoney,quartData$month,sum)
#将分组后的键、值放入table中
quartDataChina_saleMoney <- as.data.frame.table(quartDataChina_saleMoney)
#重命名table的数据
names(quartDataChina_saleMoney) <- c("month","saleMoney")

#将合并后的销售数量、销售金额合并成获取季度数据
quartDataChina <- cbind(quartDataChina_saleMoney,quartDataChina_saleNumber$saleNumber)
names(quartDataChina)[3] <- "saleNumber"

quartDataChina$month <- as.character(quartDataChina$month)



#------------------------------------------------
#按照1~3月显示全国的销售数量、融资总额
#------------------------------------------------
#将1月、2月、3月作为因子排序
quartDataChina$month <- factor(quartDataChina$month,
                               labels = c("201701","201702","201703")
                               )


#按照销1月、2月、3月将全国的销售数量、融资总额排序
quartDataChina <- quartDataChina[order(quartDataChina$month,decreasing = FALSE),] 


#------------------------------------------------
#在一幅图中显示如下数据:
#每各区域第一季度汽车销售量排名、中位数
#每各区域第一季度总融资额排名、中位数
#全国第一季度销售数量趋势
#全国第一季度总融资额趋势
#------------------------------------------------

opar <- par(no.readonly = TRUE)


#将6幅图放在一起显示,
layout(matrix(c(1,2,3,4,5,5,6,6)  #对6幅图进行布局,放入矩阵中
      ,2,4,byrow = TRUE)          #矩阵是2行4列的,按照行进行排布
      ,widths = c(3,1,3,1)        #4列的宽度是3:1:3:1
      ,heights = c(1,1)           #两行的高度是1:1  
       )

#第1幅图:各区域销售金额排名
#问题:
#hist()是频率直方图,只能显示频率;
#barplot也不能按照顺序排序显示直方图;
#如何才能按销售金额顺序从左到右按顺序显示直方图呢?
barplot(rev(quartNumberArea$saleNumber),
        col=brewer.pal(20,"Set1"),rep(1,20),
        main="各区域第一季度汽车销售量排名(辆)"
)


#第2幅图:显示销售量中位数
quartNumberArea_mid<-as.numeric(summary(quartNumberArea$saleNumber)[3]) 
boxplot(quartNumberArea$saleNumber, main = quartNumberArea_mid)    


#第3幅图:各区域融资额排名
barplot(rev(quartMoneyArea$saleMoney),
        col=brewer.pal(20,"Set1"),rep(1,20),
        main="各区域第一季度总融资额排名(万元)"
)

#第4幅图:显示融资额中位数
quartMoneyArea_mid<-as.numeric(summary(quartMoneyArea$saleMoney)[3])   
boxplot(quartMoneyArea$saleMoney, main = quartMoneyArea_mid)      


#第5幅图:显示全国第一季度销售数量趋势
#问题:用泛型函数时,需要将“数值”向量转换成“字符” ?
quartDataChina_saleNumber <- as.character(quartDataChina$saleNumber) 


plot(quartDataChina$month               #X轴
     ,quartDataChina_saleNumber         #y轴(是字符)
     ,type="b"                          #点线相连
     ,lty=2                             #线的形状
     ,pch=1                             #点的形状
     ,main="全国第一季度销售数量趋势"   #标题
     ,xaxt="n"                          #隐藏X轴
     ,xlab="月份"                       #x轴名称
     ,ylab="销售数量(台)"             #y轴名称
     )

axis(1                                  #x轴
     ,at= quartDataChina$month          #x轴刻度是月份向量
     ,labels= quartDataChina$month      #x轴刻度描述是月份
     )

#在点上进行标注
text(quartDataChina$month               
     ,quartDataChina$saleNumber
     ,labels = quartDataChina$saleNumber
     ,cex = 0.6
     ,pos = 4
)


#第6幅图:显示全国第一季度总融资额趋势
quartDataChina_saleMoney <- as.character(quartDataChina$saleMoney) 

plot(quartDataChina$month               #X轴
     ,quartDataChina_saleMoney          #y轴
     ,type="b"                          #点线相连
     ,lty=2                             #线的形状
     ,pch=1                             #点的形状
     ,main="全国第一季度总融资额趋势"   #标题
     ,xaxt="n"                          #隐藏X轴
     ,xlab="月份"                       #x轴名称
     ,ylab="融资额(万元)"             #y轴名称
)

axis(1                                  #x轴
     ,at= quartDataChina$month          #x轴刻度是月份向量
     ,labels= quartDataChina$month      #x轴刻度描述是月份
)

#在点上进行标注
text(quartDataChina$month               
     ,quartDataChina$saleMoney
     ,labels = quartDataChina$saleMoney
     ,cex = 0.6
     ,pos = 4
)

par(opar)

六、知识小贴士
用factor对数据框中的数据分类、排序时,不能使用level,而只需要按照顺序写入到labels中就可以了。
将因子按照顺序写入到labels中,可以正常排序:





若加入level字段反而不能排序了:


七、疑问

关于直方图排序、泛型函数plot()的这两个问题已在文中用粗体下划线标出,请大侠帮忙解答。谢谢!

编辑于 2017-05-06