文档章节

【数据挖掘与R语言笔记】预测海藻数量(一)观察数据和处理数据缺失

灰大羊
 灰大羊
发布于 2016/08/09 23:46
字数 3017
阅读 147
收藏 0
点赞 0
评论 0

说明

观察数据

# 1. 加载程序包
library(DMwR)
# 2. 查看数据表头
head(algae)
# 3. 查看统计特性
summary(algae)
# 4. 查看数值变量分布情况
hist(algae$mxPH, probability = T)

参数说明:

  • probability - 布尔类型参数,用于标明直方图是否使用频率来呈现数据

Q-Q图

我们可以使用Q-Q图来查看某一数据对象是否满足正态分布。

# 1. 加载程序包,并设置图像的显示布局
library(car)
par(mfrow = c(1, 2))
# 2. 绘制第一个直方图
hist(algae$mxPH, prob = T, xlab = '', main = 'Histogram of maximum pH value', ylim = 0:1)
# 2.1 给直方图上加上密度线,可以视为平滑版本的直方图
lines(density(algae$mxPH, na.rm = T))
# 2.2 给直方图的x轴下方绘制变量的实际值
rug(jitter(algae$mxPH))
# 3. 绘制Q-Q图
qqPlot(algae$mxPH, main = 'Normal QQ lot of maximum pH')
# 4. 还原图像布局设置
par(mfrow = c(1, 1))

参数说明:

  • par() - 设置或检索图像参数
    • mfrow - 设置当前图像显示的布局,c(1, 2)表示一行两列
  • hist()
    • xlab - x轴标题
    • main - 设置图像标题
    • ylim - y轴范围
  • density() - 计算数据对象的分布密度
  • rug() - 在x轴附近绘制变量的实际值,从而识别离群点
  • jitter() - 对要绘制的原始值略微进行随机排列,避免两个值相等的可能性

利用箱图检查oPO4

箱图能快速提供变量分布的一些关键属性的摘要,它不仅给出了变量的中心趋势,也给出了变量的发散情况和离群值。

箱图框边界代表变量的第一个四分位数和第三个四分位数,而框内的水平线是变量的中位数。

设 r 是变量的四分位距,

  • 箱图上方的小横线是小于或等于第三个四分位数加上 1.5 × r 的最大的观测值,
  • 箱图下方的小横线是大于或等于第一个四分位数减去 1.5 × r 的最小的观测值。

箱图上方小横线上面或者下方小横线下面的小圆圈表示域其他值相比特别大或者特别小的值,通常认为是离群值。

# 1. 绘制箱图
boxplot(algae$oPO4, ylab = "Orthophosphate (oPO4)")
# 2. 在y轴附近绘制变量的实际值
rug(jitter(algae$oPO4), side = 2)
# 3. 在坐标系中,以平均值为y坐标,绘制水平虚线
abline(h = mean(algae$oPO4, na.rm = T), lty = 2)

注:

  • 中位数表示上方的点的个数与下方的点的个数相等。
  • 将均值线与箱图内的分位数线进行比较,就可以知道变量的多个离群值使得作为变量中心(及变量的大部分取值)的均值产生了扭曲。

观察离群值

# 1. 绘制散点图
plot(algae$NH4, xlab = "")
# 2. 绘制均线
abline(h = mean(algae$NH4, na.rm = T), lty = 1)
# 3. 绘制均线+一个标准差
abline(h = mean(algae$NH4, na.rm = T) + sd(algae$NH4, na.rm = T), lty = 2)
# 4. 绘制中位线
abline(h = median(algae$NH4, na.rm = T), lty = 3)
# 5. 启动交互,当鼠标点击某个点的附近时,会自动输出这个点的值在点的附近
identify(algae$NH4)

或,输出选取离群值的详细数据

plot(algae$NH4, xlab = "")
clicked.lines <- identify(algae$NH4)
algae[clicked.lines, ]

或,利用逻辑表达式直接检索离群值

algae[algae$NH4 > 19000, ]

algae[!is.na(algae$NH4) & algae$NH4 > 19000, ]

条件绘图

条件绘图是依赖于某个特定因子的图形表示。因子是一个取值为有限集合的名义变量。

对变量Size的每个值绘制a1。

library(lattice)
bwplot(size ~ a1, data = algae, ylab = 'River Size', xlab = 'Algal A1')

分位箱图

分位箱图中的数显分别代表变量的第一个分位数、中位数、第三个分位数,小竖代表数据的真实取值,这些值的分布信息则由分位数图来体现。

