Output prognose med glidende gennemsnit

I et tidligere indlæg forklarede jeg CAGR-baseret prognose. CAGR-baseret prognose er en meget enkel prognosemetode, som ofte anvendes i industrien, f.eks. til prognoser for salg og produktionsoutput.

Simple prognosemodeller har fordele. De er nemme at forstå og nemme at implementere. Derudover indeholder de få parametre og er dermed meget præcise i deres kerneantagelser. På den måde kan man sige, at simple prognosemetoder i mange tilfælde er de bedste prognosemetoder. Med andre ord: Hvis du forsøger at forudsige fremtiden, kan du lige så godt gøre det med en prognosemodel, som du forstår fuldt ud, og som du til enhver tid kan forklare for enhver.

I dette indlæg vil jeg gerne introducere tidsserieprognoser baseret på en simpel beregning af glidende gennemsnit. Glidende gennemsnit, også kaldet rullende gennemsnit eller rullende midler, bruges til at analysere og forbehandle historiske tidsseriedata. Ikke desto mindre kan de bruges til at skabe en simpel prognosealgoritme.

Jeg skelner simpelt glidende gennemsnitsprognose i to kategorier:

(a) prognoser ud fra historiske data ved at beregne et rullende gennemsnit

(b) samme som (a), men med en yderligere iboende vækstparameter

Kategori (b) er således en kombination af CAGR-baseret prognose og rullende gennemsnitsprognose.

Ligesom CAGR-baseret prognose kan simple rullende gennemsnitsprognoser kun bruges til begrænsede tidshorisonter.

Jeg implementerer en sådan prognosetilgang i kodningseksemplet nedenfor ved hjælp af en funktion, der beregner et glidende gennemsnit af defineret længde. Jeg implementerer denne funktion i R og anvender den til at forudsige fremtidige værdier. Jeg kalder funktionen “sma_forecast”. Det er implementeret i R-koden nedenfor:

sma_forecast = function(past,length){
  
  future = rep(0,times = length)
  
  prediction = c(past,future)
  
  for(i in (length(past)+1):length(prediction)){
    prediction[i] = mean(prediction[(i-length(past)):(i-1)])
  }
  
  return(prediction)
}

Næste trin i denne arbejdsgang er at læse historiske data ind. I dette tilfælde læste jeg data om årlig produktionsproduktion for bilindustrien fordelt på land, målt i antal producerede enheder i et givet år i et givet land. Det sidste trin er at beregne prognosen ved hjælp af sma_forecast. Alt dette gøres i kodningseksemplet nedenfor ved hjælp af R:

library(readxl)

data_df = as.data.frame(read_xls("oica.xls"))

head(data_df)
##   year   country    total
## 1 2018 Argentina   466649
## 2 2018   Austria   164900
## 3 2018   Belgium   308493
## 4 2018    Brazil  2879809
## 5 2018    Canada  2020840
## 6 2018     China 27809196
tail(data_df)
##     year    country    total
## 835 1999     Turkey   297862
## 836 1999    Ukraine     1918
## 837 1999         UK  1973519
## 838 1999        USA 13024978
## 839 1999 Uzbekistan    44433
## 840 1999     Others    11965
library(dplyr)
data_df = filter(data_df,country=="USA")

library(ggplot2)
ggplot(data_df) + 
  geom_path(mapping = aes(x = year, y = total/1000000), 
            size = 2, 
color = "red") + 
  labs(title = "US automotive industry production output",
       subtitle = "historical OICA data, for 1999 - 2018") +
  xlab("year") +
  ylab("output [millions of units]") + 
  ylim(0,15)
library(dplyr)

data_df = data_df %>% arrange(desc(-year))

predictionVals = sma_forecast(past=data_df$total,length = 10)

plot_df = as.data.frame(matrix(nrow=length(predictionVals),ncol= 4))
colnames(plot_df) = c("year","country","total","category")
plot_df$total = predictionVals
plot_df$category[1:nrow(data_df)] = "history"
plot_df$category[(nrow(data_df)+1):length(predictionVals)] = "prediction"
plot_df$year = data_df$year[1]:(data_df$year[1]+length(predictionVals)-1)
plot_df$country = data_df$country[1]

ggplot(plot_df) +
  geom_point(mapping = aes(x = year,
                          y = total/1000000,
                          color = category),
             size = 2) +
  labs(title = "US autmotive industry production output",
       subtitle = "A prediction from historic OICA data, based on moving average calculation") +
  xlab("year") +
  ylab("output [millions of units]") +
  ylim(0,15)

Jeg afslutter mit eksempel på dette tidspunkt.

Ting jeg kunne have tilføjet:

(a) Opdeling i træning og testsæt til evaluering af metode

(b) Evaluer metode for forskellige lande, tidsintervaller og forudsigelseslængder

(c) Testforudsigelse på data, der adskiller sig fra produktionsoutputdata

(d) …

Hvis du fandt dette indlæg interessant, kan du overveje at tjekke mine andre indlæg ud, om fx CAGR-baseret prognose, indhentning og analyse af OICA-data, tidsserieanalyse, lineær programmering, offentlige kilder til bilindustriens salgsdata osv.

Leave a Reply

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Close

Meta