Install relevant R packages
packages = c('rgdal', 'maptools', 'raster','spatstat', 'tmap','sf','SpatialEpi', 'tidyverse','spData')
for (p in packages){
if(!require(p, character.only = T)){
install.packages(p)
}
library(p,character.only = T)
}
Import MP14_SUBZONE layer and named it as mpsz
mpsz <- readOGR(dsn = "data/geospatial", layer="MP14_SUBZONE_WEB_PL")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\IS415 Geospatial Analytics and Applications\take-home2\Take_home_Exe02\data\geospatial", layer: "MP14_SUBZONE_WEB_PL"
## with 323 features
## It has 15 fields
mpsz
## class : SpatialPolygonsDataFrame
## features : 323
## extent : 2667.538, 56396.44, 15748.72, 50256.33 (xmin, xmax, ymin, ymax)
## crs : +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
## variables : 15
## names : OBJECTID, SUBZONE_NO, SUBZONE_N, SUBZONE_C, CA_IND, PLN_AREA_N, PLN_AREA_C, REGION_N, REGION_C, INC_CRC, FMEL_UPD_D, X_ADDR, Y_ADDR, SHAPE_Leng, SHAPE_Area
## min values : 1, 1, ADMIRALTY, AMSZ01, N, ANG MO KIO, AM, CENTRAL REGION, CR, 00F5E30B5C9B7AD8, 2014/12/05, 5092.8949, 19579.069, 871.554887798, 39437.9352703
## max values : 323, 17, YUNNAN, YSSZ09, Y, YISHUN, YS, WEST REGION, WR, FFCCF172717C2EAF, 2014/12/05, 50424.7923, 49552.7904, 68083.9364708, 69748298.792
Import listings data set and named it as airbnb.
airbnb <- read_csv("data/aspatial/listings.csv")
After looking through the details of the data set, the coords of the data set is in longitude and latitude format. One key point to take note is the CRS of the langitude and latitude. It should be in WGS84 (EPSG:4326).
Commonly used by organizations that provide GIS data for the entire globe or many countries. CRS used by Google Earth.
airbnb_sf <- st_as_sf(airbnb, coords = c("longitude","latitude"), crs = 4326)
By using function st_transform, we are able to convert the longitude and latitude to XY coords by defining the EPSG as 3414 (SV21).
airbnb_sf <-st_transform(airbnb_sf, CRS("+init=epsg:3414"))
airbnb_sf
## Simple feature collection with 7713 features and 14 fields
## geometry type: POINT
## dimension: XY
## bbox: xmin: 7215.566 ymin: 25166.35 xmax: 43401.32 ymax: 48466.72
## epsg (SRID): NA
## proj4string: +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs
## # A tibble: 7,713 x 15
## id name host_id host_name neighbourhood_g~ neighbourhood room_type price
## <dbl> <chr> <dbl> <chr> <chr> <chr> <chr> <dbl>
## 1 49091 "COZ~ 266763 Francesca North Region Woodlands Private ~ 87
## 2 50646 "Ple~ 227796 Sujatha Central Region Bukit Timah Private ~ 80
## 3 56334 "COZ~ 266763 Francesca North Region Woodlands Private ~ 72
## 4 71609 "Ens~ 367042 Belinda East Region Tampines Private ~ 214
## 5 71896 "B&B~ 367042 Belinda East Region Tampines Private ~ 99
## 6 71903 "Roo~ 367042 Belinda East Region Tampines Private ~ 109
## 7 71907 "3rd~ 367042 Belinda East Region Tampines Private ~ 217
## 8 117957 "Pri~ 448620 Lynnity North-East Regi~ Sengkang Private ~ 67
## 9 241503 "Lon~ 1017645 Bianca East Region Bedok Private ~ 52
## 10 241508 "Lon~ 1017645 Bianca East Region Bedok Private ~ 54
## # ... with 7,703 more rows, and 7 more variables: minimum_nights <dbl>,
## # number_of_reviews <dbl>, last_review <date>, reviews_per_month <dbl>,
## # calculated_host_listings_count <dbl>, availability_365 <dbl>,
## # geometry <POINT [m]>
Removing those irrelevant column and only keep the room_type column.
airbnb_sf <- subset(airbnb_sf, select = -c(name, host_id,host_name,neighbourhood_group,price,minimum_nights,number_of_reviews,last_review,reviews_per_month, calculated_host_listings_count,availability_365,id,neighbourhood))
Filter room_type by Private room.
private <- airbnb_sf %>%
filter(room_type == "Private room")
Filter room_type by Hotel room.
Hotel <- airbnb_sf %>%
filter(room_type == "Hotel room")
Filter room_type by Shared room.
Shared <- airbnb_sf %>%
filter(room_type == "Shared room")
Filter room_type by Entire home/apt
Entire <- airbnb_sf %>%
filter(room_type == "Entire home/apt")
Convert private to Spatialpoints format which only left the coords without any other information.
private_sp <- as(private, "Spatial")
private_sp <- as(private_sp, "SpatialPoints")
Convert hotel to Spatialpoints format which only left the coords without any other information.
Hotel_sp <- as(Hotel, "Spatial")
Hotel_sp <- as(Hotel_sp, "SpatialPoints")
Convert share to Spatialpoints format which only left the coords without any other information.
Shared_sp <- as(Shared, "Spatial")
Shared_sp <- as(Shared_sp, "SpatialPoints")
Convert entire to Spatialpoints format which only left the coords without any other information.
Entire_sp <- as(Entire, "Spatial")
Entire_sp <- as(Entire_sp, "SpatialPoints")
Converting the data set in to spatstat’s ppp object format.
private_ppp <- as(private_sp,"ppp")
private_ppp_jit <- rjitter(private_ppp, retry=TRUE, nsim=1, drop=TRUE)
entire_ppp <- as(Entire_sp,"ppp")
entire_ppp_jit <- rjitter(entire_ppp, retry=TRUE, nsim=1, drop=TRUE)
hotel_ppp <- as(Hotel_sp,"ppp")
hotel_ppp_jit <- rjitter(hotel_ppp, retry=TRUE, nsim=1, drop=TRUE)
shared_ppp <- as(Shared_sp,"ppp")
shared_ppp_jit <- rjitter(shared_ppp, retry=TRUE, nsim=1, drop=TRUE)
Extract the target planning areas
Lavender <- mpsz[mpsz@data$SUBZONE_N == "LAVENDER",]
Tanjong_Pagar <- mpsz[mpsz@data$SUBZONE_N == "TANJONG PAGAR",]
Converting the spatial point data frame into generic sp format
Lavender_sp <- as(Lavender, "SpatialPolygons")
Tanjong_Pagar_sp <- as(Tanjong_Pagar, "SpatialPolygons")
Creating owin object
Lavender_owin <- as(Lavender_sp, "owin")
Tanjong_Pagar_owin <- as(Tanjong_Pagar_sp, "owin")
private_Lavender_ppp <- private_ppp_jit[Lavender_owin]
shared_Lavender_ppp <- shared_ppp_jit[Lavender_owin]
hotel_Lavender_ppp <- hotel_ppp_jit[Lavender_owin]
entire_Lavender_ppp <- entire_ppp_jit[Lavender_owin]
private_Tanjong_Pagar_ppp <- private_ppp_jit[Tanjong_Pagar_owin]
shared_Tanjong_Pagar_ppp <- shared_ppp_jit[Tanjong_Pagar_owin]
hotel_Tanjong_Pagar_ppp <- hotel_ppp_jit[Tanjong_Pagar_owin]
entire_Tanjong_Pagar_ppp <- entire_ppp_jit[Tanjong_Pagar_owin]
Computing KDE
kde_private_Lavender_bw <- density(private_Lavender_ppp , sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_private_Lavender_bw)
WARNNING: The land area of Lavender is very small approximately 1km2. Therefore, we cannot rescale the size by 1000. An ideal rescale size would be 100m.
private_Lavender_ppp.100m <- rescale(private_Lavender_ppp, 100, "m")
kde_private_Lavender.bw <- density(private_Lavender_ppp.100m, sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_private_Lavender.bw)
gridded_kde_private_Lavender_bw <- as.SpatialGridDataFrame.im(rescale(kde_private_Lavender.bw, 1/100,"m"))
spplot(gridded_kde_private_Lavender_bw)
kde_private_Lavender_bw_raster <- raster(gridded_kde_private_Lavender_bw)
kde_private_Lavender_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 8.682154, 9.355564 (x, y)
## extent : 30342.65, 31453.96, 32035.6, 33233.11 (xmin, xmax, ymin, ymax)
## crs : NA
## source : memory
## names : v
## values : -6.352857e-16, 31.49338 (min, max)
projection(kde_private_Lavender_bw_raster) <- CRS("+init=EPSG:3414")
kde_private_Lavender_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 8.682154, 9.355564 (x, y)
## extent : 30342.65, 31453.96, 32035.6, 33233.11 (xmin, xmax, ymin, ymax)
## crs : +init=EPSG:3414 +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs
## source : memory
## names : v
## values : -6.352857e-16, 31.49338 (min, max)
tmap_mode('view')
## tmap mode set to interactive viewing
tm_shape(kde_private_Lavender_bw_raster) +
tm_raster("v", breaks = c(0,5,10,15,20,25,30,35,40,45,50),alpha = 0.7) +
tm_layout(legend.position = c("right", "bottom"), frame = FALSE)+
tm_shape(mpsz)+
tm_polygons(alpha = 0)
tmap_mode('plot')
## tmap mode set to plotting
Computing KDE
kde_hotel_Lavender_bw <- density(hotel_Lavender_ppp , sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_hotel_Lavender_bw)
WARNNING: The land area of Lavender is very small approximately 1km2. Therefore, we cannot rescale the size by 1000. An ideal rescale size would be 100m.
hotel_Lavender_ppp.100m <- rescale(hotel_Lavender_ppp, 100, "m")
kde_hotel_Lavender.bw <- density(hotel_Lavender_ppp.100m, sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_hotel_Lavender.bw)
gridded_kde_hotel_Lavender_bw <- as.SpatialGridDataFrame.im(rescale(kde_hotel_Lavender.bw, 1/100,"m"))
spplot(gridded_kde_hotel_Lavender_bw)
kde_hotel_Lavender_bw_raster <- raster(gridded_kde_hotel_Lavender_bw)
kde_hotel_Lavender_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 8.682154, 9.355564 (x, y)
## extent : 30342.65, 31453.96, 32035.6, 33233.11 (xmin, xmax, ymin, ymax)
## crs : NA
## source : memory
## names : v
## values : 9.794041e-13, 2.879695 (min, max)
projection(kde_hotel_Lavender_bw_raster) <- CRS("+init=EPSG:3414")
kde_hotel_Lavender_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 8.682154, 9.355564 (x, y)
## extent : 30342.65, 31453.96, 32035.6, 33233.11 (xmin, xmax, ymin, ymax)
## crs : +init=EPSG:3414 +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs
## source : memory
## names : v
## values : 9.794041e-13, 2.879695 (min, max)
tmap_mode('view')
## tmap mode set to interactive viewing
tm_shape(kde_hotel_Lavender_bw_raster) +
tm_raster("v",alpha = 0.7) +
tm_layout(legend.position = c("right", "bottom"), frame = FALSE)+
tm_shape(mpsz)+
tm_polygons(alpha = 0)
tmap_mode('plot')
## tmap mode set to plotting
Computing KDE
kde_entire_Lavender_bw <- density(entire_Lavender_ppp , sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_entire_Lavender_bw)
WARNNING: The land area of Lavender is very small approximately 1km2. Therefore, we cannot rescale the size by 1000. An ideal rescale size would be 100m.
entire_Lavender_ppp.100m <- rescale(entire_Lavender_ppp, 100, "m")
kde_entire_Lavender.bw <- density(entire_Lavender_ppp.100m, sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_entire_Lavender.bw)
gridded_kde_entire_Lavender_bw <- as.SpatialGridDataFrame.im(rescale(kde_entire_Lavender.bw, 1/100,"m"))
spplot(gridded_kde_entire_Lavender_bw)
kde_entire_Lavender_bw_raster <- raster(gridded_kde_entire_Lavender_bw)
kde_entire_Lavender_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 8.682154, 9.355564 (x, y)
## extent : 30342.65, 31453.96, 32035.6, 33233.11 (xmin, xmax, ymin, ymax)
## crs : NA
## source : memory
## names : v
## values : 1.455076e-10, 7.290718 (min, max)
projection(kde_entire_Lavender_bw_raster) <- CRS("+init=EPSG:3414")
kde_entire_Lavender_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 8.682154, 9.355564 (x, y)
## extent : 30342.65, 31453.96, 32035.6, 33233.11 (xmin, xmax, ymin, ymax)
## crs : +init=EPSG:3414 +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs
## source : memory
## names : v
## values : 1.455076e-10, 7.290718 (min, max)
tmap_mode('view')
## tmap mode set to interactive viewing
tm_shape(kde_entire_Lavender_bw_raster) +
tm_raster("v",alpha = 0.7) +
tm_layout(legend.position = c("right", "bottom"), frame = FALSE)+
tm_shape(mpsz)+
tm_polygons(alpha = 0)
tmap_mode('plot')
## tmap mode set to plotting
Lavender is a very old town area in Singapore and the size of the area are relavately small. In addition, the residence population are very stable and there are not much listings in the airbnb listing. Since the location is very near to the town, therefore more private and entire room in the listing compare to hotel and sharing.
Computing KDE
kde_private_Tanjong_Pagar_bw <- density(private_Tanjong_Pagar_ppp , sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_private_Tanjong_Pagar_bw)
WARNNING: The land area of Tanjong Pagar is very small approximately 0.2km2. Therefore, we cannot rescale the size by 1000. An ideal rescale size would be 100m.
private_Tanjong_Pagar_ppp.100m <- rescale(private_Tanjong_Pagar_ppp, 100, "m")
kde_private_Tanjong_Pagar.bw <- density(private_Tanjong_Pagar_ppp.100m, sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_private_Tanjong_Pagar.bw)
gridded_kde_private_Tanjong_Pagar_bw <- as.SpatialGridDataFrame.im(rescale(kde_private_Tanjong_Pagar.bw, 1/100,"m"))
spplot(gridded_kde_private_Tanjong_Pagar_bw)
kde_private_Tanjong_Pagar_bw_raster <- raster(gridded_kde_private_Tanjong_Pagar_bw)
kde_private_Tanjong_Pagar_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 3.758669, 4.986962 (x, y)
## extent : 29169.13, 29650.24, 28430.25, 29068.58 (xmin, xmax, ymin, ymax)
## crs : NA
## source : memory
## names : v
## values : 1.630879e-09, 7.352955 (min, max)
projection(kde_private_Tanjong_Pagar_bw_raster) <- CRS("+init=EPSG:3414")
kde_private_Tanjong_Pagar_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 3.758669, 4.986962 (x, y)
## extent : 29169.13, 29650.24, 28430.25, 29068.58 (xmin, xmax, ymin, ymax)
## crs : +init=EPSG:3414 +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs
## source : memory
## names : v
## values : 1.630879e-09, 7.352955 (min, max)
tmap_mode('view')
## tmap mode set to interactive viewing
tm_shape(kde_private_Tanjong_Pagar_bw_raster) +
tm_raster("v",alpha = 0.7) +
tm_layout(legend.position = c("right", "bottom"), frame = FALSE)+
tm_shape(mpsz)+
tm_polygons(alpha = 0)
tmap_mode('plot')
## tmap mode set to plotting
Computing KDE
kde_hotel_Tanjong_Pagar_bw <- density(hotel_Tanjong_Pagar_ppp , sigma=bw.diggle, edge=TRUE, kernel="gaussian")
## Warning: Berman-Diggle Cross-Validation criterion was optimised at right-hand
## end of interval [0, 30]; use argument 'hmax' to specify a wider interval for
## bandwidth 'sigma'
plot(kde_hotel_Tanjong_Pagar_bw)
WARNNING: The land area of Tanjong Pagar is very small approximately 0.2km2. Therefore, we cannot rescale the size by 1000. An ideal rescale size would be 100m.
hotel_Tanjong_Pagar_ppp.100m <- rescale(hotel_Tanjong_Pagar_ppp, 100, "m")
kde_hotel_Tanjong_Pagar.bw <- density(hotel_Tanjong_Pagar_ppp.100m, sigma=bw.diggle, edge=TRUE, kernel="gaussian")
## Warning: Berman-Diggle Cross-Validation criterion was optimised at right-hand
## end of interval [0, 0.3]; use argument 'hmax' to specify a wider interval for
## bandwidth 'sigma'
plot(kde_hotel_Tanjong_Pagar.bw)
gridded_kde_hotel_Tanjong_Pagar_bw <- as.SpatialGridDataFrame.im(rescale(kde_hotel_Tanjong_Pagar.bw, 1/100,"m"))
spplot(gridded_kde_hotel_Tanjong_Pagar_bw)
kde_hotel_Tanjong_Pagar_bw_raster <- raster(gridded_kde_hotel_Tanjong_Pagar_bw)
kde_hotel_Tanjong_Pagar_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 3.758669, 4.986962 (x, y)
## extent : 29169.13, 29650.24, 28430.25, 29068.58 (xmin, xmax, ymin, ymax)
## crs : NA
## source : memory
## names : v
## values : -2.026363e-16, 1.780085 (min, max)
projection(kde_hotel_Tanjong_Pagar_bw_raster) <- CRS("+init=EPSG:3414")
kde_hotel_Tanjong_Pagar_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 3.758669, 4.986962 (x, y)
## extent : 29169.13, 29650.24, 28430.25, 29068.58 (xmin, xmax, ymin, ymax)
## crs : +init=EPSG:3414 +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs
## source : memory
## names : v
## values : -2.026363e-16, 1.780085 (min, max)
tmap_mode('view')
## tmap mode set to interactive viewing
tm_shape(kde_hotel_Tanjong_Pagar_bw_raster) +
tm_raster("v",alpha = 0.7) +
tm_layout(legend.position = c("right", "bottom"), frame = FALSE)+
tm_shape(mpsz)+
tm_polygons(alpha = 0)
tmap_mode('plot')
## tmap mode set to plotting
Computing KDE
kde_entire_Tanjong_Pagar_bw <- density(entire_Tanjong_Pagar_ppp , sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_entire_Tanjong_Pagar_bw)
WARNNING: The land area of Tanjong Pagar is very small approximately 0.2km2. Therefore, we cannot rescale the size by 1000. An ideal rescale size would be 100m.
entire_Tanjong_Pagar_ppp.100m <- rescale(entire_Tanjong_Pagar_ppp, 100, "m")
kde_entire_Tanjong_Pagar.bw <- density(entire_Tanjong_Pagar_ppp.100m, sigma=bw.diggle, edge=TRUE, kernel="gaussian")
plot(kde_entire_Tanjong_Pagar.bw)
gridded_kde_entire_Tanjong_Pagar_bw <- as.SpatialGridDataFrame.im(rescale(kde_entire_Tanjong_Pagar.bw, 1/100,"m"))
spplot(gridded_kde_entire_Tanjong_Pagar_bw)
kde_entire_Tanjong_Pagar_bw_raster <- raster(gridded_kde_entire_Tanjong_Pagar_bw)
kde_entire_Tanjong_Pagar_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 3.758669, 4.986962 (x, y)
## extent : 29169.13, 29650.24, 28430.25, 29068.58 (xmin, xmax, ymin, ymax)
## crs : NA
## source : memory
## names : v
## values : 6.576149e-10, 49.87469 (min, max)
projection(kde_entire_Tanjong_Pagar_bw_raster) <- CRS("+init=EPSG:3414")
kde_entire_Tanjong_Pagar_bw_raster
## class : RasterLayer
## dimensions : 128, 128, 16384 (nrow, ncol, ncell)
## resolution : 3.758669, 4.986962 (x, y)
## extent : 29169.13, 29650.24, 28430.25, 29068.58 (xmin, xmax, ymin, ymax)
## crs : +init=EPSG:3414 +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs
## source : memory
## names : v
## values : 6.576149e-10, 49.87469 (min, max)
tmap_mode('view')
## tmap mode set to interactive viewing
tm_shape(kde_entire_Tanjong_Pagar_bw_raster) +
tm_raster("v", breaks = c(0,5,10,15,20,25,30,35,40),alpha = 0.7) +
tm_layout(legend.position = c("right", "bottom"), frame = FALSE)+
tm_shape(mpsz)+
tm_polygons(alpha = 0)
tmap_mode('plot')
## tmap mode set to plotting
The size Tanjong Pagar areas are very small and the property price are relatively high as the location of the Tanjong Pagar is very near to CBD areas. Therefore, it attract a lot of working adults to rent long term houses around the area. Since the area of Tanjong Pagar are very small, therefore all the residence building tend to cluster within the same area.