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.
Industriingeniør som gerne beskæftiger sig med optimering, simulation og matematisk modellering i R, SQL, VBA og Python
Leave a Reply