In-Class Exercise 2

Author

KB

Published on: 27-Nov-2022

(First published on: 26-Nov-2022)

Whether water points with the same status co-occur geographically in Nigeria

(Note: The following was part of an in-class exercise for ISSS624 conducted on 26 Nov 2022).

1.1 Overview

To prepare for the Take-home Exercise 1, which examines the spatial patterns of functional and non-functional water points (wp) in Nigeria

Learn how to:

  • Import raw Geospatial Data downloaded from the Internet

  • Perform data wrangling for spatial pattern analysis

1.2 Import and load the appropriate packages into R environment

# funModelling will be used for rapid Exploratory Data Analysis
pacman::p_load(sf, tidyverse, tmap, spdep, funModeling)

1.3 Import the Geospatial Data

2 geospatial data sets are used for this exericse:

  • geo_export: This contains information on the water points in Nigeria

  • nga_lga2: This contains Nigeria Level-2 Administrative Boundary (also known as Local Government Area) polygon features GIS data

1.3.1 Import water point geospatial data

wp = st_read(dsn = "In-Class_Ex2/geodata",
              layer = "geo_export",
              crs = 4326) %>%
  filter(clean_coun == "Nigeria")

Next, write_rds() of readr package is used to save the extracted sf data table (i.e. wp) into an output file in rds data format. The output file is called wp_nga.rds and it is saved in geodata sub-folder.

write_rds(wp, "In-Class_Ex2/geodata/wp_nga.rds")

1.3.2 Import Nigeria LGA boundary data

nga = st_read(dsn = "In-Class_Ex2/geodata",
               layer = "nga_lga2",
               crs = 4326)

2.1 Data Wrangling

2.1.1 Recode NA values into string

First, we do a count of the values in the status_cle column in the imported wp dataset

wp_nga = read_rds("In-Class_Ex2/geodata/wp_nga.rds")

freq(data=wp_nga,input = 'status_cle')

We use the replace_na() method to recode all the NA values in status_cle field into Unknown

wp_nga = wp_nga %>%
  mutate(status_cle = replace_na(status_cle, "Unknown"))

2.2 Extract functional water points

In the code chunk below, filter() of dplyr is used to select functional water points.

wpt_functional = wp_nga %>%
  filter(status_cle %in%
           c("Functional", 
             "Functional but not in use",
             "Functional but needs repair"))

2.3 Extract non-functional water points

wpt_nonfunctional = wp_nga %>%
  filter(status_cle %in%
           c("Abandoned/Decommissioned", 
             "Abandoned",
             "Non-Functional",
             "Non functional due to dry season",
             "Non-Functional due to dry season"))

2.4 Extract water points with Unknown value

wpt_unknown = wp_nga %>%
  filter(status_cle == "Unknown")

2.5 Perform Point-in-Polygon Count

We use st_intersects to compute the number of functional, non-functional and unknown wps in each LGA.

nga_wp = nga %>% 
  mutate(`total wpt` = lengths(
    st_intersects(nga, wp_nga))) %>%
  mutate(`wpt functional` = lengths(
    st_intersects(nga, wpt_functional))) %>%
  mutate(`wpt non-functional` = lengths(
    st_intersects(nga, wpt_nonfunctional))) %>%
  mutate(`wpt unknown` = lengths(
    st_intersects(nga, wpt_unknown)))

2.6 Save the data table for spatial analysis

We derive two fields namely pct_functional and pct_non-functional using the mutate() of dplyr package. To keep the file size small, we use select() of dplyr is used to retain only columns 3,4,9,10, 18,19,20,21,22,and 23.

nga_wp = nga_wp %>%
  mutate(pct_functional = `wpt functional`/`total wpt`) %>%
  mutate(`pct_non-functional` = `wpt non-functional`/`total wpt`) %>%
  select(3:4, 9:10, 18:23)

Thereafter ,we save the tidied sf data table into rds format for our spatial analysis

write_rds(nga_wp, "In-Class_Ex2/geodata/nga_wp.rds")

2.7 Visualise the spatial dsitribution of water points

# Load the nga_wp sf data file prepare in the previous steps
nga_wp <- read_rds("In-Class_Ex2/geodata/nga_wp.rds")

# Plot the various types of water points
total = qtm(nga_wp, "total wpt") + 
        tm_layout(main.title = "Total no. of \nwater points",
                  main.title.position = "center",
                  main.title.size = 1.0,
                  legend.height = 0.26,
                  legend.width = 0.40) 

wp_functional = qtm(nga_wp, "wpt functional") + 
                tm_layout(main.title = "Total no. of functional \nwater points",
                  main.title.position = "center",
                  main.title.size = 1.0,
                  legend.height = 0.26,
                  legend.width = 0.40) 

wp_nonfunctional = qtm(nga_wp, "wpt non-functional") + 
                tm_layout(main.title = "Total no. of non-functional \nwater points",
                  main.title.position = "center",
                  main.title.size = 1.0,
                  legend.height = 0.26,
                  legend.width = 0.40)

unknown <- qtm(nga_wp, "wpt unknown") + 
                tm_layout(main.title = "Total no. of  water points \nwith unknown status",
                  main.title.position = "center",
                  main.title.size = 1.0,
                  legend.height = 0.26,
                  legend.width = 0.40)

tmap_arrange(total, wp_functional, wp_nonfunctional, unknown, ncol=2)