In deze sessie gaan we de kwaliteit van de ruwe data bekijken en leren we hoe je met slimme tools data kunt aanpassen, zodat deze gebruikt kan worden voor verdere analyse of visualisatie.
Maak een nieuw R Script aan in RStudio en bewaar het in een voor jou logische folder op je computer (geef het een zinvolle naam, bijvoorbeeld werkSessie2.R). Verwijs in RStudio naar deze werkfolder door te klikken op Session >> Set Working Directory >> To Source File Location
We gaan met functies werken uit de dplyr package. Een uitgebreid overzicht van deze functies vind je hier.
library(dplyr)
library(tidyr)
Met de volgende code kun je een online csv bestand direct inlezen in R en met de dplyr::glimpse() functie de data bekijken. De oorspronkelijke data komt van de Gemeente Alphen a/d Rijn.
## Lees data uit online csv-bestand
openDF <- read.csv(file = "https://raw.githubusercontent.com/witusj/R-workshop/gh-pages/Datasets/sessie%202/open_data.csv", stringsAsFactors = TRUE)
glimpse(openDF)
## Observations: 45,669
## Variables: 15
## $ X (int) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1...
## $ id (int) 2934, 1561, 1563, 1564, 1565, 1567, 1569...
## $ kl_imagcode (fctr) PLACERIF, MEGLYPTO, MEGLYPTO, MEGLYPTO,...
## $ nedboomsoort (fctr) Gewone plataan, Watercipres, Watercipre...
## $ latboomsoort (fctr) Platanus x hispanica, Metasequoia glypt...
## $ aanlegjaar (int) 1985, 1970, 1970, 1970, 1970, 1970, 1970...
## $ inspectiedatum (fctr) 29-07-2014, 04-08-2014, 04-08-2014, 04-...
## $ kl_veilig_maatregelen (fctr) Geen veiligheidsmaatregel;, Geen veilig...
## $ structuurelement (fctr) Woongebied, Woongebied, Woongebied, Woo...
## $ woonplaats (fctr) Boskoop, Boskoop, Boskoop, Boskoop, Bos...
## $ wijk (fctr) Boskoop, Boskoop, Boskoop, Boskoop, Bos...
## $ buurt (fctr) Snijdelwijk, Boskoop, Boskoop, Boskoop,...
## $ openbare_ruimte (fctr) Bosweg, A.p. van neslaan, A.p. van nesl...
## $ x (fctr) 104066,236, 105447,454, 105455,527, 105...
## $ y (fctr) 453323,99, 454397,319, 454442,028, 4544...
Wat voor een soort data bevat openDF?
Wat is de latijnse naam voor ‘Moeraseik’?
Wat is het vroegste aanlegjaar in de dataset?
Van hoeveel boomsoorten binnen de Gemeente Alphen aan de Rijn is de latijnse naam vastgesteld? (HINT: gebruik de functie levels() en kijk goed bij de namen die met een ‘N’ beginnen)
Het kan wellicht handig zijn om de inspectiedatum op te splitsen in dag, maand en jaar.
## Splits de inspectiedatum
openDF <- separate(openDF, inspectiedatum, into = c("inspectiedag", "inspectiemaand", "inspectiejaar"), sep="-", remove = FALSE, extra = "drop", fill = "right")
Nu kunnen we makkelijk de inspecties van een bepaalde periode uit de data filteren (let op het dubbele = teken) en kijken welke bomen zijn aangemerkt om gerooid te worden.
## Filter op jaar en maand
openDF2014 <- filter(openDF, inspectiejaar == "2014", kl_veilig_maatregelen == "Rooien;")
head(openDF2014)
## X id kl_imagcode nedboomsoort latboomsoort aanlegjaar
## 1 63 2857 SAALBA Schietwilg Salix alba 1990
## 2 356 2880 SAALBA Schietwilg Salix alba 2000
## 3 451 3349 SAALBA Schietwilg Salix alba 1970
## 4 455 1952 BEPENDUL Ruwe berk Betula pendula 1980
## 5 749 3445 TICORDAT Kleinbladige linde Tilia cordata 1985
## 6 847 1840 LISTYRAC Sassafras Sassafras albidum 2012
## inspectiedatum inspectiedag inspectiemaand inspectiejaar
## 1 30-07-2014 30 07 2014
## 2 31-07-2014 31 07 2014
## 3 06-08-2014 06 08 2014
## 4 07-08-2014 07 08 2014
## 5 05-08-2014 05 08 2014
## 6 08-08-2014 08 08 2014
## kl_veilig_maatregelen structuurelement woonplaats wijk buurt
## 1 Rooien; Woongebied Boskoop Boskoop Snijdelwijk
## 2 Rooien; Boskoop Boskoop Snijdelwijk
## 3 Rooien; Woongebied Boskoop Boskoop Boskoop
## 4 Rooien; Woongebied Boskoop Boskoop Snijdelwijk
## 5 Rooien; Woongebied Boskoop Boskoop Boskoop
## 6 Rooien; Woongebied Boskoop Boskoop Snijdelwijk
## openbare_ruimte x y
## 1 Lage weide 103890,645 453625,156
## 2 Emmakade 104931,9 453665,223
## 3 Weteringpad 103938,935 454361,435
## 4 Klaverblad 103958,989 453882,047
## 5 Reyerskoop 105583,114 454224,553
## 6 Wilgehout 103800,245 453831,052
Maak een subset van de data waarin alleen de bomen staan die in 2014 in de Horstenbuurt aangemerkt werden om gerooid te worden.
Van welke boomsoort zullen de meeste bomen worden gerooid in deze buurt?
Maak een subset van alle bomen die sinds 2010 geinspecteerd zijn.
We gaan data aggregeren om een beter beeld te krijgen van het inspectieproces bij de Gemeente Alphen a/d Rijn. Met de table() functie kunnen we een matrix bouwen. Horizontaal (rij) plaatsen we de afzonderlijke woonplaatsen en verticaal (kolom) de inspectiejaren. In de cellen van de matrix staat het aantal keren dat de gegeven combinatie (woonplaats, jaar) in de dataset voorkomt.
## Aantal inspecties per woonplaats per jaar
inspecTab <- table(openDF$woonplaats, openDF$inspectiejaar)
inspecTab
##
## 2003 2005 2006 2007 2008 2009 2010 2011
## 0 0 0 0 0 0 0 0
## Aarlanderveen 0 0 0 56 2 207 2 0
## Alphen aan den Rijn 0 2253 1643 1043 243 980 374 4510
## Benthuizen 0 0 0 0 0 0 8 0
## Boskoop 0 0 0 0 0 132 0 0
## Hazerswoude-Dorp 0 0 0 0 0 4 288 0
## Hazerswoude-Rijndijk 0 0 1 0 0 0 14 0
## Koudekerk aan den Rijn 0 0 0 0 0 0 0 0
## Zwammerdam 50 30 0 1 0 142 4 0
##
## 2012 2013 2014 2015
## 0 0 0 1
## Aarlanderveen 767 4 11 0
## Alphen aan den Rijn 11983 1510 6457 0
## Benthuizen 0 0 1617 0
## Boskoop 0 0 5235 0
## Hazerswoude-Dorp 0 0 1691 0
## Hazerswoude-Rijndijk 0 0 1907 0
## Koudekerk aan den Rijn 0 0 1444 0
## Zwammerdam 589 27 90 0
str(inspecTab)
## 'table' int [1:9, 1:12] 0 0 0 0 0 0 0 0 50 0 ...
## - attr(*, "dimnames")=List of 2
## ..$ : chr [1:9] "" "Aarlanderveen" "Alphen aan den Rijn" "Benthuizen" ...
## ..$ : chr [1:12] "2003" "2005" "2006" "2007" ...
Als we de structuur van inspecTab bekijken zien we dat het class table heeft en bestaat uit de waarden (int) en namen van de rijen en kolommen (attr). Om dit om te zetten naar een data frame kunnen we de functie as.data.frame.matrix() gebruiken. Wat we zo direct nodig hebben, zijn de de namen van de afzonderlijke rijen. Deze kunnen we via de functie rownames() opslaan in een vector.
## Conversie tabel naar data frame
inspecDF <- as.data.frame.matrix(inspecTab)
head(inspecDF)
## 2003 2005 2006 2007 2008 2009 2010 2011 2012 2013
## 0 0 0 0 0 0 0 0 0 0
## Aarlanderveen 0 0 0 56 2 207 2 0 767 4
## Alphen aan den Rijn 0 2253 1643 1043 243 980 374 4510 11983 1510
## Benthuizen 0 0 0 0 0 0 8 0 0 0
## Boskoop 0 0 0 0 0 132 0 0 0 0
## Hazerswoude-Dorp 0 0 0 0 0 4 288 0 0 0
## 2014 2015
## 0 1
## Aarlanderveen 11 0
## Alphen aan den Rijn 6457 0
## Benthuizen 1617 0
## Boskoop 5235 0
## Hazerswoude-Dorp 1691 0
## Bewaar rijnamen
plaatsenVec <- rownames(inspecDF)
cat(plaatsenVec, sep = ", ")
## , Aarlanderveen, Alphen aan den Rijn, Benthuizen, Boskoop, Hazerswoude-Dorp, Hazerswoude-Rijndijk, Koudekerk aan den Rijn, Zwammerdam
We kunnen nu de data in een staafdiagram weergeven m.b.v. de functie barplot(). De functie barplot accepteert als input alleen een matrix of een vector. Daarom gebruiken we de tabel in plaats van de data frame.
## Barplot van aantal inspecties per woonplaats per jaar
barplot(inspecTab,
xlab = "Jaar",
col=rainbow(9)
)
legend("topleft",
legend = plaatsenVec,
fill=rainbow(9)
)

