Hallo,
ich bearbeite für meine Masterarbeit das Thema Nachfrageprognosen und habe dazu eine sehr wichtige Frage und hoffe, dass mir jemand helfen kann.
Ich arbeite derzeit mit dem R Package "Prophet". Hierbei kann man z.B. historische Nachfragedaten in R importieren und das Programm berechnet anhand dieser historischen Daten dann Prognosen für zukünftige Perioden. Für diese zukünftigen Perioden wird sowohl ein erwarteter Nachfragewert (yhat) berechnet, als auch ein Fehlerintervall (80% Niveau, Wert kann angepasst werden) mit einem unteren Intervallwert (yhat_lower) und einem oberen Intervallwert (yhat_upper). Prophet berechnet dieses Intervall durch Monte-Carlo-Simulation anhand von 1000 Simulationswerten. Das Intervall sagt dann aus, dass 80% (bzw. je nach gewünschtem Niveau) der Simulationswerte in diesem Intervall liegen.
Das ganze geschieht auf Tagesbasis und ich habe im Anhang einen Beispiel-Screenshot von den berechneten Prognosen beigefügt, für jeden Tag ist dort ein Prognosewert und ein Fehlterintervall berechnet wurden. (Anmerkung: Die unteren Intervallwerte sind in der Regel negativ, es gibt zwar keine negativen Nachfragen aber hierbei würde es dann z.B. mehr Retourlieferungen geben als normale Lieferungen, es liegt also kein Fehler vor)
Mein Problem ist nun: Ich möchte diese Prognosen nicht auf Tagesbasis sondern auf Wochenbasis haben. Dazu kann ich natürlich ganz leicht die erwarteten Prognosewerte jeweils für 7 Tage aufsummieren und habe die Prognosewerte für jeweils eine Woche. Jedoch kann ich die Fehlterintervalle natürlich nicht einfach so aufsummieren und meine Frage ist nun, wie ich die Fehlterintervalle auf Tagesbasis aggregieren kann hin zu Wochenbasis.
In einem anderen Forum hat jemand genau die gleiche Frage gehabt wie ich und dazu auch einen Lösungsvorschlag bekommen (https://github.com/facebook/prophet/issues/426), nur leider hat dieser jemand das "Prophet" Package nicht für R sondern für Python benutzt und da ich leider generell nur ganz geringe Programmierkenntnisse habe und mich mit Python auch gar nicht auskenne, konnte ich diese Antwort nicht für mich nutzen und den Code nicht ausprobieren. Ich habe nur verstanden, dass man wieder mit Simulationen vorgehen sollte.
Ich bin mir nicht ganz sicher, ob mir jemand bei diesem Problem helfen kann, ohne genauere Kenntnisse von dem "Prophet" Package zu haben, aber ich bin auf jedenfall für jede Hilfe/ jeden Codevorschlag usw. sehr dankbar und kann bei Nachfragen auch gerne weitere Infos geben.
Vielen Dank schonmal!
LG Leon
Fehlerintervall für mehrere Perioden aggregieren
- databraineo
- Beiträge: 10
- Registriert: Mo Apr 02, 2018 8:20 am
Re: Fehlerintervall für mehrere Perioden aggregieren
Hallo Leon,
der Link zum Python-Code war hilfreich, denn die beiden Sprachen haben im Datenanalyse-Bereich viele Ähnlichkeiten. Aber ein bisschen anders ist es natürlich schon.
Wenn ich es richtig verstanden habe, dann werden die wöchentlichen yhat_lower und yhat_upper als 10%- bzw. 90%-Perzentil der gesampelten Werte berechnet.
In R könnte das dann so aussehen:
Viele Grüße,
Holger
der Link zum Python-Code war hilfreich, denn die beiden Sprachen haben im Datenanalyse-Bereich viele Ähnlichkeiten. Aber ein bisschen anders ist es natürlich schon.
Wenn ich es richtig verstanden habe, dann werden die wöchentlichen yhat_lower und yhat_upper als 10%- bzw. 90%-Perzentil der gesampelten Werte berechnet.
In R könnte das dann so aussehen:
Code: Alles auswählen
library(prophet)
library(dplyr)
library(tidyr)
history <- data.frame(ds = seq(as.Date('2015-01-01'), as.Date('2016-01-01'), by ='d'),
y = sin(1:366/200) + rnorm(366)/10)
m <- prophet(history)
# data.frame mit den gwünschten Daten
df <- data.frame(ds = seq(as.Date("2019-01-01"), Sys.Date(), by="d"))
# Kalenderwoche ergänzen
df$week <- format(df$ds, "%Y-%W")
# Vorhersage-samples mit dem Modell
samples <- predictive_samples(m, df)
# die gesampelten yhats zum data.frame hinzufügen
df <- cbind(df,as.data.frame(samples$yhat))
# umwandeln in einen Längsdatensatz (Kontenmodell)
# Achtung: pivot_longer ist erst in den neuesten Versionen von tidyr enthalten. Alternativen sind gather oder melt
dfLong <- pivot_longer(df, cols = starts_with("V"), names_to = "sample")
# hier passiert das eigentliche Aggregieren
# yhat ist der Mittelwert der täglichen Mittelwerte
# yhat_lower/yhat_upper sind die 10%-/90%-Perzentile des Samples
weekly_predict <- dfLong %>%
group_by(week) %>%
summarize(yhat = mean(value),
yhat_lower = quantile(value,0.1),
yhat_upper = quantile(value,0.9))
Holger
Lasst uns helfen, dass Menschen mittels Datenanalyse intelligente Entscheidungen treffen
Website: Databraineo - Data Science Blog
Twitter: @databraineo
Facebook-Gruppe: Data Science Deutschland
Website: Databraineo - Data Science Blog
Twitter: @databraineo
Facebook-Gruppe: Data Science Deutschland
Re: Fehlerintervall für mehrere Perioden aggregieren
Hallo,databraineo hat geschrieben: ↑Sa Sep 28, 2019 12:18 pm Hallo Leon,
der Link zum Python-Code war hilfreich, denn die beiden Sprachen haben im Datenanalyse-Bereich viele Ähnlichkeiten. Aber ein bisschen anders ist es natürlich schon.
Wenn ich es richtig verstanden habe, dann werden die wöchentlichen yhat_lower und yhat_upper als 10%- bzw. 90%-Perzentil der gesampelten Werte berechnet.
In R könnte das dann so aussehen:Viele Grüße,Code: Alles auswählen
library(prophet) library(dplyr) library(tidyr) history <- data.frame(ds = seq(as.Date('2015-01-01'), as.Date('2016-01-01'), by ='d'), y = sin(1:366/200) + rnorm(366)/10) m <- prophet(history) # data.frame mit den gwünschten Daten df <- data.frame(ds = seq(as.Date("2019-01-01"), Sys.Date(), by="d")) # Kalenderwoche ergänzen df$week <- format(df$ds, "%Y-%W") # Vorhersage-samples mit dem Modell samples <- predictive_samples(m, df) # die gesampelten yhats zum data.frame hinzufügen df <- cbind(df,as.data.frame(samples$yhat)) # umwandeln in einen Längsdatensatz (Kontenmodell) # Achtung: pivot_longer ist erst in den neuesten Versionen von tidyr enthalten. Alternativen sind gather oder melt dfLong <- pivot_longer(df, cols = starts_with("V"), names_to = "sample") # hier passiert das eigentliche Aggregieren # yhat ist der Mittelwert der täglichen Mittelwerte # yhat_lower/yhat_upper sind die 10%-/90%-Perzentile des Samples weekly_predict <- dfLong %>% group_by(week) %>% summarize(yhat = mean(value), yhat_lower = quantile(value,0.1), yhat_upper = quantile(value,0.9))
Holger
@databraineo : vielen Dank für deine Antwort, dies hat mir geholfen und ich habe es nun hinbekommen
Ich hätte nun noch eine Frage, wie ich die Prognosewerte zusammen mit den Intervallwerten in einem Diagramm darstellen kann. Und zwar habe ich jetzt ein Data Frame mit 3 Spalten (Prognosewert, 10% Perzentil Wert, 90% Perzentil Wert) und ich möchte ein Diagramm haben, welches in etwa so aussieht: Gibt es da eine simple Möglichkeit?
Vielen Dank nochmals!
Re: Fehlerintervall für mehrere Perioden aggregieren
das macht ggplot2::geom_ribbon ziemlich einfach! Here ein Beispiel (letzer plot): https://ggplot2.tidyverse.org/reference/geom_ribbon.html
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Fehlerintervall für mehrere Perioden aggregieren
Hallo, danke, ich denke das ist genau das was ich brauche.
Ich habe versucht das Beispiel auf meinen Datenframe zu übertragen und habe es aber leider nicht ganz hinbekommen.
Ich habe ein Datenframe "wochenprognose" mit 4 Spalten (Woche, Prognose, ymin, ymax) und habe diese beiden Code Zeilen probiert:
Code: Alles auswählen
p <- ggplot(wochenprognose, aes(Woche))
p + geom_ribbon(aes(ymin = wochenprognose$ymin, ymax = wochenprognose$ymax), fill = "grey70") + geom_line(aes(y = wochenprognose$Prognose))
Wo liegt der Fehler bei mir?
VIelen Dank nochmals!
Zuletzt geändert von jogo am Mi Okt 02, 2019 12:38 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert, siehe http://forum.r-statistik.de/viewtopic.php?f=20&t=29
Grund: Formatierung verbessert, siehe http://forum.r-statistik.de/viewtopic.php?f=20&t=29
Re: Fehlerintervall für mehrere Perioden aggregieren
Keine '$' in ggplots aes verwenden!
Und ein reproduzierbares Beispiel posten...
Und ein reproduzierbares Beispiel posten...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Fehlerintervall für mehrere Perioden aggregieren
Ein kurzes Update:
Mein Code von oben hatte nur nicht funktioniert, da ich einen blöden Fehler gemacht und mich vertippt hatte (falsche Bezeichnungen nach den "$"verwendet) Nach Korrektur hat alles gepasst.
Danke nochmal für die Hilfe!
LG
Mein Code von oben hatte nur nicht funktioniert, da ich einen blöden Fehler gemacht und mich vertippt hatte (falsche Bezeichnungen nach den "$"verwendet) Nach Korrektur hat alles gepasst.
Danke nochmal für die Hilfe!
LG