[SLD] MLR Večparametrična linearna regresija
Contents
“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.
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:
- Napoved s pomočjo povprečne cene : costs = povpr. cene * delovnih dni * št. enot
- Napoved s pomočjo dvoparameterske regresijske analize
- 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
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 |
Author SlanaD
LastMod 2019-07-27