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