R语言统计与绘图:绘制QQ图

您所在的位置:网站首页 r语言qqline R语言统计与绘图:绘制QQ图

R语言统计与绘图:绘制QQ图

2023-05-07 06:23| 来源: 网络整理| 查看: 265

QQ图一般用来比较两组数字的分布,比如两个变量或两个向量。

在国外,顾客习惯性会给服用人员小费,给多少小费是一个经常被讨论的话题,今天使用的数据集为reshape2包的tips数据集,用来演示QQ图的绘制。

先来看看这个数据集:

1.加载数据集install.packages("reshape2") # 安装包library(reshape2) # 加载包attach(tips) # 绑定数据集head(tips) # 查看数据集前6行

数据集中有7个变量,主要用到tip变量。

2. 绘制密度图

数据集中有个tip变量(小费),我们先来看看tip变量的分布,比如说绘制个密度图。

plot(density(tip),  # 绘制密度图     main = "绘制tip变量的密度图",  # 添加标题     col = "blue", # 设置线的颜色     lwd = 2) # 设置线宽

从上图可以看出tip变量分布是不均匀的,图形右边有一条长长的尾巴,这表明,有些顾客给出的小费比较多,但大多数顾客的小费在2-4之间。

大多数统计分析方法都要求数据分布为正态分布,或接近正态分布。

为了演示tip变量分布与正态分布之间的差别,我们在同一画板上绘制图形。

具体操作:先使用rnorm()函数生成一组数字,这组数字命名为ran,然后绘制ran的密度图,并使用ploygon()函数绘制填充曲线,然后使用lines()函数在同一图上绘制tip变量的密度图。

ran = rnorm(1000000) # 生成一组随机数字plot(density(ran), # 绘制ran密度图     main = "tip密度图与正态分布之间的差异", # 设置图像标题     xlim = c(-4,10)) # 设置坐标轴范围polygon(density(ran), col = "burlywood") # 绘制填充曲线lines(density(tip),  # 添加曲线      col = "blue", # 设置曲线颜色      lwd = 2) # 设置曲线宽度

如上图所示,显示的信息比前面更多,但是毕竟这两组数字的均值不一致,所以图形重叠的不多,我们可以通过设置相关参数,来创建一个新的tip变量。

tip变量可以简单的方法转化为平均值为0,标准差为1的新变量newtip。

mean(tip) # 计算tip均值# [1] 2.998279sd(tip) # 计算tip标准差# [1] 1.383638newtip = (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) # 设置线宽

3. 绘制QQ图

还有其他方法也可以比较这两种分布,从而得到不同的图形。

首先计算下tip变量的摘要信息:

summary(tip)#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. #  1.000   2.000   2.900   2.998   3.562  10.000 

summary()函数会计算出tip变量的四分位间距,我们还可以通过quantile()函数计算变量的分位数。

比如说下面这个变量qtip可以计算tip变量0-1,每隔0.1的分位数结果。

qtip = quantile(tip, seq(0,1,.1))qtip# 0%    10%    20%    30%    40%    50%    60%    70%    80%    90%   100% # 1.000  1.500  2.000  2.000  2.476  2.900  3.016  3.480  4.000  5.000 10.000 

我们可以将tip变量的分位数与ran变量的分位数进行绘图,来确定这两个变量分布的一致性,因此这种图形也叫做分位数图或者QQ图。

下面来绘制图形,代码如下:

qtip2 = quantile(tip, seq(0,1,.005)) # 计算tip变量的分位数结果qqplot(ran, qtip2, #绘制QQ图       main = "QQ图", # 设置图形标题       xlim = c(-3,3),  # 设置x范围       col = "skyblue2") # 设置颜色qqline(qtip2, # 设置参考线       col = "burlywood", # 设置颜色       lwd = 2) # 设置线宽grid(lty = "dotted", # 设置网格     col = "gray75") # 设置颜色

如上图可以看出,即使tip变量中间大部分范围都接近于正态分布,但其两端仍相距甚远,这表明tip变量不接近正态分布,进行正态分布分析可能是不明智的。

如果你知道做了绘制QQ图的原理,那么你可以使用下面这个函数来快速制作QQ图,而不用创建分位数变量。

qqnorm(tip, # 绘制图形的变量       main = "快速绘制QQ plot", # 图形标题       col = "blue", # 设置颜色       ylab = "tip quantiles") # 设置y轴标签qqline(tip, # 设置参考线       col = "burlywood", # 设置颜色       lwd = 2) # 设置线宽grid(lty = "dotted", # 设置网格     col = "gray75") # 设置颜色

4. 对数转换

如前所述,tip变量不是正态分布的,我们可以通过转换来是数据达到正态分布,比如说对数变换。

logtip = log10(tip) # 设置对数转换qqnorm(logtip, # 绘图变量       main = "log10(tip)的QQ图",       col = "blue4") # 设置颜色qqline(logtip, # 设置参考线       col = "burlywood3", # 设置颜色       lwd = 2) # 设置线宽

参考资料

Graphing Data with R,John Jay Hilfiger著



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3