library(dplyr) #grammar of data manipulation, providing a consistent set of verbs that help you solve the most common data manipulation challenges
library(tidyr) #The goal of tidyr is to help you create tidy data.
library(data.table) #Used for function fread
= 2022 Stichjahr
GWR-Vorlage: Gebäude- und Wohnungsbestand, Bautätigkeit
Statistisches Amt des Kantons Zürich
Kontakt: Basil Schläpfer (basil.schlaepfer@statistik.ji.zh.ch) / Katharina Kälin (katharina.kaelin@statistik.ji.zh.ch)
Zweck des Dokuments
In diesem Dokument wird gezeigt wie das statistische Amt des Kantons Zürich auf Basis des Gebäude- und Wohnungsregisters (GWR) sogenannte Subdatensätze erstellt, die Analysen des Wohnungsbestandes sowie der Wohnungen in abgebrochenen Gebäuden beziehungsweise neu erstellten Gebäuden ermöglicht.
Das Ziel dieses Dokumentes ist die Schaffung von Transparenz in der Fachwelt und der interessierten Öffentlichkeit. Die Auswertung des GWR ist nicht standardisiert. Dies führt dazu, dass unterschiedliche Stellen nicht immer dieselben Zahlen publizieren. Rückmeldungen zum hier gezeigten Vorgehen sind willkommen (siehe Kontaktangaben oben).
Zu beachten ist, dass das statistische Amt das Gebäude- und Wohnungsregister nicht selbst führt, sondern nur auswertet. Aufgebaut und nachgeführt wird das GWR von den Gemeinden. Der Bund führt ein eidgenössisches GWR, auf dessen Basis landesweite Statistiken erstellt werden.
Für den Kanton Zürich kann das GWR als vollständiger Datensatz bezogen werden (link). Die Merkmalsdokumentation ist ebenfalls öffentlich (link.)
Aufbau des Dokuments
Das Dokument hat drei Hauptteile. Im Abschnitt Vorbereitungen werden die benötigten R-Pakete geladen sowie Parameter für die Datenaufbereitung festgelegt. Im Abschnitt GWR laden werden der Gebäude- und der Wohnungsdatensatz des GWR einzeln geladen und anschliessend verknüpft. Zudem werden im Wohnungsdatensatz die Angabe zur Zimmerzahl und im Gebäudedatensatz die Gebäudekategorie rekodiert bzw. hergeleitet. Im Abschnitt Subdatensätze wird dann der integrierte GWR-Datensatz nach verschiedenen Kriterien gefiltert. Diese Subdatensätzte können dann für die eigentliche Analysen verwendet werden.
Die Code-Chunks bauen aufeinander auf. Für die Subdatensätze müssen also auch die vorhergegangen Code-Chunks durchlaufen.
Vorbereitungen
Die Variable Stichjahr wird in den nachfolgenden Auswertungen gebraucht, um frühzeitig erfasste Gebäude auszuschliessen, etwa vom Bestand. Das Stichjahr sollte das Jahr des GWR-Standes sein (siehe Variable Stichtag im GWR).
GWR laden
Das GWR besteht aus einem Gebäude- und einem Wohnungsdatensatz. Mit Hilfe des Eidgenössischen Gebäudeidentifikators (EGID) können die Datensätze verbunden werden.
Variablen mit dem Präfix ‘gwr_’ stammen direkt aus dem GWR. Variablen mit dem Präfix ‘stat_’ wurden vom statistischen Amt hergeleitet.
Wohnungsdatensatz / Anzahl Zimmer rekodieren
<- fread('https://www.web.statistik.zh.ch/ogd/daten/ressourcen/KTZH_00002022_00004065.csv') %>%
GWR_WHG select(Eidgenoessischer_Gebaeudeidentifikator,
Eidgenoessischer_Wohnungsidentifikator,
Baujahr_der_Wohnung,
Abbruchjahr_der_Wohnung,
Wohnungsstatus_Code,
Wohnungsflaeche,
Anzahl_Zimmer,%>%
Kocheinrichtung_Code) rename(EGID=Eidgenoessischer_Gebaeudeidentifikator,
EWID = Eidgenoessischer_Wohnungsidentifikator,
WSTAT = Wohnungsstatus_Code,
WBAUJ = Baujahr_der_Wohnung,
WABBJ = Abbruchjahr_der_Wohnung,
WAZIM = Anzahl_Zimmer,
WKCHE = Kocheinrichtung_Code,
WAREA = Wohnungsflaeche) %>%
# nenne alle Attribute zu 'gwr_' + um
setNames(paste0('gwr_', names(.))) %>%
#Rekodierung der Zimmerangaben (stat_WAZIM)
mutate(
stat_WAZIM = ifelse(gwr_WAZIM > 6,6,gwr_WAZIM),
stat_WAZIM = as.character(stat_WAZIM),
stat_WAZIM = ifelse(stat_WAZIM == "6", "6+", stat_WAZIM),
stat_WAZIM = as.factor(ordered(stat_WAZIM, levels = c("1", "2", "3", "4", "5", "6+"))))
Gebäudedatensatz
<- fread('https://www.web.statistik.zh.ch/ogd/daten/ressourcen/KTZH_00002022_00004064.csv') %>%
GWR_GEB select(Eidgenoessischer_Gebaeudeidentifikator,Gebaeudestatus_Code,Gebaeudekategorie_Code, Gebaeudeklasse_Code,Baujahr_des_Gebaeudes,Abbruchjahr_des_Gebaeudes) %>%
rename(EGID=Eidgenoessischer_Gebaeudeidentifikator,
GSTAT = Gebaeudestatus_Code,
GKAT = Gebaeudekategorie_Code,
GKLAS = Gebaeudeklasse_Code,
GBAUJ = Baujahr_des_Gebaeudes,
GABBJ = Abbruchjahr_des_Gebaeudes) %>%
# nenne alle Attribute zu 'gwr_' + ums
setNames(paste0('gwr_', names(.)))
Gebäudekategorien definieren (stat_gkat)
Im GWR sind die Alltagsbezeichnungen für die Gebäudetypen wie zum Beispiel Ein- (EFH) und Mehrfamilienhaus (MFH) nicht erfasst. Diese werden basierend auf den Variablen GKAT
und GKLAS
hergeleitet. In Abhängigkeit zur Fragestellung macht es mehr Sinn stat_gkat
oder stat_gkat2
zu verwenden.
<- GWR_GEB %>%
GWR_GEB # stat_gkat
mutate(stat_gkat = case_when(
== 1010 ~ "Provisorische Unterkunft",
gwr_GKAT == 1020 & gwr_GKLAS == 1110 ~ "EFH",
gwr_GKAT == 1020 & gwr_GKLAS %in% c(1121, 1122) ~ "MFH", # "MFH - ohne Nebennutzung"
gwr_GKAT == 1030 ~ "Wohngebäude mit Nebennutzung", # "MFH - mit Nebennutzung"
gwr_GKAT == 1040 ~ "Gebäude mit teilweiser Wohnnutzung", # "Nicht-Wohngebäude - mit Wohnutzung"
gwr_GKAT %in% c(1060, 1080) ~ "Gebäude ohne Wohnnutzung",
gwr_GKAT TRUE ~ "Rest"
)%>%
)# stat_gkat2
mutate(stat_gkat2 = case_when(
== 1010 ~ "Provisorische Unterkunft",
gwr_GKAT == 1020 & gwr_GKLAS == 1110 ~ "EFH",
gwr_GKAT == 1020 & gwr_GKLAS %in% c(1121, 1122) ~ "MFH",
gwr_GKAT == 1030 ~ "MFH",
gwr_GKAT == 1040 ~ "Gebäude ohne Wohnnutzung",
gwr_GKAT %in% c(1060, 1080) ~ "Gebäude ohne Wohnnutzung",
gwr_GKAT TRUE ~ "Rest"
))
Anmerkungen zu stat_gkat
Die Kategorie “Wohngebäude mit Nebennutzung” ist sehr heterogen. Sie umfasst zum Beispiel Bauernhöfe mit angeschlossenem Stall, aber auch Mehrfamilienhäuser mit gewerblicher Erdgeschossnutzung (etwa in der Stadt Zürich).
Die Kategorie “Wohngebäude mit teilweiser Wohnnutzung” umfasst in der Regel Gebäude, die nicht von typischen Haushalten bewohnt werden (u.a. Hotels und Altersheime).
GWR Datensatz mit Gebäuden und Wohnungen
<- GWR_WHG %>%
GWR_WHG_JoinGEB left_join(GWR_GEB, by = c("gwr_EGID" = "gwr_EGID"))
Subdatensätze
Am Anfang vieler GWR-Auswertungen steht die Filterung der Daten. Nachfolgend werden deshalb thematische Subdatensätze erstellt bzw. aus dem Hauptdatensatz GWR_WHG_JoinGEB gefiltert.
Aktueller Gebäudebestand
Der unten gefilterte Datensatz GWR_Bestand_GEB umfasst auch Gebäude ohne Wohnungen. Mit Hilfe der Variable stat_gkat
können Gebäude mit Wohnnutzung herausgefiltert werden.
<- GWR_GEB %>%
GWR_Bestand_GEB # selektiere nur bestehende Gebäude
filter(gwr_GSTAT == 1004)
Aktueller Wohnungsbestand
<- GWR_WHG_JoinGEB %>%
GWR_Bestand_WHG_Aktuell filter(
# selektiere nur Wohnungen die Angaben zu gwr_GBAUJ und gwr_WBAUJ enthalten
!is.na(gwr_GBAUJ) & !is.na(gwr_WBAUJ) &
# selektiere nur bestehende Wohnungen in bestehenden Gebäuden
== "3004" & gwr_GSTAT == "1004" &
gwr_WSTAT # nur Wohnräume mit Küche werden als Wohnung gezählt
== 1 | is.na(gwr_WKCHE)) &
(gwr_WKCHE # selektiere die unten genannten stat_gkat
%in% c("EFH",
stat_gkat "MFH",
"Wohngebäude mit Nebennutzung",
"Gebäude mit teilweiser Wohnnutzung")
)
Abbruchtätigkeit
Es werden nur Wohnungen in abgebrochenen Gebäuden berücksichtigt. Wohnungen, die infolge eines Umbaus aufgelöst wurden, werden nicht berücksichtigt. Um die Wohnungsabbrüche pro Jahr auszuweisen, wird die Variable GABBJ
verwendet (und nicht WABBJ
).
Die Variable GABBJ
ist erst ab 2010 gut erfasst, deshalb kann die Abbruchtätigkeit erst ab diesem Zeitpunkt ausgewiesen werden.
# GWR_AbbruchWHG ----
<- GWR_WHG_JoinGEB %>%
GWR_AbbruchWHG # selektiere abgebrochene Wohnungen in abgebrochenen Gebäuden
filter(gwr_WSTAT == 3007 & gwr_GSTAT == 1007) %>%
# selektiere nur Wohnungen in denen gwr_GABBJ == gwr_WABBJ
filter(gwr_GABBJ == gwr_WABBJ) %>%
# nur Wohnräume mit Küche werden als Wohnung gezählt
filter(gwr_WKCHE == 1 | is.na(gwr_WKCHE)) %>%
# selektiere die unten genannten stat_gkat
filter(stat_gkat %in% c("EFH",
"MFH",
"Wohngebäude mit Nebennutzung",
"Gebäude mit teilweiser Wohnnutzung")
%>%
) filter(gwr_GABBJ <= Stichjahr)
Neubautätigkeit
Es werden nur Wohnungen in neu gebauten Gebäuden berücksichtigt. Wohnungen, die infolge eines Umbaus entstanden, werden nicht berücksichtigt. Um die Wohnungsabbrüche pro Jahr auszuweisen, wird die Variable GBAUJ
verwendet (und nicht WBAUJ
).
Insbesondere bei der Bautätigkeit können nachträgliche Erfassungen die Resultate verändern. In der Tendenz wird deshalb die Bautätigkeit in der jüngeren Vergangenheit als zu tief ausgewiesen.
# GWR_NeubauWHG ----
<- GWR_WHG_JoinGEB %>%
GWR_NeubauWHG mutate(
# füge neue Spalte 'gwr_WBAUJ' hinzu: Wenn das WBAUJ nicht bekannt ist (NA oder 1999), dann verwenden wir das GBAUJ als WBAUJ
# WBAUJ wird erst am dem Jahr 2000 ausgwiesen. Der Defaultwert für die Jahre davor ist 1999 (auch wenn die Wohnung in einem anderen Jahr gebaut wurde.
# Metadatenkatalog: "Wohnungen, welche vor dem Jahr 2000 fertiggestellt wurden (durch Neubau oder Umbau des Gebäudes), sind im eidg. GWR mit Baujahr 1999 erfasst."
gwr_WBAUJ = ifelse(is.na(gwr_WBAUJ) | gwr_WBAUJ == 1999, gwr_GBAUJ, gwr_WBAUJ),
# füge neue Spalte 'diff' hinzu welches die Differenz zw. gwr_GBAUJ und gwr_WBAUJ beschreibt.
diff = gwr_GBAUJ - gwr_WBAUJ
%>%
) filter(
# selektiere nur Wohnungen die Angaben zu gwr_GBAUJ und gwr_WBAUJ enthalten
!is.na(gwr_GBAUJ) & !is.na(gwr_WBAUJ) &
# selektiere nur bestehende Wohnungen in bestehenden Gebäuden
== "3004" & gwr_GSTAT == "1004" &
gwr_WSTAT # Wenn die Wohnung fünf Jahre jünger/älter als das Gebäude ist, gehen wir davon aus, dass sich um einen Neubau handelt.
# Wenn die Wohnung *mehr* als fünf Jahre jünger/älter als das Gebäude ist, gehen wir davon aus, dass es sich um keinen Neubauwohnung handelt sondern vielleicht eine Aufstockung oder neue Wohnung im Rahmen eines Umbaus.
%in% c(-5:5) &
diff # nur Wohnräume mit Küche werden als Wohnung gezählt
== 1 | is.na(gwr_WKCHE)),
(gwr_WKCHE # selektiere die unten genannten stat_gkat
%in% c("EFH",
stat_gkat "MFH",
"Wohngebäude mit Nebennutzung",
"Gebäude mit teilweiser Wohnnutzung")
)
Historischer Wohnungsbestand ab 2010
Historische Wohnungsbestände können auf verschiedene Arten hergeleitet werden. Der Ansatz unten hat den Vorteil, dass die Auswertung sich auf einen GWR-Stand bezieht und somit den aktuellen Registerstand wiedergibt.
Die Variable GABBJ
ist erst ab 2010 gut erfasst, deshalb kann die Abbruchtätigkeit erst ab diesem Zeitpunkt ausgewiesen werden.
= list()
datalist
<- c(2010:Stichjahr)
jahr_list
for(i in 1:length(jahr_list)) {
= jahr_list[i]
jahr_sel
# A: Berechne Bestand des jeweiligen Jahres X gemäss aktuellem Bestand
<- GWR_Bestand_WHG_Aktuell %>%
GWR_NeubauWHG_sel # selektiere Neubaute die bis zum Jahr X gebaut wurden
filter(gwr_GBAUJ <= jahr_sel) %>%
# selektiere nur die unten genannte Spalten
select(gwr_EGID, gwr_EWID,gwr_GBAUJ, gwr_WAREA, stat_WAZIM, stat_gkat) %>%
mutate(jahr = jahr_sel)
# B: In 'A' fehlen die Gebäude die in der Vergangenheit abgerissen wurden. Diese werden hier hinzugefügt.
# Beispiel: Ein Gebäude welches im 2017 abgebrochen wurde ist im Bestand 2021 nicht mehr drin
<- GWR_AbbruchWHG %>%
GWR_AbbruchWHG_sel # filtere Gebäude die vor dem Jahr X erstellt wurden
# (Bei Gebäude die nach dem Jahr X erstellt und abgebrochen wurden handelt es sich vermutlich um Korrekturen.)
filter(gwr_GBAUJ < jahr_sel) %>%
# filtere Gebäude die nach dem Jahr X abgebrochen wurden oder oder NA haben bei gwr_GABBJ
filter(gwr_GABBJ > jahr_sel) %>%
# selektiere nur die unten genannte Spalten
select(gwr_EGID, gwr_EWID,gwr_GBAUJ, gwr_WAREA, stat_WAZIM, stat_gkat) %>%
mutate(jahr = jahr_sel)
<- rbind(GWR_NeubauWHG_sel, GWR_AbbruchWHG_sel)
datalist[[i]]
}
<- do.call(rbind, datalist)
GWR_Bestand_WHG_Historisch
<- GWR_Bestand_WHG_Historisch %>%
GWR_Bestand_WHG group_by(jahr) %>%
summarize(
n = n())