############################################## #### Keto Schumacher #### #### Forschungsseminar Datenjournalismus #### #### Herbstsemester 2017 #### ############################################## rm(list = ls()) ##### Preparations ##### setwd("C:/Users/Keto2/Desktop/UZH/17HS/Datenjournalismus/Blogbeitrag/Blogbeitrag") #### Loading Packages # install.packages("ggridges") #install.packages("directlabels") library(dplyr) library(tidyr) library(reshape2) library(ggplot2) library(ggridges) library(directlabels) #library(maptools) #library(ggmap) #### Loading Data bevoelkerung <- read.csv("C:/Users/Keto2/Desktop/UZH/17HS/Datenjournalismus/Blogbeitrag/Daten/bevoelkerung.csv") gebaeude <- read.csv("C:/Users/Keto2/Desktop/UZH/17HS/Datenjournalismus/Blogbeitrag/Daten/gebaeude.csv") wohnung <- read.csv("C:/Users/Keto2/Desktop/UZH/17HS/Datenjournalismus/Blogbeitrag/Daten/wohnung.csv") #### Data Manipulation summary(wohnung) summary(gebaeude) # Deleting Rows containing NAs gebclean <- gebaeude[-unique(is.na(gebaeude$GebNum)*c(1:nrow(gebaeude)))[-1], ] wohclean <- wohnung[-unique(is.na(wohnung$GebNum)*c(1:nrow(wohnung)))[-1], ] # Merging the cleaned DataSets on Real estate and Flats wohgeb <- merge(wohclean,gebclean, by = c("GebNum", "StichtagDatJahr")) summary(wohgeb) #### Merging wohgeb and the relevant information from the "bev" dataset to get #### positions for all buildings names(bevoelkerung) quartierinfo <- bevoelkerung[ , c(3, 12:15)] # Constructing a Counter for each person in a building quartierinfo$npers <- 1 # Constructing a Counter for each person in a flat quartierinfo$nperswhg <- 1 # Deleting Rows containing NAs quartierinfo <- quartierinfo[-sort(unique(is.na(quartierinfo$GebNum)*c(1:nrow(quartierinfo))))[-1], ] # getting the number of people per building quartierAgg = aggregate(npers ~ StichtagDatJahr + GebNum + QuarLang + KreisLang, quartierinfo, sum) # getting the number of people per flat quartierAgg2 = aggregate(nperswhg ~ StichtagDatJahr + GebNum + QuarLang + EWID + KreisLang, quartierinfo, sum) #reducing the number of entries in order to merge with the data on Flats and Buildings quartierinfobasic <- unique(quartierinfo[ , c(2:4)]) #Merging the Building and Flat information with the information on position of the buildings wohgebort <- merge(wohgeb, quartierinfobasic) #Merging the number of people per building wohgebort <- merge(wohgebort, quartierAgg, all.x = T) #Merging the number of people per flat wohgebort <- merge(wohgebort, quartierAgg2, all.x = T) #as each entry corresponds to a flat, a counter for flats is introduced wohgebort$indxwhg <- 1 #calculating space per person wohgebort$WohnFlaecheProPerson <- wohgebort$WohnFlaeche/wohgebort$nperswhg #calculating number of rooms per person wohgebort$ZimmerProPerson <- wohgebort$AnzZimmer/wohgebort$nperswhg #identifying empty flats wohgebort$nperswhg[is.na(wohgebort$nperswhg)==T & wohgebort$StichtagDatJahr>2012 & is.na(wohgebort$EWID)==F] <- 0 wohgebort$Leerstand <- 0 wohgebort$Leerstand[wohgebort$nperswhg==0] <- 1 names(wohgebort) #getting the absolute number of flats per quartier numwhg <- aggregate(indxwhg ~StichtagDatJahr + QuarLang + KreisLang + EigentumGbdLevel2Lang, wohgebort, sum) #getting the absolute number of square meters per quartier wohnfl <- aggregate(WohnFlaeche ~StichtagDatJahr + QuarLang + KreisLang + EigentumGbdLevel2Lang, wohgebort, sum) # merging information on square meters and flats per owner group per quartier quartierlvl <- merge(wohnfl, numwhg) # preparing the number of people per owner group per quartier for merging npersprep <- unique(wohgebort[ , c(1:4, 10:11)]) # operating with the number of people per building, as not all people are assigned to flats... npers <- aggregate(npers~StichtagDatJahr + QuarLang + KreisLang + EigentumGbdLevel2Lang, npersprep, sum) # calculating the average number of rooms per person and the average number of square meters per person ZimmerProPerson <- aggregate(ZimmerProPerson~StichtagDatJahr + QuarLang + KreisLang + EigentumGbdLevel2Lang, wohgebort, mean) WohnFlaecheProPerson <- aggregate(WohnFlaecheProPerson~StichtagDatJahr + QuarLang + KreisLang + EigentumGbdLevel2Lang, wohgebort, mean) # merging all relevant information quartierlvl <- merge(quartierlvl, npers, all.x = T) quartierlvl$npers[is.na(quartierlvl$npers)] <- 0 quartierlvl <- merge(quartierlvl, ZimmerProPerson, all.x = T) quartierlvl <- merge(quartierlvl, WohnFlaecheProPerson, all.x = T) # renaming the Variables names(quartierlvl) <- c("Jahr", "Quartier", "Kreis", "Besitzer", "Wohnfläche", "Anzahl Wohnungen", "Anzahl Mieter", "Zimmer Pro Person", "Wohnfläche Pro Person") # repeating the above for the level of city districts kreis.numwhg <- aggregate(`Anzahl Wohnungen` ~Jahr + Kreis + Besitzer, quartierlvl, sum) kreis.wohnfl <- aggregate(Wohnfläche ~Jahr + Kreis + Besitzer, quartierlvl, sum) kreislvl <- merge(kreis.wohnfl, kreis.numwhg) kreis.npers <- aggregate(`Anzahl Mieter`~Jahr + Kreis + Besitzer, quartierlvl, sum) kreislvl <- merge(kreislvl, kreis.npers, all.x = T) names(kreislvl) <- c("Jahr", "Kreis", "Besitzer", "Wohnfläche", "Anzahl Wohnungen", "Anzahl Mieter") # and finally also for the city-level stadt.numwhg <- aggregate(`Anzahl Wohnungen` ~Jahr + Besitzer, kreislvl, sum) stadt.wohnfl <- aggregate(Wohnfläche ~Jahr + Besitzer, kreislvl, sum) stadtlvl <- merge(stadt.wohnfl, stadt.numwhg) stadt.npers <- aggregate(`Anzahl Mieter`~Jahr + Besitzer, kreislvl, sum) stadtlvl <- merge(stadtlvl, stadt.npers, all.x = T) names(stadtlvl) <- c("Jahr", "Besitzer", "Wohnfläche", "Anzahl Wohnungen", "Anzahl Mieter") # write.csv(stadtlvl, file = "StadtAggregatedData.csv") ######## Constructing Percentages ##### City-Level first #### stadtlvlanteil <- data.frame() Jahr <- unique(stadtlvl$Jahr) for(i in 1:length(Jahr)){ throughput <- stadtlvl[stadtlvl$Jahr==Jahr[i], ] throughput$`Wohnfläche Anteil` <- throughput$Wohnfläche/sum(throughput$Wohnfläche)*100 throughput$`Wohnungen Anteil` <- throughput$`Anzahl Wohnungen`/sum(throughput$`Anzahl Wohnungen`)*100 throughput$`Mieter Anteil` <- throughput$`Anzahl Mieter`/sum(throughput$`Anzahl Mieter`)*100 stadtlvlanteil <- rbind(stadtlvlanteil, throughput) rm(throughput) } stadtlvlanteil$Differenz <- stadtlvlanteil$`Mieter Anteil`-stadtlvlanteil$`Wohnungen Anteil` stadtlvlanteil$`Wohnfläche Pro Mieter` <- stadtlvlanteil$Wohnfläche/stadtlvlanteil$`Anzahl Mieter` stadtlvlanteil$`Mieter Pro Wohnung`<- stadtlvlanteil$`Anzahl Mieter`/stadtlvlanteil$`Anzahl Wohnungen` stadtlvlveraenderung <- dcast(stadtlvlanteil, Besitzer ~ Jahr, value.var = "Wohnungen Anteil") stadtlvlveraenderung[is.na(stadtlvlveraenderung)] <- 0 stadtlvlveraenderung$Veraenderung <- stadtlvlveraenderung$`2016`-stadtlvlveraenderung$`2008` stadtlvlveraenderungmieter <- dcast(stadtlvlanteil, Besitzer ~ Jahr, value.var = "Mieter Anteil") stadtlvlveraenderungmieter[is.na(stadtlvlveraenderungmieter)] <- 0 stadtlvlveraenderungmieter$Veraenderung <- stadtlvlveraenderungmieter$`2016`-stadtlvlveraenderungmieter$`2008` ##### Kreis Second #### kreislvlanteil <- data.frame() Jahr <- unique(kreislvl$Jahr) kreislvl$Kreis <- as.character(kreislvl$Kreis) for(i in 1:length(Jahr)){ throughput1 <- kreislvl[kreislvl$Jahr==Jahr[i], ] kreis <- as.character(unique(kreislvl$Kreis)) for(j in 1:length(kreis)){ throughput2 <- throughput1[throughput1$Kreis==kreis[j], ] throughput2$`Wohnfläche Anteil` <- throughput2$Wohnfläche/sum(throughput2$Wohnfläche)*100 throughput2$`Wohnungen Anteil` <- throughput2$`Anzahl Wohnungen`/sum(throughput2$`Anzahl Wohnungen`)*100 throughput2$`Mieter Anteil` <- throughput2$`Anzahl Mieter`/sum(throughput2$`Anzahl Mieter`)*100 kreislvlanteil <- rbind(kreislvlanteil, throughput2) rm(throughput2) } } ##### Quartier Final #### quartierlvlanteil <- data.frame() Jahr <- unique(quartierlvl$Jahr) for(i in 1:length(Jahr)){ throughput1 <- quartierlvl[quartierlvl$Jahr==Jahr[i], ] quartier <- as.character(unique(quartierlvl$Quartier)) for(j in 1:length(quartier)){ throughput2 <- throughput1[throughput1$Quartier==quartier[j], ] throughput2$`Wohnfläche Anteil` <- throughput2$Wohnfläche/sum(throughput2$Wohnfläche)*100 throughput2$`Wohnungen Anteil` <- throughput2$`Anzahl Wohnungen`/sum(throughput2$`Anzahl Wohnungen`)*100 throughput2$`Mieter Anteil` <- throughput2$`Anzahl Mieter`/sum(throughput2$`Anzahl Mieter`)*100 quartierlvlanteil <- rbind(quartierlvlanteil, throughput2) rm(throughput2) } } quartierlvlveraenderung <- dcast(quartierlvlanteil, Besitzer + Quartier ~ Jahr, value.var = "Wohnungen Anteil") quartierlvlveraenderung[is.na(quartierlvlveraenderung)] <- 0 quartierlvlveraenderung$Veraenderung <- quartierlvlveraenderung$`2016`-quartierlvlveraenderung$`2008` quartierlvlveraenderungmieter <- dcast(quartierlvlanteil, Besitzer + Quartier ~ Jahr, value.var = "Mieter Anteil") quartierlvlveraenderungmieter[is.na(quartierlvlveraenderungmieter)] <- 0 quartierlvlveraenderungmieter$Veraenderung <- quartierlvlveraenderungmieter$`2016`-quartierlvlveraenderungmieter$`2008` ######### Plotting ####### # City-Level jpeg(filename = "Aktiengesellschaften.jpg",width = 1000, height = 1000, units = "px",res = 150, quality = 100, bg = "white") p0 <- ggplot(data = quartierlvlveraenderung[quartierlvlveraenderung$Besitzer=="Aktiengesellschaft", ])+aes(x = reorder(Quartier,-Veraenderung), y= Veraenderung) p0+geom_bar(stat = "identity", fill = "slategrey")+theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.title = element_blank())+labs(title = "Anstieg Wohnungsbesitz von Aktiengesellschaften 2008-2016", y= "Veränderung in Prozent\ndes Wohnungsbestandes", x="", caption = "Daten: Statistik Stadt Zürich\nGrafik: Keto Schumacher") dev.off() jpeg(filename = "Einzelpersonen.jpg",width = 1000, height = 1000, units = "px",res = 150, quality = 100, bg = "white") p0.1 <- ggplot(data = quartierlvlveraenderung[quartierlvlveraenderung$Besitzer=="Einzelperson", ])+aes(x = reorder(Quartier,-Veraenderung), y= Veraenderung) p0.1+geom_bar(stat = "identity", fill = "slategrey")+theme(axis.text.x = element_text(angle = 45, hjust = 1))+labs(title = "Abnahme Wohnungsbesitz von Einzelpersonen 2008-2016", y= "Veränderung in Prozent\ndes Wohnungsbestandes", x="", caption = "Daten: Statistik Stadt Zürich\nGrafik: Keto Schumacher") dev.off() jpeg(filename = "Wohnungen.jpg",width = 1000, height = 1000, units = "px",res = 150, quality = 100, bg = "white") sortedwhgantl <- stadtlvlanteil[ order(-stadtlvlanteil$`Wohnungen Anteil`), ] p1 <- ggplot(data = subset(sortedwhgantl, Besitzer %in% c("Aktiengesellschaft", "Baugenossenschaft", "Einzelperson", "Mehrere Natürliche Personen", "Stockwerkeigentum", "Erbengemeinschaft", "Pensionskasse")))+aes(x = Jahr, y= `Wohnungen Anteil`, color = Besitzer) p1+geom_line()+ labs(title = "Verschiebungen auf dem Zürcher Wohnungsmarkt 2008-2016", y= "Anteile am Wohnungsbestand\nin Prozent", x="", caption = "Daten: Statistik Stadt Zürich\nGrafik: Keto Schumacher")+ scale_colour_discrete(breaks = unique(sortedwhgantl$Besitzer[sortedwhgantl$Jahr==2016]))+expand_limits(y = 0) dev.off() jpeg(filename = "Mieter.jpg",width = 1000, height = 1000, units = "px",res = 150, quality = 100, bg = "white") sortedmieterantl <- stadtlvlanteil[ order(-stadtlvlanteil$`Mieter Anteil`), ] p3 <- ggplot(data = subset(sortedmieterantl, Besitzer %in% c("Aktiengesellschaft", "Baugenossenschaft", "Einzelperson", "Mehrere Natürliche Personen", "Stockwerkeigentum", "Erbengemeinschaft", "Pensionskasse")))+aes(x = Jahr, y= `Mieter Anteil`, color = Besitzer) p3+geom_line()+scale_colour_discrete(breaks = unique(sortedmieterantl$Besitzer[sortedmieterantl$Jahr==2016]))+labs(title = "Bewohner als Anteile der Gesamtbevölkerung 2008-2016", y= "Anteile an Gesamtbevölkerung\nin Prozent", x="", caption = "Daten: Statistik Stadt Zürich\nGrafik: Keto Schumacher")+expand_limits(y = 0) dev.off() jpeg(filename = "Differenz.jpg",width = 1000, height = 1000, units = "px",res = 150, quality = 100, bg = "white") stadtprep <- stadtlvlanteil[stadtlvlanteil$Jahr==2016, ] sorteddiff16 <- stadtprep[ order(-stadtprep$Differenz), ] sorteddiff16 <- subset(sorteddiff16, Besitzer %in% c("Aktiengesellschaft", "Baugenossenschaft", "Einzelperson", "Mehrere Natürliche Personen", "Stockwerkeigentum", "Erbengemeinschaft", "Verein, private Stiftung", "Stadt Zürich", "Pensionskasse", "Städtische Stiftung", "Kanton Zürich")) p4.1 <- ggplot(data = sorteddiff16)+aes(x = Besitzer, y= Differenz) p4.1+geom_bar(stat = "identity", fill = "slategrey")+scale_x_discrete(limits = sorteddiff16$Besitzer)+ theme(axis.text.x = element_text(angle = 45, hjust = 1))+labs(title = "Differenz zwischen Anteilen an Bewohnern und Wohnungen", y= "Differenz in Prozent", x="", caption = "Daten: Statistik Stadt Zürich\nGrafik: Keto Schumacher") dev.off() # Ridges Plot mediansstadt <- data.frame() for(i in 1:length((unique(wohgebort$EigentumGbdLevel2Lang)))){ throughput1 <- wohgebort[wohgebort$EigentumGbdLevel2Lang==unique(wohgebort$EigentumGbdLevel2Lang)[i], ] for(j in 1:length(unique(throughput1$StichtagDatJahr))){ throughput2 <- throughput1[throughput1$StichtagDatJahr == unique(throughput1$StichtagDatJahr)[j], ] throughput2$WohnFlaeche_Median <- median(throughput2$WohnFlaeche) throughput2$WohnFlaeche_Mean <- mean(throughput2$WohnFlaeche) mediansstadt<- rbind(mediansstadt, throughput2) } } table(mediansstadt$WohnFlaeche_Median) mediansstadt2 <- dcast(mediansstadt, EigentumGbdLevel2Lang~StichtagDatJahr, value.var = "WohnFlaeche_Median", fun.aggregate = mean) meansstadt <- dcast(mediansstadt, EigentumGbdLevel2Lang~StichtagDatJahr, value.var = "WohnFlaeche_Mean", fun.aggregate = mean) jpeg(filename = "Medians.jpg",width = 1000, height = 1000, units = "px",res = 150, quality = 100, bg = "white") p5prep <- mediansstadt[mediansstadt$StichtagDatJahr == 2016 , ] p5prep2 <- p5prep[ order(-p5prep$WohnFlaeche_Median), ] p5prep2 <- subset(p5prep2, WohnFlaeche %in% 0:200 & EigentumGbdLevel2Lang %in% c("Aktiengesellschaft", "Baugenossenschaft", "Einzelperson", "Mehrere Natürliche Personen", "Stockwerkeigentum", "Erbengemeinschaft", "Verein, private Stiftung", "Stadt Zürich", "Pensionskasse", "Städtische Stiftung", "Kanton Zürich")) p5 <- ggplot(data = p5prep2)+ aes(x=WohnFlaeche, y=reorder(EigentumGbdLevel2Lang,WohnFlaeche_Median), fill = WohnFlaeche_Median) p5+geom_density_ridges(aes(rel_min_height = 0.015), na.rm = T)+ labs(title = "Wohnfläche Stadt Zürich nach Eigentümern 2016", x= "Quadratmeter", y="", caption = "Daten: Statistik Stadt Zürich\nGrafik: Keto Schumacher")+ scale_fill_continuous(name = "Wohnfläche\nMedian") dev.off()