A study to see if the mobile speed readings are indeed as random as what the map published on the blogpost by Inforcomm Development Authority of Singapore here.

The data was obtained from the follwing url : https://data.gov.sg/media/uploads/blog/2016/04/myconnection/data/speed_data_layer.js

However the data obtained is not in the required format, thus some data cleaning has to be done.

Reading in the data

s <- readLines("https://data.gov.sg/media/uploads/blog/2016/04/myconnection/data/speed_data_layer.js")

Viewing the data

head(s)
[1] "var speed_data_layer = {"                                                                                                                                                                                                                                                                                                                                                                      
[2] "\"type\": \"FeatureCollection\","                                                                                                                                                                                                                                                                                                                                                              
[3] "\"crs\": { \"type\": \"name\", \"properties\": { \"name\": \"urn:ogc:def:crs:OGC:1.3:CRS84\" } },"                                                                                                                                                                                                                                                                                             
[4] "                                                                                "                                                                                                                                                                                                                                                                                                              
[5] "\"features\": ["                                                                                                                                                                                                                                                                                                                                                                               
[6] "{ \"type\": \"Feature\", \"properties\": { \"grid_id\": 2552, \"perc_disc_50\": 16.6416 }, \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [ 103.616, 1.252272733872298 ], [ 103.615, 1.250540683064729 ], [ 103.613, 1.250540683064729 ], [ 103.612, 1.252272733872298 ], [ 103.613, 1.254004784679867 ], [ 103.615, 1.254004784679867 ], [ 103.616, 1.252272733872298 ] ] ] } },"

The given data is in a GeoJSON format. However there exists some javascript in the first few lines of the file, so some work has to be done to remove those lines.

Removing javascript from the file

s <- gsub(s, pattern = "var speed_data_layer = ", replacement = "")

Saving and reading the data into R as a spatial object

library(rgdal)
writeLines(s, "speed.geojson")
s.sp <- readOGR("speed.geojson","OGRGeoJSON") # Need to import rgdal lib
OGR data source with driver: GeoJSON 
Source: "speed.geojson", layer: "OGRGeoJSON"
with 3147 features
It has 2 fields

Confirming that the data is correct

plot(s.sp)

head(s.sp@data)

From the blogpost, we know that the column “perc_disc_5o” represents the median speed in each grid cell.

median(s.sp$perc_disc_50)
[1] 13.94566
mean(s.sp$perc_disc_50)
[1] 16.92992
summary(s.sp)
Object of class SpatialPolygonsDataFrame
Coordinates:
         min        max
x 103.612000 104.033000
y   1.222828   1.470511
Is projected: FALSE 
proj4string :
[+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs]
Data attributes:
    grid_id       perc_disc_50     
 Min.   : 2552   Min.   :  0.3395  
 1st Qu.: 7824   1st Qu.:  9.7170  
 Median : 9876   Median : 13.9457  
 Mean   : 9809   Mean   : 16.9299  
 3rd Qu.:11868   3rd Qu.: 18.5637  
 Max.   :16621   Max.   :289.3561  

Now that the data has been correctly loads, we can save it into a shp file for further processing in ArcGIS.

if(!file.exists("4g-hex.shp")){
  writeOGR(s.sp, ".", "4g-hex", driver="ESRI Shapefile")
}

Plotting the data using ARCGis

Visualisation of internet speeds in SG

Visualisation of internet speeds in SG

Using Morans I to check for spatial correlation

Checking for spatial correlation

Checking for spatial correlation

Results indicate that the degree of clustering on the global scale is very small (0.07). However there might be local clustering, thus we run the Getis-Ord Gi* Hot Spot Analysis Tool to find hotspots in the data.

Internet speed hot and cold spots in SG

Internet speed hot and cold spots in SG

Parks in SG

Parks in SG

Analysis

