Das Projekt ‘Rad ab’ war ein Teil des Hack and Harvest Hackathon 2019. Die Idee war die Untersuchung der Korrelation von Bevölkerungsstruktur und Nutzung der Fahrrad-Mietsysteme in Konstanz. Die Datenbasis bildete das Open Data Angebot Offene Daten Konstanz.

rm(list=ls())
library(dplyr)
library(forcats)
library(ggmap)
library(ggplot2)
library(osmdata)
library(rgdal)
library(tidyr)

Radstationen

rad.stationen <- read.csv("input/Fahrradmietsystem_konrad_TINK.csv", sep=';') %>%
    rename(Name = Station_Name) %>%
    rename(Nummer = Station_nummer) %>%
    mutate(Typ = fct_recode(Typ, 'konrad + TINK'='Konrad. TINK')) %>%
    mutate(Typ = fct_recode(Typ, 'konrad'='Konrad')) 

rad.stationen
karte <- get_map(getbb("Konstanz"), maptype="terrain") 
ggmap(karte) +
  geom_point(data=rad.stationen, aes(Longitude, Latitude, color=Typ), inherit.aes=FALSE, alpha=1, size=4) +
  labs(title='Verteilung der Radstationen') +
  theme_void() +
  theme(legend.position="bottom") 

Anmietungen/Rückgaben

konrad.anmietungen <- read.csv("input/Anmietungen Fahrrad-Mietsystem konrad im Jahr 2018.csv", sep=';') %>%
    rename(Name = Station_Name) %>%
    rename(Nummer = Station.Nr.) %>%
    select(-Jahr) %>%
    rename('05.2018' = 'Mai') %>%
    rename('06.2018' = 'Juni') %>%
    rename('07.2018' = 'Juli') %>%
    rename('08.2018' = 'August') %>%
    rename('09.2018' = 'September') %>%
    rename('10.2018' = 'Oktober') %>%
    rename('11.2018' = 'November') %>%
    rename('12.2018' = 'Dezember') %>%
    gather(key='Monat', value='Anzahl', ends_with('2018')) %>%
    mutate(Monat = as.Date(paste0('15.',Monat),'%d.%m.%Y')) %>%
    mutate(Typ = fct_recode(Typ, 'konrad + TINK'='konrad, TINK')) %>%
    mutate(Vorgang = 'Anmietung')

konrad.rückgabe <- read.csv("input/Rückgaben Fahrrad-Mietsystem konrad im Jahr 2018.csv", sep=';') %>%
    rename(Name = Station_Name) %>%
    rename(Nummer = Station.Nr.) %>%
    select(-Jahr) %>%
    rename('05.2018' = 'Mai') %>%
    rename('06.2018' = 'Juni') %>%
    rename('07.2018' = 'Juli') %>%
    rename('08.2018' = 'August') %>%
    rename('09.2018' = 'September') %>%
    rename('10.2018' = 'Oktober') %>%
    rename('11.2018' = 'November') %>%
    rename('12.2018' = 'Dezember') %>%
    gather(key='Monat', value='Anzahl', ends_with('2018')) %>%
    mutate(Monat = as.Date(paste0('15.',Monat),'%d.%m.%Y')) %>%
    mutate(Typ = fct_recode(Typ, 'konrad + TINK'='konrad, TINK')) %>%
    mutate(Vorgang = 'Rückgabe')

konrad <- rbind(konrad.anmietungen, konrad.rückgabe) %>% filter(Typ == 'konrad' | Typ == 'konrad + TINK')
head(konrad)
ggplot(konrad) +
    facet_wrap(Name~., ncol=4) +
    geom_bar(aes(x=Monat, y=Anzahl, fill=Vorgang), stat='Identity', position="dodge") +
    labs(title='Anmietungen/Rückgabe Radstationen konrad (2018)') +
    theme_bw() +
    theme(legend.position="bottom")

tink.anmietungen <- read.csv("input/Anmietungen Fahrrad-Mietsystem TINK im Jahr 2018.csv", sep=';') %>%
    rename(Name = Station_Name) %>%
    rename(Nummer = Station_Nr.) %>%
    select(-Jahr) %>%
    rename('08.2018' = 'August') %>%
    rename('09.2018' = 'September') %>%
    rename('10.2018' = 'Oktober') %>%
    rename('11.2018' = 'November') %>%
    rename('12.2018' = 'Dezember') %>%
    gather(key='Monat', value='Anzahl', ends_with('2018')) %>%
    mutate(Monat = as.Date(paste0('15.',Monat),'%d.%m.%Y')) %>%
    mutate(Typ = fct_recode(Typ, 'konrad + TINK'='konrad, TINK')) %>%
    mutate(Vorgang = 'Anmietung')

tink.rückgabe <- read.csv("input/Rückgaben Fahrrad-Mietsystem TINK im Jahr 2018.csv", sep=';') %>%
    rename(Name = Station_Name) %>%
    rename(Nummer = Station.Nr.) %>%
    select(-Jahr) %>%
    rename('08.2018' = 'August') %>%
    rename('09.2018' = 'September') %>%
    rename('10.2018' = 'Oktober') %>%
    rename('11.2018' = 'November') %>%
    rename('12.2018' = 'Dezember') %>%
    gather(key='Monat', value='Anzahl', ends_with('2018')) %>%
    mutate(Monat = as.Date(paste0('15.',Monat),'%d.%m.%Y')) %>%
    mutate(Typ = fct_recode(Typ, 'konrad + TINK'='konrad, TINK')) %>%
    mutate(Vorgang = 'Rückgabe')

