第三章 数据探索
3.1 数据质量分析
缺失值的处理,从总体上分为删除、对可能值进行插补以及不处理。
异常值分析也称为离群点分析,可以通过简单统计量分析、3σ原则以及箱型图分析(箱型图仅通过分位数对数据进行识别,而不需要分布,分析结果比较客观)。
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter3/示例程序")
# 读入数据
saledata <- read.csv(file = "./data/catering_sale.csv", header = TRUE)
# 缺失值检测 并打印结果,由于R把TRUE和FALSE分别当作1、0,可以用sum()和mean()函数来分别获取缺失样本数、缺失比例
sum(complete.cases(saledata))
sum(!complete.cases(saledata))
mean(!complete.cases(saledata))
saledata[!complete.cases(saledata), ]
# 异常值检测箱线图
sp <- boxplot(saledata$"销量", boxwex = 0.7)
title("销量异常值检测箱线图")
xi <- 1.1
sd.s <- sd(saledata[complete.cases(saledata), ]$"销量")
mn.s <- mean(saledata[complete.cases(saledata), ]$"销量")
points(xi, mn.s, col = "red", pch = 18)
arrows(xi, mn.s - sd.s, xi, mn.s + sd.s, code = 3, col = "pink", angle = 75, length = .1)
text(rep(c(1.05, 1.05, 0.95, 0.95), length = length(sp$out)),
labels = sp$out[order(sp$out)], sp$out[order(sp$out)] +
rep(c(150, -150, 150, -150), length = length(sp$out)), col = "red")
运行结果是缺失值个数为1,占样本总量的0.497%,位于第15行。
3.2 数据特征分析
分布分析:对于定量数据,可以用频率分布表、直方图和茎叶图分析其分布的特征;对于定性数据,可用饼形图和条形图显示分布情况。
对比分析:绝对数比较寻找差异,相对数比较反映现象之间的关联度。
统计量分析:常用均值、中位数表现指标集中趋势,用标准差、四分位数间距表现离中趋势。
均值
m
e
a
n
(
x
)
=
x
ˉ
=
∑
x
i
n
;
m
e
a
n
(
x
)
=
∑
w
i
x
i
∑
w
i
=
∑
f
i
x
i
mean(x)=\bar{x}=\frac{\sum x_i}{n};mean(x)={\frac{\sum w_ix_i}{\sum w_i}}=\sum f_ix_i
mean(x)=xˉ=n∑xi;mean(x)=∑wi∑wixi=∑fixi,均值对极端值很敏感,若数据是偏态分布,可以用截断均值或中位数来度量数据的集中趋势。
中位数
M
=
x
(
n
+
1
2
)
=
1
2
(
x
n
2
+
x
n
+
1
2
)
M=x_{(\frac{n+1}{2})}=\frac{1}{2}(x_{\frac{n}{2}}+x_{\frac{n+1}{2}})
M=x(2n+1)=21(x2n+x2n+1)
极差:
m
a
x
−
m
i
n
max-min
max−min,极差对异常值很敏感,且忽略了极差间数据的分布。
标准差:
s
=
∑
(
x
i
−
x
ˉ
)
2
n
s=\sqrt{\frac{\sum(x_i-\bar x)^2}{n} }
s=n∑(xi−xˉ)2,用于衡量数据偏离均值的程度。
变异系数:
C
V
=
s
x
ˉ
×
100
%
CV=\frac{s}{\bar x}×100\%
CV=xˉs×100%,用来衡量标准差s相对于均值x的离中趋势,比较多个不同单位或不同波动幅度的数据集的离中趋势。
四分位数间距:上四分位数QU和下四分位数QL之差包含了数据的一半,其值越大,说明数据变异程度越大,反之变异程度越小。
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter3/示例程序")
# 读入数据
saledata <- read.table(file = "./data/catering_sale.csv", sep=",", header = TRUE)
sales <- saledata[, 2]
# 统计量分析
# 均值
mean_ <- mean(sales, na.rm = T)
# 中位数
median_ <- median(sales, na.rm = T)
# 极差
range_ <- max(sales, na.rm = T) - min(sales, na.rm = T)
# 标准差
std_ <- sqrt(var(sales, na.rm = T))
# 变异系数
variation_ <- std_ / mean_
# 四分位数间距
q1 <- quantile(sales, 0.25, na.rm = T)
q3 <- quantile(sales, 0.75, na.rm = T)
distance <- q3 - q1
a <- matrix(c(mean_, median_, range_, std_, variation_, q1, q3, distance),
1, byrow = T)
colnames(a) <- c("均值", "中位数", "极差", "标准差", "变异系数",
"1/4分位数", "3/4分位数", "四分位间距")
print(a)
周期性分析:探索某个变量是否随着时间变化而呈现出某种周期变化趋势。
贡献度分析:又称“帕累托分析”,原理是帕累托法则“2/8定律”,争取找到那20%的资源并合理利用。
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter3/示例程序")
# 读取菜品数据,绘制帕累托图
dishdata <- read.csv(file = "./data/catering_dish_profit.csv")
barplot(dishdata[, 3], col = "blue1", names.arg = dishdata[, 2], width = 1,
space = 0, ylim = c(0, 10000), xlab = "菜品", ylab = "盈利:元")
accratio <- dishdata[, 3]
for ( i in 1:length(accratio)) {
accratio[i] <- sum(dishdata[1:i, 3]) / sum(dishdata[, 3])
}
par(new = T, mar = c(4, 4, 4, 4))
points(accratio * 10000 ~ c((1:length(accratio) - 0.5)), new = FALSE,
type = "b", new = T)
axis(4, col = "red", col.axis = "red", at = 0:10000, label = c(0:10000 / 10000))
mtext("累积百分比", 4, 2)
points(6.5, accratio[7] * 10000, col="red")
text(7, accratio[7] * 10000,paste(round(accratio[7] + 0.00001, 4) * 100, "%"))
相关分析:绘制散点图、散点矩阵图分析,相关系数。
pearson相关系数
r
=
∑
i
=
1
n
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
∑
i
=
1
n
(
x
i
−
x
ˉ
)
2
∑
i
=
1
n
(
y
i
−
y
ˉ
)
2
r=\frac{\sum_{i=1}^{n}(x_i-\bar x)(y_i-\bar y)}{\sqrt{\sum_{i=1}^{n}(x_i-\bar x)^2\sum_{i=1}^{n}(y_i-\bar y)^2}}
r=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ),0~0.3极弱线性相关,0.3~0.5低度线性相关,0.5~0.8显著线性相关,0.8~1高度线性相关。Spearman秩相关系数:pearson相关系数需要连续变量服从正态分布,非正态的关联性可以用等级相关系数描述
r
s
=
1
−
6
∑
i
=
1
n
(
R
i
−
Q
i
)
2
n
(
n
2
−
1
)
r_s=1-\frac{6\sum_{i=1}^{n}(R_i-Q_i)^2}{n(n^2-1)}
rs=1−n(n2−1)6∑i=1n(Ri−Qi)2,spearman相关只需要两个变量具有严格单调的函数关系,而pearson需要两个变量是线性相关的才说有线性关系。
判定系数:相关系数的平方r^2,用来衡量回归方程对y的解释程度,越接近1表明xy相关性越强。
# 餐饮销量数据相关性分析
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("F:/数据及程序/chapter3/示例程序")
# 读取数据
cordata <- read.csv(file = "./data/catering_sale_all.csv", header = TRUE)
# 求出相关系数矩阵
cor(cordata[, 2:11])
3.3 R语言主要数据探索函数
统计作图函数
barplot():绘制简单条形图
##barplot(X,horiz=FLASE,main,xlab,ylab),参数horiz是逻辑值,TRUE表示横向条形图
x=sample(rep(c("A","B","C"),20),50) ##产生包含ABC的随机向量
counts=table(x) ##统计三种样本的数量保存在counts中
barplot(counts) ##绘制条形图展示三种样本的数量
pie():饼图,和不满1时饼图残缺,和超过1时,得到的是比例饼图
##pie(X)饼图
x=sample(rep(c("A","B","C"),20),50) ##产生包含ABC的随机向量
counts=table(x) ##统计三种样本的数量保存在counts中
pct=round(counts/sum(counts)*100)
lbls=paste(c("A","B","C"),pct,"%") ##计算百分比,便于加标签
pie(counts,labels = lbls) ##画饼图
hist():二维条形直方图
##hist(X,freq=TRUE)二维直方图,freq=T画频数图,freq=F画频率图
x=sample(1:999,100)%%100 ##取100个1到99之间的随机数
hist(x,freq=FALSE,breaks=7,main="H x") ##绘制频率直方图
line(density(x),col="red") ##添加密度曲线
boxplot():箱型图
##boxplot(X,notch,horiztal),notch为TRUE时,绘制的是X的带刻槽的凹盒图
x1=c(rnorm(50,5,2),11,1) ##生成随机数50个,均值5,方差2,并补充2个常数
x2=c(rnorm(50,7,4),10,2)
boxplot(x1,x2,notch=TRUE) ##绘制带刻槽的箱型图