Select Git revision
generiere_testdaten.R
generiere_testdaten.R 5.59 KiB
#' generiere_testdaten.R
#'
#' Macht aus den Templates für Ortsteil- und Stimmbezirk-Ergebnisse
#' jeweils eine Serie von fiktiven Livedaten, um das Befüllen der
#' Grafiken testen zu können.
#'
require(tidyr)
require(dplyr)
require(readr)
# Alles weg, was noch im Speicher rumliegt
rm(list=ls())
source("R/lies_aktuellen_stand.R")
#---- Funktion zum Testdaten-Löschen ----
lösche_testdaten <- function(){
q <- tolower(readline(prompt = "Testdaten löschen - sicher? "))
if (!(q %in% c("j","y","ja"))) { return() }
# Datenarchiv weg
if (file.exists("daten/fom_df.rds")){
file.remove("daten/fom_df.rds")
}
# Testdaten
testdaten_files <- list.files("testdaten", full.names=TRUE)
for (f in testdaten_files) {
# Grausam, I know.
if (str_detect(f,"ortsteile[0-9]+\\.csv") |
str_detect(f,"stimmbezirke[0-9]+\\.csv")) {
file.remove(f)
}
}
}
# Vorlagen laden
vorlage_stimmbezirke_df <- read_delim("testdaten/Open-Data-06412000-Buergerentscheid-zur-Abwahl-des-Oberbuergermeisters-der-Stadt-Frankfurt-am-Main_-Herrn-Peter-Feldmann-Stimmbezirk.csv",
delim = ";", escape_double = FALSE,
locale = locale(date_names = "de",
decimal_mark = ",",
grouping_mark = "."),
trim_ws = TRUE)
stimmbezirke_max <- sum(vorlage_stimmbezirke_df$`max-schnellmeldungen`)
# Konstanten für die Simulation - werden jeweils um bis zu +/-25% variiert
c_wahlberechtigt = 510000 / stimmbezirke_max # Gleich große stimmbezirke
c_wahlbeteiligung = 0.3 # Wahlbeteiligung um 30%, wird im Lauf der "Wahl" erhöht (kleinere WL sind schneller ausgezählt)
c_wahlschein = 0.25 # 25% Briefwähler
c_nv = 0.05 # 0,5% wählen "spontan" und sind nicht verzeichnet (nv) im Wählerverzeichnis
c_ungültig = 0.01 # 1% Ungültige
c_nein = 0.15 # unter den gültigen: 85% Ja-Stimmen (Varianz also von ca 81-89%)
variiere <- function(x = 1) {
# Variiert den übergebenen Wert zufällig um -25% bis +25%:
# Zufallswerte zwischen 0,75 und 1,25 erstellen und multiplizieren
#
# Die Length-Funktion ist wichtig - sonst erstellt runif() nur einen
# Zufallswert, mit dem alle Werte von x multipliziert werden.
return(floor(x * (runif(length(x),0.75,1.25))))
}
i = 1
# Schleife für die stimmbezirke: Solange noch nicht alle "ausgezählt" sind...
while(sum(vorlage_stimmbezirke_df$`anz-schnellmeldungen`) < stimmbezirke_max) {
# ...splitte das df in die gemeldeten (meldungen_anz == 1) und nicht gemeldeten Zeilen
tmp_gemeldet_df <- vorlage_stimmbezirke_df %>% filter(`anz-schnellmeldungen` == 1)
# Die Variable rand wird als Anteil von 20 Meldungen an debn noch offenen stimmbezirke berechnet