0
点赞
收藏
分享

微信扫一扫

R语言学习笔记 04-2画图 boxplot箱线图的具体计算例子

云岭逸人 2022-05-01 阅读 28

R语言学习笔记


提示:本文数据rate2019.sav已上传到资源

文章目录


箱线图

setwd("E:/00大三/201风险建模的统计方法/220308")	#数据路径,需更改!!!
install.packages("readr")  #安装包

library(Hmisc)#加载包
library(readr)#加载包

#===========================导入数据===2019===========================================
SAV.rate2019<-spss.get("rate2019.sav")	#导入数据,标签。需要加载Hmisc包。
ls(SAV.rate2019)	#看变量名
attach(SAV.rate2019)
describe(region1)	#描述统计。需要加载Hmisc包。其他类似函数有summary(length、class和mode),list(列出全部),head(列出前几个)


#======================================求四分位点======================================

##结果储存的准备工作
name.row<-c(" ","25%分位点","中位数","75%分位点" ," ")	#结果的行名称
name.col<-c("Type1","Type2","Type3","Type4","Type5","Type6","Type7","Type8","Type9","Fivenum","Boxplot")	#结果的列名称,不能用中文,可能会错(如何能正确输出欸?)
list.name<-list(name.row,name.col)	#由行名称、列名称组成的列表
NUM.row<-5	#


##EC, East Asia & Pacific  
data.EC<-subset(SAV.rate2019,region1=="EC")	#数据取子集 筛选数据
result.EC<-matrix(data=NA,nrow=5,ncol=11,byrow=FALSE,dimnames = list.name)	#用于存储结果,5行11列,按列填充
for(i in 1:9){ result.EC[,i]<-quantile(data.EC$rate2019,probs=c(0,0.25,0.5,0.75,1),type=i)}	#循环,得出5×9个数值,9个quantile的结果
result.EC[,10]<-fivenum(data.EC$rate2019)	#第10列是五数fivenum的结果
result.EC[,11]<-boxplot(data.EC$rate2019)$stats#第11列是箱线图的结果
?quantile

##EP,Europe & Central Asia		#后续三个都和EC相同方法
data.EP<-subset(SAV.rate2019,region1=="EP")	#数据取子集 筛选数据
result.EP<-matrix(data=NA,nrow=5,ncol=11,byrow=FALSE,dimnames = list.name)	#用于存储结果,5行11列,按列填充
for(i in 1:9){ result.EP[,i]<-quantile(data.EP$rate2019,preb=c(0,0.25,0.5,0.75,1),type=i)}	#循环,得出5×9个数值
result.EP[,10]<-fivenum(data.EP$rate2019)		#第10列是五数fivenum的结果
result.EP[,11]<-boxplot(data.EP$rate2019)$stats	#第11列是箱线图的结果

##LC,Latin America & Caribbean
data.LC<-subset(SAV.rate2019,region1=="LC")	#数据取子集 筛选数据
result.LC<-matrix(data=NA,nrow=5,ncol=11,byrow=FALSE,dimnames = list.name)	#用于存储结果,5行11列,按列填充
for(i in 1:9){ result.LC[,i]<-quantile(data.LC$rate2019,preb=c(0,0.25,0.5,0.75,1),type=i)}	#循环,得出5×9个数值
result.LC[,10]<-fivenum(data.LC$rate2019)		#第10列是五数fivenum的结果
result.LC[,11]<-boxplot(data.LC$rate2019)$stats	#第11列是箱线图的结果

##MN,Middle East & North Africa
data.MN<-subset(SAV.rate2019,region1=="MN")	#数据取子集 筛选数据
result.MN<-matrix(data=NA,nrow=5,ncol=11,byrow=FALSE,dimnames = list.name)	#用于存储结果,5行11列,按列填充
for(i in 1:9){ result.MN[,i]<-quantile(data.MN$rate2019,preb=c(0,0.25,0.5,0.75,1),type=i)}	#循环,得出5×9个数值
result.MN[,10]<-fivenum(data.MN$rate2019)		#第10列是五数fivenum的结果
result.MN[,11]<-boxplot(data.MN$rate2019)$stats	#第11列是箱线图的结果



#======================================结果======================================
list.RESULT<-list(EC=result.EC,EP=result.EP,LC=result.LC,MN=result.MN)	#汇总结果
list.RESULT



