R应用空间数据科学

原文地址:http://blog.dominodatalab.com/applied-spatial-data-science-with-r/

概述

最近我开始着手我的博士论文,其中利用大量不同的空间数据类型。在这一过程中,我发现有很多我还没有意识到的R空间数据分析概念。这份报告的目的是记录其中一些概念,以及我最爱的空间数据分析包。报告的结构如下:首先我们需要问问为什么R是空间分析的首选工具,其次将会探索一个典型的数据分析生命周期。

为什么用R做空间数据分析

你可能会问自己,为什么在有商业和开源地理信息系统(分别以ESRI ArcMap和QGIS为代表)时还要用R做空间分析。下面是我的原因中的一些:

  • R是免费和开源的;
  • 可重复性:研究者可以重复他们自己或其他人的分析,并验证发现;
  • 包:有许多R包用于空间数据分析、统计建模、可视化、机器学习和其他。
用于空间数据分析的R

一些我最爱的空间数据分析包包括:

  • sp:这个包提供用于空间数据的类和方法;绘制地图,使用坐标的实用函数。
  • rgdal:这个包提供了不同栅格和向量地理空间数据格式的导入与导出;坐标参考系;投影,等等。
  • rgeos:提供函数用于处理拓扑操作。
  • ggplot2:最流行的数据可视化包,作者是Hadely Wickham
  • ggmap:提供在来自Google地图、Open Street Map,cloudmade和stamen等源的静态地图之上的空间数据可视化函数。
  • leaflet:leaflet for R提供函数在R中控制和整合Leaflet,一个交互式地图JavaScript库。
  • lubridate:我的空间数据大部分有日期-时间测量,这个包提供了操作日期时间的函数。

数据准备

数据

在这份指南中,我们将会使用来自休斯敦警察局收集的2010年1月-2010年8月犯罪数据。ggmap包的作者David Kahle非常好心地收集并处理了该数据,在他的包中可用。

因此让我们安装一些在这份指南中会用到的我最爱的包。

读取空间数据

犯罪数据存储为逗号分隔值(CSV)格式,体积较小,只有13MB。也可以在这个GitHub仓库中找到:https://github.com/SparkIQ-Labs/Demos/tree/master/spatial-analysis/data。

注意:完整数据在ggmap中也可用,数据集名为“crime”。可以通过data(crime)命令加载到R环境中。

数据结构的快速查看显示出这个数据狂有86,314个观测和17个变量。

让我们看一下部分数据记录和一些汇总统计量以熟悉数据。这可以用head()summary()命令完成。


汇总统计量显示需要将变量“date”,“offense”,“month”和“day”的格式转换为日期和因子。我们还需要去除“coordinates”变量为NA的5条数据记录,因为这会影响空间分析。

空间点数据框

为了利用包括sp包在内的几个数据包中的类和方法,我们需要转换“crime_df”本地数据框为“SpatialPointsDataFrame”


注意我们使用一些新的函数,也就是SpatialPoints,SpatialPointsDataFrame,CRS和proj4string。它们来自空间分析包sp。这个包中的基础类是Spatial,从中派生的一些子类如下:


我们能看到,SpatialPointsSpatialPointsDataFrameSpatial类的子类。这种类系统比起R的基础类系统,在操作空间数据类型时表现更丰富。

下面让我们看看这种新的数据类型的结构。

可以看到这个类是一个有5个槽位/组件的SpatialPointsDataFrame,包括:

  1. data:读入R的原始数据
  2. coords.nrs:坐标的数据类型
  3. coords:坐标
  4. bbox:坐标的边界框
  5. pro4string:坐标参考系

我们用函数CRS()指定一个坐标参考系,在这里是WGS84。我们知道这是一个地理坐标参考系类型,因为坐标以经度和维度格式表示。

或者可以使用coordinates()命令,如下:

坐标参考系统

理解坐标参考系(CRS)很重要,这些对空间中的地理编码数据非常有用。CRS有两种类型:

  1. 地理坐标系(经度,维度),例如WGS84
  2. 笛卡尔/投影/平面坐标系(x,y)

