“Per aspera ad astra”

Latin

“In distinguishing the advantages of warriors’ weapons, we discover that, whatever the weapon, there is a time and a situation in which it is appropriate.”

“The 5 rings” by Miyamoto Musashi

Večparametrična linearna regresija MLR (en. Multiple Linear Regression)

Napovedovanje pričakovanih stroškov na osnovi zgodovinskih podatkov:

V primeru imaš zgodovinske podatke za preteklih 12 mesecev in sicer poznaš končni strošek, število delovnih enot, ki je ta strošek povzročilo in koliko delovni dni v mesecu so te delovne enote delale.

Podatki v excelu so TUKAJ.

Table 1: Vstopni podatki (zadnjih 6)
MonthF Working days Working units Costs
2019-01 21 42 333715.2
2019-02 19 44 351693.3
2019-03 21 48 372979.2
2019-04 21 42 341544.0
2019-05 21 44 373718.4
2019-06 18 44 306089.1

Naloga:

Napovej skupen strošek, če veš koliko delovnih enot bo delalo v tem mesecu in koliko delovnih dni bodo delali.

Parameter
Mesec: 07
Delovni dni: 21
Enote: 38

Excel

Rezultati so v isti datoteki kot podatki, na listu Analysis. MLR izvedeš s pomočjo dodatka za analize. Posnetek zaslona je na prej omenjenem listu.

Izračunane so tri napovedi:

  1. Napoved s pomočjo povprečne cene : costs = povpr. cene * delovnih dni * št. enot
  2. Napoved s pomočjo dvoparameterske regresijske analize
  3. Napoved s pomočjo trenda rasti povprečne cene

Napovedovanje je vedno nehvaležno. Katera napoved je sedaj pravilna? Glede na izražen trend rasti povprečne cene, bi se verjetno odločil za tretjo varianto.

Python

import pandas as pd
from sklearn import linear_model

#Preberi podatki
df =  pd.read_excel("./../../static/data/2019-07-27_Costs.xlsx", 
                         sheet_name = "DATA" )
                         
myData = df[df.MonthF != '2019-07'].copy() #odstrani zadnji mesec, ker tam ni rezultata

# with sklearn
regr = linear_model.LinearRegression()
X = myData[['Working days', 'Working units']]
Y = myData[['Costs']]

regr.fit(X, Y)
## LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
##          normalize=False)
print('Intercept: \n', regr.intercept_)
## Intercept: 
##  [-193877.84443355]
print('Coefficients: \n', regr.coef_)

#napoved za 21 dni in 38 enot
## Coefficients: 
##  [[8839.1747215  8048.40834209]]
napoved = regr.predict([[21 , 38]]).item(0)
 
print('Napoved: ', napoved)
## Napoved:  297584.34171746176

R

##MLR
#-------
library(tidyverse)

df <- readxl::read_excel(path ="./../../static/data/2019-07-27_Costs.xlsx", 
                         sheet = "DATA" )

myData  <- df %>% subset(MonthF != '2019-07') 

# Multiple Linear Regresion: lm() is used to fit linear models

fit1 <- lm(formula = Costs ~  `Working days` + `Working units`, data = myData)
summary(fit1)
## 
## Call:
## lm(formula = Costs ~ `Working days` + `Working units`, data = myData)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -19659 -11933  -2833  10190  27844 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)   
## (Intercept)      -193878     107231  -1.808  0.10406   
## `Working days`      8839       4346   2.034  0.07245 . 
## `Working units`     8048       1882   4.277  0.00206 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 17210 on 9 degrees of freedom
## Multiple R-squared:  0.7472, Adjusted R-squared:  0.691 
## F-statistic:  13.3 on 2 and 9 DF,  p-value: 0.002053
myData_test <- data.frame(
                  'Working days' = c(21), 
                  'Working units' = c(38) )
colnames(myData_test) = c("Working days", "Working units")

p1 <- predict(fit1, newdata = myData_test, se.fit = TRUE, level = 0.95 )
#izpis rezultatov    
cat("            Prediction     : ", p1$fit[[1]], "\n")
##             Prediction     :  297584.3
Table 2: Napovedi
MonthF Working days Working units Costs Predicted
2018-06 21 42 319267.2 329778.0
2018-07 19 40 284515.0 296002.8
2018-08 22 44 338597.2 354714.0
2018-09 19 38 289570.1 279906.0
2018-10 21 38 297008.0 297584.3
2018-12 20 42 301280.0 320938.8
2019-01 21 42 333715.2 329778.0
2019-02 19 44 351693.3 328196.4
2019-03 21 48 372979.2 378068.4
2019-04 21 42 341544.0 329778.0
2019-05 21 44 373718.4 345874.8
2019-06 18 44 306089.1 319357.3