Skip to content
Snippets Groups Projects
Select Git revision
  • cea3bc8cc10483ad9cc60a2567d56f973d92a8a9
  • main default protected
2 results

generiere_testdaten.R

Blame
  • 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