R als een Gis

Over ruimtelijke data en het gebruik van R als een GIS

Harrie Jonkman www.harriejonkman.nl
12-15-2019

Introduction to Spatial Data & Using R as a GIS

Dit is een bewerking en verkorte versie van de tutorial die Nick Bearman eerder schreef (Introduction to Spatial Data & Using R as a GIS) en die vrij toegankelijk is hier. De data die in deze tutorial worden gebruikt zijn eigen data of open data ook om de techniek goed onder de knie te krijgen. Dank je wel Nick Bearman.

Eindtermen: R Functies & Bibliotheken:

Intro op R & GIS

R Basis

R begon als een statistisch programma en wordt nog steeds door veel gebruikers als een programma gebruikt. We gaan een programma gebruiken dat RStudio heet, dat bovenop R werkt en een goede gebruikersinterface biedt. Ik zal het in de presentatie even hebben over RStudio, en de belangrijkste gebieden van het venster zijn op de achterzijde gemarkeerd.


[1] 14

Maak je voorlopig geen zorgen over de [1] - let wel dat R 14 heeft afgedrukt, want dit is het antwoord op de som die je hebt ingetikt. In deze werkbladen laat ik soms de resultaten zien van wat je hebt ingetypt, zoals hieronder:


[1] 20

Merk ook op dat * hier het symbool voor vermenigvuldiging is - in het laatste commando vroeg R om de berekening 5 maal 4 uit te voeren. Andere symbolen zijn - voor aftrekken en / voor delen:


[1] -2

[1] 0.3529412

Je kunt de antwoorden van de berekeningen ook toewijzen aan variabelen en gebruiken in berekeningen.

Hier wordt de waarde 300 opgeslagen in de variabele prijs. Het <- symbool betekent dat de waarde rechts in de variabele links in de variabele wordt gezet, deze wordt getypt met een << gevolgd door een -. De variabelen worden getoond in het venster met de naam Environment, rechtsboven in het venster. Variabelen kunnen gebruikt worden in volgende berekeningen. Om bijvoorbeeld een korting van 20% op deze prijs toe te passen, kunt je het volgende invoeren:

#Figure 1: Screenshot of RStudio


[1] 240

of gebruik tussenvariabelen:


[1] 240

R kan ook werken met lijsten met nummers, maar ook met individuele nummers. Lijsten worden gespecificeerd met behulp van de c-functie. Stel dat je een lijst hebt met huizenprijzen in duizenden euro’s. Je zou ze kunnen opslaan in een variabele die house.prices genoemd wordt, zoals hieronder:


[1] 120 150 212  99 199 299 159

Merk op dat er geen probleem is met punten in het midden van variabelenamen. U kunt dan functies toepassen op deze lijsten.


[1] 176.8571

Als de huizenprijzen in duizenden euro’s zijn, dan zegt dit ons dat de gemiddelde huizenprijs 176.900 EURO bedraagt. Merk op dat het antwoord op jouw scherm meer cijfers kan weergegeven. Dus je kunt iets als 176.8571429 voor gemiddelde waarde hebben.

Het Dataframe

R heeft een manier om gegevens op te slaan in een object dat een dataframe wordt genoemd. Dit lijkt op een interne spreadsheet.


[1] 240

Waar alle relevante gegevenselementen samen als een set kolommen worden opgeslagen.

We hebben een CSV-bestand van huizenprijzen en inbraakcijfers, dat we in R kunnen laden. We kunnen gebruik maken van een functie genaamd read.csv die, zoals je misschien wel kunt bedenken, CSV-bestanden leest. Voer de onderstaande coderegel uit, die het CSV-bestand in een variabele met de naam hp.data laadt.

Rotterdam

Als we de gegevens inlezen, is het altijd een goed idee om te controleren of ze goed zijn binnengekomen. Om dit te doen, kunnen we een voorbeeld van de dataset bekijken. Het head-commando toont de eerste 6 rijen van de data.

Hieronder lezen we dan ons databestand in.


# A tibble: 6 x 2
  buurtenrotterdam            NNGB
  <chr>                      <dbl>
1 Afrikaanderwijk             0.86
2 Agniesebuurt               NA   
3 Bedrijvenpark Noord_West   NA   
4 Bedrijventerrein Schieveen NA   
5 Bergpolder                 NA   
6 Beverwaard                  0.78