tink <- rbind(tink.anmietungen, tink.rückgabe) %>% filter(Typ == 'TINK' | Typ == 'konrad + TINK')
head(tink)
ggplot(tink) +
    facet_wrap(Name~., ncol=4) +
    geom_bar(aes(x=Monat, y=Anzahl, fill=Vorgang), stat='Identity', position='dodge') +
    labs(title='Anmietungen/Rückgabe Radstationen TINK (2018)') +
    theme_bw() +
    theme(legend.position="bottom") 

Stadtteile

vororte <- c('Egg', 'Dettingen', 'Dingelsdorf', 'Litzelstetten', 'Wallhausen')
filename <- "input/Einwohner_nach_Stadtviertel 2010-2017.csv"
stadt <- read.csv(filename, sep=";", na.strings=c('','-')) %>%

  # Artefakte entfernen. Hurrga!
  select(-AA, -AB) %>%

  # Fehlende Daten werden herausgefiltert.
  filter(complete.cases(.)) %>%

  # Es lebe ASCII, UTF-8 und andere Unwägbarkeiten.  
  mutate(STADTTEIL = fct_collapse(STADTTEIL, 'Fürstenberg' = c('Fuerstenberg'))) %>%
  mutate(STADTTEIL = fct_collapse(STADTTEIL, 'Königsbau' = c('Koenigsbau'))) %>%
  
  # Einige Variablenamen etwas leiser stellen.
  rename(Stadtteil = STADTTEIL) %>%
  rename(Stadtviertel = STADTVIERTEL) %>%
  
  # Zusätzliches Merkmal: (Pseudo-) Verwaltungseinheit.
  mutate(Verwaltungseinheit = as.factor(ifelse(Stadtteil %in% vororte, 'Vorort', 'Stadt'))) %>%

  # Nur die Daten selektieren, die hier gebraucht werden.
  select(Stadtteil, Stadtviertel, STT, Verwaltungseinheit) %>%
  unique()

head(stadt)
stadtteile <- stadt %>% select(Stadtteil, STT, Verwaltungseinheit) %>% unique()

stadtteile

Gebäude

filename <- "input/Gebäude nach Baujahr 2016.csv"
gebäude <- read.csv(filename, sep=";", na.strings=c('','-')) %>%

  # Einige Variabel (IMHO) etwas aussagkräftiger machen.
  rename(Baujahr = BAUJAHR_GEBAEUDE_GRUPPIERT) %>%
  rename(Baublock = Baublock.6stellig) %>%
  rename(Gauss_Krüger_X = KOORDINATE_X) %>%
  rename(Gauss_Krüger_Y = KOORDINATE_Y) %>%
  rename(Wohnungen = ANZAHL_WOHNUNG_GRUPPIERT) %>%

  # Datensätze mit fehlenden DAaten werden herausgefiltert.
  filter(complete.cases(.)) %>%
  
  # Dinge, die im aktuellen Kontext nicht gebraucht werden.
  select(-AGS, -Anzahl_GEBAEUDE, -Gemeinde, -STADTVIERTEL, -Stand)

# Die Information zum Stadtteil hinzufügen.
gebäude <- merge(gebäude, stadtteile)

# Labels für die Wohnungsklassifizierung umsortieren.
gebäude$Baujahr = factor(gebäude$Baujahr,levels(gebäude$Baujahr)[c(9,1:8)])
gebäude$Wohnungen = factor(gebäude$Wohnungen,levels(gebäude$Wohnungen)[c(1,3,4,5,2)])

head(gebäude)
# Ein bisserl die Gauß-Krüger Koordinaten der Gebäude nach WGS84 transformieren.
GK <- data.frame(cbind(x=gebäude$Gauss_Krüger_X, y=gebäude$Gauss_Krüger_Y))
coordinates(GK) <- c('x', 'y')
proj4string(GK) <- CRS("+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs")
df <- as.data.frame(spTransform(GK, CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")))
gebäude$WGS84_X = df$x
gebäude$WGS84_Y = df$y
ggplot(gebäude) +
  geom_bar(aes(x=Wohnungen, fill=Stadtteil)) +
  facet_wrap(Stadtteil~., ncol=3) +
  coord_flip() + 
  labs(x='Wohnungen im Gebäude', y='Anzahl', title='Wohnungen pro Gebäude (Stand 2016)') +
  theme_bw() +
  theme(legend.position="bottom")

size <- c(1:length(levels(gebäude$Wohnung)))[gebäude$Wohnung] + 1
ggmap(karte) +
  geom_point(data=gebäude, aes(WGS84_X, WGS84_Y, color=Wohnungen), inherit.aes=FALSE, alpha=.2, size=size, na.rm=T) +
  labs(title='Wohnungen pro Gebäude (Stand 2016)') +
  theme_void() +
  theme(legend.position="bottom") + 
  guides(color=guide_legend(override.aes=list(alpha=1, size=4)))