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).

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 

Stichjahr = 2022

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

GWR_WHG <- fread('https://www.web.statistik.zh.ch/ogd/daten/ressourcen/KTZH_00002022_00004065.csv') %>%
  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

GWR_GEB <- fread('https://www.web.statistik.zh.ch/ogd/daten/ressourcen/KTZH_00002022_00004064.csv') %>%
  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(
      gwr_GKAT == 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",
      TRUE ~ "Rest"
      )
    )%>%
  # stat_gkat2
  mutate(stat_gkat2 = case_when(
    gwr_GKAT == 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",
    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_JoinGEB <- GWR_WHG %>%
  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_Bestand_GEB <- GWR_GEB %>%
  # selektiere nur bestehende Gebäude
  filter(gwr_GSTAT == 1004) 

Aktueller Wohnungsbestand

GWR_Bestand_WHG_Aktuell <- GWR_WHG_JoinGEB %>%
  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
    gwr_WSTAT == "3004" & gwr_GSTAT == "1004" &
    # nur Wohnräume mit Küche werden  als Wohnung gezählt
    (gwr_WKCHE == 1 | is.na(gwr_WKCHE)) &
    # selektiere die unten genannten stat_gkat
    stat_gkat %in% c("EFH",
                     "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_AbbruchWHG <- GWR_WHG_JoinGEB  %>%
  # 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_NeubauWHG <- GWR_WHG_JoinGEB %>%
  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
      gwr_WSTAT == "3004" & gwr_GSTAT == "1004" &
      # 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.
      diff %in% c(-5:5) &
      # nur Wohnräume mit Küche werden  als Wohnung gezählt
      (gwr_WKCHE == 1 | is.na(gwr_WKCHE)),
      # selektiere die unten genannten stat_gkat
      stat_gkat %in% c("EFH",
                       "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.

datalist = list()

jahr_list <- c(2010:Stichjahr)

for(i in 1:length(jahr_list)) {

jahr_sel = jahr_list[i]

# A: Berechne Bestand des jeweiligen Jahres X gemäss aktuellem Bestand
GWR_NeubauWHG_sel <- GWR_Bestand_WHG_Aktuell %>%
  # 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_sel <- GWR_AbbruchWHG %>%
  # 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)

datalist[[i]] <- rbind(GWR_NeubauWHG_sel, GWR_AbbruchWHG_sel)

}

GWR_Bestand_WHG_Historisch <- do.call(rbind, datalist)

GWR_Bestand_WHG <- GWR_Bestand_WHG_Historisch %>%
  group_by(jahr) %>%
  summarize(
    n = n())