投影坐标参考系由分成两个主要类型的几种系统组成,即:

  1. 国家平面(NADS 83):这在美国最常使用,例如Nevada State Plane NADS83
  2. 通用横轴墨卡托投影(UTM):例如Nevada(UTM Zone 11N),South Africa(UTM Zones 34S & 35S)

如果你看到如下格式的坐标数据,那么就是地理坐标系:

  1. (-94.324, 42.234)
  2. (33.33 44.4), (33d19’47’’N 44d23.9’E), (38SMB4488), (38n 444000 3688000)

基准面:基准面是多套参数和地面控制点定义的地方坐标系,例子:WGS84,NADS83

现在有了一个空间点数据框和适当的坐标系,以及时间数据,我们可能应该保存一份R数据文件格式的副本。

ESRI Shapefile多边形

将要使用的另一个数据集是休斯敦地区的行政人口普查区。这些数据以多边形shapefile提供,来自美国人口普查局网站


另外也可以用maptools包中的readShapeSpatial()函数读取shapefile数据。


我们的shapefile是“SpatialPolygonsDataFrame”类。可以通过使用plot()函数绘图快速查看。

数据探索

R中的一些基本方法可以用于探索空间对象,像是plot()summary()print()等等。例如summary()给出空间实体的数量,投影信息和边界框,而print()显示一个空间对象中的数据视图。

sp包提供了更丰富的方法,用于操作空间对象。

一个探索任意空间对象边界区域的方法是bbox()。第一行报告了东西范围,而第二行是南北方向。

我们可以使用proj4string()方法探索任意空间对象的投影系统。这个方法也可以被用于在需要时为一个空间对象指定一个不同的坐标系。完成代码如下:

可以使用@符号代替$符号探索/提取空间点数据框中单个槽位。例如,让我们看看数据和坐标槽位:



数据可视化

R有几个包用于可视化空间数据。我们会看下R中自带的传统绘图系统,通常包含在“base-R”包中,例如sp包中用于空间数据的plot()函数。也将探索包括ggplot2,ggmap和leaflet在内的“外部”包。

使用传统绘图系统可视化数据

sp包提供通过增量添加图层绘制空间数据的函数。让我们从绘制德克萨斯州休斯顿的shapefile开始。

然后在地图上加入犯罪数据。使用参数add = TRUE图上增加图层。

接着加入标题和图例。



尽管绘制空间数据的基本函数已经足够制作地图,但我们也喜欢“外部”R库,它们提供更多功能,绘制好看的地图,比如ggplot2,ggmap,leaflet。

使用外部可视化数据

ggplot2

ggplot2处理数据框而不支持Spatial类。因此我们必须使用ggplot2中的fortify()函数转换它们。


ggmap

创建德克萨斯州休斯顿的静态背景图层。


使用“ggmap”命令绘图。


绘制shapefile。



使用经度和维度变量对城镇犯罪数据进行地理编码。

leaflet

Leaflet for R是一个提供函数开发精致漂亮的Leaflet地图的包。Leaflet是领先的开源交互式地图JavaScript库。

首先从创建休斯敦地区的地图开始,然后加入图层(特征)。这可以使用leaflet()命令完成。第一层我们用addTiles命令加入“瓦片”。



接下来在地图上添加shapefile。这会增加为一个新图层,多边形,使用addPolygon命令。


最后加入犯罪数据,这作为一个新图层点被介入,使用addMarkers命令。

地理统计分析

在下一篇文章中,我们将会看看如何在空间数据上实施地理统计分析。

参考资料
  1. Applied Spatial Data Analysis with R. Roger S. Bivand, Edzer Pebesma and V. Gómez-Rubio. UseR! Series, Springer. 2nd ed. 2013, xviii+405 pp., Softcover. ISBN: 978-1-4614-7617-7
  2. ggmap: Spatial Visualization with ggplot2
  3. Do more with dates and times in R with lubridate 1.3.0
  4. Introduction to visualising spatial data in R. Robin Lovelace (R.Lovelace@leeds.ac.uk), James Cheshire, Rachel Oldroyd and others V. 1.3, September 2015
  5. Leaflet for R
  6. gglot2 documentation
  7. Introduction to dplyr