共计 2746 个字符,预计需要花费 7 分钟才能阅读完成。
文章和代码曾经归档至【Github 仓库:https://github.com/timerring/dive-into-AI】或者公众号【AIShareLab】回复 R 语言 也可获取。
在剖析之前,先将数据集 birthwt 中的分类变量 low、race、smoke、ht 和 ui 转换成因子。
library(MASS)
data(birthwt)
str(birthwt)
options(warn=-1)
library(dplyr)
birthwt <- birthwt %>%
mutate(low = factor(low, labels = c("no", "yes")),
race = factor(race, labels = c("white", "black", "other")),
smoke = factor(smoke, labels = c("no", "yes")),
ht = factor(ht, labels = c("no", "yes")),
ui = factor(ui, labels = c("no", "yes")))
str(birthwt)
获取数据框里每个变量的罕用统计量是一种疾速摸索数据集的办法,这能够通过上面的一个命令实现。
summary(birthwt)
函数 summary() 能够对每个变量进行汇总统计。对于数值型变量,如 age、lwt、plt、ftv 和 bwt,函数 summary() 给出最小值、下四分位数、中位数、均值、上四分位数和最大值;对于分类变量,如 low、race、smoke、ht 和 ui,给出的则是频数统计表。
epiDisplay 包的函数 summ() 作用于数据框能够失去另一种格局的汇总输入,它将变量按行排列,把最小值和最大值放在最初两列以不便查看数据的全距。
library(epiDisplay)
summ(birthwt)
须要留神的是,对于因子型的变量,函数 summ() 把变量的各个程度当作数值计算统计量。
数值型变量的描述性统计分析
本节将探讨数值型变量的集中趋势、离散水平和散布形态等。这里咱们关注 3 个连续型变量:年龄(age)、母亲怀孕前体重(lwt)和婴儿出世时体重(bwt)。
cont.vars <- dplyr::select(birthwt, age, lwt, bwt)
接下来,先计算这 3 个变量的描述性统计量,而后依照母亲吸烟状况(smoke)分组考查描述性统计量。这里 smoke 是一个二分类变量,咱们在把它转换成因子时曾经为其两个程度定义了标签:“no”和“yes”。
除了下面提到的函数 summary(),R 中还有很多用于计算特定统计量的函数(见第二章)。例如,计算变量 age 的样本量、样本均值和样本标准差:
length(cont.vars$age)
mean(cont.vars$age)
sd(cont.vars$age)
咱们还能够用函数 sapply() 同时计算数据框中多个变量的指定统计量。例如,计算数据框 cont.vars 中各个变量的样本标准差:
sapply(cont.vars, sd)
根本包中没有提供计算偏度和峰度的函数,咱们能够依据公式本人计算,也能够调用其余包里的函数计算,例如 Hmisc 包、psych 包和 pstecs 包等。这些包提供了品种繁多的计算统计量的函数,这几个包在首次应用前须要先装置。上面以 psych 包为例进行阐明。psych 包被广泛应用于计量心理学。
psych 包里的函数 describe() 能够计算变量疏忽缺失值后的样本量、均值、标准差、中位数、截尾均值、相对中位差、最小值、最大值、全距、偏度、峰度和均值的规范误等。
例如:
R.Version()
library(psych)
describe(cont.vars)
在很多时候咱们还想计算某个分类变量各个类别下的统计量。在 R 中实现这个工作有多种形式,上面先从根本包的函数 aggregate() 和 tapply() 开始介绍。
aggregate(cont.vars, by = list(smoke = birthwt$smoke), mean)
aggregate(cont.vars, by = list(smoke = birthwt$smoke), sd)
函数 aggregate() 中的参数 by 必须设为 list。如果间接应用 list(birthwt$smoke),则下面分组列的名称将会是“Group.1”而不是“smoke”。咱们还能够在 list 外面设置多个分类变量,例如:
aggregate(cont.vars,
by = list(smoke = birthwt$smoke, race = birthwt$race),
mean)
这里的分类变量有 2 个,其中 smoke 有 2 个类别,race 有 3 个类别,下面的命令依照这两个变量各类别的所有组合(共 6 组)计算均值。
当然,你也能够应用上面任一形式写:
aggregate(birthwt[,c("age","lwt","bwt")],
by = list(smoke = birthwt$smoke, race = birthwt$race),
mean)
aggregate(cbind(age, lwt, bwt)~smoke+race, birthwt, mean)
函数 tapply() 能够实现相似的性能,不同的是它的第一个参数必须是一个变量,第二个参数名是 INDEX 而不是 by。例如,计算变量 bwt 在母亲不同吸烟状况下的均值,能够输出:
tapply(birthwt$bwt, INDEX = birthwt$smoke, mean)
# no 3055.69565217391 yes 2771.91891891892
epiDisplay 包里的函数 summ() 也能够实现相似的性能,不同的是该函数里的统计量是固定的,而且函数的输入蕴含一个依照分类变量绘制的有序点图,如下图所示。
summ(birthwt$bwt, by = birthwt$smoke)
用函数 summ() 输入的有序点图摸索数值型变量的散布尤其是数据的密集趋势和异样值十分不便。
psych 包里的函数 describeBy() 也能够分组计算与函数 describe() 雷同的统计量,例如:
describeBy(cont.vars, birthwt$smoke)
函数 describeBy() 尽管很不便,但它不能指定任意函数,所以扩展性较差。实际上,在第 3 章介绍的 dplyr 包里的函数 group_by() 和 summarise() 就能非常灵活地计算分组统计量。例如:
library(dplyr)
birthwt %>%
group_by(smoke) %>%
summarise(Mean.bwt = mean(bwt), Sd.bwt = sd(bwt))
数据分析者能够抉择本人最习惯的形式计算和展现描述性统计量。最初一种形式的思路最清晰,后果最简洁。