#######################################################
## Open Data Kooperation: univie & Parlament ##########
## Showcase 7: Ausschussvorsitze ######################
## code by Laurenz Ennser-Jedenastik & Daniel Bliem ###
### Kontakt: laurenz.ennser@univie.ac.at ##############
#######################################################
# Leeren der Arbeitsumgebung
rm(list = ls())
# Laden der erforderlichen Pakete. Falls nicht installiert, mit 'install.packages("Name des Pakets") installieren
library(httr)
library(jsonlite)
library(RJSONIO)
library(RCurl)
library(httr2)
library(purrr)
library(tibble)
library(rjson)
library(tidyverse)
library(gridExtra)
library(stringr)
library(ggtext)
# Definieren des Arbeitsverzeichnisses
setwd("Pfad/Zu/Ihrem/Arbeitsverzeichnis")
### Herunterladen des ersten Datensatzes: Parlamentarier:innen
# Definieren der URL für die POST-Anfrage
req <- request("https://www.parlament.gv.at/Filter/api/json/post?jsMode=EVAL&FBEZ=WFW_008&listeId=undefined&showAll=true&export=true")
# Senden der POST-Anfrage mit definiertem Body
t1 <-
req %>%
req_body_raw('{
"M": [
"M"
],
"W": [
"W"
],
"R_WF": [
"FR"
]
}
') %>%
req_perform()
# Laden der Antwort in einen Datenframe
df1 <- t1 %>% resp_body_json()
# Benötigte Variablen extrahieren
name_list <- lapply(df1$rows, function(x) x[[3]])
pad_list <- lapply(df1$rows, function(x) x[[1]])
party_list <- lapply(df1$rows, function(x) x[[4]])
# Erstellen eines Datenrahmens aus den extrahierten Informationen
df01 <- data.frame(
Name = unlist(name_list),
pad_id = unlist(pad_list),
fraktion = unlist(party_list)
)
# Umformen der Fraktionsvariable
df01$fraktion <- str_extract_all(df01$fraktion, ">([^<]+)</span>") %>%
lapply(function(x) paste(x, collapse = ", ")) %>%
unlist()
df01$fraktion <- gsub("</span>", "", df01$fraktion)
df01$fraktion <- gsub(">", "", df01$fraktion)
# Doppelte Einträge löschen (Änderung von Titel oder Nachname der Person)
df01 <- subset(df01, !grepl("siehe", Name))
# Speichern des Dataframes
save(df01, file = "Ihr Dateiname.RData")
### Herunterladen des 2. Datensatzes: Ausschussmitgliedschaften
# Liste von allen benötigten Personen-IDs
pad_id_list <- unique(df01$pad_id)
# Festlegen des Speicherorts für die JSON Files
setwd("Pfad/Zu/Ihrem/Speicherort")
# Herunterladen der JSON Files für jede Person
fetch_data <- function(pad_intern) {
base_url <- "https://www.parlament.gv.at/Filter/api/filter/data/250?js=eval&showAll=true&export=true"
post_body <- list(PAD_INTERN = list(pad_intern))
response <- POST(url = base_url, body = post_body, encode = "json")
if (status_code(response) == 200) {
# Speichern des Inhalts der Antwort (JSON-Daten) in einer Datei
content <- content(response, as = "text")
write(content, file = paste0(pad_intern, ".json"))
}}
# Iterieren dieser Funktion für jede PAD_INTERN-Nummer
for (pad_intern in pad_id_list) {
fetch_data(pad_intern)
}
# Erstellen des leeren Dataframes
df02 <- data.frame(
pad_id = character(),
GP = character(),
position = character(),
ausschuss = character(),
NR = character(),
start_date = character(),
end_date = character(),
stringsAsFactors = FALSE
)
# Pfad zu den JSON Files festlegen
json_files <- list.files(path = "Pfad/Zu/Ihren/JSON/Files", pattern = "\\.json$", full.names = TRUE)
# Daten mit Loop extrahieren und in den Dataframe spielen
for (file in json_files) {
# Laden der JSON-Daten
json_data <- jsonlite::fromJSON(file)
if (!is.null(json_data$rows) && length(json_data$rows) > 0) {
rows_matrix <- json_data$rows
# Durchlaufen jeder Zeile der Matrix
for (i in 1:nrow(rows_matrix)) {
# Extrahieren der spezifischen Werte aus der aktuellen Zeile der Matrix
row <- rows_matrix[i, ]
pad_id <- row[7]
GP <- row[1]
position <- row[3]
ausschuss <- gsub("\\s*\\([^)]+\\)", "", row[4])
NR <- row[5]
date_info <- row[4]
# Beim Enddatum müssen laufende Ausschüsse berücksichtigt werden
if (grepl("\\s+-\\s+", date_info)) {
start_date <- gsub(".*\\((.*?)\\s*-\\s*.*", "\\1", date_info)
end_date <- gsub(".*-\\s*(.*?)\\)", "\\1", date_info)
} else {
start_date <- gsub(".*\\((.*?)\\).*", "\\1", date_info)
end_date <- "01.01.2024" # Enddatum für den Fall, in dem end_date nicht angegeben ist
}
# Hinzufügen der extrahierten Werte als neue Zeile
new_row <- data.frame(pad_id, GP, position, ausschuss, NR, start_date, end_date, stringsAsFactors = FALSE)
df02 <- rbind(df02, new_row)
}
} else {
cat("Keine Daten in 'rows' für Datei:", file, "\n") # Alle Personen, für die es noch keine Ausschussdaten gibt (Abgeordnete vor XX. GP)
}
}
# Filtern der Ausschüsse: Kein U-Ausschuss, Unterausschuss, besonderer Ausschuss, Ausschuss im Bundesrat, ...
df02 <- df02 %>%
filter(NR == "NR") %>%
filter(!grepl("unterausschuss|ständiger|unterausschuß|untersuchungsausschuss|besonderer|enquete", ausschuss, ignore.case = TRUE))
# Auf neue Rechtschreibung korrigieren
df02$ausschuss <- gsub("(A|a)usschuß", "\\1usschuss", df02$ausschuss)
# Ausschüsse zusammenfassen, die die gleichen Materien behandeln
df02$ausschuss[df02$ausschuss == "Ausschuss für Wissenschaft und Forschung"] <- "Wissenschaftsausschuss"
df02$ausschuss[df02$ausschuss == "Ausschuss für Wirtschaft und Industrie"] <- "Ausschuss für Wirtschaft, Industrie und Energie"
df02$ausschuss[df02$ausschuss == "Ausschuss für Forschung, Innovation und Technologie"] <- "Ausschuss für Forschung, Innovation und Digitalisierung"
df02$ausschuss[df02$ausschuss == "Ausschuss für Sportangelegenheiten"] <- "Sportausschuss"
df02$ausschuss[df02$ausschuss == "Bautenausschuss"] <- "Ausschuss für Bauten und Wohnen"
df02$ausschuss[df02$ausschuss == "Familienausschuss"] <- "Ausschuss für Familie und Jugend"
# Filtern der Rollen: Nur Ausschussvorsitzende
df02 <- df02 %>%
filter(position == "Obmann" | position == "Obfrau")
# Einschränken der Daten auf Untersuchungszeitraum (bis 01.01.2024)
df02$start_date <- as.Date(df02$start_date, format = "%d.%m.%Y")
df02$end_date <- as.Date(df02$end_date, format = "%d.%m.%Y")
df02 <- df02 %>%
filter(start_date <= "2024-01-01")
# Speichern des Dataframes
save(df02, file = "Sc07_2.RData")
# Übertragen der Namens- und Fraktionsvariable auf df02
df03 <- merge(df02, df01, by = "pad_id")
# Korrigieren der Fraktionsbezeichnungen
bereinige_fraktion <- function(fraktion) {
fraktion <- gsub("\\bGRÜNE, OF, GRÜNE\\b", "GRÜNE", fraktion)
fraktion <- gsub("\\bÖVP, STRONACH, OK\\b", "ÖVP, STRONACH", fraktion)
fraktion <- gsub("\\bSTRONACH, OK\\b", "STRONACH", fraktion)
fraktion <- gsub("\\bNEOS-LIF, NEOS\\b", "NEOS", fraktion)
fraktion <- gsub("\\bNEOS-LIF\\b", "NEOS", fraktion)
fraktion <- gsub("\\bL, F\\b", "L, FPÖ", fraktion)
fraktion <- gsub("\\bF, BZÖ\\b|\\bF, F-BZÖ, BZÖ\\b|\\bF, FPÖ, OK, BZÖ\\b|\\bFPÖ, F, BZÖ\\b|\\bFPÖ, F, F-BZÖ, BZÖ\\b", "FPÖ, BZÖ", fraktion)
fraktion <- gsub("\\bBZÖ, FPÖ\\b|\\bBZÖ, OK, FPÖ\\b", "BZÖ, FPÖ", fraktion)
fraktion <- gsub("\\bF, F-BZÖ, FPÖ\\b|\\bFPÖ, F, F-BZÖ\\b|\\bF, F-BZÖ\\b", "FPÖ", fraktion)
fraktion <- gsub("\\bF, FPÖ\\b|\\bFPÖ, F\\b", "FPÖ", fraktion)
fraktion <- gsub("\\bF\\b", "FPÖ", fraktion)
return(fraktion)
}
df03$fraktion <- bereinige_fraktion(df03$fraktion)
# Festlegen des korrekten Klubs Ausschussvorsitzender, die mehreren Klubs angehörten
df03 <- df03 %>%
mutate(
fraktion = case_when(
fraktion %in% c("FPÖ, BZÖ", "BZÖ, FPÖ") & as.Date(end_date, format="%d.%m.%Y") < as.Date("2006-10-01") ~ "FPÖ",
fraktion %in% c("FPÖ, BZÖ", "BZÖ, FPÖ") & as.Date(start_date, format="%d.%m.%Y") > as.Date("2013-10-29") & Name != "Stadler Ewald, Mag." ~ "FPÖ",
fraktion %in% c("FPÖ, BZÖ", "BZÖ, FPÖ") & Name == "Stadler Ewald, Mag." ~ "FPÖ",
fraktion %in% c("FPÖ, BZÖ", "BZÖ, FPÖ") ~ "BZÖ",
fraktion == "ÖVP, STRONACH" ~ "STRONACH",
fraktion == "FPÖ, L" ~ "LIF",
fraktion == "L, FPÖ" ~ "FPÖ",
TRUE ~ fraktion
)
)
# Vorsitze von gleicher GP und Fraktion zusammenfassen
df03_neu <- df03 %>%
group_by(GP, ausschuss, fraktion) %>%
summarise(
start_date = min(as.Date(start_date, format="%d.%m.%Y")),
end_date = max(as.Date(end_date, format="%d.%m.%Y")),
Name = paste(Name, collapse = ", "),
pad_id = paste(pad_id, collapse = ", ")
) %>%
ungroup()
# Korrigieren der Ausnahmefälle, in denen ein Ausschuss innerhalb einer GP Klubvorsitz wechselt: In dieser Auswertung zählt der Klub, der 2 Monate (60 Tage) nach Regierungsbildung im Vorsitz war
# Erstellen eines Dataframes mit dem Datum 60 Tage nach Regierungsantritt für jede GP
inauguration_dates <- data.frame(
GP = c("XX", "XXI", "XXII", "XXIII", "XXIV", "XXV", "XXVI", "XXVII"),
inauguration_date = as.Date(c("1996-05-11", "2000-04-04", "2003-04-29", "2007-03-12", "2009-01-31", "2014-02-14", "2018-02-16", "2020-03-07"))
)
# Fusionieren dieser Daten mit dem originalen Dataframe
df03_neu <- merge(df03_neu, inauguration_dates, by = "GP")
# Filtern der Observationen, in denen ein Klub später als 60 Tage nach Regierungsantritt in den Ausschussvorsitz gekommen ist
df03_neu <- df03_neu[as.Date(df03_neu$inauguration_date) >= as.Date(df03_neu$start_date) & as.Date(df03_neu$inauguration_date) <= as.Date(df03_neu$end_date), ]
df03_neu <- df03_neu %>%
filter(pad_id != "14767, 35490, 35490")
# Erstellen eines benutzerdefinierten Themes für die Grafiken
custom_theme <- function() {
theme_minimal() +
theme(
plot.background = element_rect(fill = "white", color = NA),
panel.grid.major = element_line(color = alpha("gray", 0.25)),
panel.grid.minor = element_line(color = "white"),
panel.border = element_blank(),
plot.title = element_text(color = "#132843", size = 18, face = "bold", family = "Lato", margin = margin(b = 5), hjust = 0),
plot.subtitle = element_text(color = "#132843", size = 14, family = "Lato", margin = margin(b = 20), hjust = 0),
axis.title.x = element_text(face = "bold", family = "Lato", size = 15, margin = margin(t = 15)),
axis.title.y = element_text(face = "bold", family = "Lato", size = 15, margin = margin(r = 15)),
axis.text = element_text(family = "Lato", size = 12),
legend.text = element_text(family = "Lato", face = "bold", size = 12),
plot.margin = margin(1.2, 0.7, 0.7, 0.7, "cm"),
plot.title.position = "plot",
plot.caption.position = "plot",
plot.caption = element_text(size = 11)
)
}
# Festlegen des Speicherorts für die Grafiken
setwd("Pfad/Zu/Ihrem/Speicherort")
# Festlegen der Reihenfolge und Farben der Fraktionen
fraktion_order <- c("ÖVP", "SPÖ", "FPÖ", "GRÜNE", "NEOS", "PILZ", "STRONACH", "BZÖ", "LIF")
fraktion_color <- c("ÖVP" = "#62c3d0", "SPÖ" = "#FF0000", "FPÖ" = "#0052fb", "GRÜNE" = "#69b12e", "NEOS" = "#e3257b", "PILZ" = "#c8c8c8", "STRONACH" = "#f8e924", "BZÖ" = "#ff8d04", "LIF" = "#b0d8f3")
### 1. Grafik: Scatterplot von Ausschussvorsitzen zu Mandatsanzahl
# Zusammenfassen der Vorsitzanzahl pro Klub und GP
df03_sum <- df03_neu %>%
group_by(GP, fraktion) %>%
summarise(Vorsitze = n())
# Hinzufügen der Anzahl der Mandate pro GP (Daten von der Parlamentswebsite)
mandate_data <- data.frame(
fraktion = rep(c("ÖVP", "SPÖ", "FPÖ", "GRÜNE", "NEOS", "PILZ", "STRONACH", "BZÖ", "KPÖ", "LIF"), times = 8),
GP = rep(c("XX", "XXI", "XXII", "XXIII", "XXIV", "XXV", "XXVI", "XXVII"), each = 10),
NR_Mandate = c(52, 71, 41, 9, NA, NA, NA, NA, NA, 10,
52, 65, 52, 14, NA, NA, NA, NA, NA, NA,
79, 69, 18, 17, NA, NA, NA, NA, NA, NA,
66, 68, 21, 21, NA, NA, NA, 7, NA, NA,
51, 57, 34, 20, NA, NA, NA, 21, NA, NA,
47, 52, 40, 24, 9, NA, 11, NA, NA, NA,
62, 52, 51, NA, 10, 8, NA, NA, NA, NA,
71, 40, 31, 26, 15, NA, NA, NA, NA, NA)
)
# Hinzufügen dieser Daten in den vorher erstellten Dataframe
df03_sum <- merge(df03_sum, mandate_data, by = c("fraktion", "GP"), all.x = TRUE)
# Hinzufügen einer Reihe für Liste PILZ (die keinen Ausschussvorsitz hatten und deswegen nicht inkludiert sind)
df03_sum[nrow(df03_sum) + 1,] = c("PILZ", "XXVI", 0, 8)
# Umwandeln der Daten in numerische Daten
df03_sum$Vorsitze <- as.numeric(df03_sum$Vorsitze)
df03_sum$NR_Mandate <- as.numeric(df03_sum$NR_Mandate)
# Erstellen der Grafik
grafik_01 <- ggplot(df03_sum, aes(x = NR_Mandate, y = Vorsitze, color = fraktion)) +
geom_smooth(method = "lm", se = FALSE, color = "#132843") +
geom_point(size = 3, position = position_jitter(w = 0.2, h = 0.2)) +
scale_color_manual(values = fraktion_color, breaks = fraktion_order) +
scale_x_continuous(breaks = seq(0, 80, by = 10), limits = c(0, 82)) +
scale_y_continuous(breaks = seq(0, max(df03_sum$Vorsitze), by = 2), limits = c(-1, 13)) +
labs(title = "Mandatsanzahl und Ausschussvorsitze",
subtitle = "Pro Klub und GP (XX. - XXVII. GP)",
x = "Anzahl der NR-Mandate",
y = "Anzahl der Ausschussvorsitze",
caption = "Quelle: parlament.gv.at") +
custom_theme() +
theme(
legend.position = "bottom",
legend.title = element_blank(),
) +
guides(colour = guide_legend(nrow = 1))
# Speichern der Grafik
ggsave("SC07_Grafik01.jpg", grafik_01, width = 10, height = 7.5, units = "in", dpi = 300)
### 2. - 4. Grafik
# Funktion zur Feststellung, wie oft der Vorsitz innerhalb eines Ausschusses Klub wechselt
function_vorsitz <- function(x, condition) {
if (condition == 1) {
return(length(unique(x)) == 1)
} else if (condition == 2) {
return(length(unique(x)) == 2)
} else if (condition == 3) {
return(length(unique(x)) > 2)
} else {
stop("Fehler")
}
}
# Aufteilen der Daten in drei Dataframes basierend auf Fraktionswechsel des Ausschussvorsitzes
df_vorsitz_1 <- df03_neu %>%
group_by(ausschuss) %>%
filter(function_vorsitz(fraktion, 1))
df_vorsitz_2 <- df03_neu %>%
group_by(ausschuss) %>%
filter(function_vorsitz(fraktion, 2))
df_vorsitz_3 <- df03_neu %>%
group_by(ausschuss) %>%
filter(function_vorsitz(fraktion, 3))
# Anpassen der Reihenfolge der zweiten Grafik
df_vorsitz_1 <- df_vorsitz_1 %>%
mutate(fraktion = factor(fraktion, levels = fraktion_order)) %>%
arrange(fraktion)
# Erstellen der zweiten Grafik
grafik_02 <- ggplot(df_vorsitz_1, aes(x = GP, y = ausschuss, fill = fraktion)) +
geom_tile(color = "white", width = 0.97, height = 0.97) +
scale_y_discrete(limits=rev) +
scale_fill_manual(values = fraktion_color,
breaks = fraktion_order) +
labs(title = "Entwicklung der Ausschussvorsitze über die Gesetzgebungsperioden",
subtitle = "Ausschüsse mit Obleuten aus einem Nationalratsklub",
x = "",
y = "",
caption = "Quelle: parlament.gv.at") +
custom_theme() +
theme(
legend.position = "",
axis.title.y = element_text(margin = margin(r = -10)),
axis.text.x = element_text(size = 11),
strip.text = element_text(size = 11, face = "bold"),
strip.placement = "outside"
) +
scale_x_discrete(labels = c("XX\n1996-99", "XXI\n1999-02", "XXII\n2002-06", "XXIII\n2006-08", "XXIV\n2008-13", "XXV\n2013-17", "XXVI\n2017-19", "XXVII\n2019-24")) +
facet_grid(fraktion ~ ., scales = "free_y", space = "free_y", switch = "y")
# Speichern der Grafik
ggsave("SC07_Grafik02.jpg", grafik_02, width = 10, height = 7.5, units = "in", dpi = 300)
# Erstellen der dritten Grafik - Ausschüsse, in denen der Vorsitz zwischen zwei Klubs wechselt
grafik_03 <- ggplot(df_vorsitz_2, aes(x = GP, y = ausschuss, fill = fraktion)) +
geom_tile(color = "white", width = 0.97, height = 0.97) +
scale_fill_manual(values = fraktion_color,
breaks = fraktion_order) +
labs(title = "Entwicklung der Ausschussvorsitze über die Gesetzgebungsperioden",
subtitle = "Ausschüsse mit Obleuten aus zwei Nationalratsklubs",
x = "",
y = "",
caption = "Quelle: parlament.gv.at") +
custom_theme() +
theme(
legend.position = "bottom",
legend.title = element_blank(),
legend.margin = margin(t = -20, b = 10),
axis.text.x = element_text(size = 11),
axis.title.y = element_text(margin = margin(r = -10)),
) +
guides(fill = guide_legend(nrow = 1)) +
scale_x_discrete(labels = c("XX\n1996-99", "XXI\n1999-02", "XXII\n2002-06", "XXIII\n2006-08", "XXIV\n2008-13", "XXV\n2013-17", "XXVI\n2017-19", "XXVII\n2019-24")) +
scale_y_discrete(limits = rev(c("Hauptausschuss", "Ausschuss für Familie und Jugend", "Geschäftsordnungsausschuss", "Finanzausschuss", "Ausschuss für Bauten und Wohnen",
"Ausschuss für innere Angelegenheiten", "Unterrichtsausschuss", "Volksanwaltschaftsausschuss",
"Verkehrsausschuss", "Tourismusausschuss", "Ausschuss für Forschung, Innovation und Digitalisierung", "Ausschuss für Menschenrechte", "Rechnungshofausschuss")))
# Speichern der Grafik
ggsave("SC07_Grafik03.jpg", grafik_03, width = 10, height = 7.5, units = "in", dpi = 300)
# Vierte Grafik: Aufteilen der Ausschüsse nach Anzahl der Klubs im Vorsitz
df_vorsitz_3 <- df_vorsitz_3 %>%
mutate(fraktion_count = length(unique(fraktion))) %>%
arrange(fraktion_count, ausschuss)
# Erstellen der Labels für die Grafik
strip.labels <- c("3 Klubs", "4 Klubs", "5 Klubs")
names(strip.labels) <- c("3", "4", "5")
# Erstellen der vierten Grafik
grafik_04 <- ggplot(df_vorsitz_3, aes(x = GP, y = ausschuss, fill = fraktion)) +
geom_tile(color = "white", width = 0.97, height = 0.97) +
scale_fill_manual(values = fraktion_color,
breaks = fraktion_order) +
labs(title = "Entwicklung der Ausschussvorsitze über die Gesetzgebungsperioden",
subtitle = "Ausschüsse mit Obleuten aus drei oder mehr Nationalratsklubs",
x = "",
y = "",
caption = "Quelle: parlament.gv.at") +
custom_theme() +
theme(
legend.position = "bottom",
legend.title = element_blank(),
legend.margin = margin(t = -20, b = 10, l = -70),
axis.text.x = element_text(size = 11),
axis.title.y = element_text(margin = margin(r = -10)),
strip.placement = "outside",
strip.text = element_text(size = 11, face = "bold")
) +
guides(fill = guide_legend(nrow = 1)) +
facet_grid(fraktion_count ~ ., scales = "free_y", space = "free_y", switch = "y",
labeller = labeller(fraktion_count = strip.labels)) +
scale_x_discrete(labels = c("XX\n1996-99", "XXI\n1999-02", "XXII\n2002-06", "XXIII\n2006-08", "XXIV\n2008-13", "XXV\n2013-17", "XXVI\n2017-19", "XXVII\n2019-24")) +
scale_y_discrete(limits=rev)
# Speichern der Grafik
ggsave("SC07_Grafik04.jpg", grafik_04, width = 10, height = 7.5, units = "in", dpi = 300)