library(Hmisc)
bwplot(size ~ a1, data = algae, panel = panel.bpplot, probs = seq(0.1, .49, by = 0.1), datadensity = T, ylab = 'River Size', xlab = 'Algal A1')
  • panel.bplot - 分位箱图面板模式

library(lattice)
min02 <- equal.count(na.omit(algae$mnO2), number = 4, overlap = 1/5)
stripplot(season ~ a3|min02, data = algae[!is.na(algae$mnO2), ])
  • equal.count() - 对连续变量离散化,把该变量转换为因子类型。
  • number - 设置区间个数
  • overlap - 设置两个区间之间的靠近边界的重合
  • stripplot() - 根据'season'变量把变量的实际值绘制到不同的图形中。
  • |min02 - 根据'min02'绘制不同的图形。按照从左到右、从下到上的顺序排列。

数据缺失处理

处理数据缺失的常见策略:

  1. 将含有缺失值的案例剔除
  2. 根据变量之间的相关关系填补缺失值
  3. 根据案例之间的相似性填补缺失值
  4. 使用能够处理缺失值数据的工具

剔除缺失部分

适用于当含有缺失值的记录在总体可用数据中所占比例非常小的时候。

下面的代码会去除在algae中,具有大于20%NA值的观测实例。

library(DMwR)
data(algae)
# 1. 获取所有包含NA值的观测记录,并输出以便观察
algae[!complete.cases(algae), ]
# 2. 获取包含NA值的观测记录条数
nrow(algae[!complete.cases(algae), ])
# 3. 获取每一行观测实例所包含的NA值的个数
apply(algae, 1, function(x) sum(is.na(x)))
# 4. 找出具有大于20%NA值的观测实例
manyNAs(algae, 0.2)
# 5. 去除具有大量NA值的观测实例
algae <- algae[-manyNAs(algae), ]
  • complete.cases(algae) - 返回一个布尔值向量,用于指示数据框中,不包含NA值的观测实例
  • manyNAs() - 获取包含大于给定概率NA值的观测实例,manyNAs的第二个参数(给定概率)默认为0.2

用高频率值来填补缺失值

填补还有缺失值记录的另一个方法时尝试找到这些缺失值最可能的值,根据数据所呈现的分布情况以及离散情况,应该选择不同的策略进行填补

  • 正态分布,因为大部分值围绕在均值附近,所以一般使用均值进行填补。
  • 偏态分布或存在离群值,大部分值都处于均值的一侧,或离群值会扭曲平均值,所以,选择中位数进行填充值较好的选择。

PS:不同的数据源、分布情况,选择填充算法外,还需要考虑不同策略对逼近程度和算法复杂度的权衡。

应用步骤如下:

  1. 找到数据对象各属性的分布情况
  2. 根据分布情况,选择填充策略
  3. 应用填充策略到需要的观测实例中

如: mxPH符合正态分布,第48行观测实例使用均值被填充是一种较好的选择。

data(algae)

algae[48, "mxPH"] <- mean(algae$mxPH, na.rm = T)

如: Chla包含几个极端的离群值,且分布偏向于较低的数值,所以使用中位数进行填充是一种相对较好的选额。

data(algae)

algae[is.na(algae$Chla), "Chla"] <- median(algae$Chla, na.rm = T)

使用相关关系填充

给定向量组$$ A: a_1, a_2, a_3, ..., a_m $$,如果存在不全为零的系数$$ k_1, k_2, k_3, ..., k_m $$,使

$$ k_1 a_1 + k_2 a_2 + ... + k_m a_m = 0 $$

则称向量组A是线性相关的,否则称它线性无关。

——《工程数学-线性代数(第六版)》(同济大学)

当两个变量的相关值在1(或-1)周围,表示相应的两个变量之间有强正(或负)线性相关关系。在得到两个变量之间的线性相关关系后,就可以想办法得到变量间线性相关的近似函数形式,以便通过一个变量的值计算出另一个变量的值。

library(DMwR)
data(algae)

cor(algae[, 4:18], use = "complete.obs")
symnum(cor(algae[, 4:18], use = "complete.obs"))

  • cor() - 函数可以用来生成变量之间的相关值矩阵
  • use = "complete.obs" - 在计算相关值时忽略含有NA的记录。
  • symnum() - 函数用来优化变量相关值矩阵的显示

当我们找到两个变量之间的相关关系之后,我们就可以思考如何利用相关性较高的变量来填充NA值。