From the graph of hotspots and coldspots of internet speeds in Singapore, there seems to be a clustering of higher internet speeds around public parks, where the largest cluster of internet hotspots would be in the area around East Coast Park. Comparing our speed map with a map from URA showing parks in singapore, we can easily observe that the other hotspots in areas such as Pasir Ris Park, Punggol Waterway and Coney Island, and the area around Jurong Lake Park. This might be due to telecos putting additional infrastructure in these places to accommodate for the greater amount of people whom will be utilising their mobile devices to access the internet in these places, as compared to other residential areas where users can utilise their home wi-fi network. Other reasons might be due to having more data regarding these areas as the data collection for internet speed is carried out by collecting internet speed from mobile devices that has downloaded the app, MyConnectionSG. Thus, as users are more likely to use their mobile devices in public places, there might be more data collected in these areas, which might give a better representation of internet speeds in these areas, as compared to other areas with lesser data, a few slow internet connections would easily reduce the aggregated internet speed in that given area. As for the coldspots for 4G internet connection, the largest cluster of coldspots seem to be around the area around punggol and sengkang, along the Tamapines Expressway. The next cluster appears to be around Marine Parade and Geylang. This might be because these areas are still under development, and the telecos have yet to put in the infrastructure to support faster internet speeds in these areas. Other reasons might be because some of this places might be along roads or expressways, thus the telecos might not decide to provide the infrastructure to support faster internet speeds in this area. Another reason might be because these areas are along roads, so there is not much data collected in this area, and a few slow internet connections might be bringing down the aggregated internet speed in this area. Moving along roads might cause the observed internet speed to decrease as the movement of vehicles on roads and the movement of the individual using his or her mobile device in the vehicle might increase packet loss, resulting in a slower internet speed.