Je kunt ook op de variabele in het venster Environment klikken, die de gegevens in een nieuw tabblad zal tonen. Je kunt ook zelf invoeren en een tabblad openen met de gegevens:


#Probeer onderstaande, hier niet afgedrukt want dit wordt te lang
View(RotterdamStaat)

Je kunt ook elke kolom in de dataset beschrijven met behulp van de summary-functie:

Item Beschrijving

Min. De kleinste waarde in de kolom 1st. Qu. Het eerste kwartiel (de waarde 1/4 van de variabele) Median De mediaan (de waarde 1/2 van de variabele) Mean Het gemiddelde van de kolom 3rd. Qu. Het derde kwartiel (de waarde 3/4 van de variabele) Max. De hoogste waarde in de kolom


 buurtenrotterdam        NNGB       
 Length:93          Min.   :0.6500  
 Class :character   1st Qu.:0.7650  
 Mode  :character   Median :0.8000  
                    Mean   :0.8006  
                    3rd Qu.:0.8400  
                    Max.   :0.9000  
                    NA's   :30      

Voor elke kolom wordt een aantal waarden genoemd:

Op basis van deze getallen kan een indruk worden verkregen van de spreiding van de waarden van elke variabele. Met name kan worden vastgesteld dat de mediaan van de huizenprijs in St. Helens per wijk varieert van 65.000 EURO tot 260.000 EURO en dat de helft van de prijzen tussen 152.500 EURO en 210.000 EURO ligt. Ook kan worden vastgesteld dat, aangezien de mediaan van het gemeten inbraakpercentage nul is, ten minste de helft van de gebieden geen inbraken had in de maand waarin de tellingen werden samengesteld..

We kunnen vierkante haken gebruiken om specifieke delen van het dataframe te bekijken, bijvoorbeeld hp.data[1,] of hp.data[,1]. We kunnen ook kolommen verwijderen en nieuwe kolommen aanmaken met behulp van de onderstaande code. Vergeet niet om het head() commando te gebruiken zoals we eerder deden om naar het dataframe te kijken.


# A tibble: 6 x 3
  buurtenrotterdam            NNGB counciltax
  <chr>                      <dbl> <lgl>     
1 Afrikaanderwijk             0.86 NA        
2 Agniesebuurt               NA    NA        
3 Bedrijvenpark Noord_West   NA    NA        
4 Bedrijventerrein Schieveen NA    NA        
5 Bergpolder                 NA    NA        
6 Beverwaard                  0.78 NA        

# A tibble: 6 x 3
  buurtenrotterdam            NNGB `Price-thousands`
  <chr>                      <dbl> <lgl>            
1 Afrikaanderwijk             0.86 NA               
2 Agniesebuurt               NA    NA               
3 Bedrijvenpark Noord_West   NA    NA               
4 Bedrijventerrein Schieveen NA    NA               
5 Bergpolder                 NA    NA               
6 Beverwaard                  0.78 NA               

Geograpfische Informatie

R heeft zich ontwikkeld tot een GIS waar gebruikers aan hebben bijgedragen met pakketten, of ‘libraries’ zoals R ze noemt. We zullen in de tutorial verschillende van dit soort ‘libraries’ gebruiken en zullen ze laden als dat nodig is.

Als u uw computer gebruikt, moet u de R-libraries installeren en ze ook laden. Om dit te doen, start u install.packages (“library_name”).

Om met ruimtelijke gegevens te kunnen werken, moeten we na dat installeren een aantal ‘libraries’ laden>

Om met ruimtelijke gegevens te werken, moeten we enkele libraries laden. Daarmee is R echter alleen maar in staat om geografische data te verwerken. Het laadt nog geen specifieke data sets. Om dit te doen, moeten we enkele gegevens inlezen. Hiervoor gaan we shapefiles gebruiken - een bekend GIS-dataformat. We gaan LSOA(Lower layer Super Output Areas)-data gebruiken voor St. Helens in Merseyside.

