Homework 6: Point Patterns

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)

2500 foot buffer

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")

Convex Hull

Here is a convex hull of the points:

chull<-st_convex_hull(st_union(results))
mapview(chull)+mapview(results,col.regions="green")

spatial join

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)

nearest neighbor

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!