Datenaufbereitung mit R

Vorbereitung

Um statistische Daten direkt aus den Datenbanken des statistischen Bundesamtes oder der nordrhein-westfälischen Statistik abrufen zu können, wird die Erweiterung “wiesbaden” benötigt. Zusätzlich erfordert die Umformung der Daten die Pakete “tidyr” und “dplyr”.

setwd("C:/Users/*Username*/*Folder*")
##### Bibliotheken installieren (falls noch nicht
##### geschehen)####
install.packages("wiesbaden")
install.packages("tidyr")
install.packages("dplyr")
##### Bibliotheken aktivieren ####
library("wiesbaden")
library("tidyr")
library("dplyr")

Aufbereitung der Wanderungsdaten zwischen Kreisen in NRW nach Altersgruppen

Datenabruf

Um Daten aus den statistischen Datenbanken abzurufen, ist eine kostenfreie Registrierung bei der entsprechenden Seite erforderlich. Die dort erhaltenen Anmeldedaten werden im folgenden unter Benutzername und Passwort benötigt. Unter db wird mit den Kürzeln nrw, regio, de oder bm die gewünschte Datenbank angegeben. Für nähere Informationen zum Wiesbaden-Paket: Getting started with Wiesbaden

# Verfügbare Datentabellen in der Unterkategorie *12791*
# laden
datalist_NRW <- retrieve_datalist(tableseries = "12791*", genesis = c(db = "nrw",
    user = "Benutzername", password = "Passwort"))
head(datalist_NRW)
##    tablename
## 1 12791NWG01
## 2 12791NWG02
## 3 12791NWG03
## 4 12791NWG04
## 5 12791NWG05
## 6 12791NWG06
##                                                                                               description
## 1                                     Fortgezogene, Zugezogene, Geschlecht, Nationalität, Gemeinden, Jahr
## 2 Fortgezogene, Zugezogene, Geschlecht, Altersgruppen (unter 18, ..., 65 Jahre und mehr), Gemeinden, Jahr
## 3                                                 Fortgezogene, Zugezogene, Nationalität, Gemeinden, Jahr
## 4                                                   Fortgezogene, Zugezogene, Geschlecht, Gemeinden, Jahr
## 5             Fortgezogene, Zugezogene, Altersgruppen (unter 18, ..., 65 Jahre und mehr), Gemeinden, Jahr
## 6                                                               Fortgezogene, Zugezogene, Gemeinden, Jahr
Wanderungen_Alter_NRW_Kreise <- retrieve_data(tablename = "12791NWKK5",
    genesis = c(db = "nrw", user = "Benutzername", password = "Passwort"))  # Ausgewählte Datentabelle als dataframe laden
# Einblick in die geladenen Daten
head(Wanderungen_Alter_NRW_Kreise)
##   id12791    ALTX01 KRE2DI KREISE JAHR BEV009_val BEV009_qual BEV009_lock
## 1       D ALT000B18  05111  05112 1975        125           e          NA
## 2       D ALT000B18  05111  05112 1976        118           e          NA
## 3       D ALT000B18  05111  05112 1977        114           e          NA
## 4       D ALT000B18  05111  05112 1978        139           e          NA
## 5       D ALT000B18  05111  05112 1979        101           e          NA
## 6       D ALT000B18  05111  05112 1980         74           e          NA
##   BEV009_err BEV010_val BEV010_qual BEV010_lock BEV010_err
## 1          0         78           e          NA          0
## 2          0         86           e          NA          0
## 3          0         82           e          NA          0
## 4          0         67           e          NA          0
## 5          0         61           e          NA          0
## 6          0         65           e          NA          0

Um die Kriterien für die Datenaufbereitung festlegen zu können, benötigen wir Informationen über die Bedeutung der einzelnen Spalten. Diese erhalten wir über die Funktion retrieve_metadata

# Metadaten laden
retrieve_metadata(tablename = "12791NWKK5", genesis = c(db = "nrw",
    user = "Benutzername", password = "Passwort"))
##     name                                      description   unit
## 1 BEV009                                     Fortgezogene Anzahl
## 2 BEV010                                       Zugezogene Anzahl
## 3 ALTX01 Altersgruppen (unter 18, ..., 65 Jahre und mehr)       
## 4 KRE2DI       Kreisfreie Städte und Kreise (Quelle/Ziel)       
## 5 KREISE                     Kreisfreie Städte und Kreise       
## 6   JAHR                                             Jahr

Aus den Metadaten kann entnommen werden, welche Spalte den Ursprungskreis und welche den Zielkreis angibt. Diese Information ist entscheident, um die Pivottabelle richtig zu formatieren. In diesem Fall ziehen Menschen aus Kreise in KRE2DI fort (BEV009). Um die Daten in das hin&weg-Format zu bringen fehlt jetzt nur noch die Information, welche Kategorien die Daten enthalten. In diesem Fall existiert eine Spalte mit kategorisierungsvariablen - ALTX01. Für diese benötigen wir alle Einzelwerte. Um diese zu erhalten fragen wir die Valuelabel ab.

retrieve_valuelabel("ALTX01", valuelaberl = "*", genesis = c(db = "nrw",
    user = "Benutzername", password = "Passwort"), language = "de")  # Alle Werte für das Label ALTX01 (Altersgruppen) abrufen `> werden für die Filter/den Loop bei der Datenaufbereitung benötigt
##      ALTX01           description
## 1 ALT000B18        unter 18 Jahre
## 2 ALT018B25 18 bis unter 25 Jahre
## 3 ALT025B30 25 bis unter 30 Jahre
## 4 ALT030B50 30 bis unter 50 Jahre
## 5 ALT050B65 50 bis unter 65 Jahre
## 6  ALT065UM     65 Jahre und mehr

