hin&weg Datenaufbereitung aus statistischen Datenbanken
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)
}
}