R语言系统教程(七):数据的分布

  • 7.1 分布函数
  • 7.2 直方图、经验分布图与QQ图
    • 7.2.1 直方图
    • 7.2.2 核密度估计函数
    • 7.2.3 经验分布
    • 7.2.4 QQ图
  • 7.3 茎叶图、箱线图及五数总括
    • 7.3.1 茎叶图
    • 7.3.2 箱线图
    • 7.3.3 五数总括
  • 7.4 正态性检验与分布拟合检验
    • 7.4.1 正态W检验方法
    • 7.4.2 KS检验

数据的数字特征刻画了数据的主要特征,而要对数据的总体情况做全面的描述,就要研究数据的分布。

7.1 分布函数

在概率论中,大家已经学到了很多分布,也了解到了分布函数的定义,由于本篇不是概率论教程,因此这里不再赘述各种分布的定义。
R语言中提供了很多调用各种分布的函数,以正态分布为例:
主要有
dnorm(x, mean=0, sd=1, log = FALSE)
pnorm(q, mean=0, sd=1, lower.tail = TRUE, log.p = FALSE)
qnorm(p, mean=0, sd=1, lower.tail = TRUE, log.p = FALSE)
rnorm(n, mean=0, sd=1)
其中x,q是由数值型变量构成的向量,p是概率构成的向量,n是产生随机数的个数,mean是所计算正态分布的期望,默认为0,sd是所计算正态分布的标准差,默认为1,函数dnorm()的返回值是正态分布density函数,函数pnorm()返回的是其分布函数,qnorm()返回其quantile函数,rnorm()用来产生满足正态分布的随机数向量。
log和log.p是逻辑变量,为真时返回对数正态分布,lower.tail是逻辑变量,为真时按通常定义计算,为FALSE时,F按1-F计算。
另外,可以看到函数名是由前缀加分布名组成的,其他分布函数也有类似结果,详情见下图:


其几个前缀的意义如下:

  • d:概率密度函数 f ( x ) f(x) f(x)
  • p:分布函数 F ( x ) F(x) F(x)
  • q:分位数函数 F − 1 ( x ) F^{-1}(x) F−1(x)
  • r:产生随机数

7.2 直方图、经验分布图与QQ图

7.2.1 直方图

R中用hist()函数绘制直方图,格式为
hist(x)

> data = rnorm(50)
> hist(data)


或者如果需要调整一些参数
hist(x, breaks = “Sturges”, freq = NULL, probability = !freq,
include.lowest = TRUE, right = TRUE,
density = NULL, angle = 45, col = NULL, border = NULL,
main = paste(“Histogram of” , xname),
xlim = range(breaks), ylim = NULL,
xlab = xname, ylab,
axes = TRUE, plot = TRUE, labels = FALSE,
nclass = NULL, …)
其中x是由样本构成的向量;
参数breaks规定直方图的组距,由以下几种形式给出(参考资料中对此部分参数的说明有所偏差,可能是版本更新的原因):

  1. 向量,直接给出各个breakpoints
> hist(data, breaks = seq(-5,5,0.2))


注意:区间应包含所有数据,不然会报错

  1. 数,给出区间的个数
> hist(data, breaks = 15)

  1. 字符串,给出产生区间的方法,细节见官方文档

参数freq为逻辑变量;为TRUE时绘制频数直方图,为FALSE绘制频率密度直方图(区域面积之和为1)

> hist(data, freq = TRUE)

> hist(data, freq = FALSE)


参数probability也是逻辑变量,含义与freq正相反。
参数col表示直方图中填充的颜色,参数plot是逻辑变量,TRUE表示给出直方图,FALSE表示只给出绘制直方图的各种结果,而不绘图,其他参数见官方文档

7.2.2 核密度估计函数

