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
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")

# trasformo il vettore delle date in tabella di frequenze
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)

# prendo i subset dei soli anni che mi interessano
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_2016 <- df[grep("2016", df$mydata), ]
df_2016$month = months_vectr
df_2017 <- df[grep("2017", df$mydata), ]
df_2017$month = months_vectr
df_2014$year = "2014"
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)

# 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)


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)

# ********************************************************************
# 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)
# ********************************************************************


# ********************************************************************
# 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

Post popolari in questo blog

Azure Service Bus Topics

R – regressione lineare semplice

Polly.NET