QQ图一般用来比较两组数字的分布,比如两个变量或两个向量。
在国外,顾客习惯性会给服用人员小费,给多少小费是一个经常被讨论的话题,今天使用的数据集为reshape2包的tips数据集,用来演示QQ图的绘制。
先来看看这个数据集:
1.加载数据集
library(reshape2)#加载包 attach(tips)#绑定数据集 head(tips)#查看数据集前6行install.packages("reshape2")#安装包
数据集中有7个变量,主要用到tip变量。
2. 绘制密度图
数据集中有个tip变量(小费),我们先来看看tip变量的分布,比如说绘制个密度图。
main="绘制tip变量的密度图",#添加标题 col="blue",#设置线的颜色 lwd=2)#设置线宽plot(density(tip),#绘制密度图
从上图可以看出tip变量分布是不均匀的,图形右边有一条长长的尾巴,这表明,有些顾客给出的小费比较多,但大多数顾客的小费在2-4之间。
大多数统计分析方法都要求数据分布为正态分布,或接近正态分布。
为了演示tip变量分布与正态分布之间的差别,我们在同一画板上绘制图形。
具体操作:先使用rnorm()函数生成一组数字,这组数字命名为ran,然后绘制ran的密度图,并使用ploygon()函数绘制填充曲线,然后使用lines()函数在同一图上绘制tip变量的密度图。
plot(density(ran),#绘制ran密度图 main="tip密度图与正态分布之间的差异",#设置图像标题 xlim=c(-4,10))#设置坐标轴范围 polygon(density(ran),col="burlywood")#绘制填充曲线 lines(density(tip),#添加曲线 col="blue",#设置曲线颜色 lwd=2)#设置曲线宽度ran=rnorm(1000000)#生成一组随机数字
如上图所示,显示的信息比前面更多,但是毕竟这两组数字的均值不一致,所以图形重叠的不多,我们可以通过设置相关参数,来创建一个新的tip变量。
tip变量可以简单的方法转化为平均值为0,标准差为1的新变量newtip。
#[1]2.998279 sd(tip)#计算tip标准差 #[1]1.383638 newtip=(tip-2.998)/1.384#创建新变量newtip plot(density(ran),#绘制正态分布图形 ylim=c(0,.48),#设置y范围 main="newtip变量与正态分布差异",#设置图形 xlim=c(-4,8))#设置x范围 polygon(density(ran),#设置填充曲线 col="burlywood")#设置颜色 lines(density(newtip),#添加曲线 col="blue",#设置曲线颜色 lwd=2)#设置线宽mean(tip)#计算tip均值
3. 绘制QQ图
还有其他方法也可以比较这两种分布,从而得到不同的图形。
首先计算下tip变量的摘要信息:
#Min.1stQu.MedianMean3rdQu.Max. #1.0002.0002.9002.9983.56210.000summary(tip)
summary()函数会计算出tip变量的四分位间距,我们还可以通过quantile()函数计算变量的分位数。
比如说下面这个变量qtip可以计算tip变量0-1,每隔0.1的分位数结果。
qtip #0%10%20%30%40%50%60%70%80%90%100% #1.0001.5002.0002.0002.4762.9003.0163.4804.0005.00010.000qtip=quantile(tip,seq(0,1,.1))
我们可以将tip变量的分位数与ran变量的分位数进行绘图,来确定这两个变量分布的一致性,因此这种图形也叫做分位数图或者QQ图。
下面来绘制图形,代码如下:
qqplot(ran,qtip2,#绘制QQ图 main="QQ图",#设置图形标题 xlim=c(-3,3),#设置x范围 col="skyblue2")#设置颜色 qqline(qtip2,#设置参考线 col="burlywood",#设置颜色 lwd=2)#设置线宽 grid(lty="dotted",#设置网格 col="gray75")#设置颜色qtip2=quantile(tip,seq(0,1,.005))#计算tip变量的分位数结果
如上图可以看出,即使tip变量中间大部分范围都接近于正态分布,但其两端仍相距甚远,这表明tip变量不接近正态分布,进行正态分布分析可能是不明智的。
如果你知道做了绘制QQ图的原理,那么你可以使用下面这个函数来快速制作QQ图,而不用创建分位数变量。
main="快速绘制QQplot",#图形标题 col="blue",#设置颜色 ylab="tipquantiles")#设置y轴标签 qqline(tip,#设置参考线 col="burlywood",#设置颜色 lwd=2)#设置线宽 grid(lty="dotted",#设置网格 col="gray75")#设置颜色qqnorm(tip,#绘制图形的变量
4. 对数转换
如前所述,tip变量不是正态分布的,我们可以通过转换来是数据达到正态分布,比如说对数变换。
qqnorm(logtip,#绘图变量 main="log10(tip)的QQ图", col="blue4")#设置颜色 qqline(logtip,#设置参考线 col="burlywood3",#设置颜色 lwd=2)#设置线宽logtip=log10(tip)#设置对数转换
参考资料
Graphing Data with R,John Jay Hilfiger著既往专辑
如果觉得《r语言做绘制精美pcoa图_R语言统计与绘图:绘制QQ图》对你有帮助,请点赞、收藏,并留下你的观点哦!