与直方图配套的是核密度估计函数(原理见非参估计),其目的是用已知样本估计其密度,函数声明如下:
density(x, bw = “nrd0”, adjust = 1,
kernel = c(“gaussian”, “epanechnikov”, “rectangular”,
“triangular”, “biweight”, “cosine”, “optcosine”),
window = kernel, width,
give.Rkern = FALSE,
n = 512, from, to, cut = 3, na.rm = FALSE)
其中x是由样本组成的向量,bw为选择带宽的方法,bw默认得到光滑的曲线。
注意:作者测试时density()不起作用,原因未知,实际使用的是density.default()函数

> w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0)
> hist(w, freq = FALSE)
> lines(density.default(w), col = "blue")
> x <- 44:76
> lines(x, dnorm(x, mean(w), sd(w)), col = "red")

7.2.3 经验分布

对于一般的总体分布,若要估计它的总体分布函数,可用经验分布函数,R中可用ecdf()绘制样本的经验分布函数。

> plot(ecdf(w),verticals = TRUE, do.p = FALSE)
> x <- 44:78
> lines(x, pnorm(x, mean(w), sd(w)))

7.2.4 QQ图

QQ图可以帮助我们鉴别样本的分布是否近似于某种类型的分布,R语言中,函数qqnorm(),qqline()提供了画正态QQ图和相应直线的方法,声明如下:
qqnorm(y, …)
qqnorm(y, ylim, main = “Normal Q-Q Plot”,
xlab = “Theoretical Quantiles”,
ylab = “Sample Quantiles”, plot.it = TRUE,
datax = FALSE, … )

qqline(y, datax = FALSE, … )

qqplot(x, y, plot.it = TRUE, xlab = deparse(substitute(x)),
ylab = deparse(substitute(y)), … )
其中x是第一列样本,y是第二列样本或只有此列样本,其它参数见官方文档

> w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0)
> qqnorm(w)
> qqline(w)

7.3 茎叶图、箱线图及五数总括

7.3.1 茎叶图

与直方图相比,茎叶图能更细致的看出数据分布的结构,R中使用stem()绘制数据茎叶图

> x<-c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75, 78, 79, 81, 83, 84, 84, 84, 85, 86, 86, 86,87, 89, 89, 89, 90, 91, 91, 92, 100)
> stem(x)The decimal point is 1 digit(s) to the right of the |2 | 53 | 4 | 55 | 0456 | 1487 | 255898 | 13444566679999 | 011210 | 0

函数stem()声明如下:
stem(x, scale = 1, width = 80, atom = 1e-08)
其中x是数据向量,scale控制茎叶图长度,width控制宽度,atom是容差。

> stem(x, scale = 2)The decimal point is 1 digit(s) to the right of the |2 | 53 | 3 | 4 | 4 | 55 | 045 | 56 | 146 | 87 | 27 | 55898 | 134448 | 566679999 | 01129 | 10 | 0
> stem(x, scale = 0.5)The decimal point is 1 digit(s) to the right of the |2 | 54 | 50456 | 148255898 | 1344456667999011210 | 0

7.3.2 箱线图

箱线图可以直观简洁的展现数据分布的主要特征,R中使用boxplot()函数

> boxplot(x)
Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) :display list redraw incomplete
2: In doTryCatch(return(expr), name, parentenv, handler) :invalid graphics state
3: In doTryCatch(return(expr), name, parentenv, handler) :invalid graphics state

boxplot()函数的使用方法有三种形式:

  1. boxplot(x, …)
    其中x是由数据构成的数值型向量,或者列表,或数据框。
  2. boxplot(formula, data = NULL, …, subset, na.action = NULL)
    其中formula为公式,如y ~ grp,这里y是由数据构成的数值型向量,grp是数据分组,通常为因子,data是数据结构。
  3. boxplot(x, …, range = 1.5, width = NULL, varwidth = FALSE,
    notch = FALSE, outline = TRUE, names, plot = TRUE,
    border = par(“fg”), col = NULL, log = “”,
    pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5),
    horizontal = FALSE, add = FALSE, at = NULL)
    其中x与第一种意义相同,range为范围,notch为逻辑变量,当notch为TRUE时,画出的箱型线带有切口;outline也为逻辑变量,当其为FALSE时,不标明异常值点,col为颜色变量,用以绘制不同颜色的箱线图,当horiontal为TURE时,将绘制水平箱线图,add为逻辑变量,为TRUE时将在原图上绘制,否则替换为新图;其他参数见官方文档
