R – regressione non lineare
Introduzione
Nel post relativo alla
regressione lineare semplice abbiamo visto come la retta di regressione non
interpoli bene i valori delle serie storiche delle vendite dei prodotti. Il
motivo è legato al fatto che le vendite sono variabili per mese in modo non
lineare e si rende necessaria l’introduzione di un altro tipo di regressione:
la regressione polinomiale.
Descrizione regressione non lineare
La regressione non lineare o
polinomiale si propone di trovare la curva che meglio interpola le osservazioni
xi tramite funzioni polinomiali di grado n nella forma:
Nel caso della regressione polinomiale
possiamo avere da una ad n variabili dipendenti. La curva di regressione è
quella che meglio interpola i dati delle osservazioni e per raggiungere lo
scopo si ricorre al metodo dei minimi quadrati che consentono di individuare i
valori dei coefficienti β0, β1 … βn.
Esempio con R
Immagino di avere lo stesso file di testo del precedente
post contenente un elenco di date di vendita dei prodotti:
09-2014
09-2014
09-2014
09-2014
10-2014
10-2014
10-2014
11-2014
11-2014
…
12-2016
…
09-2014
09-2014
09-2014
10-2014
10-2014
10-2014
11-2014
11-2014
…
12-2016
…
Di fatto per ogni prodotto venduto ho una record che indica
il mese ed anno in cui la vendita è avvenuta; il codice che segue legge il file
e lo importa in un dataframe.
# leggo elenco delle date da file
mydata = read.table("<percorso file>/dati_vendite_cs.txt")
mydata = read.table("<percorso file>/dati_vendite_cs.txt")
# trasformo il vettore delle date in tabella di frequenze
df = as.data.frame(table(mydata))
df = as.data.frame(table(mydata))
# creo un vettore con l’elenco dei mesi dell’anno
months_vectr <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
months_vectr <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
# prendo i subset dei soli anni che mi interessano
df_2014 <- df[grep("2014", df$mydata), ]
df_2014$month = months_vectr
df_2014 <- df[grep("2014", df$mydata), ]
df_2014$month = months_vectr
df_2015 <-
df[grep("2015", df$mydata), ]
df_2015$month = months_vectr
df_2015$month = months_vectr
df_2016 <-
df[grep("2016", df$mydata), ]
df_2016$month = months_vectr
df_2016$month = months_vectr
df_2017 <-
df[grep("2017", df$mydata), ]
df_2017$month = months_vectr
df_2017$month = months_vectr
df_2014$year =
"2014"
df_2015$year = "2015"
df_2016$year = "2016"
df_2017$year = "2017"
df_2015$year = "2015"
df_2016$year = "2016"
df_2017$year = "2017"
# unisco i dataframe
dat = rbind(df_2014, df_2015, df_2016, df_2017)
dat = rbind(df_2014, df_2015, df_2016, df_2017)
# stampo le serie dei vari anni
g <- ggplot(dat, aes(x = month, y = Freq, colour = year)) + geom_line(linetype="dashed", size = 0.5)
plot(g)
g <- ggplot(dat, aes(x = month, y = Freq, colour = year)) + geom_line(linetype="dashed", size = 0.5)
plot(g)
Il grafico precedente mostra la
distribuzione delle vendite mese per mese e viene disegnata una seria per
ciascuno degli anni di vendita. È su queste serie storiche che si baserà la
predizione per l’anno successivo (in questo esempio il 2018). Segue il codice
che esegue la predizione con una regressione di tipo lineare e disegna il
grafico con le serie storiche e la predizione.
# mi creo un dataframe con mese e frequenze per ciascuno anno
di vendita
dat_month_freq = data.frame(month = dat$month, freq = dat$Freq)
dat_month_freq = data.frame(month = dat$month, freq = dat$Freq)
# ********************************************************************
# Fitting Polynomial Regression to the dataset
# ********************************************************************
dat_month_freq$month2 = dat_month_freq$month^2
dat_month_freq$month3 = dat_month_freq$month^3
dat_month_freq$month4 = dat_month_freq$month^4
poly_reg = lm(formula = freq ~ ., data = dat_month_freq)
# Fitting Polynomial Regression to the dataset
# ********************************************************************
dat_month_freq$month2 = dat_month_freq$month^2
dat_month_freq$month3 = dat_month_freq$month^3
dat_month_freq$month4 = dat_month_freq$month^4
poly_reg = lm(formula = freq ~ ., data = dat_month_freq)
# la variabile contiene I dati della predizione con modello non
lineare
prediction_y = predict(poly_reg, newdata = dat_month_freq)
# ********************************************************************
prediction_y = predict(poly_reg, newdata = dat_month_freq)
# ********************************************************************
# ********************************************************************
# Visualising the Polynomial Regression results
# ********************************************************************
g <- ggplot(dat, aes(x = month, y = Freq, colour = year)) + geom_line(linetype="dashed", size = 0.5) +
geom_line(aes(x = dat_month_freq$month, y = prediction_y), colour = 'blue') + ggtitle('nof contracts vs selling month (prediction 2018 - PR)') +
xlab('contract delivery month') + ylab('nof delivered contracts')
plot(g)
# ********************************************************************
# Visualising the Polynomial Regression results
# ********************************************************************
g <- ggplot(dat, aes(x = month, y = Freq, colour = year)) + geom_line(linetype="dashed", size = 0.5) +
geom_line(aes(x = dat_month_freq$month, y = prediction_y), colour = 'blue') + ggtitle('nof contracts vs selling month (prediction 2018 - PR)') +
xlab('contract delivery month') + ylab('nof delivered contracts')
plot(g)
# ********************************************************************
In questo caso la curva in blu
segue in modo molto più preciso i valori delle serie storiche rispetto alla
regressione lineare vista nel post precedente e si adatta alla variabilità
delle vendite che si riscontra mese per mese.
Commenti
Posta un commento