#======================================结果导出======================================
##结果导出到csv文件"作业结果1.csv"
write.csv(list.RESULT[[1]],file="EC.csv")	#但结果是一长行,没办法整成一个漂亮的方块,于是尝试使用另一方法
write.csv(list.RESULT[[2]],file="EP.csv")
##另一方法,导出到"作业结果2.csv"
#需要加载readr包
RE.EC<-data.frame(result.EC)	#矩阵转成data.frame
RE.EP<-data.frame(result.EP)
RE.LC<-data.frame(result.LC)
RE.MN<-data.frame(result.MN)

rep("EC",5) 
write_csv(RE.EC,file="作业结果2.csv",col_names=T)		#这个函数的问题,一是显示不了行名,二是没办法写入汉字→所以没办法写入空行,顶多写入一行0。
write_csv(RE.EP,file="作业结果2.csv",append = TRUE)	#所以这两列会有点分不清,令人难过
write_csv(RE.LC,file="作业结果2.csv",append = TRUE)	#而且必须是data.frame
write_csv(RE.MN,file="作业结果2.csv",append = TRUE)	#难道就没有好看的函数了吗!

#============检验前10列哪一种方法的的四分位点==和boxplot的相同===============================
a<-c(1:4)*0	#结果储存在a里面

for(i in 1:10)
{
	if(result.EC[2,i]==result.EC[2,11]  &  result.EC[3,i]==result.EC[3,11]	&  result.EC[4,i]==result.EC[4,11]){
		a[1]=i}
}	#EC

for(i in 1:10)
{
	if(result.EP[2,i]==result.EP[2,11]  &  result.EP[3,i]==result.EP[3,11]	&  result.EP[4,i]==result.EP[4,11])
		a[2]=i
}	#EP

for(i in 1:10)
{
	if(result.LC[2,i]==result.LC[2,11]  &  result.LC[3,i]==result.LC[3,11]	&  result.LC[4,i]==result.LC[4,11])
		a[3]=i
}	#LC

for(i in 1:10)
{
	if(result.MN[2,i]==result.MN[2,11]  &  result.MN[3,i]==result.MN[3,11]	&  result.MN[4,i]==result.MN[4,11])
		a[4]=i
}	#MN

a	#结果,分别代表EC、EP、LC、MN
#都是第10列和第11列的四分位数,也就是fivenum列和boxplot的四分位数相同


#===========================计算==异常值点===上下触须极值===============================
#使用fivenum结果(fivenum结果存储在第10列,第二行为25%,第三行50%,第四行75%)

name.row.extre<-c("EC","EP","LC","MMN")	#上下触须行名称
name.col.extre<-c("LOW","UP")		#上下触须列名称
list.name.extre<-list(name.row.extre,name.col.extre)	#由行名称、列名称组成的列表

RESULT.extre<-matrix(data=NA,nrow=4,ncol=2,byrow=FALSE,dimnames = list.name.extre)	#用于储存上下触须极值的4×2矩阵

#=====EC==========
attach(data.EC)
IQR<-result.EC[4,10]-result.EC[2,10]
max<-max(rate2019)	#最大值
min<-min(rate2019)	#最小值
up<-result.EC[4,10]+1.5*IQR	#判断上界
low<-result.EC[2,10]-1.5*IQR	#判断下界


if(up >= max & low <= min){
	print("无异常值")
	RESULT.extre[1,1]=min
	RESULT.extre[1,2]=max
}else{
	newdata<-rate2019[	rate2019<=min(max,up)	&	 rate2019>=max(min,low)] 	#这是去掉异常值之后的数据	
	RESULT.extre[1,1]=min(newdata)	#第一行是EC,第一列是下触须
	RESULT.extre[1,2]=max(newdata) 		  #第二列是上触须
	out.EC<-rate2019[		rate2019>min(max,up)	|	 rate2019<max(min,low)] 	#异常值
	}
rrr<-rate2019[order(rate2019,decreasing=F),]
match(rate2019[rate2019>up|rate2019<low] ,rate2019)	#这个是输出异常值点在第几个位置,但是需要排序
detach(data.EC)

?match
#=====EP==========
attach(data.EP)
IQR<-result.EP[4,10]-result.EP[2,10]
max<-max(rate2019)	#最大值
min<-min(rate2019)	#最小值
up<-result.EP[4,10]+1.5*IQR	#判断上界
low<-result.EP[2,10]-1.5*IQR	#判断下界