R gebruikt werkmappen om informatie op te slaan die relevant is voor het huidige project waaraan je werkt. Ik stel voor dat je een map een bepaalde naam geeft die het R-werk ergens zinvol maakt. Dan moeten we R vertellen waar deze map staat, dus klik op Session > Set Working Directory > Choose Directory. . en selecteer de map die je hebt aangemaakt.

Zoals met de meeste programma’s, zijn er meerdere manieren om dingen te doen. Om bijvoorbeeld de werkmap in te stellen, kunnen we het volgende typen: setwd(“M:/R_werk”). Jouw versie kan een langere titel hebben, afhankelijk van hoe je de map noemt. Merk ook op dat schuine streepjes worden aangegeven met een ‘/’ en niet ’'.

Er is een set van shapefiles voor de St. Helens-wijken op dezelfde locatie als de dataset die je eerder hebt gelezen. Omdat er meerdere bestanden nodig zijn, heb ik deze in één zip-bestand gebundeld. Deze download je naar jouw lokale map en pakt deze vervolgens uit. Dit doe je met de volgende R-functies:

De eerste functie downloadt het zip-bestand daadwerkelijk in uw werkmap. De tweede functie pakt het zip-bestand uit. Nu kunnen we het bestand in R lezen.


Reading layer `wijkindeling' from data source `C:\HARRIE\Tijdelijk\Git\HarriesHoekje\_posts\2019-12-15-r-als-een-gis\wijkindeling.shp' using driver `ESRI Shapefile'
Simple feature collection with 85 features and 14 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 55500 ymin: 428647.4 xmax: 101032.6 ymax: 447000
epsg (SRID):    NA
proj4string:    +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs

De st_read functie doet dit en slaat ze op als een Simple Features (of sf) object. Je kunt de qtm-functie gebruiken om de polygonen (d.w.z. de kaart van de LSOA) te tekenen.

We kunnen ook het head()-commando gebruiken om de eerste zes rijen te tonen, precies hetzelfde als bij een data frame.


Simple feature collection with 6 features and 14 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 87699.71 ymin: 433848.1 xmax: 96594.48 ymax: 440401.8
epsg (SRID):    NA
proj4string:    +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs
  GROEP CODE GEMEENTE GEBIED BUURT SUBBUURT SBTDEEL BLOK TEKST
1   TIR   15      599     10    79       -1      -1   -1  1079
2   TIR   15      599      3    27       -1      -1   -1  0327
3   TIR   15      599     19    26       -1      -1   -1  1926
4   TIR   15      599      3    22       -1      -1   -1  0322
5   TIR   15      599      8    42       -1      -1   -1  0842
6   TIR   15      599     10    82       -1      -1   -1  1082
             GEBDNAAM                    BUURTNAAM wijknr Shape_Leng
1          Feijenoord      Kop van Zuid - Entrepot     79   4134.193
2          Delfshaven    Oud Mathenesse/Witte Dorp   3004   4828.106
3    Nieuw Mathenesse             Nieuw Mathenesse      0   6494.563
4          Delfshaven                 Tussendijken     22   2853.695
5 Kralingen-Crooswijk Kralingen Oost/Kralingse Bos   3005  12400.652
6          Feijenoord                   Hillesluis     82   4786.269
  Shape_Area                       geometry
