R – regressione lineare semplice



Introduzione

Il presente post vuole inaugurare una serie di brevi articoli riguardanti le analisi delle regressioni sfruttando il noto ambiente di sviluppo matematico R.  Non è scopo di questi articoli introdurre alla programmazione in R e si dà pertanto per scontata una certa familiarità con il linguaggio e con l’IDE R Studio.
Allo stesso modo, viene data per scontata la dimestichezza con le regressioni lineari, polinomiali, … anche se sarà mia cura dare un breve cenno a ciascuna di esse prima di vederle applicate in R.

Descrizione regressione lineare semplice

L'analisi della regressione è una tecnica usata per analizzare una serie di dati che consistono in una variabile dipendente e una o più variabili indipendenti. Lo scopo è stimare un'eventuale relazione funzionale esistente tra la variabile dipendente e le variabili indipendenti […] L'analisi della regressione può essere usata per effettuare previsioni (ad esempio per prevedere dati futuri di una serie temporale), inferenza statistica, per testare ipotesi o per modellare delle relazioni di dipendenza. Questi usi della regressione dipendono fortemente dal fatto che le assunzioni di partenza siano verificate (fonte Wikipedia).
La regressione lineare si compone di una o più variabili indipendenti le cui N osservazioni possono portare alla stima del valore della variabile dipendente secondo l’equazione lineare:
Nel caso della regressione lineare semplice avremo una sola variabile dipendente. L’indice i si riferisce alla i-esima osservazione della variabile dipendente e con si indica l’errore connesso alla misurazione. Quindi la retta di regressione è quella che meglio interpola i dati dell’osservazione e per raggiungere lo scopo si ricorre al metodo dei minimi quadrati che consentono di individuare i valori dei coefficienti β0 e β1.

Esempio con R

Immagino di avere un file di testo contenente l’elenco (in formato YYYY-MM) delle date di vendita di un certo prodotto fatto come segue:
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. Quindi procedo suddividendo i dati in sotto set contenenti i valori anno per anno e quindi ne disegno il grafico.
# 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 e per ciascuno creo una proprietà year che mi indica l'anno a cui si riferisce il subset
# questo mi permetterà di ottenere serie multiple sul grafico che viene in seguito plottato
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 viste in precedenza 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)
 
# la funzione lm viene usata per il calcolo della regressione
regressor = lm(formula = freq ~ month, data = dat_month_freq)

# eseguo una predizione che si basa sulle serie storiche
sell_pred = predict(regressor, newdata = dat_month_freq)


# genero il dataframe con la predizione per l’anno successivo
df_sell_pred = head(data.frame(month = dat$month, Freq = sell_pred), 12)
df_sell_pred$year = "2018"
dat_with_prevision = rbind(df_2014, df_2015, df_2016, df_2017, df_sell_pred)
g <- ggplot(dat_with_prevision, aes(x = month, y = Freq, colour = year)) + geom_line(linetype="dashed", size = 0.5)
plot(g)


È evidente che la regressione lineare non si sposa bene con questo modello in cui le serie storiche hanno un andamento di tipo non lineare e vedremo come migliorare la nostra curva passando ad una regressione di tipo polinomiale.

Commenti

Post popolari in questo blog

Azure Service Bus Topics

Polly.NET