if(up >= max & low <= min){
	print("无异常值")
	RESULT.extre[2,1]=min
	RESULT.extre[2,2]=max
	out.EP<-NA
}else{
	newdata<-rate2019[	rate2019<=min(max,up)	&	 rate2019>=max(min,low)] 	#这是去掉异常值之后的数据	
	RESULT.extre[2,1]=min(newdata)	#第二行是EP,第一列是下触须
	RESULT.extre[2,2]=max(newdata)		   #第二列是上触须
	out.EP<-rate2019[		rate2019>min(max,up)	|	 rate2019<max(min,low)] 	#异常值
	}
detach(data.EP)

#=====LC==========
attach(data.LC)
IQR<-result.EC[4,10]-result.EC[2,10]
max<-max(rate2019)	#最大值
min<-min(rate2019)	#最小值
up<-result.LC[4,10]+1.5*IQR	#判断上界
low<-result.LC[2,10]-1.5*IQR	#判断下界


if(up >= max & low <= min){
	print("无异常值")
	RESULT.extre[3,1]=min
	RESULT.extre[3,2]=max
}else{
	newdata<-rate2019[	rate2019<=min(max,up)	&	 rate2019>=max(min,low)] 	#这是去掉异常值之后的数据	
	RESULT.extre[3,1]=min(newdata)	#第三行是LC,第一列是下触须
	RESULT.extre[3,2]=max(newdata)		   #第二列是上触须
	out.LC<-rate2019[		rate2019>min(max,up)	|	 rate2019<max(min,low)] 	#异常值
	}
detach(data.LC)

#=====MN==========
attach(data.MN)
IQR<-result.EC[4,10]-result.EC[2,10]
max<-max(rate2019)	#最大值
min<-min(rate2019)	#最小值
up<-result.MN[4,10]+1.5*IQR	#判断上界
low<-result.MN[2,10]-1.5*IQR	#判断下界


if(up >= max & low <= min){
	print("无异常值")
	RESULT.extre[4,1]=min
	RESULT.extre[4,2]=max
}else{
	newdata<-rate2019[	rate2019<=min(max,up)	&	 rate2019>=max(min,low)] 	#这是去掉异常值之后的数据	
	RESULT.extre[4,1]=min(newdata)	#第四行是MN,第一列是下触须
	RESULT.extre[4,2]=max(newdata)		   #第二列是上触须
	out.MN<-rate2019[		rate2019>min(max,up)	|	 rate2019<max(min,low)] 	#异常值
	}
detach(data.MN)


RE.extre<-data.frame(RESULT.extre)	#上下触须的结果 转为数据框,用于写入之前的"作业结果2.csv"	 
write_csv(RE.extre,file="作业结果2.csv",append = TRUE)	#不知道为啥标题写不进去,就反正,四行分别是EC、EP、LC、MN,第一列是下触须,第二列是上触须

#*****异常值写入数据*****
list.out<-list(EC=out.EC,EP=out.EP,LC=out.LC,MN=out.MN)	#这是所有的异常值,现在要努力把它转成data.frame从而写入csv
max.length<-0	#用于储存最多的那个异常值的个数,从而生成矩阵
for(i in 1:4){
	l=length(list.out[[i]])
	if(max.length<l)max.length=l
	}

#****先转为矩阵
RESULT.out<-matrix(data=NA,nrow=4,ncol=max.length,byrow=FALSE)	#用于储存异常值的4×m矩阵,m=max.length
for(i in 1:4){
	j<-length(list.out[[i]])	#j是第i行的长度
	RESULT.out[i,1:j]=unlist(list.out[[i]])	#必须加1:j,不然报错“ 被替换的项目不是替换值长度的倍数”
}
#****转为数据框并写入
RE.out<-data.frame(RESULT.out)	#上下触须的结果 转为数据框,用于写入之前的"作业结果2.csv"	 
write_csv(RE.out,file="作业结果2.csv",append = TRUE)	#四行分别是EC、EP、LC、MN


par(mfrow=c(2,2))		#2行2列显示
boxplot(data.EC$rate2019,main="EC")	#画箱线图
boxplot(data.EP$rate2019,main="EP")
boxplot(data.LC$rate2019,main="LC")
boxplot(data.MN$rate2019,main="MN")
举报

相关推荐

0 条评论