Wat valt op als je de inspecTab dataset bekijkt?
Maak een tabel waarin je het aantal afzonderlijke categorieën veiligheidsmaatregelen per jaar telt.
Voor hoeveel bomen werd in 2014 een jaarlijkse inspectie geadviseerd?
Analyseer deze data
In deze sessie kijken we hoe je data aantrekkelijk kunt visualiseren en op een makkelijke manier toegankelijk maakt voor de gebruikers.
Er zijn talrijke packages voor R gebouwd waarmee je data op veelzijdige manieren grafisch kunt weergeven. In deze workshop gaan we werken met de R interface voor de Google Charts API (googleVis). Op deze pagina vind je voorbeelden van de mogelijkheden die de interface biedt.
## Laad de benodigde packages
library(googleVis)
library(gsheet)
library(dplyr)
De data die we gebruiken, komt uit een Google Spreadsheet.
## Lees data uit Google Spreadsheet
url <- 'https://docs.google.com/spreadsheets/d/1f0qX_BBu-4qhKHa6mBiwbUHmUahrXcHeWieBDD9fiXg'
surveyDF <- gsheet2tbl(url)
Met de functie gvisBubbleChart() wordt alle code gegegenereerd die nodig is om de grafiek in een html pagina weer te geven. Met de plot() functie wordt de grafiek in een webbrowser getoond.
## Bouw Google Bubble Chart
survChart <- gvisBubbleChart(surveyDF,
idvar = "Naam",
xvar = "Waarschijnlijkheid",
yvar = "Gevolg",
colorvar = "Soort.Risico",
options = list(hAxis = '{minValue:1, maxValue:5, title:"Gevolg"}'
,vAxis = '{minValue:1, maxValue:5, title:"Waarschijnlijkheid"}',
width = 700,
height = 700
)
)
plot(survChart)
Wat voor een structuur heeft survDF?
Om wat voor een soort data gaat het?
Maak een nieuwe bubble chart met de variabelen die op “.1” eindigen.
Wat valt je op als je de twee bubble charts met elkaar vergelijkt?
Zoals je wellicht al is opgevallen, bevat survDF 7 sets van variabelen die een gelijke opzet hebben. Het gaat hier om een survey, waarbij deelnemers moesten reageren op stellingen. In de vorige exercitie hebben we de afzonderlijke reacties grafisch weergegeven. We gaan nu kijken naar de centrum- en spreidingsmaten. Voor het gemak zijn deze waarden al berekend en in dit bestand bewaard.
We gebruiken nu de package plotly. Voor het gebruik en voorbeelden zie hier.
## Laad packages
library(plotly)
## Bouw Plotly Chart
p <- plot_ly(
meanvarDF,
x = Waarschijnlijkheid,
y = Gevolgen,
color = Perc.Kans,
size = Spreiding,
text = Topic,
mode = "text+markers",
cmin = 0,
cmax = 1,
colors = c("red", "orange", "white", "light blue" , "dodgerblue")
)
p
Wat voor een structuur heeft meanvarDF?
Analyseer de chart en beschrijf wat je opvalt.
Verander de chart, zodat in plaats van het thema het percentage van deelnemers wordt getoond dat aangaf het thema als een kans te zien.
In de volgende oefening gaan we data in een geografische kaart plaatsen. De data is via een mobiele telefoon verzameld en kan hier opgehaald worden. We gebruiken de Leaflet package.
## Laad packages
library(leaflet)
## Bepaal middelpunt van de kaart
latCtr <- mean(gpsDF$lat)
lonCtr <- mean(gpsDF$lon)
## Bouw de kaart en geef weer
m1 <- leaflet() %>%
addTiles() %>%
setView(lonCtr, latCtr, 12) %>% # map location
# add som circles:
addCircles(color = "Red", lng=gpsDF$lon, lat=gpsDF$lat, 20)
m1
Welke data is door de mobiele telefoon verzameld en op welke momenten?
Waarom zijn sommige punten verder van elkaar verwijderd dan andere?
Gebruik deze data om een nieuwe geografische kaart te bouwen en analyseer de informatie.
Natuurlijk wil je uiteindelijk de uitkomsten van je werk met anderen delen. In R kun je heel gemakkelijk rapportages in verschillende formats (HTML, pdf of Word) creëren, waarin je tekst, code, tabellen en grafieken integreerd. Hiervoor open je een RMarkdown script.
Geef je document een titel en kies wat voor een soort document je wilt maken. In dit voorbeeld gaan we een webpagina bouwen en kiezen dus voor HTML.
R bouwt alvast een template met wat voorbeelden, zodat je direct aan de slag kunt. Als je wilt testen hoe het document er uit gaat zien, klik je op Knit HTML.
In het bovenste gedeelte van het het RMarkdown script zie je een zogenaamd YAML veld waarin meta data staat. Je kunt deze veranderen en extra variabelen toevoegen (bijvoorbeeld een inhoudsopgave). Online is veel informatie te vinden over het gebruik van YAML en (R) Markdown. Voor RMarkdown vind je onder het helpmenu van RStudio ook een Cheatsheet en een handleiding.
--- title: "Rapportage Q1 2016" author: "Nomen Nescio" date: "17-08-1016" output: html_document: toc: yes --- Deze rapportage gaat over de subsidie-uitkeringen van de Gemeente Purmerend.
```{r, message=FALSE, warning=FALSE}
library(knitr)
library(dplyr)
subsDF <- read.csv(file = "https://raw.githubusercontent.com/witusj/R-workshop/gh-pages/Datasets/sessie%202/subs_data.csv", stringsAsFactors = TRUE)
glimpse(subsDF)
## Tabel waarde subsidies per jaar per categorie
subsTable <- xtabs(Bedrag ~ Categorie + Jaar, subsDF)
subsDF <- as.data.frame.matrix(subsTable)
subsDF <- round(subsDF, 0)
kable(subsDF, caption = "Tabel 1. Waarde subsidies per jaar per categorie")
## Staafdiagram
barplot(subsTable,
main="Subsidiebedragen per categorie",
xlab="Jaar",
ylab="Bedrag",
col=rainbow(5)
)
legend("topright",
legend = dimnames(subsTable)$Categorie,
fill=rainbow(5)
)
```
Als het document volledig naar wens is, kun je het snel publiceren op internet via Rpubs. Klik hiervoor op het ‘blauwe oogje’.
en volg de instructies. De link naar je document op RPubs kun je delen met betrokkenen en bijvoorbeeld integreren in het intranet van je organisatie of toevoegen aan een mail. LET OP: de informatie op RPubs is niet afgeschermd en zichtbaar voor iedereen die het webadres heeft.