1   671847.0 POLYGON ((93530.4 436049.7,...
2   880203.0 POLYGON ((89592.66 437446.3...
3  2071912.9 POLYGON ((87705.53 436406.7...
4   399761.8 POLYGON ((89484.61 436419.5...
5  6521950.1 POLYGON ((95980.45 440392, ...
6   902617.3 POLYGON ((94062.15 434700.2...

Voor degene die met GIS werkt: Dit is hetzelfde als de attribuutentententabel in programma’s als ArcGIS, QGIS of MapInfo. Als u het shapefile in QGIS of ArcGIS wilt openen om vast te stellen hoe het er zo’n beetje uit ziet, kunt u dat doen.

Je kunt zien dat er veel informatie beschikbaar is, inclusief de geometrie. Voor ons is het ID-veld belangrijk, en zien dat dit overeenkomt met het ID-veld in het hp.data bestand. We kunnen dit gebruiken om de twee datasets samen te voegen om de inbraakgegevens op de kaart te tonen.

Het idee is dat er in elke dataset een veld is dat we kunnen gebruiken om de twee samen te voegen; in dit geval hebben we het ID-veld in sthelens en het ID-veld in hp.data.

Gebruik de head-functie om te controleren of de gegevens correct zijn samengevoegd.


Simple feature collection with 6 features and 16 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 88174.91 ymin: 432495.7 xmax: 99128.64 ymax: 442409.5
epsg (SRID):    NA
proj4string:    +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs
                   BUURTNAAM GROEP CODE GEMEENTE GEBIED BUURT
1            Afrikaanderwijk   TIR   15      599     10    86
2               Agniesebuurt   TIR   15      599      5    15
3 Bedrijventerrein Schieveen   TIR   15      599     26    50
4                 Bergpolder   TIR   15      599      5    31
5                 Beverwaard   TIR   15      599     12    90
6                   Bloemhof   TIR   15      599     10    81
  SUBBUURT SBTDEEL BLOK TEKST                   GEBDNAAM wijknr
1       -1      -1   -1  1086                 Feijenoord     86
2       -1      -1   -1  0515                      Noord     15
3       -1      -1   -1  2650 Bedrijventerrein Schieveen      0
4       -1      -1   -1  0531                      Noord     31
5       -1      -1   -1  1290                IJsselmonde     90
6       -1      -1   -1  1081                 Feijenoord     81
  Shape_Leng Shape_Area NNGB Price-thousands
1   3461.527   621148.9 0.86              NA
2   2809.173   384570.5   NA              NA
3   5036.165  1518931.1   NA              NA
4   3253.672   454195.3   NA              NA
5   6592.857  1514886.2 0.78              NA
6   3613.866   788457.4 0.81              NA
                        geometry
1 POLYGON ((93595.07 434773.5...
2 POLYGON ((91881.82 438449.9...
3 POLYGON ((88174.91 441742.2...
4 POLYGON ((91216.07 439018.2...
5 POLYGON ((97775.88 434798.3...
6 POLYGON ((93506.9 434355.2,...

Nu we de gegevens hebben samengevoegd, kunnen we een kaart maken van deze huizen-prijzen.

Dit is een zeer snelle manier om een kaart met R te maken. Om de kaart te gebruiken, klikt u op de Export-knop en kiest u vervolgens voor Copy naar Clipboard. . . . Kies vervolgens Copy Plot. Als je ook Word hebt, kun je de kaart in je document plakken. Je kunt de kaart ook opslaan als Afbeelding of PDF.

Een Kaart maken Census Data

Werken met R vereist vaak meerdere coderegels code om een output te krijgen. In plaats van de code in de Console in te typen, kunnen we in plaats daarvan een script gebruiken. Daar kunnen we altijd naar teruggaan en de code zeer eenvoudig te bewerken, om fouten te corrigeren!

Maak een nieuw script aan (File > New File > R-script) en voer de code daar in. Vervolgens kunt je de regels die je wilt uitvoeren selecteren door ze te markeren en vervolgens op Ctrl+Enter te drukken, of door de Run knop bovenaan te gebruiken.

Nu gaan we hetzelfde principe gebruiken als voorheen om een kaart te maken van enkele gegevens uit 2018. We moeten de gegevens eerst downloaden.

Omdat de bestanden te zwaar zijn, vind je de informatie hierover niet hier. In het pdf bestand kun je hier wel over lezen (zie in deze map WerkdocumentNEDoriginal.pdf).

Referenties

Nick Bearman. Introduction to Spatial Data & Using R as a GIS. https://github.com/nickbearman/intro-r-spatial-analysis/blob/master/workbook.pdf

Lovelace, R., Nowosad, J. and Muenchow, J. Geocomputation with R. https://geocompr.github.io/


Deze ‘practical’ is geschreven met R 3.5.1 (2018-07-02) en RStudio 1.1.463 door Dr. Nick Bearman (nick@ geospatialtrainingsolutions.co.uk).

Het werk is gelicenseerd onder Creative Commons Attribution-ShareAlike 4.0 International License. Om een kopie van deze licentie te zien, ga dan naar http://creativecommons.org/licenses/by-sa/4.0/deed.en. De laatste PDF-versie kun je hier https://github.com/nickbearman/intro-r-spatial-analysis vinden. Deze versie is op 18 May 2019 gemaakt.