LS0tDQp0aXRsZTogIkxhYiAxMCAtIG1vYmlsZSBicm9hZGJhbmQgc3BlZWRzIGluIFNpbmdhcG9yZSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KYXV0aG9yOiBOaWNob2xhcyBZZW93DQotLS0NCg0KQSBzdHVkeSB0byBzZWUgaWYgdGhlIG1vYmlsZSBzcGVlZCByZWFkaW5ncyBhcmUgaW5kZWVkIGFzIHJhbmRvbSBhcyB3aGF0IHRoZSBtYXAgcHVibGlzaGVkIG9uIHRoZSBibG9ncG9zdCBieSBJbmZvcmNvbW0gRGV2ZWxvcG1lbnQgQXV0aG9yaXR5IG9mIFNpbmdhcG9yZSBbaGVyZV0oaHR0cHM6Ly9kYXRhLmdvdi5zZy9ibG9nL3NpbmdhcG9yZS1tb2JpbGUtYnJvYWRiYW5kKS4NCg0KVGhlIGRhdGEgd2FzIG9idGFpbmVkIGZyb20gdGhlIGZvbGx3aW5nIHVybCA6DQpodHRwczovL2RhdGEuZ292LnNnL21lZGlhL3VwbG9hZHMvYmxvZy8yMDE2LzA0L215Y29ubmVjdGlvbi9kYXRhL3NwZWVkX2RhdGFfbGF5ZXIuanMNCg0KSG93ZXZlciB0aGUgZGF0YSBvYnRhaW5lZCBpcyBub3QgaW4gdGhlIHJlcXVpcmVkIGZvcm1hdCwgdGh1cyBzb21lIGRhdGEgY2xlYW5pbmcgaGFzIHRvIGJlIGRvbmUuIA0KDQpSZWFkaW5nIGluIHRoZSBkYXRhDQpgYGB7cn0NCnMgPC0gcmVhZExpbmVzKCJodHRwczovL2RhdGEuZ292LnNnL21lZGlhL3VwbG9hZHMvYmxvZy8yMDE2LzA0L215Y29ubmVjdGlvbi9kYXRhL3NwZWVkX2RhdGFfbGF5ZXIuanMiKQ0KYGBgDQoNClZpZXdpbmcgdGhlIGRhdGENCmBgYHtyfQ0KaGVhZChzKQ0KYGBgDQoNClRoZSBnaXZlbiBkYXRhIGlzIGluIGEgR2VvSlNPTiBmb3JtYXQuIEhvd2V2ZXIgdGhlcmUgZXhpc3RzIHNvbWUgamF2YXNjcmlwdCBpbiB0aGUgZmlyc3QgZmV3IGxpbmVzIG9mIHRoZSBmaWxlLCBzbyBzb21lIHdvcmsgaGFzIHRvIGJlIGRvbmUgdG8gcmVtb3ZlIHRob3NlIGxpbmVzLg0KDQpSZW1vdmluZyBqYXZhc2NyaXB0IGZyb20gdGhlIGZpbGUNCmBgYHtyfQ0KcyA8LSBnc3ViKHMsIHBhdHRlcm4gPSAidmFyIHNwZWVkX2RhdGFfbGF5ZXIgPSAiLCByZXBsYWNlbWVudCA9ICIiKQ0KYGBgDQoNClNhdmluZyBhbmQgcmVhZGluZyB0aGUgZGF0YSBpbnRvIFIgYXMgYSBzcGF0aWFsIG9iamVjdA0KYGBge3J9DQpsaWJyYXJ5KHJnZGFsKQ0Kd3JpdGVMaW5lcyhzLCAic3BlZWQuZ2VvanNvbiIpDQpzLnNwIDwtIHJlYWRPR1IoInNwZWVkLmdlb2pzb24iLCJPR1JHZW9KU09OIikgIyBOZWVkIHRvIGltcG9ydCByZ2RhbCBsaWINCmBgYA0KDQpDb25maXJtaW5nIHRoYXQgdGhlIGRhdGEgaXMgY29ycmVjdA0KYGBge3J9DQpwbG90KHMuc3ApDQpoZWFkKHMuc3BAZGF0YSkNCmBgYA0KDQpGcm9tIHRoZSBibG9ncG9zdCwgd2Uga25vdyB0aGF0IHRoZSBjb2x1bW4gInBlcmNfZGlzY181byIgcmVwcmVzZW50cyB0aGUgbWVkaWFuIHNwZWVkIGluIGVhY2ggZ3JpZCBjZWxsLg0KDQpgYGB7cn0NCm1lZGlhbihzLnNwJHBlcmNfZGlzY181MCkNCm1lYW4ocy5zcCRwZXJjX2Rpc2NfNTApDQpzdW1tYXJ5KHMuc3ApDQpgYGANCg0KTm93IHRoYXQgdGhlIGRhdGEgaGFzIGJlZW4gY29ycmVjdGx5IGxvYWRzLCB3ZSBjYW4gc2F2ZSBpdCBpbnRvIGEgc2hwIGZpbGUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBpbiBBcmNHSVMuDQpgYGB7cn0NCmlmKCFmaWxlLmV4aXN0cygiNGctaGV4LnNocCIpKXsNCiAgd3JpdGVPR1Iocy5zcCwgIi4iLCAiNGctaGV4IiwgZHJpdmVyPSJFU1JJIFNoYXBlZmlsZSIpDQp9DQpgYGANCg0KI1Bsb3R0aW5nIHRoZSBkYXRhIHVzaW5nIEFSQ0dpcw0KDQohW1Zpc3VhbGlzYXRpb24gb2YgaW50ZXJuZXQgc3BlZWRzIGluIFNHXShEOi9CYWNrdXAvU1VURC9IQVNTL01hcHMgMS9MYWJzL0xhYiAxMC9BcmNNYXBMYWIxMC1PcmlnaW5hbE1hcC5wbmcpDQoNClVzaW5nIE1vcmFucyBJIHRvIGNoZWNrIGZvciBzcGF0aWFsIGNvcnJlbGF0aW9uDQoNCiFbQ2hlY2tpbmcgZm9yIHNwYXRpYWwgY29ycmVsYXRpb25dKEQ6L0JhY2t1cC9TVVREL0hBU1MvTWFwcyAxL0xhYnMvTGFiIDEwL01vcmFuc0ktbG9va2luZy1mb3Itc3BhdGlhbC1jb3JyZWxhdGlvbi5wbmcpDQoNClJlc3VsdHMgaW5kaWNhdGUgdGhhdCB0aGUgZGVncmVlIG9mIGNsdXN0ZXJpbmcgb24gdGhlIGdsb2JhbCBzY2FsZSBpcyB2ZXJ5IHNtYWxsICgwLjA3KS4gSG93ZXZlciB0aGVyZSBtaWdodCBiZSBsb2NhbCBjbHVzdGVyaW5nLCB0aHVzIHdlIHJ1biB0aGUgR2V0aXMtT3JkIEdpKiBIb3QgU3BvdCBBbmFseXNpcyBUb29sIHRvIGZpbmQgaG90c3BvdHMgaW4gdGhlIGRhdGEuDQoNCiFbSW50ZXJuZXQgc3BlZWQgaG90IGFuZCBjb2xkIHNwb3RzIGluIFNHXShEOlxcQmFja3VwXFxTVVREXFxIQVNTXFxNYXBzIDFcXExhYnNcXExhYiAxMFxcQXJjTWFwTGFiMTAtNEdfc3BlZWRzX2luU0cucG5nKQ0KDQohW1BhcmtzIGluIFNHXShEOi9CYWNrdXAvU1VURC9IQVNTL01hcHMgMS9MYWJzL0xhYiAxMC9QYXJrcy1pbi1TRy5qcGVnKQ0KDQoNCiMjQW5hbHlzaXMNCg0KRnJvbSB0aGUgZ3JhcGggb2YgaG90c3BvdHMgYW5kIGNvbGRzcG90cyBvZiBpbnRlcm5ldCBzcGVlZHMgaW4gU2luZ2Fwb3JlLCB0aGVyZSBzZWVtcyB0byBiZSBhIGNsdXN0ZXJpbmcgb2YgaGlnaGVyIGludGVybmV0IHNwZWVkcyBhcm91bmQgcHVibGljIHBhcmtzLCB3aGVyZSB0aGUgbGFyZ2VzdCBjbHVzdGVyIG9mIGludGVybmV0IGhvdHNwb3RzIHdvdWxkIGJlIGluIHRoZSBhcmVhIGFyb3VuZCBFYXN0IENvYXN0IFBhcmsuIENvbXBhcmluZyBvdXIgc3BlZWQgbWFwIHdpdGggYSBtYXAgZnJvbSBVUkEgc2hvd2luZyBwYXJrcyBpbiBzaW5nYXBvcmUsIHdlIGNhbiBlYXNpbHkgb2JzZXJ2ZSB0aGF0IHRoZSBvdGhlciBob3RzcG90cyBpbiBhcmVhcyBzdWNoIGFzIFBhc2lyIFJpcyBQYXJrLCBQdW5nZ29sIFdhdGVyd2F5IGFuZCBDb25leSBJc2xhbmQsIGFuZCB0aGUgYXJlYSBhcm91bmQgSnVyb25nIExha2UgUGFyay4gVGhpcyBtaWdodCBiZSBkdWUgdG8gdGVsZWNvcyBwdXR0aW5nIGFkZGl0aW9uYWwgaW5mcmFzdHJ1Y3R1cmUgaW4gdGhlc2UgcGxhY2VzIHRvIGFjY29tbW9kYXRlIGZvciB0aGUgZ3JlYXRlciBhbW91bnQgb2YgcGVvcGxlIHdob20gd2lsbCBiZSB1dGlsaXNpbmcgdGhlaXIgbW9iaWxlIGRldmljZXMgdG8gYWNjZXNzIHRoZSBpbnRlcm5ldCBpbiB0aGVzZSBwbGFjZXMsIGFzIGNvbXBhcmVkIHRvIG90aGVyIHJlc2lkZW50aWFsIGFyZWFzIHdoZXJlIHVzZXJzIGNhbiB1dGlsaXNlIHRoZWlyIGhvbWUgd2ktZmkgbmV0d29yay4gT3RoZXIgcmVhc29ucyBtaWdodCBiZSBkdWUgdG8gaGF2aW5nIG1vcmUgZGF0YSByZWdhcmRpbmcgdGhlc2UgYXJlYXMgYXMgdGhlIGRhdGEgY29sbGVjdGlvbiBmb3IgaW50ZXJuZXQgc3BlZWQgaXMgY2FycmllZCBvdXQgYnkgY29sbGVjdGluZyBpbnRlcm5ldCBzcGVlZCBmcm9tIG1vYmlsZSBkZXZpY2VzIHRoYXQgaGFzIGRvd25sb2FkZWQgdGhlIGFwcCwgTXlDb25uZWN0aW9uU0cuIFRodXMsIGFzIHVzZXJzIGFyZSBtb3JlIGxpa2VseSB0byB1c2UgdGhlaXIgbW9iaWxlIGRldmljZXMgaW4gcHVibGljIHBsYWNlcywgdGhlcmUgbWlnaHQgYmUgbW9yZSBkYXRhIGNvbGxlY3RlZCBpbiB0aGVzZSBhcmVhcywgd2hpY2ggbWlnaHQgZ2l2ZSBhIGJldHRlciByZXByZXNlbnRhdGlvbiBvZiBpbnRlcm5ldCBzcGVlZHMgaW4gdGhlc2UgYXJlYXMsIGFzIGNvbXBhcmVkIHRvIG90aGVyIGFyZWFzIHdpdGggbGVzc2VyIGRhdGEsIGEgZmV3IHNsb3cgaW50ZXJuZXQgY29ubmVjdGlvbnMgd291bGQgZWFzaWx5IHJlZHVjZSB0aGUgYWdncmVnYXRlZCBpbnRlcm5ldCBzcGVlZCBpbiB0aGF0IGdpdmVuIGFyZWEuDQpBcyBmb3IgdGhlIGNvbGRzcG90cyBmb3IgNEcgaW50ZXJuZXQgY29ubmVjdGlvbiwgdGhlIGxhcmdlc3QgY2x1c3RlciBvZiBjb2xkc3BvdHMgc2VlbSB0byBiZSBhcm91bmQgdGhlIGFyZWEgYXJvdW5kIHB1bmdnb2wgYW5kIHNlbmdrYW5nLCBhbG9uZyB0aGUgVGFtYXBpbmVzIEV4cHJlc3N3YXkuIFRoZSBuZXh0IGNsdXN0ZXIgYXBwZWFycyB0byBiZSBhcm91bmQgTWFyaW5lIFBhcmFkZSBhbmQgR2V5bGFuZy4gVGhpcyBtaWdodCBiZSBiZWNhdXNlIHRoZXNlIGFyZWFzIGFyZSBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCwgYW5kIHRoZSB0ZWxlY29zIGhhdmUgeWV0IHRvIHB1dCBpbiB0aGUgaW5mcmFzdHJ1Y3R1cmUgdG8gc3VwcG9ydCBmYXN0ZXIgaW50ZXJuZXQgc3BlZWRzIGluIHRoZXNlIGFyZWFzLiBPdGhlciByZWFzb25zIG1pZ2h0IGJlIGJlY2F1c2Ugc29tZSBvZiB0aGlzIHBsYWNlcyBtaWdodCBiZSBhbG9uZyByb2FkcyBvciBleHByZXNzd2F5cywgdGh1cyB0aGUgdGVsZWNvcyBtaWdodCBub3QgZGVjaWRlIHRvIHByb3ZpZGUgdGhlIGluZnJhc3RydWN0dXJlIHRvIHN1cHBvcnQgZmFzdGVyIGludGVybmV0IHNwZWVkcyBpbiB0aGlzIGFyZWEuIEFub3RoZXIgcmVhc29uIG1pZ2h0IGJlIGJlY2F1c2UgdGhlc2UgYXJlYXMgYXJlIGFsb25nIHJvYWRzLCBzbyB0aGVyZSBpcyBub3QgbXVjaCBkYXRhIGNvbGxlY3RlZCBpbiB0aGlzIGFyZWEsIGFuZCBhIGZldyBzbG93IGludGVybmV0IGNvbm5lY3Rpb25zIG1pZ2h0IGJlIGJyaW5naW5nIGRvd24gdGhlIGFnZ3JlZ2F0ZWQgaW50ZXJuZXQgc3BlZWQgaW4gdGhpcyBhcmVhLiBNb3ZpbmcgYWxvbmcgcm9hZHMgbWlnaHQgY2F1c2UgdGhlIG9ic2VydmVkIGludGVybmV0IHNwZWVkIHRvIGRlY3JlYXNlIGFzIHRoZSBtb3ZlbWVudCBvZiB2ZWhpY2xlcyBvbiByb2FkcyBhbmQgdGhlIG1vdmVtZW50IG9mIHRoZSBpbmRpdmlkdWFsIHVzaW5nIGhpcyBvciBoZXIgbW9iaWxlIGRldmljZSBpbiB0aGUgdmVoaWNsZSBtaWdodCBpbmNyZWFzZSBwYWNrZXQgbG9zcywgcmVzdWx0aW5nIGluIGEgc2xvd2VyIGludGVybmV0IHNwZWVkLiANCg0K