library(rgdal)
## Loading required package: sp
## rgdal: version: 1.1-10, (SVN revision 622)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 1.11.3, released 2015/09/16
## Path to GDAL shared files: /usr/local/Cellar/gdal/1.11.3_1/share/gdal
## Loaded PROJ.4 runtime: Rel. 4.9.2, 08 September 2015, [PJ_VERSION: 492]
## Path to PROJ.4 shared files: (autodetected)
## Linking to sp version: 1.2-3
library(ggplot2)
library(ggmap)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readr)
library(readxl)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
##
## date
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(knitr)
library(purrr)
##
## Attaching package: 'purrr'
## The following object is masked from 'package:dplyr':
##
## order_by
baeume = read_excel('strassenbaeume-friedrichshain-kreuzberg.xls') %>% mutate(
`Baumart deutsch` = factor(`Baumart deutsch`),
`Baumart botanisch` = factor(`Baumart botanisch`),
`Gattung` = factor(`Gattung`),
`Pflanzjahr` = as.numeric(`Pflanzjahr`),
`Standalter` = as.numeric(`Standalter`),
`Krone Durchmesser in m` = as.numeric(`Krone Durchmesser in m`),
`Stamm Umfang in cm` = as.numeric(`Stamm Umfang in cm`),
`Baumhoehe in m` = as.numeric(`Baumhoehe in m`)
) %>% na.omit() %>%
group_by(Gattung) %>% mutate(n=n()) %>% ungroup() %>% mutate(r = dense_rank(desc(n))) %>% filter(r<=20) %>% select(-r, -n) %>%
sample_n(10000) # Keep 10k
## Warning in eval(substitute(expr), envir, enclos): NAs durch Umwandlung
## erzeugt
## Warning in eval(substitute(expr), envir, enclos): NAs durch Umwandlung
## erzeugt
## Warning in eval(substitute(expr), envir, enclos): NAs durch Umwandlung
## erzeugt
## Warning in eval(substitute(expr), envir, enclos): NAs durch Umwandlung
## erzeugt
## Warning in eval(substitute(expr), envir, enclos): NAs durch Umwandlung
## erzeugt
baeume %>% select(`Baumart deutsch`, `Baumart botanisch`, `Gattung`, `Pflanzjahr`, `Standalter`, `Krone Durchmesser in m`, `Stamm Umfang in cm`, `Baumhoehe in m`) %>% summary
## Baumart deutsch Baumart botanisch
## LINDE :1752 TILIA SPEC. :1752
## KAISER-LINDE :1361 TILIA INTERMEDIA 'PALLIDA':1361
## AHORNBLÄTTRIGE PLATANE : 658 PLATANUS ACERIFOLIA : 658
## SPITZ-AHORN : 581 ACER PLATANOIDES : 581
## WINTER-LINDE : 577 TILIA CORDATA : 577
## BAUM-HASEL - TÜRKISCHE HASEL: 554 CORYLUS COLURNA : 554
## (Other) :4517 (Other) :4517
## Gattung Pflanzjahr Standalter Krone Durchmesser in m
## TILIA :4813 Min. :1760 Min. : 1.00 Min. : 0.010
## ACER :1261 1st Qu.:1966 1st Qu.: 18.00 1st Qu.: 4.000
## PLATANUS : 681 Median :1983 Median : 33.00 Median : 6.000
## CORYLUS : 554 Mean :1980 Mean : 36.25 Mean : 6.083
## CRATAEGUS: 461 3rd Qu.:1998 3rd Qu.: 50.00 3rd Qu.: 8.000
## SORBUS : 295 Max. :2015 Max. :256.00 Max. :80.000
## (Other) :1935
## Stamm Umfang in cm Baumhoehe in m
## Min. : 4.00 Min. : 3.000
## 1st Qu.: 52.00 1st Qu.: 7.000
## Median : 79.00 Median : 7.000
## Mean : 91.05 Mean : 9.396
## 3rd Qu.: 117.00 3rd Qu.: 12.000
## Max. :4773.00 Max. :400.000
##
nlevels(baeume$`Baumart botanisch`)
## [1] 141
length(unique(baeume$`Baumart botanisch`))
## [1] 102
nlevels(baeume$`Gattung`)
## [1] 38
length(unique(baeume$`Gattung`))
## [1] 20
Höhe in Meter
ggplot(baeume) + geom_histogram(aes(`Baumhoehe in m`))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
baeume %>% filter(`Baumhoehe in m` > 30) %>% kable
| ID | Baum Nr. | Objektnr. | Objektname | Baumart deutsch | Baumart botanisch | Gattung | ALK Nr. | Straße | Hausnr. | Hausnr. Zusatz | Pflanzjahr | Standalter | Krone Durchmesser in m | Stamm Umfang in cm | Baumhoehe in m | Bezirk |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00008100:0016b217 | 58 | GÜRTELST | Gürtelstraße | KAISER-LINDE | TILIA INTERMEDIA ‘PALLIDA’ | TILIA | - | Gürtelstraße | - | - | 2012 | 4 | 1.5 | 28 | 400 | Friedrichshain-Kreuzberg |
ggplot(baeume) + geom_histogram(aes(`Krone Durchmesser in m`))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
baeume %>% filter(`Krone Durchmesser in m` > 40) %>% kable
| ID | Baum Nr. | Objektnr. | Objektname | Baumart deutsch | Baumart botanisch | Gattung | ALK Nr. | Straße | Hausnr. | Hausnr. Zusatz | Pflanzjahr | Standalter | Krone Durchmesser in m | Stamm Umfang in cm | Baumhoehe in m | Bezirk |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00008100:0016b6da | 36 | 03608 | Ratiborstraße | LINDE | TILIA SPEC. | TILIA | - | Ratiborstraße | - | - | 2013 | 3 | 80 | 9 | 3 | Friedrichshain-Kreuzberg |
ggplot(baeume) + geom_histogram(aes(`Stamm Umfang in cm`))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
baeume %>% filter(`Stamm Umfang in cm` > 1000) %>% kable
| ID | Baum Nr. | Objektnr. | Objektname | Baumart deutsch | Baumart botanisch | Gattung | ALK Nr. | Straße | Hausnr. | Hausnr. Zusatz | Pflanzjahr | Standalter | Krone Durchmesser in m | Stamm Umfang in cm | Baumhoehe in m | Bezirk |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00008100:00168bfc | 32/3 | LENBACHS | Lenbachstraße | KAISER-LINDE | TILIA INTERMEDIA ‘PALLIDA’ | TILIA | - | Lenbachstraße | - | - | 2001 | 15 | 5.5 | 4773 | 7 | Friedrichshain-Kreuzberg |
13 Meter Stammumfang ist das größte, was ich bei einer Kaiserlinde finden konnte.
# wirft auch NA weg
baeume = baeume %>% filter(
`Stamm Umfang in cm` < 1000 &
`Krone Durchmesser in m` < 40 &
`Baumhoehe in m` < 30)
ggplot(baeume %>% filter(`Krone Durchmesser in m` < 40 & `Baumhoehe in m` < 30)) + geom_point(aes(Standalter, `Krone Durchmesser in m`, color=`Gattung`)) + scale_colour_discrete(guide=F)
baeume %>% filter(Standalter > 200) %>% kable
| ID | Baum Nr. | Objektnr. | Objektname | Baumart deutsch | Baumart botanisch | Gattung | ALK Nr. | Straße | Hausnr. | Hausnr. Zusatz | Pflanzjahr | Standalter | Krone Durchmesser in m | Stamm Umfang in cm | Baumhoehe in m | Bezirk |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00008100:00163dcf | 24 | 04737 | Waterloo-Ufer | SCHEIN-AKAZIE - SILBERREGEN | ROBINIA PSEUDOACACIA | ROBINIA | - | Waterloo-Ufer | - | - | 1760 | 256 | 5 | 153 | 7 | Friedrichshain-Kreuzberg |
ggplot(baeume %>% filter(`Krone Durchmesser in m` < 40 & `Baumhoehe in m` < 30)) + geom_point(aes(Standalter, `Baumhoehe in m`, color=`Gattung`, size=`Stamm Umfang in cm`)) + scale_colour_discrete(guide=F)
Die Windwerte holen wir uns von DWD CDC (http://www.dwd.de/DE/klimaumwelt/cdc/cdc_node.html). Normalerweise würden wir alle Berliner Wetterstationen haben wollen, aber der einfachheit halber nehmen wir nur die Daten der Station Schönefeld.
wetter = read_delim('produkt_klima_Tageswerte_20141202_20160603_00427.txt',delim=';')
wetter %>% summary
## STATIONS_ID MESS_DATUM QUALITAETS_NIVEAU LUFTTEMPERATUR
## Min. :427 Min. :20141202 Min. :1.000 Min. :-10.200
## 1st Qu.:427 1st Qu.:20150418 1st Qu.:3.000 1st Qu.: 3.700
## Median :427 Median :20150902 Median :3.000 Median : 8.350
## Mean :427 Mean :20152873 Mean :2.891 Mean : 9.168
## 3rd Qu.:427 3rd Qu.:20160118 3rd Qu.:3.000 3rd Qu.: 14.175
## Max. :427 Max. :20160603 Max. :3.000 Max. : 29.400
## DAMPFDRUCK BEDECKUNGSGRAD LUFTDRUCK_STATIONSHOEHE REL_FEUCHTE
## Min. : 2.200 Min. :0.000 Min. : 968.3 Min. :38.58
## 1st Qu.: 6.500 1st Qu.:4.300 1st Qu.:1004.6 1st Qu.:65.73
## Median : 8.200 Median :5.700 Median :1010.6 Median :78.81
## Mean : 9.121 Mean :5.411 Mean :1010.0 Mean :76.45
## 3rd Qu.:10.900 3rd Qu.:6.900 3rd Qu.:1016.0 3rd Qu.:87.83
## Max. :21.700 Max. :8.000 Max. :1032.0 Max. :99.92
## WINDGESCHWINDIGKEIT LUFTTEMPERATUR_MAXIMUM LUFTTEMPERATUR_MINIMUM
## Min. :-999.000 Min. :-8.200 Min. :-12.900
## 1st Qu.: 3.000 1st Qu.: 6.925 1st Qu.: 0.125
## Median : 4.100 Median :12.300 Median : 3.900
## Mean : -4.665 Mean :13.499 Mean : 4.651
## 3rd Qu.: 5.300 3rd Qu.:19.900 3rd Qu.: 8.975
## Max. : 11.400 Max. :37.800 Max. : 21.000
## LUFTTEMP_AM_ERDB_MINIMUM WINDSPITZE_MAXIMUM NIEDERSCHLAGSHOEHE
## Min. :-17.900 Min. :-999.0000 Min. : 0.000
## 1st Qu.: -2.400 1st Qu.: 8.2000 1st Qu.: 0.000
## Median : 1.000 Median : 10.6000 Median : 0.000
## Mean : 2.012 Mean : 0.4449 Mean : 1.245
## 3rd Qu.: 6.300 3rd Qu.: 13.9000 3rd Qu.: 1.100
## Max. : 20.400 Max. : 29.6000 Max. :23.800
## NIEDERSCHLAGSHOEHE_IND SONNENSCHEINDAUER SCHNEEHOEHE
## Min. :0.000 Min. : 0.000 Min. : 0.0000
## 1st Qu.:0.000 1st Qu.: 0.283 1st Qu.: 0.0000
## Median :6.000 Median : 3.733 Median : 0.0000
## Mean :4.253 Mean : 4.643 Mean : 0.1855
## 3rd Qu.:6.000 3rd Qu.: 7.929 3rd Qu.: 0.0000
## Max. :8.000 Max. :15.683 Max. :10.0000
## eor
## Length:550
## Class :character
## Mode :character
##
##
##
Fehlende Werte sind als -999 kodiert. Das kommt sowohl beim Wind als auch bei den Windspitzen vor, die uns interessieren.
Wir ersetzen die -999er Werte durch NA und dann füllen wir mit dem letzen vorherigen Wert auf.
wetter = wetter %>%
transmute(Datum=ymd(MESS_DATUM), Windmittel=WINDGESCHWINDIGKEIT, Windspitze=WINDSPITZE_MAXIMUM) %>%
mutate(Windmittel=na.locf(replace(Windmittel, Windmittel==-999, NA)), Windspitze=na.locf(replace(Windspitze, Windspitze==-999, NA)))
ggplot(wetter) + geom_line(aes(Datum, Windmittel)) + geom_line(aes(Datum, Windspitze), color='red')
ggplot(wetter) + geom_histogram(aes(Windspitze))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Ab 20 m/s gilt als Sturm.
max(wetter$Datum)
## [1] "2016-06-03"
Nun generieren wir uns Zufallsinspektionen. Laut einem Ordnungsamt-Online-Eintrag gilt:
Der öffentliche Baumbestand wird ein mal jährlich hinsichtlich der Gewährleistung der Verkehrssicherkeit kontrolliert.
inspections = baeume %>% transmute(
ID=ID,
Datum=sample(seq(max(wetter$Datum) - years(1), max(wetter$Datum), by=1), n(), replace=T),
Risiko=sample(seq(0,3), n(), replace=T, prob=c(.9,.09,.009,.001))
)
Welche Baumarten sind bei Sturm gefährdet? Nach internetrecherche sind
Flachwurzler
Herzwurzler
Pfahlwurzler
FLACHWURZLER_RISIKO = 1
HERZWURZLER_RISIKO = 0.5
PFAHLWURZLER_RISIKO = 0.25
risiko_gattung = function(x) {
x = c(
PSEUDOTSUGA=FLACHWURZLER_RISIKO,
SALIX=FLACHWURZLER_RISIKO,
ACER=HERZWURZLER_RISIKO,
CARPINUS=HERZWURZLER_RISIKO,
LARIX=HERZWURZLER_RISIKO,
TILIA=HERZWURZLER_RISIKO,
CORYLUS=HERZWURZLER_RISIKO,
LIQUIDAMBAR=HERZWURZLER_RISIKO,
PRUNUS=HERZWURZLER_RISIKO,
SORBUS=HERZWURZLER_RISIKO,
FRAXINUS=HERZWURZLER_RISIKO,
BETULA=HERZWURZLER_RISIKO
)[x]
x[is.na(x)] = PFAHLWURZLER_RISIKO
return(x)
}
risiko_gattung(c('PSEUDOTSUGA', 'PSEUDOTSUGA', 'BETULA', 'QUERCUS'))
## PSEUDOTSUGA PSEUDOTSUGA BETULA <NA>
## 1.00 1.00 0.50 0.25
# baeume %>% group_by(`Baumart deutsch`) %>% summarise(count=n(), Gattung=first(Gattung)) %>% arrange(count) %>% head()
Zudem sind Risikofaktoren:
Höhe ~ Risiko (ab 20m stark erhöht) Stammdurchmesser ~ 1/Risiko Kronendurchmesser ~ Risiko Risikofaktor ~ Risiko Alter ~ Risiko Wurzeltyp ~ Risiko
Windspitze ~ Risiko Tage seit Schaden ~ Risiko
=> (HöheKronendurchmesser/Stammdicke)Risikofaktor^2
Andere Features (die ich nicht habe):
max_wind = 25 # 26.5
wetter %>% filter(Windspitze > max_wind)
## Source: local data frame [5 x 3]
##
## Datum Windmittel Windspitze
## (date) (dbl) (dbl)
## 1 2015-01-10 9.6 29.2
## 2 2015-03-29 6.7 26.7
## 3 2015-03-30 11.4 26.4
## 4 2015-03-31 11.4 29.6
## 5 2015-11-29 9.1 26.2
Generiere einen Data Frame mit jedem Baum für jedes Sturmereignis
candidates = baeume %>%
select(ID, Gattung, `Standalter`, `Krone Durchmesser in m`, `Stamm Umfang in cm`, `Baumhoehe in m`) %>%
mutate(join=1) %>%
full_join(wetter %>% filter(Windspitze > max_wind) %>% mutate(join=1)) %>% select(-join)
## Joining by: "join"
candidates %>% summary
## ID Gattung Standalter
## Length:49985 TILIA :24050 Min. : 1.00
## Class :character ACER : 6305 1st Qu.: 18.00
## Mode :character PLATANUS : 3405 Median : 33.00
## CORYLUS : 2770 Mean : 36.26
## CRATAEGUS: 2305 3rd Qu.: 50.00
## SORBUS : 1475 Max. :256.00
## (Other) : 9675
## Krone Durchmesser in m Stamm Umfang in cm Baumhoehe in m
## Min. : 0.010 Min. : 4.0 Min. : 3.000
## 1st Qu.: 4.000 1st Qu.: 52.0 1st Qu.: 7.000
## Median : 6.000 Median : 79.0 Median : 7.000
## Mean : 6.076 Mean : 90.6 Mean : 9.357
## 3rd Qu.: 8.000 3rd Qu.:117.0 3rd Qu.:12.000
## Max. :30.000 Max. :565.0 Max. :25.000
##
## Datum Windmittel Windspitze
## Min. :2015-01-10 Min. : 6.70 Min. :26.20
## 1st Qu.:2015-03-29 1st Qu.: 9.10 1st Qu.:26.40
## Median :2015-03-30 Median : 9.60 Median :26.70
## Mean :2015-05-02 Mean : 9.64 Mean :27.62
## 3rd Qu.:2015-03-31 3rd Qu.:11.40 3rd Qu.:29.20
## Max. :2015-11-29 Max. :11.40 Max. :29.60
##
stdize = function(x, ...) {(x - min(x, ...)) / (max(x, ...) - min(x, ...))}
candidates = candidates %>% mutate(
#Höhe ~ Risiko (ab 20m stark erhöht)
Hoehenrisiko=stdize(`Baumhoehe in m`)*0.99+0.01,
#Stammdurchmesser ~ 1/Risiko
Stammrisiko=stdize(-`Stamm Umfang in cm`)*0.99+0.01,
#Kronendurchmesser ~ Risiko
Kronenrisiko=stdize(`Krone Durchmesser in m`)*0.99+0.01,
#Alter ~ Risiko
Altersrisiko=stdize(Standalter)*0.99+0.01,
#Wurzeltyp ~ Risiko
Gattungsrisiko=risiko_gattung(Gattung),
#Windspitze ~ Risiko
Windrisiko=stdize(Windspitze)*0.99+0.01,
#Tage seit Schaden ~ Risiko
#Risikofaktor ~ Risiko
Risiko = (Hoehenrisiko*Stammrisiko*Kronenrisiko*Altersrisiko*Gattungsrisiko*Windrisiko)^0.8
)
ggplot(candidates) + geom_histogram(aes(Risiko))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
candidates = candidates %>% mutate(Schaden=candidates$Risiko %>% map_int(function(p) sample(seq(0,3), 1, prob=c((1-p)*6/8,(1-p)*1/8,(1-p)/8,p)))) #~ rbinom(1, 3, p=.)))
factor(candidates$Schaden) %>% summary
## 0 1 2 3
## 37290 6233 6194 268
candidates %>% filter(Schaden > 2) %>% ggplot + geom_point(aes(Risiko, `Standalter`, size=`Stamm Umfang in cm`, color=Gattung))
candidates %>% filter(Schaden > 0) %>% .$Gattung %>% unique() %>% length
## [1] 20
candidates %>% .$Gattung %>% unique() %>% length
## [1] 20
ggplot(candidates) + geom_boxplot(aes(factor(Schaden), Risiko))
Schaeden = candidates %>% filter(Schaden > 0) %>% mutate(
Schadensart = factor(c(NA, 'niedrig (Abgebrochene Zweige)', 'Mittel (Abgebrochene Äste)', 'Hoch (Windwurf/Windbruch)')[Schaden + 1])
) %>% select(ID, Datum, Schadensart)
Schaeden %>% write.csv('schaeden.csv')
write.csv(baeume, 'baeume-clean.csv')
split_date = ymd('2015-03-31')
training = candidates %>%
filter(Schaden > 0 & Datum < split_date) %>%
mutate(high_risk=as.numeric(Schaden==3))
test = candidates %>%
filter(Schaden > 0 & Datum >= split_date) %>%
mutate(high_risk=as.numeric(Schaden==3))
model <- glm(high_risk ~ `Gattung` + `Standalter` + `Krone Durchmesser in m` + `Stamm Umfang in cm` + `Baumhoehe in m` + Windspitze, family=binomial(link='logit'),data=training)
p <- predict(model, type="response", newdata = test)
summary(model)
##
## Call:
## glm(formula = high_risk ~ Gattung + Standalter + `Krone Durchmesser in m` +
## `Stamm Umfang in cm` + `Baumhoehe in m` + Windspitze, family = binomial(link = "logit"),
## data = training)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.2921 -0.1847 -0.1083 -0.0625 3.5251
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.662e+01 2.261e+00 -11.774 < 2e-16 ***
## GattungAESCULUS -1.129e+00 6.344e-01 -1.779 0.07523 .
## GattungBETULA 1.385e-01 1.057e+00 0.131 0.89582
## GattungCARPINUS -1.564e+01 1.156e+03 -0.014 0.98920
## GattungCORYLUS -5.461e-01 4.588e-01 -1.190 0.23390
## GattungCRATAEGUS -1.529e+01 5.398e+02 -0.028 0.97740
## GattungFRAXINUS -8.342e-01 7.495e-01 -1.113 0.26571
## GattungGINKGO -1.600e+01 1.399e+03 -0.011 0.99088
## GattungGLEDITSIA -7.271e-01 6.161e-01 -1.180 0.23792
## GattungPLATANUS -9.114e-01 3.083e-01 -2.956 0.00311 **
## GattungPOPULUS -2.178e+00 8.075e-01 -2.697 0.00700 **
## GattungPRUNUS -1.548e+01 8.997e+02 -0.017 0.98627
## GattungPYRUS -1.500e+01 7.793e+02 -0.019 0.98464
## GattungQUERCUS -1.024e+00 5.577e-01 -1.837 0.06623 .
## GattungROBINIA -3.880e-01 7.888e-01 -0.492 0.62277
## GattungSALIX -1.655e+01 2.367e+03 -0.007 0.99442
## GattungSOPHORA -4.466e-01 1.047e+00 -0.427 0.66962
## GattungSORBUS -1.120e-01 6.266e-01 -0.179 0.85818
## GattungTILIA -1.068e+00 2.247e-01 -4.754 2.00e-06 ***
## GattungULMUS -1.737e+01 1.759e+03 -0.010 0.99212
## Standalter 1.277e-02 6.829e-03 1.870 0.06147 .
## `Krone Durchmesser in m` 1.038e-01 3.827e-02 2.714 0.00665 **
## `Stamm Umfang in cm` -4.746e-03 3.488e-03 -1.361 0.17355
## `Baumhoehe in m` 1.317e-01 2.957e-02 4.452 8.49e-06 ***
## Windspitze 7.558e-01 7.770e-02 9.727 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1416.8 on 7527 degrees of freedom
## Residual deviance: 1129.3 on 7503 degrees of freedom
## AIC: 1179.3
##
## Number of Fisher Scoring iterations: 18
plot(test$Risiko, p)
library(ROCR)
## Loading required package: gplots
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
pr <- prediction(p, test$high_risk)
prf <- performance(pr, measure = "tpr", x.measure = "fpr")
plot(prf)
auc <- performance(pr, measure = "auc")
auc <- auc@y.values[[1]]
auc
## [1] 0.8735065
test %>% mutate(prediction = p) %>% arrange(desc(prediction)) %>%
mutate(high_risk_found=cumsum(high_risk)/sum(high_risk), percentage_checked=row_number()/n()) %>%
ggplot() + geom_step(aes(percentage_checked, high_risk_found), color='red') + geom_line(aes(percentage_checked, percentage_checked))