For this assignment, I’ll be creating point patterns from the westside grocery store data.
First, we load the grocery store data.
library(tidycensus)
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3 v purrr 0.3.4
## v tibble 3.1.0 v dplyr 1.0.5
## v tidyr 1.1.3 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(sf)
## Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
library(ggplot2)
library(readxl)
library(censusxy)
library(mapview)
library(dplyr)
library(qgisprocess)
## Using 'qgis_process' at 'C:/Program Files/QGIS 3.16/bin/qgis_process-qgis.bat'.
## Run `qgis_configure()` for details.
library(raster)
## Loading required package: sp
##
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
##
## select
## The following object is masked from 'package:tidyr':
##
## extract
library(RColorBrewer)
library(spatstat)
## Loading required package: spatstat.data
## Loading required package: spatstat.geom
## Registered S3 method overwritten by 'spatstat.geom':
## method from
## print.boxx cli
## spatstat.geom 2.0-1
##
## Attaching package: 'spatstat.geom'
## The following objects are masked from 'package:raster':
##
## area, rotate, shift
## Loading required package: spatstat.core
## Loading required package: nlme
##
## Attaching package: 'nlme'
## The following object is masked from 'package:raster':
##
## getData
## The following object is masked from 'package:dplyr':
##
## collapse
## Loading required package: rpart
## Warning: replacing previous import 'spatstat.utils::RelevantNA' by
## 'spatstat.sparse::RelevantNA' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::grokIndexVector' by
## 'spatstat.sparse::grokIndexVector' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::fullIndexSequence' by
## 'spatstat.sparse::fullIndexSequence' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::positiveIndex' by
## 'spatstat.sparse::positiveIndex' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::replacementIndex' by
## 'spatstat.sparse::replacementIndex' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::RelevantEmpty' by
## 'spatstat.sparse::RelevantEmpty' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::isRelevantZero' by
## 'spatstat.sparse::isRelevantZero' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::logicalIndex' by
## 'spatstat.sparse::logicalIndex' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::RelevantZero' by
## 'spatstat.sparse::RelevantZero' when loading 'spatstat.core'
## Warning: replacing previous import 'spatstat.utils::strictIndexSequence' by
## 'spatstat.sparse::strictIndexSequence' when loading 'spatstat.core'
## spatstat.core 1.65-5
## Loading required package: spatstat.linnet
## spatstat.linnet 2.0-0
##
## spatstat 2.0-1 (nickname: 'Caution: contains small parts')
## For an introduction to spatstat, type 'beginner'
grocery_addr<-read_excel("C:/Users/hhx360/Google Drive (naslund.utsa@gmail.com)/School Files/School/MS Applied Demography/semesters/Spring 2021/DEM 7093 - GIS/Homework/Homework 5/west_side_grocery.xls")
## New names:
## * Source -> Source...1
## * Source -> Source...223
addr<-grocery_addr[c(6, 12:14)]
names(addr)<-c("street", "city", "st", "zip")
head(addr)
## # A tibble: 6 x 4
## street city st zip
## <chr> <chr> <chr> <chr>
## 1 646 S Flores St San Antonio TX 78204
## 2 1314 Fredericksburg Rd San Antonio TX 78201
## 3 1545 S San Marcos San Antonio TX 78207
## 4 4522 Fredericksburg Rd San Antonio TX 78201
## 5 1200 El Paso St San Antonio TX 78207
## 6 2902 Guadalupe St San Antonio TX 78207
results.proj<-cxy_geocode(addr,
street = "street",
city = "city",
state ="st",
zip = "zip",
class="sf",
output = "simple")
## 24 rows removed to create an sf object. These were addresses that the geocoder could not match.
Here, we see the grocery stores on the west side:
results<-st_as_sf(grocery_addr,coords=c("Longitude","Latitude"),crs=4269,agr="constant")
results<-st_transform(results,crs=2278)
mapview(results)
Here is a 2,500 foot buffer on all grocery stores in the west side:
grocery_buffer<-st_buffer(results,dist=2500)
mapview(grocery_buffer)+mapview(results,col.regions="green")
Here is a convex hull of the points:
chull<-st_convex_hull(st_union(results))
mapview(chull)+mapview(results,col.regions="green")
Here is a spatial join of one of the ACS layers with the west side grocery points (specifically, unemployment):
sa_acs<-get_acs(geography = "tract",
state="TX",
county = "Bexar",
year = 2019,
variables=c( "DP05_0001E", "DP03_0009P", "DP03_0062E", "DP03_0119PE",
"DP05_0001E","DP02_0009PE","DP02_0008PE","DP02_0040E","DP02_0038E",
"DP02_0066PE","DP02_0067PE","DP02_0080PE","DP02_0092PE",
"DP03_0005PE","DP03_0028PE","DP03_0062E","DP03_0099PE","DP03_0101PE",
"DP03_0119PE","DP04_0046PE","DP05_0072PE","DP05_0073PE",
"DP05_0066PE", "DP05_0072PE", "DP02_0113PE") ,
geometry = T, output = "wide")
## Getting data from the 2015-2019 5-year ACS
## Downloading feature geometry from the Census website. To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
## Using the ACS Data Profile
## Using the ACS Data Profile
sa_acs2<-sa_acs%>%
mutate(totpop= DP05_0001E, pwhite=DP05_0072PE,
pblack=DP05_0073PE , phisp=DP05_0066PE,
phsormore=DP02_0066PE,punemp=DP03_0009PE, medhhinc=DP03_0062E,
ppov=DP03_0119PE)%>%
dplyr::select(GEOID, totpop, pblack, pwhite, phisp, punemp, medhhinc, ppov)
sa_acs2<-st_transform(sa_acs2, crs = 2278)
sa_trol<-st_cast(sa_acs2, "MULTILINESTRING")
spjoin<-st_join(results, sa_acs2)
## New names:
## * Source...223 -> Source...221
head(spjoin)
mapview(spjoin["punemp"])+mapview(sa_trol)
Here is the nearest neighbor analysis, using z-scoring as a result:
grocery_nn<-qgis_run_algorithm(alg="native:nearestneighbouranalysis",
INPUT=results,
OUTPUT_HTML_FILE=file.path(tempdir(),"grocerynn.html"),
load_output=TRUE)
## Ignoring unknown input 'load_output'
## Running "C:/Program Files/QGIS 3.16/bin/qgis_process-qgis.bat" run \
## "native:nearestneighbouranalysis" \
## "--INPUT=C:\Users\hhx360\AppData\Local\Temp\Rtmpqaonh4\file361038db56b1\file36103e052025.gpkg" \
## "--OUTPUT_HTML_FILE=C:\Users\hhx360\AppData\Local\Temp\Rtmpqaonh4/grocerynn.html"
##
## ----------------
## Inputs
## ----------------
##
## INPUT: C:\Users\hhx360\AppData\Local\Temp\Rtmpqaonh4\file361038db56b1\file36103e052025.gpkg
## OUTPUT_HTML_FILE: C:\Users\hhx360\AppData\Local\Temp\Rtmpqaonh4/grocerynn.html
##
##
## 0...10...20...30...40...50...60...70...80...90...100 - done.
##
## ----------------
## Results
## ----------------
##
## EXPECTED_MD: 1654.757340237235
## NN_INDEX: 0.8046634820351501
## OBSERVED_MD: 1331.5228033185172
## OUTPUT_HTML_FILE: C:\Users\hhx360\AppData\Local\Temp\Rtmpqaonh4/grocerynn.html
## POINT_COUNT: 59
## Z_SCORE: -2.8703861806878765
As you can see, the z-score is -2.87. That is all, thank you!