> A <- c(79.98, 80.04, 80.02, 80.04, 80.03, 80.03, 80.04, 79.97, 80.05, 80.03, 80.02, 80.00, 80.02)
> B <- c(80.02, 79.94, 79.98, 79.97, 79.97, 80.03, 79.95, 79.97)
> boxplot(A, B, notch=T, names=c('A', 'B'), col = c(2,3))
Warning message:
In bxp(list(stats = c(80, 80.02, 80.03, 80.04, 80.05, 79.94, 79.96,  :一些槽在折叶点外('box'): 可能是因为notch=FALSE

使用InsectSprays数据集绘制下例:

> boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
> boxplot(count ~ spray, data = InsectSprays, notch = TRUE, col = 2:7, add = T)
Warning message:
In bxp(list(stats = c(7, 11, 14, 18.5, 23, 7, 12, 16.5, 18, 21,  :一些槽在折叶点外('box'): 可能是因为notch=FALSE

7.3.3 五数总括

使用fivenum()函数返回样本的五数总括,函数声明如下:
fivenum(x, na.rm = TRUE)

> x<-c(25, 45, 50, 54, 55, 61, 64, 68, 72, 75, 75, 78, 79, 81, 83, 84, 84, 84, 85, 86, 86, 86, 87, 89, 89, 89, 90, 91, 91, 92, 100)
> fivenum(x)
[1]  25  70  84  88 100

7.4 正态性检验与分布拟合检验

7.4.1 正态W检验方法

使用Shapiro-Wilk统计量做正态性检验,R中提供了函数shapiro.test()

> w <- c(75.0, 64.0, 47.4, 66.9, 62.2, 62.2, 58.7, 63.5, 66.6, 64.0, 57.0, 69.0, 56.9, 50.0, 72.0)
> shapiro.test(w)Shapiro-Wilk normality testdata:  w
W = 0.96862, p-value = 0.8371

7.4.2 KS检验

Kolmogorov-Smirnov检验方法,R中提供了ks.test()函数,其声明如下:
ks.test(x, y, …,
alternative = c(“two.sided”, “less”, “greater”),
exact = NULL)

> set.seed(1)
> x<-rt(100,5)
> ks.test(x, "pf",2,5)One-sample Kolmogorov-Smirnov testdata:  x
D = 0.63749, p-value < 2.2e-16
alternative hypothesis: two-sided

R语言系统教程(七):数据的分布(含多种图的绘制)相关推荐

  1. R语言系统教程(三):多维数组和矩阵

    R语言系统教程(三):多维数组和矩阵 3.1 生成数组或矩阵 3.1.1 将向量定义为数组 3.1.2 用array()函数构造多维数组 3.1.3 用matrix()函数构造矩阵 3.2 数组下标 ...

  2. r语言 转录本结构及丰度_桑基图的绘制核心微生物组分类学及丰度展示

    为什么要用桑基图 桑基图 (Sankey diagram)是一种展现数据之间流动和相互关系的图像,类似于一种网络图,通过不同层级节点之间的连接以及连接边的宽度,展示数据之间的流动关系. 在微生物群落分 ...

  3. 《量化金融R语言初级教程》一1.1 使用时间序列数据

    本节书摘来异步社区<量化金融R语言初级教程>一书中的第1章,第1.1节,作者: [匈牙利]Gergely Daróczi(盖尔盖伊) , 等 译者: 高蓉 , 李茂 责编: 胡俊英,更多章 ...

  4. R语言ggplot2可视化:可视化箱图、在箱图中添加抖动数据点(Dot + Box Plot)、自定义抖动数据点的大小、颜色、数据点分布在箱图中间、添加主标题、副标题、题注信息

    R语言ggplot2可视化:可视化箱图.在箱图中添加抖动数据点(Dot + Box Plot).自定义抖动数据点的大小.颜色.数据点分布在箱图中间.添加主标题.副标题.题注信息 目录

  5. R语言使用dbern函数生成伯努利分布(0-1分布)密度数据、使用plot函数可视化伯努利分布密度数据( Bernoulli distribution)

    R语言使用dbern函数生成伯努利分布(0-1分布)密度数据.使用plot函数可视化伯努利分布密度数据( Bernoulli distribution) 目录

  6. 《量化金融R语言初级教程》一2.3 使用真实数据

    本节书摘来异步社区<量化金融R语言初级教程>一书中的第2章,第2.3节,作者: [匈牙利]Gergely Daróczi(盖尔盖伊) , 等 译者: 高蓉 , 李茂 责编: 胡俊英,更多章 ...

  7. R语言使用pbern函数生成伯努利分布(0-1分布)累积分布函数数据、使用plot函数可视化伯努利分布累积分布函数数据( Bernoulli distribution)

    R语言使用pbern函数生成伯努利分布(0-1分布)累积分布函数数据.使用plot函数可视化伯努利分布累积分布函数数据( Bernoulli distribution) 目录

  8. 对英国房屋价格建模并预测 ---《量化金融R语言初级教程》

    时间序列分析 一.实验介绍 1.1 实验内容 时间序列分析研究的是按时间顺序收集的数据.相邻的观测数据通常相互依赖.因此,时间序列分析的技术需要处理这种相依性. 本章的目标是通过一些特定应用来介绍一些 ...

  9. 《量化金融R语言高级教程》一1.2 波动率建模

    本节书摘来异步社区<量化金融R语言高级教程>一书中的第1章,第1.2节,作者: [匈牙利]Edina Berlinger(艾迪娜•伯林格) , 等 译者: 高蓉 责编: 胡俊英,更多章节内 ...

最新文章

  1. 深入理解Java 8 Lambda表达式(Oracle官方文档版)
  2. 使用createrepo自建yum源
  3. 内核-程序员的顶级梦寐
  4. ElementUI的el-form表单验证报错[Element Warn][Form]model is required for validate to work!
  5. 计算机基础access数据库操作题,2021年3月全国计算机等级考试二级Access数据库程序设计题库及答案讲解...
  6. Halcon学习笔记:select_points_object_model_3d(3D对象模型阀值分割)
  7. hbase1.1.1 连接集群_Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos
  8. 【IT】IT专业术语
  9. mysql+order+in索引吗_mysql – 为什么ORDER BY不使用索引?
  10. mvc php 分页,MVC+jQuery.Ajax异步实现增删改查和分页_jquery
  11. 数字电视加密技术工作原理(EMM ECM)
  12. 计算机中常用的数学知识
  13. AI修图!pix2pix网络介绍与tensorflow实现
  14. 商贸批发进销存管理软件,仓库条码管理,库存管理。采购入库单,供应商档案管理。
  15. 关于 Kubernetes中NetworkPolicy(网络策略)方面的一些笔记
  16. Win7环境安装Anaconda
  17. NLP系列 2.特征提取
  18. MySQL不会丢失数据的秘密,就藏在它的 7种日志里
  19. 微服务 撮合引擎 撮合微服务搭建 案例 4
  20. 分析函数入门sum...over(partition by xxx order by yyy rows between zzz)

热门文章

  1. 疫情之下,想成为刘畊宏那样的强者,你必须三不乱
  2. C语言 | while语句
  3. java实现频繁项集_java实现Apriori算法——频繁项集的计算
  4. mysql 留存率_留存率的几种主流计算方法(转)
  5. jsp学习(六.MVC模式)
  6. ElasticSearch collapse搜索时出现:only keywords and numbers are accepted
  7. html语言怎么改变文字大小,如何设置css中字体大小?
  8. #input框#默认样式#:怎么修改点击之后的边框的样式
  9. ef core select选择实体中的部分数据
  10. CRM七天无跟进自动退回公海功能的实现