Datenaufbereitung

Mit diesen Angaben kann jetzt der Aufbereitungscode gefüllt werden. Warnungen für rbind können ignoriert werden

for (a in c("ALT000B18","ALT018B25","ALT025B30", "ALT030B50","ALT050B65","ALT065UM")) { 
  # Erstes Unterscheidungskriterium: Altersgruppen. Hier alle Werte für diese Kategorie angeben, für die eine hin&weg Tabelle erstellt werden soll 
  for (i in 1976:2017) {
    # Zweites Unterscheidungskriterium: Jahr. Hier Start und Endjahr bzw. alle Jahre angeben, für die eine hin&weg Tabelle erstellt werden soll 
    x = pivot_wider( # erstellt Pivot Tabelle
      (subset(Wanderungen_Alter_NRW_Kreise, JAHR==i&ALTX01==a, select=c(KREISE, KRE2DI, BEV009_val))), 
      # Auswahl der Daten aus dem Dataframe, die sowohl dem Kriterium Jahr=i als auch ALtersgruppe=a entsprechen. Für diese Daten werden dann die Relevanten Spalten Ursprungskreise, Zielkreise und Anzahl Wanderungen ausgewählt
      names_from = KRE2DI, values_from = BEV009_val) %>% select(KREISE,order(colnames(.))) %>% arrange(KREISE) 
    # Festlegen, aus welcher Spalte die Namen und die Werte für die Pivottabelle kommen sollen. Die Labels werden zusätzlich in den Spalten und Zeilen sortiert, so dass die Reihenfolge für beide identisch ist.
    write.table( 
      # Befehl schreibt alle enthaltenen Daten in eine Tabelle
      rbind( 
        # Rowbind, d.h. die Werte innerhalb dieser Klammer werden als Reihen verknüpft
        c("metadata keys", "type", "timeunit", "time","Inhalt"),  
        # 1. Reihe mit den Metadaten-Schlüsseln für hin&weg
        c("metadata values", "movement", "year", i,paste("Wanderungen zwischen Kreisen in NRW",a)), 
        # 2. Reihe mit den Metadatenvalues. Das Jahr, i, wird automatisch ausgefüllt. Der "paste" Befehl schreibt alles innerhalb der Klammern als Text. In diesem Fall den Textbaustein und dahinter die Altersgruppe des Datensatzes (a)
        colnames(x), 
        # als dritte Zeile dienen die Spaltennamen der Pivottabelle, d.h. die Kreiscodes
        x), 
      # ab der vierten Zeile beginnt die Pivottabelle mit den Daten und den Kreiscodes der Ursprungskreise (1. Zeile)
      file = paste("Kreiswanderungen_NRW_",a,"_",i,".csv", sep = ""), row.names = F , col.names = F, sep=";", quote = F) 
    # Hier werden die Speicherkriterien festgelegt. Der Dateiname setzt sich aus dem Textbaustein, der Altersgruppe a, dem Jahr i und der Dateiendung ".csv" zusammen.Spalten und Zeilennamen sollen nicht mit gespeichert werden. Als Seperator wird ";" festgelegt, Wichtig: "quote", d.h. Anführungszeichen müssen deaktiviert werden, damit hin&weg die Daten verarbeiten kann.
  }} 
# Schließende Klammern der beiden Loops, d.h. alles innerhalb dieser Klammern wird für alle möglichen Kombinationen von a und i ausgeführt.

Als Ergebnis werden die CSV-Dateien mit der entsprechenden Benennung im Arbeitsverzeichnis abgelegt. Diese Dateien können direkt in hin&weg geöffnet werden.

Reiner Code:

# Bibliotheken installieren
install.packages("wiesbaden")
install.packages("tidyr")
install.packages("dplyr")
# Bibliotheken aktivieren
library("wiesbaden")
library("tidyr")
library("dplyr")
# Verfügbare Datentabellen in der Unterkategorie *12791*
# laden
datalist_NRW <- retrieve_datalist(tableseries = "12791*", genesis = c(db = "nrw",
    user = "Benutzername", password = "Passwort"))
head(datalist_NRW)
# Wanderungsdaten laden
Wanderungen_Alter_NRW_Kreise <- retrieve_data(tablename = "12791NWKK5",
    genesis = c(db = "nrw", user = "Benutzername", password = "Passwort"))
head(Wanderungen_Alter_NRW_Kreise)
# Metadaten laden
retrieve_metadata(tablename = "12791NWKK5", genesis = c(db = "nrw",
    user = "Benutzername", password = "Passwort"))
# Label laden
retrieve_valuelabel("ALTX01", valuelaberl = "*", genesis = c(db = "nrw",
    user = "Benutzername", password = "Passwort"), language = "de")
# Tabellen erstellen und speichern
for (a in c("ALT000B18", "ALT018B25", "ALT025B30", "ALT030B50",
    "ALT050B65", "ALT065UM")) {
    for (i in 1976:2017) {
        x = pivot_wider((subset(Wanderungen_Alter_NRW_Kreise,
            JAHR == i & ALTX01 == a, select = c(KREISE, KRE2DI,
                BEV009_val))), names_from = KRE2DI, values_from = BEV009_val) %>%
            select(KREISE, order(colnames(.))) %>%
            arrange(KREISE)
        write.table(rbind(c("metadata keys", "type", "timeunit",
            "time", "Inhalt"), c("metadata values", "movement",
            "year", i, paste("Wanderungen zwischen Kreisen in NRW",
                a)), colnames(x), x), file = paste("Kreiswanderungen_NRW_",
            a, "_", i, ".csv", sep = ""), row.names = F, col.names = F,
            sep = ";", quote = F)
    }
}