data(algae)
algae <- algae[-manyNAs(algae), ]
lm(PO4 ~ oPO4, data = algae)

通过计算,我们得出在PO4和oPO4之间的线性函数为:

$$ PO4 = 42.897 + 1.293 oPO4 $$

在得到两个变量之间的线性函数之后,如果不是在同一个观测值上都为NA,那么我们就可以利用这个线性函数来完成填充。

algae[28, "PO4"] <- 42.897 + 1.293 * algae[28, "oPO4"]

我们可以构建一个函数,用来批量处理某一变量的所有缺失值的合理填充。

data(algae)
algae <- algae[-manyNAs(algae), ]

fillPO4 <- function(oP) {
	if (is.na(oP))
		return(NA)
	else
		return(42.897 + 1.293 * oP)
	}

algae[is.na(algae$PO4), "PO4"] <- sapply(algae[is.na(algae$PO4), "oPO4"], fillPO4)

为了进一步填充缺失值,当无法使用相关函数来处理时,我们可以尝试探索“名义变量”与缺失值变量之间的关系。

algae[is.na(algae$PO4), "PO4"] <- sapply(algae[is.na(algae$PO4), "oPO4"], fillPO4)
algae$season <- factor(algae$season, levels = c("spring", "summer", "autumn", "winter"))	# 指定因子式中因子的顺序

histogram(~mxPH | season, data = algae)
histogram(~mxPH | size * speed, data = algae)

stripplot(size ~ mxPH | speed, data = algae, jitter = T)

很多时候,为了部分缺失值的填充,我们需要不断的对各种变量组合的相关关系和填充策略进行分析、测试。这会是一个繁重的工作,但很多时候,却是不可避免的。

通过探测实例实例之间的相似性来填补缺失值

相似性与相关性不同,相关性是指观测实例的变量之间所存在的一种数学关系,而相似性是指观测实例之间所存在的一种实际情况。比如,在同等条件下,不同观测实例之间是否是相似的。

使用相似性填充NA值的步骤:

  1. 定义“相似性” - 指明用什么样的计算方法,来确定不同观测实例是相似的。

欧式距离

$$ d(x, y) = \sqrt{\sum_{i = 1}^{P} (x_i - y_i)^2} $$

  • 一般情况下,我们可以使用相似观测值的“中位数”来进行填充。
  • 如果缺失值是“名义变量”,则使用最相似数据中出现四处最多的值(众数)进行填充。
  • 还可以使用最相似数据的加权平均值来进行填充。(可以使用“高斯核函数”来从“距离”获得权重。)

高斯核函数

如果相邻个案距待填充值的个案的距离为d,则它的值在加权平均中的权重为:

$$ w(d) = e^{-d} $$

  1. 根据不同的数据情况,有时会有不同的相关计算函数的变种。如下为一个欧式距离计算函数的变种。

$$ d(x,y) = \sqrt{\sum_{i=1}^{P} \delta_i (x_i, y_i)} $$

$\delta_i ()$ 表示变量$i$的两个值之间的距离,即

