Initial setup with lecture example
This commit is contained in:
		
							parent
							
								
									ef8ed67ae7
								
							
						
					
					
						commit
						a9f9bdfdc5
					
				@ -0,0 +1,165 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					################
 | 
				
			||||||
 | 
					# Im folgenden Abschnitt wird das User Interface (UI) definiert
 | 
				
			||||||
 | 
					ui <- fluidPage(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Titel der App
 | 
				
			||||||
 | 
					  titlePanel("Münchner Mietspiegel"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Layout für die Eingaben in die App und die Ausgaben
 | 
				
			||||||
 | 
					  sidebarLayout(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Die Definition der Eingabefelder auf der linken Seite
 | 
				
			||||||
 | 
					    sidebarPanel(
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					      # Eine Überschrift mit Linie darunter
 | 
				
			||||||
 | 
					      h3("Wohnung:",align="left"),
 | 
				
			||||||
 | 
					      hr(style="height: 1px; background: black"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Ein Slider für die Fläche der Wohnung
 | 
				
			||||||
 | 
					      # der Slider geht hier von 30 (min) bis 100 (max), 
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 75 (value)
 | 
				
			||||||
 | 
					      sliderInput(inputId = "flaeche",
 | 
				
			||||||
 | 
					                  label = "Groesse in qm:",
 | 
				
			||||||
 | 
					                  min = 30,
 | 
				
			||||||
 | 
					                  max = 100,
 | 
				
			||||||
 | 
					                  value = 75
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Das Baujahr als numerische Eingabe
 | 
				
			||||||
 | 
					      # die Werte gehen von 1950 (min) bis 2000 (max) in Einerschritten (step)
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 1981 (value)
 | 
				
			||||||
 | 
					      numericInput(inputId="bjahr", 
 | 
				
			||||||
 | 
					                    label="Baujahr:", 
 | 
				
			||||||
 | 
					                        value = 1981,
 | 
				
			||||||
 | 
					                        min=1950,max=2000,step=1
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Die Lage als Auswahlliste
 | 
				
			||||||
 | 
					      # die Auswahlmöglichkeiten sind "normale Lage", "gute Lage" und "beste Lage",
 | 
				
			||||||
 | 
					      # die entsprechende Zuordnung mit Zahlen 1, 2 und 3 sind wie im Datensatz,
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 1 (selected) - also eine "normale Lage" 
 | 
				
			||||||
 | 
					      selectInput("lage",label="Lage:", 
 | 
				
			||||||
 | 
					                       choices = list("normale Lage" = 1, "gute Lage" = 2,
 | 
				
			||||||
 | 
					                                      "beste Lage" = 3), selected = 1
 | 
				
			||||||
 | 
					      ), 
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # eine Überschrift für die weiteren Ausstattungsmerkmale
 | 
				
			||||||
 | 
					      h5(strong("Ausstattung:"),align="left"),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # die weiteren drei Ausstattungsmerkmale (kueche, bad, zh) mit
 | 
				
			||||||
 | 
					      # Boxen zum Anklicken
 | 
				
			||||||
 | 
					      # die Voreinstellung ist jeweils FALSE (value), das heißt, es ist als
 | 
				
			||||||
 | 
					      # Voreinstellung keine Box angeklickt
 | 
				
			||||||
 | 
					      checkboxInput(inputId="luxuskueche", label="Luxusküche", value = FALSE),
 | 
				
			||||||
 | 
					      checkboxInput(inputId="luxusbad", label="Luxusbad", value = FALSE),
 | 
				
			||||||
 | 
					      checkboxInput(inputId="zentralheizung", label="mit Zentralheizung", value = FALSE),
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # der Hauptbereich der Nutzeroberfläche für die Ausgabe der Ergebnisse
 | 
				
			||||||
 | 
					    mainPanel(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Ausgabe des Histogramms
 | 
				
			||||||
 | 
					      plotOutput(outputId = "Verteilung"),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Ausgabe der Prognose
 | 
				
			||||||
 | 
					      textOutput("Prognose"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					server <- function(input, output) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Innerhalb dieser Funktion werden die Bilder für die Ausgabe
 | 
				
			||||||
 | 
					  # erzeugt und die Ergebnisse berechnet
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  # Folgende Funktion berechnet die Prognose für die eingegeben Werte  
 | 
				
			||||||
 | 
					  prognose <- reactive({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Speichere die Daten der Einflussvariablen in ein Objekt X
 | 
				
			||||||
 | 
					    X <- Daten[,c("flaeche","bjahr","bad","kueche","lage","zh")]
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Ersetze die erste Zeile in X nun mit den neuen, eingegebenen Werten
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    # zunächst die Werte für flaeche und bjahr 
 | 
				
			||||||
 | 
					    X[1,"flaeche"] <- input$flaeche 
 | 
				
			||||||
 | 
					    X[1,"bjahr"] <- input$bjahr
 | 
				
			||||||
 | 
					    # der angegebene Wert für lage muss zusätzlich noch in factor umgewandelt werden
 | 
				
			||||||
 | 
					    X[1,"lage"] <- as.factor(input$lage)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # die Eingaben TRUE/FALSE für die Ausstattungsmerkmale kueche, bad und zh
 | 
				
			||||||
 | 
					    # werden jeweils in 0/1-Variablen umgewandelt (mit ifelse) und in
 | 
				
			||||||
 | 
					    # den Datentyp factor umgewandelt (mit as.factor);
 | 
				
			||||||
 | 
					    # die Werte werden in die erste Zeile von X eingetragen
 | 
				
			||||||
 | 
					    X[1,"kueche"] <- as.factor(ifelse(input$luxuskueche == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    X[1,"bad"] <- as.factor(ifelse(input$luxusbad == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    X[1,"zh"] <- as.factor(ifelse(input$zentralheizung == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Berechne die Prognosen für X
 | 
				
			||||||
 | 
					    # die Prognose der neuen, eingegebenen Werte stehen im ersten Eintrag des Prognosevektors
 | 
				
			||||||
 | 
					    prognosevektor <- predict(model,X)
 | 
				
			||||||
 | 
					    prog <- prognosevektor[1]
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    # der Prognosewert wird noch auf 2 Stellen hinter dem Komma (digits=2) gerundet.
 | 
				
			||||||
 | 
					    prog <- round(prog,digits=2)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # der errechnete Wert soll als Ergebnis der Funktion zurückgegeben werden
 | 
				
			||||||
 | 
					    prog
 | 
				
			||||||
 | 
					  })         
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  # diese Funktion erzeugt das Histogramm und speichert es als Ausgabebild 
 | 
				
			||||||
 | 
					  # mit dem Namen output$Verteilung
 | 
				
			||||||
 | 
					  output$Verteilung <- renderPlot({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # die errechnete Prognose aus der oben geschriebenen Funktion prognose()
 | 
				
			||||||
 | 
					    prog <- prognose()
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Speichere die Daten der Einflussvariablen in ein Objekt X
 | 
				
			||||||
 | 
					    # und die Daten der Zielvariable in y.
 | 
				
			||||||
 | 
					    # Berechne dann die Abweichungen zwischen den Prognosen und den realen Werten
 | 
				
			||||||
 | 
					    X <- Daten[,c("flaeche","bjahr","bad","kueche","lage","zh")]
 | 
				
			||||||
 | 
					    y <- Daten[,"mieteqm"]
 | 
				
			||||||
 | 
					    abweichungen <- y-predict(model,X)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Zeichne jetzt im Histogram die Prognose mit den Abweichungen;
 | 
				
			||||||
 | 
					    # dies visualisiert die bandbreite der Mieten für diese Wohnung 
 | 
				
			||||||
 | 
					    hist(prog+abweichungen, col = "blue", main = "Verteilung der Quadratmetermieten",xlim=c(0,15))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  # Definition einer Textausgabe mit dem namen output$Prognose 
 | 
				
			||||||
 | 
					  # In dieser Textausgabe soll der in der Funktion prognose() 
 | 
				
			||||||
 | 
					  # errechnete Prognosewert ausgegeben werden
 | 
				
			||||||
 | 
					  output$Prognose <- renderText({
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    # der Wert der Prognose aus der Funktion prognose()
 | 
				
			||||||
 | 
					    prog <- prognose()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    # die Ausgabe ist eine Kombination (mit dem Befehl 'paste') von Text
 | 
				
			||||||
 | 
					    # und des errechneten Prognosewerts prog 
 | 
				
			||||||
 | 
					    Ausgabe <- paste("Durchschnittliche Miete: ", prog," Euro")
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Aufruf der App-Funktionen
 | 
				
			||||||
 | 
					###############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shinyApp(ui = ui, server = server)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					###############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# Setzen des Pfades und Einlesen der Daten
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setwd("/config/workspace/assistenz-r/lecture")
 | 
				
			||||||
 | 
					  Daten <- read.csv("Mietspiegel.csv",header=TRUE,sep=";",fill=TRUE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Daten[,"bad"] <- as.factor(Daten[,"bad"])
 | 
				
			||||||
 | 
					  Daten[,"kueche"] <- as.factor(Daten[,"kueche"])
 | 
				
			||||||
 | 
					  Daten[,"lage"] <- as.factor(Daten[,"lage"])
 | 
				
			||||||
 | 
					  Daten[,"zh"] <- as.factor(Daten[,"zh"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Berechnung des Entscheidungsbaumes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  library(tree)
 | 
				
			||||||
 | 
					  Baum <- tree(mieteqm ~ flaeche + bjahr + bad + kueche + lage + zh, data=Daten)
 | 
				
			||||||
 | 
					  tuning <- cv.tree(Baum, K=5)
 | 
				
			||||||
 | 
					  t <- which.min(tuning$dev)
 | 
				
			||||||
 | 
					  Anzahl.Endknoten <- tuning$size[t]
 | 
				
			||||||
 | 
					  model <- prune.tree(Baum,best=Anzahl.Endknoten)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Starten der Shiny-App
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setwd("/config/workspace/assistenz-r/lecture/Meine-Mietspiegel-App-Entscheidungsbaum")
 | 
				
			||||||
 | 
					  library(shiny)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  runApp("App-Mietspiegel_Entscheidungsbaum")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,169 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					################
 | 
				
			||||||
 | 
					# Im folgenden Abschnitt wird das User Interface (UI) definiert
 | 
				
			||||||
 | 
					ui <- fluidPage(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Titel der App
 | 
				
			||||||
 | 
					  titlePanel("Münchner Mietspiegel"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Layout für die Eingaben in die App und die Ausgaben
 | 
				
			||||||
 | 
					  sidebarLayout(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Die Definition der Eingabefelder auf der linken Seite
 | 
				
			||||||
 | 
					    sidebarPanel(
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					      # Eine Überschrift mit Linie darunter
 | 
				
			||||||
 | 
					      h3("Wohnung:",align="left"),
 | 
				
			||||||
 | 
					      hr(style="height: 1px; background: black"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Ein Slider für die Fläche der Wohnung
 | 
				
			||||||
 | 
					      # der Slider geht hier von 30 (min) bis 100 (max), 
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 75 (value)
 | 
				
			||||||
 | 
					      sliderInput(inputId = "flaeche",
 | 
				
			||||||
 | 
					                  label = "Groesse in qm:",
 | 
				
			||||||
 | 
					                  min = 30,
 | 
				
			||||||
 | 
					                  max = 100,
 | 
				
			||||||
 | 
					                  value = 75
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Das Baujahr als numerische Eingabe
 | 
				
			||||||
 | 
					      # die Werte gehen von 1950 (min) bis 2000 (max) in Einerschritten (step)
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 1981 (value)
 | 
				
			||||||
 | 
					      numericInput(inputId="bjahr", 
 | 
				
			||||||
 | 
					                    label="Baujahr:", 
 | 
				
			||||||
 | 
					                        value = 1981,
 | 
				
			||||||
 | 
					                        min=1950,max=2000,step=1
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Die Lage als Auswahlliste
 | 
				
			||||||
 | 
					      # die Auswahlmöglichkeiten sind "normale Lage", "gute Lage" und "beste Lage",
 | 
				
			||||||
 | 
					      # die entsprechende Zuordnung mit Zahlen 1, 2 und 3 sind wie im Datensatz,
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 1 (selected) - also eine "normale Lage" 
 | 
				
			||||||
 | 
					      selectInput("lage",label="Lage:", 
 | 
				
			||||||
 | 
					                       choices = list("normale Lage" = 1, "gute Lage" = 2,
 | 
				
			||||||
 | 
					                                      "beste Lage" = 3), selected = 1
 | 
				
			||||||
 | 
					      ), 
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # eine Überschrift für die weiteren Ausstattungsmerkmale
 | 
				
			||||||
 | 
					      h5(strong("Ausstattung:"),align="left"),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # die weiteren drei Ausstattungsmerkmale (kueche, bad, zh) mit
 | 
				
			||||||
 | 
					      # Boxen zum Anklicken
 | 
				
			||||||
 | 
					      # die Voreinstellung ist jeweils FALSE (value), das heißt, es ist als
 | 
				
			||||||
 | 
					      # Voreinstellung keine Box angeklickt
 | 
				
			||||||
 | 
					      checkboxInput(inputId="luxuskueche", label="Luxusküche", value = FALSE),
 | 
				
			||||||
 | 
					      checkboxInput(inputId="luxusbad", label="Luxusbad", value = FALSE),
 | 
				
			||||||
 | 
					      checkboxInput(inputId="zentralheizung", label="mit Zentralheizung", value = FALSE),
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # der Hauptbereich der Nutzeroberfläche für die Ausgabe der Ergebnisse
 | 
				
			||||||
 | 
					    mainPanel(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Ausgabe des Histogramms
 | 
				
			||||||
 | 
					      plotOutput(outputId = "Verteilung"),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Ausgabe der Prognose
 | 
				
			||||||
 | 
					      textOutput("Prognose"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					server <- function(input, output) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Innerhalb dieser Funktion werden die Bilder für die Ausgabe
 | 
				
			||||||
 | 
					  # erzeugt und die Ergebnisse berechnet
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  # Folgende Funktion berechnet die Prognose für die eingegeben Werte  
 | 
				
			||||||
 | 
					  prognose <- reactive({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Speichere die Daten unter neuem Namen
 | 
				
			||||||
 | 
					    Daten.neu <- Daten
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Ersetze die erste Zeile im neuen Datensatz nun mit den neuen, eingegebenen Werten
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    # zunächst die Werte für flaeche und bjahr 
 | 
				
			||||||
 | 
					    Daten.neu[1,"flaeche"] <- input$flaeche 
 | 
				
			||||||
 | 
					    Daten.neu[1,"bjahr"] <- input$bjahr
 | 
				
			||||||
 | 
					    # der angegebene Wert für lage muss zusätzlich noch in factor umgewandelt werden
 | 
				
			||||||
 | 
					    Daten.neu[1,"lage"] <- as.factor(input$lage)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # die Eingaben TRUE/FALSE für die Ausstattungsmerkmale kueche, bad und zh
 | 
				
			||||||
 | 
					    # werden jeweils in 0/1-Variablen umgewandelt (mit ifelse) und in
 | 
				
			||||||
 | 
					    # den Datentyp factor umgewandelt (mit as.factor);
 | 
				
			||||||
 | 
					    # die Werte werden in die erste Zeile von X eingetragen
 | 
				
			||||||
 | 
					    Daten.neu[1,"kueche"] <- as.factor(ifelse(input$luxuskueche == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    Daten.neu[1,"bad"] <- as.factor(ifelse(input$luxusbad == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    Daten.neu[1,"zh"] <- as.factor(ifelse(input$zentralheizung == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Berechne die Prognosen für Daten.neu
 | 
				
			||||||
 | 
					    # die Prognose der neuen, eingegebenen Werte stehen im ersten Eintrag des Prognosevektors
 | 
				
			||||||
 | 
					    X.neu <- model.matrix(mieteqm ~ flaeche + bjahr + bad + kueche + lage + zh, Daten.neu)
 | 
				
			||||||
 | 
					    X.neu <- X.neu[,-1]   # entferne den Intercept
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    prognosevektor <- predict(model,X.neu)$predictions
 | 
				
			||||||
 | 
					    prog <- prognosevektor[1]
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    # der Prognosewert wird noch auf 2 Stellen hinter dem Komma (digits=2) gerundet.
 | 
				
			||||||
 | 
					    prog <- round(prog,digits=2)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # der errechnete Wert soll als Ergebnis der Funktion zurückgegeben werden
 | 
				
			||||||
 | 
					    prog
 | 
				
			||||||
 | 
					  })         
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  # diese Funktion erzeugt das Histogramm und speichert es als Ausgabebild 
 | 
				
			||||||
 | 
					  # mit dem Namen output$Verteilung
 | 
				
			||||||
 | 
					  output$Verteilung <- renderPlot({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # die errechnete Prognose aus der oben geschriebenen Funktion prognose()
 | 
				
			||||||
 | 
					    prog <- prognose()
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Speichere die Daten der Einflussvariablen in ein Objekt X
 | 
				
			||||||
 | 
					    # und die Daten der Zielvariable in y.
 | 
				
			||||||
 | 
					    # Berechne dann die Abweichungen zwischen den Prognosen und den realen Werten
 | 
				
			||||||
 | 
					    X <- Daten[,c("flaeche","bjahr","bad","kueche","lage","zh")]
 | 
				
			||||||
 | 
					    X <- model.matrix(mieteqm ~ flaeche + bjahr + bad + kueche + lage + zh, Daten)
 | 
				
			||||||
 | 
					    X <- X[,-1]   # entferne den Intercept
 | 
				
			||||||
 | 
					    y <- Daten[,"mieteqm"]
 | 
				
			||||||
 | 
					    abweichungen <- y-predict(model,X)$predictions
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Zeichne jetzt im Histogram die Prognose mit den Abweichungen;
 | 
				
			||||||
 | 
					    # dies visualisiert die bandbreite der Mieten für diese Wohnung 
 | 
				
			||||||
 | 
					    hist(prog+abweichungen, col = "blue", main = "Verteilung der Quadratmetermieten",xlim=c(0,15))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  # Definition einer Textausgabe mit dem namen output$Prognose 
 | 
				
			||||||
 | 
					  # In dieser Textausgabe soll der in der Funktion prognose() 
 | 
				
			||||||
 | 
					  # errechnete Prognosewert ausgegeben werden
 | 
				
			||||||
 | 
					  output$Prognose <- renderText({
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    # der Wert der Prognose aus der Funktion prognose()
 | 
				
			||||||
 | 
					    prog <- prognose()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    # die Ausgabe ist eine Kombination (mit dem Befehl 'paste') von Text
 | 
				
			||||||
 | 
					    # und des errechneten Prognosewerts prog 
 | 
				
			||||||
 | 
					    Ausgabe <- paste("Durchschnittliche Miete: ", prog," Euro")
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Aufruf der App-Funktionen
 | 
				
			||||||
 | 
					###############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shinyApp(ui = ui, server = server)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					###############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					[1208/081603.928:ERROR:directory_reader_win.cc(43)] FindFirstFile: Das System kann den angegebenen Pfad nicht finden. (0x3)
 | 
				
			||||||
@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# Setzen des Pfades und Einlesen der Daten
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setwd("/config/workspace/assistenz-r/lecture")
 | 
				
			||||||
 | 
					  Daten <- read.csv("Mietspiegel.csv",header=TRUE,sep=";",fill=TRUE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Daten[,"bad"] <- as.factor(Daten[,"bad"])
 | 
				
			||||||
 | 
					  Daten[,"kueche"] <- as.factor(Daten[,"kueche"])
 | 
				
			||||||
 | 
					  Daten[,"lage"] <- as.factor(Daten[,"lage"])
 | 
				
			||||||
 | 
					  Daten[,"zh"] <- as.factor(Daten[,"zh"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Berechnung des neuronalen Netzes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Laden des R-Pakets  
 | 
				
			||||||
 | 
					    library(ANN2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Erstellen eines Datensatzes mit Dummy-Codierung der kategoriellen Variablen  
 | 
				
			||||||
 | 
					    X <- model.matrix(mieteqm ~ flaeche + bjahr + bad + kueche + lage + zh, Daten)
 | 
				
			||||||
 | 
					    X <- X[,-1]   # entferne den Intercept
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    y <- Daten[,"mieteqm"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Trainieren des neuronalen Netzes
 | 
				
			||||||
 | 
					  # mit 2 Hidden Layer, wobei der 1. Hidden Layer 4 Hidden Units hat und
 | 
				
			||||||
 | 
					  # der 2. Hidden Layer 3 Units hat
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    model <- neuralnetwork(X, y, hidden.layers=c(4,3), regression = TRUE, 
 | 
				
			||||||
 | 
					                       loss.type = "absolute", learn.rates = 1e-04,n.epochs = 100,
 | 
				
			||||||
 | 
					                       verbose=FALSE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Starten der Shiny-App
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  library(shiny)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setwd("/config/workspace/assistenz-r/lecture/Meine-Mietspiegel-App-neuronalesNetz")
 | 
				
			||||||
 | 
					  runApp("App-Mietspiegel_neuronalesNetz")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										165
									
								
								lecture/Meine-Mietspiegel-App/App-Mietspiegel/app.r
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								lecture/Meine-Mietspiegel-App/App-Mietspiegel/app.r
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,165 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					################
 | 
				
			||||||
 | 
					# Im folgenden Abschnitt wird das User Interface (UI) definiert
 | 
				
			||||||
 | 
					ui <- fluidPage(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Titel der App
 | 
				
			||||||
 | 
					  titlePanel("Münchner Mietspiegel"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Layout für die Eingaben in die App und die Ausgaben
 | 
				
			||||||
 | 
					  sidebarLayout(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Die Definition der Eingabefelder auf der linken Seite
 | 
				
			||||||
 | 
					    sidebarPanel(
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					      # Eine Überschrift mit Linie darunter
 | 
				
			||||||
 | 
					      h3("Wohnung:",align="left"),
 | 
				
			||||||
 | 
					      hr(style="height: 1px; background: black"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Ein Slider für die Fläche der Wohnung
 | 
				
			||||||
 | 
					      # der Slider geht hier von 30 (min) bis 100 (max), 
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 75 (value)
 | 
				
			||||||
 | 
					      sliderInput(inputId = "flaeche",
 | 
				
			||||||
 | 
					                  label = "Groesse in qm:",
 | 
				
			||||||
 | 
					                  min = 30,
 | 
				
			||||||
 | 
					                  max = 100,
 | 
				
			||||||
 | 
					                  value = 75
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Das Baujahr als numerische Eingabe
 | 
				
			||||||
 | 
					      # die Werte gehen von 1950 (min) bis 2000 (max) in Einerschritten (step)
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 1981 (value)
 | 
				
			||||||
 | 
					      numericInput(inputId="bjahr", 
 | 
				
			||||||
 | 
					                    label="Baujahr:", 
 | 
				
			||||||
 | 
					                        value = 1981,
 | 
				
			||||||
 | 
					                        min=1950,max=2000,step=1
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Die Lage als Auswahlliste
 | 
				
			||||||
 | 
					      # die Auswahlmöglichkeiten sind "normale Lage", "gute Lage" und "beste Lage",
 | 
				
			||||||
 | 
					      # die entsprechende Zuordnung mit Zahlen 1, 2 und 3 sind wie im Datensatz,
 | 
				
			||||||
 | 
					      # die Voreinstellung ist 1 (selected) - also eine "normale Lage" 
 | 
				
			||||||
 | 
					      selectInput("lage",label="Lage:", 
 | 
				
			||||||
 | 
					                       choices = list("normale Lage" = 1, "gute Lage" = 2,
 | 
				
			||||||
 | 
					                                      "beste Lage" = 3), selected = 1
 | 
				
			||||||
 | 
					      ), 
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # eine Überschrift für die weiteren Ausstattungsmerkmale
 | 
				
			||||||
 | 
					      h5(strong("Ausstattung:"),align="left"),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # die weiteren drei Ausstattungsmerkmale (kueche, bad, zh) mit
 | 
				
			||||||
 | 
					      # Boxen zum Anklicken
 | 
				
			||||||
 | 
					      # die Voreinstellung ist jeweils FALSE (value), das heißt, es ist als
 | 
				
			||||||
 | 
					      # Voreinstellung keine Box angeklickt
 | 
				
			||||||
 | 
					      checkboxInput(inputId="luxuskueche", label="Luxusküche", value = FALSE),
 | 
				
			||||||
 | 
					      checkboxInput(inputId="luxusbad", label="Luxusbad", value = FALSE),
 | 
				
			||||||
 | 
					      checkboxInput(inputId="zentralheizung", label="mit Zentralheizung", value = FALSE),
 | 
				
			||||||
 | 
					     
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # der Hauptbereich der Nutzeroberfläche für die Ausgabe der Ergebnisse
 | 
				
			||||||
 | 
					    mainPanel(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Ausgabe des Histogramms
 | 
				
			||||||
 | 
					      plotOutput(outputId = "Verteilung"),
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      # Ausgabe der Prognose
 | 
				
			||||||
 | 
					      textOutput("Prognose"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					server <- function(input, output) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Innerhalb dieser Funktion werden die Bilder für die Ausgabe
 | 
				
			||||||
 | 
					  # erzeugt und die Ergebnisse berechnet
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  # Folgende Funktion berechnet die Prognose für die eingegeben Werte  
 | 
				
			||||||
 | 
					  prognose <- reactive({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Speichere die Daten der Einflussvariablen in ein Objekt X
 | 
				
			||||||
 | 
					    X <- Daten[,c("flaeche","bjahr","bad","kueche","lage","zh")]
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Ersetze die erste Zeile in X nun mit den neuen, eingegebenen Werten
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    # zunächst die Werte für flaeche und bjahr 
 | 
				
			||||||
 | 
					    X[1,"flaeche"] <- input$flaeche 
 | 
				
			||||||
 | 
					    X[1,"bjahr"] <- input$bjahr
 | 
				
			||||||
 | 
					    # der angegebene Wert für lage muss zusätzlich noch in factor umgewandelt werden
 | 
				
			||||||
 | 
					    X[1,"lage"] <- as.factor(input$lage)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # die Eingaben TRUE/FALSE für die Ausstattungsmerkmale kueche, bad und zh
 | 
				
			||||||
 | 
					    # werden jeweils in 0/1-Variablen umgewandelt (mit ifelse) und in
 | 
				
			||||||
 | 
					    # den Datentyp factor umgewandelt (mit as.factor);
 | 
				
			||||||
 | 
					    # die Werte werden in die erste Zeile von X eingetragen
 | 
				
			||||||
 | 
					    X[1,"kueche"] <- as.factor(ifelse(input$luxuskueche == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    X[1,"bad"] <- as.factor(ifelse(input$luxusbad == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    X[1,"zh"] <- as.factor(ifelse(input$zentralheizung == FALSE, 0, 1))
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Berechne die Prognosen für X
 | 
				
			||||||
 | 
					    # die Prognose der neuen, eingegebenen Werte stehen im ersten Eintrag des Prognosevektors
 | 
				
			||||||
 | 
					    prognosevektor <- predict(model,X)
 | 
				
			||||||
 | 
					    prog <- prognosevektor[1]
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # der Prognosewert wird noch auf 2 Stellen hinter dem Komma (digits=2) gerundet.
 | 
				
			||||||
 | 
					    prog <- round(prog,digits=2)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # der errechnete Wert soll als Ergebnis der Funktion zurückgegeben werden
 | 
				
			||||||
 | 
					    prog
 | 
				
			||||||
 | 
					  })         
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					  # diese Funktion erzeugt das Histogramm und speichert es als Ausgabebild 
 | 
				
			||||||
 | 
					  # mit dem Namen output$Verteilung
 | 
				
			||||||
 | 
					  output$Verteilung <- renderPlot({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # die errechnete Prognose aus der oben geschriebenen Funktion prognose()
 | 
				
			||||||
 | 
					    prog <- prognose()
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Speichere die Daten der Einflussvariablen in ein Objekt X
 | 
				
			||||||
 | 
					    # und die Daten der Zielvariable in y.
 | 
				
			||||||
 | 
					    # Berechne dann die Abweichungen zwischen den Prognosen und den realen Werten
 | 
				
			||||||
 | 
					    X <- Daten[,c("flaeche","bjahr","bad","kueche","lage","zh")]
 | 
				
			||||||
 | 
					    y <- Daten[,"mieteqm"]
 | 
				
			||||||
 | 
					    abweichungen <- y-predict(model,X)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Zeichne jetzt im Histogram die Prognose mit den Abweichungen;
 | 
				
			||||||
 | 
					    # dies visualisiert die bandbreite der Mieten für diese Wohnung 
 | 
				
			||||||
 | 
					    hist(prog+abweichungen, col = "blue", main = "Verteilung der Quadratmetermieten",xlim=c(0,15))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  # Definition einer Textausgabe mit dem namen output$Prognose 
 | 
				
			||||||
 | 
					  # In dieser Textausgabe soll der in der Funktion prognose() 
 | 
				
			||||||
 | 
					  # errechnete Prognosewert ausgegeben werden
 | 
				
			||||||
 | 
					  output$Prognose <- renderText({
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    # der Wert der Prognose aus der Funktion prognose()
 | 
				
			||||||
 | 
					    prog <- prognose()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    # die Ausgabe ist eine Kombination (mit dem Befehl 'paste') von Text
 | 
				
			||||||
 | 
					    # und des errechneten Prognosewerts prog 
 | 
				
			||||||
 | 
					    Ausgabe <- paste("Durchschnittliche Miete: ", prog," Euro")
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Aufruf der App-Funktionen
 | 
				
			||||||
 | 
					###############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shinyApp(ui = ui, server = server)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					###############
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										23
									
								
								lecture/Meine-Mietspiegel-App/run-Mietspiegel.r
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								lecture/Meine-Mietspiegel-App/run-Mietspiegel.r
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# Setzen des Pfades und Einlesen der Daten
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setwd("/config/workspace/assistenz-r/lecture")
 | 
				
			||||||
 | 
					  Daten <- read.csv("Mietspiegel.csv",header=TRUE,sep=";",fill=TRUE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Daten[,"bad"] <- as.factor(Daten[,"bad"])
 | 
				
			||||||
 | 
					  Daten[,"kueche"] <- as.factor(Daten[,"kueche"])
 | 
				
			||||||
 | 
					  Daten[,"lage"] <- as.factor(Daten[,"lage"])
 | 
				
			||||||
 | 
					  Daten[,"zh"] <- as.factor(Daten[,"zh"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Berechnung der linearen Regression
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  model <- lm( mieteqm ~ flaeche + bjahr + bad + kueche + lage + zh, data=Daten)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Starten der Shiny-App
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setwd("/config/workspace/assistenz-r/lecture/Meine-Mietspiegel-App")
 | 
				
			||||||
 | 
					  library(shiny)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  runApp("App-Mietspiegel")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										1905
									
								
								lecture/Mietspiegel.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1905
									
								
								lecture/Mietspiegel.csv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user