【R语言】数据分析
一、描述性统计量
借助R语言内置的airquality数据集进行简单地演示:
1、集中趋势:均值和中位数
head(airquality)
# 求集中趋势
mean(airquality$Ozone, na.rm=T) # 求均值
median(airquality$Ozone, na.rm=T) # 求中位数
2、众数
众数(mode)是指在一组数据中出现频率最高的值。尽管R语言本身没有直接提供计算众数的内置函数,但可以使用其他函数和方法来计算众数。
# 假设Temp是离散数据
which.max(table(airquality$Temp))
# 假设Temp是连续数据:density$x[which.max(density$y)]
Density <- density(airquality$Temp)
Density
3、离散趋势
# 先求极差:最大值-最小值
max(airquality$Ozone, na.rm=T) - min(airquality$Ozone, na.rm=T)
# 选取Ozone中所有非空元素组成的子集
Ozone.rm.na <- with(airquality, Ozone[is.na(Ozone)==F])
# 求平均差
sum(abs(Ozone.rm.na - mean(Ozone.rm.na))) / length(Ozone.rm.na)
# 求标准差
sd(airquality$Ozone, na.rm=T)
# 求方差
var(airquality$Ozone, na.rm=TRUE)
# 求变异系数
with(airquality, sd(Ozone, na.rm=T) / mean(Ozone, na.rm=T) * 100)
4、峰度和偏度
需要先安装moments扩展包。
library(moments)
kurtosis(airquality$Ozone, na.rm=T) # 峰度
skewness(airquality$Ozone, na.rm=T) # 偏度
5、百分位数
quantile(airquality$Ozone, probs=seq(0,1,by=0.1), na.rm=TRUE)
6、Turkey五数
最小值、25百分位数、中位数、75百分位数、最大值
fivenum(airquality$Ozone, na.rm=TRUE)
7、数量
length(airquality$Month)
table(airquality$Month)
8、算数截断平均数
mean()函数中有一个参数trim,当指定trim时(0~0.5的数),表示先在数据两端各自截断相应比例的最大值和最小值,再计算平均数,此平均数就叫算数截断平均数,它更能有效地代表数据的集中趋势。
mean(airquality$Ozone, na.rm=T, trim=0.2)
二、列联表
table()函数
使用table()函数创建列联表时,只需要将相应的变量作为参数写进函数中即可。
当列联表多于二维度时,可以使用ftable()函数,使其呈现得更紧凑。
如下以vcd扩展包中的Arthritis数据集进行演示:
二维度列联表
library(vcd)
head(Arthritis)
# 二维度列联表
table.2D <- table(Arthritis$Treatment, Arthritis$Sex)
table.2D
三维度列联表
# 三维度列联表
table.3D <- table(Arthritis$Treatment, Arthritis$Sex, Arthritis$Improved)
table.3D
ftable()函数
更紧凑的呈现方式
ftable(table.3D)
xtabs()函数
也可以使用xtabs()函数创建列联表。此函数的特点是以公式而非变量的形式传递进函数中。
二维度列联表
xtabs(~ Treatment + Sex, data=Arthritis)
三维度列联表
xtabs(~ Treatment + Sex + Improved, data=Arthritis)
prop.table()函数
上述的table()函数和xtabs()函数得到的是频数表,可以使用prop.table()函数得到频率表,此函数通过margins参数指定频率分母的维度,默认将所有数值相加作为分母。
# 默认将所有数值相加作为分母
prop.table(table.2D)
# 按行计算频率
prop.table(table.2D, margin=1)
# 按列计算频率
prop.table(table.2D, margin=2)
addmargins()函数
此函数可以在列联表中加入边际边,默认边际边求和,也可以通过FUN参数指定其它计算。
边际边是边际频数(marginal frequencies)的简称,它指的是列联表中行总和与列总和。
vcd扩展包中的mar_table()函数也可以同时加入按行或列求和的边际边。
按行和列求和
# 按行求和
addmargins(table.2D, margin=1)
# 按列求和
addmargins(table.2D, margin=2)
同时求行和列的和
# 分别按行和列求和
addmargins(table.2D, margin=1:2)
mar_table(table.2D)
按列求平均
addmargins(table.2D, margin=2, FUN=mean)
margin.table()函数
margin.table(table.2D, margin=1)
margin.table(table.2D, margin=2)
三、同时输出多个统计量
用ggplot2包中的diamonds数据集做演示:
此数据集总共只有10列数据。
library(ggplot2)
head(diamonds)
1、summary()函数
此函数R语言内置的统计量集合函数。当数据为数值时,它输出最小值、第1四分位数、中位数、平均数、第3四分位数和最大值;当数据为因子或类别时,它输出各个水平或类别的数量。
summary(diamonds)
2、describe()函数
psych扩展包的describe()函数输出的结果更丰富,包括数据量、均值、标准差、中位数、截断均值(默认截断比例为0.1),中位数绝对离差、最小值、最大值、全距、偏度、峰度和标准误差。
library(psych)
describe(diamonds)
3、stat.desc()函数
pastecs扩展包中的stat.desc()函数可以通过设置不同的参数来调整输出的统计量。
basic=TRUE(默认):计算观测值、空值和缺失值的数量,计算最大值、最小值、值域以及求和;
desc=TRUE:计算中位数、平均数、均值标准误差、95%的置信区间、方差、标准差以及变异系数;
norm=TRUE:计算正态分布的统计量,如峰度、偏度、显著程度。
library(pastecs)
options(digits=3) # 保留3位小数
stat.desc(diamonds, basic=FALSE, desc=FALSE)