$$ \delta_i(v_1, v_2) = \left { \begin{aligned} &1 &当i是名义变量且v_i \ne v_2时 \ &0 &当i是名义变量且v_i = v_2时 \ &(v_1 - v_2)^2 &当i时数值变量时 \end{aligned} \right. $$

  1. 在应用已经定义好的“距离测算公式”之后,一般情况下,我们需要对数值变量进行标准化,即

$$ y_i = \frac{x_i - \overline{x}}{\sigma_x}\qquad $$

  1. 利用DMwR程序包中的knnImputation()来执行上面的计算
library(DMwR)
data(algae)

algae <- knnImputation(algae, k = 10)   # 使用默认的参数来完成相似数据的填充
algae <- knnImputation(algae, k = 10, meth = "median")  # 使用中位数来完成相似数据的填充

书中原文参考

  • 《Statistics for Technology》
  • 《Introductry Statictics with R》
  • 《Visualizing Data》
  • 《The Elements of Graphing Data》
  • 《Data Visualization》
  • 《R Graphics》
  • 《Data Preparation for Data Mining》

其他参考

© 著作权归作者所有

共有 人打赏支持
灰大羊
粉丝 4
博文 96
码字总数 95147
作品 0
浦东
项目经理
R语言学习笔记之相关性矩阵分析及其可视化

计算相关矩阵 R内置函数 cor() 可以用来计算相关系数:cor(x, method = c("pearson", "kendall", "spearman")),如果数据有缺失值,用cor(x, method = "pearson", use = "complete.obs")。 ...

R语言中文社区 ⋅ 02/05 ⋅ 0

给我两小时!带你发动R语言数据挖掘的高铁,一往直前!

主题: 数据挖掘快速上手之R语言实践 随之DT时代的到来,传统的统计分析方法已经不能解决海量高维数据,如何运用数据挖掘手段对复杂数据进行数据处理、数据可视化、数据建模及模型解读是每一...

李晓文 ⋅ 2017/04/18 ⋅ 0

R语言学习笔记之聚类分析

使用k-means聚类所需的包: factoextra cluster #加载包 library(factoextra) library(cluster)l #数据准备 使用内置的R数据集USArrests #load the dataset data("USArrests") #remove any m......

R语言中文社区 ⋅ 01/16 ⋅ 0

ggplot2学习笔记系列之利用ggplot2绘制误差棒及显著性标记

绘制带有误差棒的条形图 library(ggplot2) #创建数据集 df <- data.frame(treatment = factor(c(1, 1, 1, 2, 2, 2, 3, 3, 3)), response = c(2, 5, 4, 6, 9, 7, 3, 5, 8), group = factor(c......

R语言中文社区 ⋅ 02/12 ⋅ 0

R语言之数据分析高级方法「时间序列」

作者简介Introduction 姚某某 知乎专栏:https://zhuanlan.zhihu.com/mydata 往期回顾: R语言之高级数据分析「聚类分析」 本节主要总结「数据分析」的「时间序列」相关模型的思路。 「时间序...

kmd8d5r ⋅ 04/24 ⋅ 0

爬虫数据分析【旅游篇】

作者简介Introduction 挖数 腾讯数据产品经理 & 段子手 个人微信公号:washu66 往期回顾 Kindle里有一本刷了3遍的书,一直不舍得删,这本书的名字叫做《不去会死》,讲述一个普通日本上班族在...

R语言中文社区 ⋅ 03/05 ⋅ 0

【R图秀-3】——“全球和平指数”可视化

作者简介Introduction 傅兴:个人公众号:Rapp 往期回顾 今天在Tableau Public的网站上看到一个很有意思的可视化作品。(注:Tableau是一个商业版的数据可视化工具) https://public.tableau...

R语言中文社区 ⋅ 02/02 ⋅ 0

R语言data manipulation学习笔记之创建变量、重命名、数据融合

作者简介Introduction taoyan:R语言中文社区特约作家,伪码农,R语言爱好者,爱开源。 个人博客: https://ytlogos.github.io/ 公众号:生信大讲堂 往期回顾 数据分析中数据处理也就是data ...

R语言中文社区 ⋅ 03/26 ⋅ 0

传说中的马尔科夫链到底是个什么鬼?

话说自从接触数据分析以来,就不断在各种文献和大牛的文章里看到马尔科夫链这种东西。对于像小编这种经管出身、半路出家的数据爱好者而言,老是让这种一头雾水的名词出现在自己眼前又无可奈何...

R语言中文社区 ⋅ 02/27 ⋅ 0

R语言可视化学习笔记之相关矩阵可视化包ggcorrplot

基于ggplot2包以及corrplot包的相关矩阵可视化包ggcorrplot,ggcorrplot包提供对相关矩阵重排序以及在相关图中展示显著性水平的方法,同时也能计算相关性p-value 安装方法就不提了,不懂的可...

R语言中文社区 ⋅ 01/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 22分钟前 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 27分钟前 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 29分钟前 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 48分钟前 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 54分钟前 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 55分钟前 ⋅ 0

监控各项服务

比如有三个服务, 为了减少故障时间,增加监控任务,使用linux的 crontab 实现. 步骤: 1,每个服务写一个ping接口 监控如下内容: 1,HouseServer 是否正常运行,所以需要增加一个ping的接口 ; http...

黄威 ⋅ 59分钟前 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 59分钟前 ⋅ 0

nodejs __proto__跟prototype

前言 nodejs中完全没有class的这个概念,这点跟PHP,JAVA等面向对象的语言很不一样,没有class跟object的区分,那么nodejs是怎么样实现继承的呢? 对象 对象是由属性跟方法组成的一个东西,就...

Ai5tbb ⋅ 今天 ⋅ 0

Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库

Q: Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库 A: 执行以下2条命令解决: apt-get install php-mysql service apache2 restart php -m 执行后会多以下4个模块: mysqli mysqlnd...

SamXIAO ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部